QuantumPackaging

= Quantum Packaging Proposal =

Notes:

 * All current work is at: https://github.com/CiscoSystems/quantum
 * Test packages are also on PyPi. Try them with:

virtualenv ~/.quantum-venv && pip install quantum -E ~/.quantum-venv pip install quantum-sample-plugin -E ~/.quantum-venv
 * 1) Install the sample-plugin

Requirements:

 * The ability to install Quantum easily from a pre-built package
 * The availability of packages on multiple platforms
 * The ability to install separate chunks of the Quantum independently, such as installing the API client, but not the server
 * the ability to install directly from PyPi without any previous setup (execute "sudo pip install quantum" on a fresh server to get going)

Based on those requirements, my proposal is to use Python's setuptools (http://pypi.python.org/pypi/setuptools) to manage building packages. This has many benefits:


 * Supported and largely used by the Python community
 * Allows for easy creation of RPM and Python Egg packages
 * Allows us to separate out logical components into their own projects, and have them installed under a single namespace
 * Built in support for installing scripts and configuration files

Project Format:
To use setuptools for Quantum, we first need to break it out into its individual projects, each with its own build script. I see 4 good candidates for main Quantum packages:


 * quantum-server - Contains the server, plugin management code, etc
 * quantum-client - Contains the API client lib, and CLI
 * quantum-common - Contains the elements common to all packages; e.g. common/exceptions.py, serialization functions, etc
 * quantum-sample-plugin - Contains the sample plugins for Quantum to use
 * quantum-*-plugin - All Quantum plugins will be published this way (e.g. quantum-cisco-plugin)

The git repo looks something like this:

quantum/ setup.py client/ setup.py   lib/ __init__.py     quantum/ __init__.py       client.py  common/ setup.py   lib/ __init__.py     quantum/ __init__.py       common/ __init__.py         exceptions.py          serializer.py          utils.py  server/ setup.py   lib/ __init__.py     quantum/ __init__.py       server.py  plugins/ sample-plugin/ setup.py     lib/ __init__.py   cisco-plugin/ setup.py     lib/ __init__.py

Application:
I have built and added a setup.py file for the root of the repo. It has a few different commands to use so that you don't have to do them on each package individually.

sudo python setup.py install -- Installs quantum-common, quantum-client, quantum-server, and quantum-sample-plugin server-wide

python setup.py install --venv -- The same as above, but creates and installs into ~/.quantum-venv. Requires no root permissions.

python setup.py install --user -- The same as above, but installs into ~/.local. Requires no root permissions, but also less usable (unless you add it to you add to    your PATH)

python setup.py uninstall -- Uninstalls quantum-common, quantum-client, quantum-server, and quantum-sample-plugin

python setup.py build rpm -- Builds RPM packages. Requires rpmbuild (or rpm on Debian).

python setup.py build deb   (Experimental) -- Builds Deb packages. It first builds RPMs, then uses alien to convert them. Requires rpm and alien.

Development:
Setuptools allows you to install your software in "Development" mode where you don't need to re-install after each change. I haven't used it, but here is a link to its documentation: http://packages.python.org/distribute/setuptools.html#development-mode

I have setup the server and test scripts to find the module paths correctly, so you can directly use them without needing to install at all.

You can start server with:

bin/quantum-server

And run tests with:

python run_tests.py

CLI support is coming soon.