QuantumPackaging
Contents
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 #Install the sample-plugin pip install quantum-sample-plugin -E ~/.quantum-venv
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.