Add DevStack plugin

This patch adds a DevStack plugin to cinderlib so it can be installed
directly by DevStack and used for CI jobs as well as development.

When installing it will also get the Cinder configuration and generate a
.py file with the right initialization of the different backends that
have been configured in /etc/cinder/cinder.conf by the DevStack Cinder
job and its plugins.

Change-Id: I12f6b0e1bc047f1915e4f7532ea59495477f9b4a
This commit is contained in:
Gorka Eguileor 2019-03-04 18:36:19 +01:00
parent 1bdc8fa5c1
commit 37c085fd6c
9 changed files with 104 additions and 5 deletions

View File

View File

@ -35,7 +35,7 @@ import sys
import six
from cinderlib.tests.functional import cinder_to_yaml
from cinderlib.cmd import cinder_to_yaml
def _to_str(value):
@ -44,7 +44,7 @@ def _to_str(value):
return value
def main(source, dest):
def convert(source, dest):
config = cinder_to_yaml.convert(source)
result = ['import cinderlib as cl']
for backend in config['backends']:
@ -57,7 +57,11 @@ def main(source, dest):
f.write('\n\n'.join(result) + '\n')
if __name__ == '__main__':
def main():
source = '/etc/cinder/cinder.conf' if len(sys.argv) < 2 else sys.argv[1]
dest = '/dev/stdout' if len(sys.argv) < 3 else sys.argv[2]
main(source, dest)
convert(source, dest)
if __name__ == '__main__':
main()

View File

@ -24,7 +24,7 @@ import unittest2
import yaml
import cinderlib
from cinderlib.tests.functional import cinder_to_yaml
from cinderlib.cmd import cinder_to_yaml
def set_backend(func, new_name, backend_name):

37
devstack/README.rst Normal file
View File

@ -0,0 +1,37 @@
Cinderlib DevStack Plugin
=========================
This directory contains the cinderlib DevStack plugin.
To configure cinderlib with DevStack, you will need to enable this plugin by
adding one line to the [[local|localrc]] section of your local.conf file.
To enable the plugin, add a line of the form::
enable_plugin cinderlib <GITURL> [GITREF]
where::
<GITURL> is the URL of a cinderlib repository
[GITREF] is an optional git ref (branch/ref/tag). The default is master.
For example::
enable_plugin cinderlib https://git.openstack.org/openstack/cinderlib
Another example using Stein's stable branch::
enable_plugin cinderlib https://git.openstack.org/openstack/cinderlib stable/stein
The cinderlib DevStack plugin will install cinderlib from Git by default, but
it can be installed from PyPi using the ``CINDERLIB_FROM_GIT`` configuration
option::
CINDERLIB_FROM_GIT=False
The plugin will also generate the code equivalent to the deployed Cinder's
configuration in ``$CINDERLIB_SAMPLE_DIR/cinderlib.py`` which defaults to the
same directory where the Cinder configuration is saved.
For more information, see the `DevStack plugin documentation
<https://docs.openstack.org/devstack/latest/plugins.html>`_.

View File

@ -0,0 +1,7 @@
ALL_LIBS+=" cinderlib"
CINDERLIB_FROM_GIT=$(trueorfalse True CINDERLIB_FROM_GIT)
if [[ "$CINDERLIB_FROM_GIT" == "True" ]]; then
PROJECTS="openstack/cinderlib $PROJECTS"
LIBS_FROM_GIT="cinderlib,$LIBS_FROM_GIT"
fi

40
devstack/plugin.sh Normal file
View File

@ -0,0 +1,40 @@
#!/bin/bash
# plugin.sh - DevStack plugin.sh dispatch script for cinderlib
_XTRACE_CINDERLIB=$(set +o | grep xtrace)
function install_cinderlib {
if use_library_from_git "cinderlib"; then
git_clone_by_name "cinderlib"
setup_dev_lib "cinderlib"
else
pip_install cinderlib
fi
}
stable_compare="stable/[a-r]"
# Cinderlib only makes sense if Cinder is enabled and we are in stein or later
if [[ ! "${GITBRANCH["cinderlib"]}" =~ $stable_compare ]] && is_service_enabled cinder; then
if [[ "$1" == "stack" && "$2" == "install" ]]; then
# Perform installation of service source
echo_summary "Installing cinderlib"
install_cinderlib
# Plugins such as Ceph configure themselves at post-config, so we have to
# configure ourselves at the next stage, "extra"
elif [[ "$1" == "stack" && "$2" == "extra" ]]; then
# Generate the cinderlib configuration
echo_summary "Generating cinderlib initialization example python code"
sudo cinder-cfg-to-cinderlib-code $CINDER_CONF $CINDERLIB_SAMPLE
fi
if [[ "$1" == "clean" || "$1" == "unstack" ]]; then
echo_summary "Removing cinderlib and its code example from cinder.conf"
sudo rm -f $CINDERLIB_SAMPLE
pip_uninstall cinderlib
fi
fi
# Restore xtrace
$_XTRACE_CINDERLIB

9
devstack/settings Normal file
View File

@ -0,0 +1,9 @@
# Defaults
# --------
# Set up default directories
CINDERLIB_SAMPLE_DIR=${CINDERLIB_CONF_DIR:-/etc/cinder}
CINDERLIB_SAMPLE=$CINDERLIB_SAMPLE_DIR/cinderlib.py
CINDERLIB_FROM_GIT=$(trueorfalse True CINDERLIB_FROM_GIT)
define_plugin cinderlib

View File

@ -38,6 +38,8 @@ cinderlib.persistence.storage =
memory = cinderlib.persistence.memory:MemoryPersistence
db = cinderlib.persistence.dbms:DBPersistence
memory_db = cinderlib.persistence.dbms:MemoryDBPersistence
console_scripts =
cinder-cfg-to-cinderlib-code = cinderlib.cmd.cinder_cfg_to_python:main
[egg_info]
tag_build =