[SEBA-450] (part 2)

Add tox testing support on additional XOS library modules:

- xos-api
- xos-kafka (has no tests)
- xos-migrate (has no tests)
- xos-synchronizer

Change-Id: I98195bc9747971d3515882d517affe058dd86ac5
diff --git a/lib/xos-kafka/.gitignore b/lib/xos-kafka/.gitignore
new file mode 100644
index 0000000..ca52aa7
--- /dev/null
+++ b/lib/xos-kafka/.gitignore
@@ -0,0 +1,2 @@
+# setup.py copies this, don't commit it
+xoskafka/VERSION
diff --git a/lib/xos-kafka/MANIFEST.in b/lib/xos-kafka/MANIFEST.in
index 9561fb1..b9708d6 100644
--- a/lib/xos-kafka/MANIFEST.in
+++ b/lib/xos-kafka/MANIFEST.in
@@ -1 +1,3 @@
 include README.rst
+include requirements.txt
+include xoskafka/VERSION
diff --git a/lib/xos-kafka/requirements.txt b/lib/xos-kafka/requirements.txt
new file mode 100644
index 0000000..010540a
--- /dev/null
+++ b/lib/xos-kafka/requirements.txt
@@ -0,0 +1,3 @@
+confluent-kafka~=0.11.5
+multistructlog~=2.1.0
+xosconfig~=2.2.6
diff --git a/lib/xos-kafka/setup.py b/lib/xos-kafka/setup.py
index 3d05854..5662afd 100644
--- a/lib/xos-kafka/setup.py
+++ b/lib/xos-kafka/setup.py
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-
 # Copyright 2018-present Open Networking Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,8 +12,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from xosutil.autoversion_setup import setup_with_auto_version
-from xosutil.version import __version__
+from __future__ import absolute_import
+
+import os
+from shutil import copyfile
+
+from setuptools import setup
 
 
 def readme():
@@ -23,21 +25,33 @@
         return f.read()
 
 
-setup_with_auto_version(
+def version():
+    # Copy VERSION file of parent to module directory if not found
+    if not os.path.exists("xoskafka/VERSION"):
+        copyfile("../../VERSION", "xoskafka/VERSION")
+    with open("xoskafka/VERSION") as f:
+        return f.read().strip()
+
+
+def parse_requirements(filename):
+    # parse a requirements.txt file, allowing for blank lines and comments
+    requirements = []
+    for line in open(filename):
+        if line and not line.startswith("#"):
+            requirements.append(line)
+    return requirements
+
+
+setup(
     name="xoskafka",
-    version=__version__,
+    version=version(),
     description="Wrapper around kafka for XOS",
     long_description=readme(),
-    classifiers=["License :: OSI Approved :: Apache Software License"],
     author="Zack Williams",
     author_email="zdw@opennetworking.org",
-    packages=["xoskafka"],
+    classifiers=["License :: OSI Approved :: Apache Software License"],
     license="Apache v2",
-    install_requires=[
-        "confluent-kafka>=0.11.5",
-        "xosconfig>=2.1.0",
-        "multistructlog>=1.5",
-    ],
+    packages=["xoskafka"],
+    install_requires=parse_requirements("requirements.txt"),
     include_package_data=True,
-    zip_safe=False,
 )
diff --git a/lib/xos-kafka/tox.ini b/lib/xos-kafka/tox.ini
new file mode 100644
index 0000000..cec6c72
--- /dev/null
+++ b/lib/xos-kafka/tox.ini
@@ -0,0 +1,43 @@
+; Copyright 2019-present Open Networking Foundation
+;
+; Licensed under the Apache License, Version 2.0 (the "License");
+; you may not use this file except in compliance with the License.
+; You may obtain a copy of the License at
+;
+; http://www.apache.org/licenses/LICENSE-2.0
+;
+; Unless required by applicable law or agreed to in writing, software
+; distributed under the License is distributed on an "AS IS" BASIS,
+; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+; See the License for the specific language governing permissions and
+; limitations under the License.
+
+[tox]
+envlist = py27,py35,py36,py37
+skip_missing_interpreters = true
+
+[testenv]
+deps =
+  -r requirements.txt
+  nose2
+  flake8
+
+commands =
+  nose2 -c tox.ini --verbose --junit-xml
+  flake8
+
+[flake8]
+max-line-length = 119
+
+[unittest]
+plugins=nose2.plugins.junitxml
+
+[junit-xml]
+path=nose2-results.xml
+
+[coverage]
+always-on = True
+coverage = xoskafka
+coverage-report =
+  xml
+  term