Various fixes before 3.0

- Fix .ini formatting issues in tox.ini file
- Updated developer docs regarding testing
- Add missing requirements for xosapi
- Fix typo in docs

Change-Id: I3603bbd68c8ecff68d8bbc1a2d4674908c54e5b9
diff --git a/README.md b/README.md
index f348c22..34f7f52 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,8 @@
 # XOS
 
-XOS is a framework for operationalizing a collection of
-disaggregated services. It is packaged as a project in
-the Open CORD initiative, with source code managed through
-<https://gerrit.opencord.org>. It is also mirrored at
+XOS is a framework for operationalizing a collection of disaggregated services.
+It is packaged as a project in the Open CORD initiative, with source code
+managed through <https://gerrit.opencord.org>. It is also mirrored at
 <https://github.com/opencord>.
 
 You can download and use XOS either as part of CORD (see the
@@ -17,7 +16,51 @@
 
 ## Testing the XOS Core
 
-Run `make test` to run tests on the XOS codebase.
+Run `make test` to run all tests on the XOS codebase. This is what happens
+during the `verify_xos_unit-test` job in Jenkins.
 
-XOS's component libraries are stored in `lib` and are tested by running
-[tox](https://tox.readthedocs.io) in the individual library directories.
+Running these tests requires:
+
+- A Python 2.7, and one or more of Python 3.5, 3.6, or 3.7 development environment
+  - Requires a C build system and the python header files (under ubuntu 16.04, `apt
+    install python2-dev python3-dev build-essential`) to build packages with C
+    extensions.
+- [virtualenv](https://virtualenv.pypa.io)
+- [tox](https://tox.readthedocs.io) version 3.2 or later
+
+This will run 3 sets of test targets, which can also be run individually:
+
+- `lib-test`: runs `tox` on each of the library modules stored in `lib`.
+  These are tested against both Python 2 and 3 by running both `nose2` and
+  `flake8`.
+
+  If you are making changes only to a specific library, it is recommended that
+  you run `tox` directly inside that modules directory, which should run much
+  more quickly than testing all the libraries.
+
+- `xos-test`: runs `nose2` to test the `xos` directory. This code is not yet
+  Python 3 or flake8 clean.
+
+- `migration-test`: Runs the `xos-migrate` tool on the XOS core modules. This
+  verifies that the Django migrations have been properly created.  If you've
+  changed `xosgenx` or the `core.xproto` file you may need to generate new
+  migrations. See `docs/dev/xosmigrate.md` for more information.
+
+Additionally, a virtualenv will be created in `venv-xos` - you can `source
+./venv-xos/bin/activate` if you'd like to run tools like `xos-migrate` manually.
+
+### Issues you may encounter when developing XOS
+
+*Testing errors that complain about missing compliers or header files:
+`src/twisted/test/raiser.c:4:20: fatal error: Python.h: No such file or
+directory`*
+
+You probably need to install a C build system and the Python development headers.
+
+*After making changes to the requirements.txt or other files, the changes don't
+seem to be register*
+
+You might need to clean up any files left behind by previous development work.
+`make clean` in the root Makefile should clean up most files. Additionally,
+`git clean -ixd` will let you interactively remove all ignored files and
+directories from your source tree.
diff --git a/VERSION b/VERSION
index c36c648..8c57128 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-2.2.17
+2.2.18
diff --git a/containers/chameleon/Dockerfile.chameleon b/containers/chameleon/Dockerfile.chameleon
index b18ec5c..2b218e4 100644
--- a/containers/chameleon/Dockerfile.chameleon
+++ b/containers/chameleon/Dockerfile.chameleon
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # xosproject/chameleon
-FROM xosproject/xos-base:2.2.17
+FROM xosproject/xos-base:2.2.18
 
 # xos-base already has protoc and dependencies installed
 
diff --git a/containers/xos/Dockerfile.client b/containers/xos/Dockerfile.client
index e731bcf..bc01347 100644
--- a/containers/xos/Dockerfile.client
+++ b/containers/xos/Dockerfile.client
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # xosproject/xos-client
-FROM xosproject/xos-libraries:2.2.17
+FROM xosproject/xos-libraries:2.2.18
 
 # Install XOS client
 COPY lib/xos-api /tmp/xos-api
diff --git a/containers/xos/Dockerfile.libraries b/containers/xos/Dockerfile.libraries
index f87792f..590a2e9 100644
--- a/containers/xos/Dockerfile.libraries
+++ b/containers/xos/Dockerfile.libraries
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # xosproject/xos-libraries
-FROM xosproject/xos-base:2.2.17
+FROM xosproject/xos-base:2.2.18
 
 # Add libraries
 COPY lib /opt/xos/lib
diff --git a/containers/xos/Dockerfile.synchronizer-base b/containers/xos/Dockerfile.synchronizer-base
index 75a9b9e..175b378 100644
--- a/containers/xos/Dockerfile.synchronizer-base
+++ b/containers/xos/Dockerfile.synchronizer-base
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # xosproject/xos-synchronizer-base
-FROM xosproject/xos-client:2.2.17
+FROM xosproject/xos-client:2.2.18
 
 COPY xos/synchronizers/new_base /opt/xos/synchronizers/new_base
 COPY xos/xos/logger.py /opt/xos/xos/logger.py
diff --git a/containers/xos/Dockerfile.xos-core b/containers/xos/Dockerfile.xos-core
index 7a71462..8ed98f9 100644
--- a/containers/xos/Dockerfile.xos-core
+++ b/containers/xos/Dockerfile.xos-core
@@ -13,7 +13,7 @@
 # limitations under the License.
 
 # xosproject/xos-core
-FROM xosproject/xos-libraries:2.2.17
+FROM xosproject/xos-libraries:2.2.18
 
 # Install XOS
 ADD xos /opt/xos
diff --git a/docs/external_content/exampleservice.md b/docs/external_content/exampleservice.md
index 2bfd2cf..ba052a2 100644
--- a/docs/external_content/exampleservice.md
+++ b/docs/external_content/exampleservice.md
@@ -1 +1 @@
-{% include git+https://github.com/opencord/exampleservice.git/docs/example-service.md" %}
+{% include "git+https://github.com/opencord/exampleservice.git/docs/example-service.md" %}
diff --git a/lib/xos-api/requirements.txt b/lib/xos-api/requirements.txt
index 976b014..886db3d 100644
--- a/lib/xos-api/requirements.txt
+++ b/lib/xos-api/requirements.txt
@@ -1,9 +1,11 @@
+PyYAML~=3.12
 Twisted~=16.6.0
+googleapis-common-protos~=1.5.6
+grpcio-tools~=1.12.0
+grpcio~=1.12.0
 multistructlog~=2.1.0
+pykwalify~=1.6.0
+python-consul~=1.1.0
+simplejson~=3.16.0
 xosconfig~=2.2.6
 xosgenx~=2.2.6
-googleapis-common-protos~=1.5.6
-pykwalify~=1.6.0
-PyYAML~=3.12
-python-consul~=1.1.0
-grpcio~=1.12.0
diff --git a/tox.ini b/tox.ini
index d78bf8b..ea5235b 100644
--- a/tox.ini
+++ b/tox.ini
@@ -22,10 +22,6 @@
 [unittest]
 plugins = nose2.plugins.junitxml
 code-directories =
-  xos-genx
-  xos-api
-  xos-config
-  xos-synchronizer
   coreapi
 
 [junit-xml]
@@ -34,5 +30,6 @@
 [coverage]
 always-on = True
 coverage = xos
-coverage-report = term
-coverage-report = xml
+coverage-report =
+  term
+  xml