]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Sync latest Oslo config code for i18n
authorJay S. Bryant <jsbryant@us.ibm.com>
Mon, 24 Feb 2014 01:51:41 +0000 (19:51 -0600)
committerJay S. Bryant <jsbryant@us.ibm.com>
Thu, 6 Mar 2014 16:07:22 +0000 (10:07 -0600)
This sync pulls the latest Oslo config code over
to Cinder.  This sync is needed to include a fix
to config generator which is needed as part of
the work to enabled i18n messages.  Config generator
was failing when lazy message translation was enabled.

The following changes are included with this patch. Each
patch includes the file(s) the patch touches:
-> c178e56 Add basic Python 3 tests
--> cinder/openstack/common/__init__.py
-> 12bcdb7 Remove vim header
--> cinder/openstack/common/__init__.py
-> 547ab34 Fix Copyright Headers - Rename LLC to Foundation
--> cinder/openstack/common/__init__.py
-> 44b6ea3 Import oslo.config configuration file generator
--> cinder/openstack/common/config/__init__.py
-> dd9aa2b Remove unused variables
--> cinder/openstack/common/config/generator.py
-> 5dce17b Use entry points to discover options in libraries
--> tools/config/generate_sample.sh
--> cinder/openstack/common/config/generator.py
-> e8e636c generator: add an EXTRA_LIBRARIES env variable
--> cinder/openstack/common/config/generator.py
-> e3dddd7 generator: use EXTRA_* env vars in the bash script
--> tools/config/generate_sample.sh
--> cinder/openstack/common/config/generator.py
-> 6da13e8 generator: rename EXTRA_MODULES_FILE to RC_FILE
--> tools/config/generate_sample.sh
-> 763eedf Fix DictOpt support in config sample generator
--> cinder/openstack/common/config/generator.py
-> e839886 Config generator fails with lazy messages
--> cinder/openstack/common/config/generator.py
-> 343686b Add check_uptodate to tools/config
--> tools/config/check_uptodate.sh

Oslo version:
-> 0f24d82 Fix migration.db_version when no tables
-> Date: Sat, 22 Feb 2014 00:32:18 +0000

Change-Id: I26a95fe96b08d6340b0fce1b9e2949c8e661a946
Closes-Bug: 1280826
Related-bp: i18n-messages

12 files changed:
cinder/openstack/common/__init__.py
cinder/openstack/common/config/__init__.py [new file with mode: 0644]
cinder/openstack/common/config/generator.py [changed mode: 0755->0644]
etc/cinder/cinder.conf.sample
run_tests.sh
tools/conf/check_uptodate.sh [deleted file]
tools/conf/generate_sample.sh [deleted file]
tools/conf/oslo.config.generator.rc [deleted file]
tools/config/check_uptodate.sh [new file with mode: 0755]
tools/config/generate_sample.sh [new file with mode: 0755]
tools/config/oslo.config.generator.rc [new file with mode: 0644]
tox.ini

index 0a3b98867a26034118b09e0ad8ae0a3b43f8c881..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 (file)
@@ -1,15 +0,0 @@
-# vim: tabstop=4 shiftwidth=4 softtabstop=4
-
-# Copyright (c) 2011 Red Hat, Inc.
-#
-#    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.
diff --git a/cinder/openstack/common/config/__init__.py b/cinder/openstack/common/config/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
old mode 100755 (executable)
new mode 100644 (file)
index f72baab..ae112d8
@@ -1,4 +1,5 @@
 # Copyright 2012 SINA Corporation
+# Copyright 2014 Cisco Systems, Inc.
 # All Rights Reserved.
 #
 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
@@ -18,6 +19,7 @@
 
 from __future__ import print_function
 
+import argparse
 import imp
 import os
 import re
@@ -27,6 +29,7 @@ import textwrap
 
 from oslo.config import cfg
 import six
+import stevedore.named
 
 from cinder.openstack.common import gettextutils
 from cinder.openstack.common import importutils
@@ -38,6 +41,7 @@ BOOLOPT = "BoolOpt"
 INTOPT = "IntOpt"
 FLOATOPT = "FloatOpt"
 LISTOPT = "ListOpt"
+DICTOPT = "DictOpt"
 MULTISTROPT = "MultiStrOpt"
 
 OPT_TYPES = {
@@ -46,11 +50,12 @@ OPT_TYPES = {
     INTOPT: 'integer value',
     FLOATOPT: 'floating point value',
     LISTOPT: 'list value',
+    DICTOPT: 'dict value',
     MULTISTROPT: 'multi valued',
 }
 
 OPTION_REGEX = re.compile(r"(%s)" % "|".join([STROPT, BOOLOPT, INTOPT,
-                                              FLOATOPT, LISTOPT,
+                                              FLOATOPT, LISTOPT, DICTOPT,
                                               MULTISTROPT]))
 
 PY_EXT = ".py"
@@ -59,34 +64,55 @@ BASEDIR = os.path.abspath(os.path.join(os.path.dirname(__file__),
 WORDWRAP_WIDTH = 60
 
 
-def generate(srcfiles):
+def generate(argv):
+    parser = argparse.ArgumentParser(
+        description='generate sample configuration file',
+    )
+    parser.add_argument('-m', dest='modules', action='append')
+    parser.add_argument('-l', dest='libraries', action='append')
+    parser.add_argument('srcfiles', nargs='*')
+    parsed_args = parser.parse_args(argv)
+
     mods_by_pkg = dict()
-    for filepath in srcfiles:
+    for filepath in parsed_args.srcfiles:
         pkg_name = filepath.split(os.sep)[1]
         mod_str = '.'.join(['.'.join(filepath.split(os.sep)[:-1]),
                             os.path.basename(filepath).split('.')[0]])
         mods_by_pkg.setdefault(pkg_name, list()).append(mod_str)
     # NOTE(lzyeval): place top level modules before packages
-    pkg_names = filter(lambda x: x.endswith(PY_EXT), mods_by_pkg.keys())
-    pkg_names.sort()
-    ext_names = filter(lambda x: x not in pkg_names, mods_by_pkg.keys())
-    ext_names.sort()
+    pkg_names = sorted(pkg for pkg in mods_by_pkg if pkg.endswith(PY_EXT))
+    ext_names = sorted(pkg for pkg in mods_by_pkg if pkg not in pkg_names)
     pkg_names.extend(ext_names)
 
     # opts_by_group is a mapping of group name to an options list
     # The options list is a list of (module, options) tuples
     opts_by_group = {'DEFAULT': []}
 
-    extra_modules = os.getenv("OSLO_CONFIG_GENERATOR_EXTRA_MODULES", "")
-    if extra_modules:
-        for module_name in extra_modules.split(','):
-            module_name = module_name.strip()
+    if parsed_args.modules:
+        for module_name in parsed_args.modules:
             module = _import_module(module_name)
             if module:
                 for group, opts in _list_opts(module):
                     opts_by_group.setdefault(group, []).append((module_name,
                                                                 opts))
 
+    # Look for entry points defined in libraries (or applications) for
+    # option discovery, and include their return values in the output.
+    #
+    # Each entry point should be a function returning an iterable
+    # of pairs with the group name (or None for the default group)
+    # and the list of Opt instances for that group.
+    if parsed_args.libraries:
+        loader = stevedore.named.NamedExtensionManager(
+            'oslo.config.opts',
+            names=list(set(parsed_args.libraries)),
+            invoke_on_load=False,
+        )
+        for ext in loader:
+            for group, opts in ext.plugin():
+                opt_list = opts_by_group.setdefault(group or 'DEFAULT', [])
+                opt_list.append((ext.name, opts))
+
     for pkg_name in pkg_names:
         mods = mods_by_pkg.get(pkg_name)
         mods.sort()
@@ -102,8 +128,8 @@ def generate(srcfiles):
                 opts_by_group.setdefault(group, []).append((mod_str, opts))
 
     print_group_opts('DEFAULT', opts_by_group.pop('DEFAULT', []))
-    for group, opts in opts_by_group.items():
-        print_group_opts(group, opts)
+    for group in sorted(opts_by_group.keys()):
+        print_group_opts(group, opts_by_group[group])
 
 
 def _import_module(mod_str):
@@ -120,8 +146,10 @@ def _import_module(mod_str):
 
 def _is_in_group(opt, group):
     "Check if opt is in group."
-    for key, value in group._opts.items():
-        if value['opt'] == opt:
+    for value in group._opts.values():
+        # NOTE(llu): Temporary workaround for bug #1262148, wait until
+        # newly released oslo.config support '==' operator.
+        if not(value['opt'] != opt):
             return True
     return False
 
@@ -132,7 +160,7 @@ def _guess_groups(opt, mod_obj):
         return 'DEFAULT'
 
     # what other groups is it in?
-    for key, value in cfg.CONF.items():
+    for value in cfg.CONF.values():
         if isinstance(value, cfg.CONF.GroupAttr):
             if _is_in_group(opt, value._group):
                 return value._group.name
@@ -219,7 +247,8 @@ def _print_opt(opt):
     except (ValueError, AttributeError) as err:
         sys.stderr.write("%s\n" % str(err))
         sys.exit(1)
-    opt_help += ' (' + OPT_TYPES[opt_type] + ')'
+    opt_help = u'%s (%s)' % (opt_help,
+                             OPT_TYPES[opt_type])
     print('#', "\n# ".join(textwrap.wrap(opt_help, WORDWRAP_WIDTH)))
     if opt.deprecated_opts:
         for deprecated_opt in opt.deprecated_opts:
@@ -249,6 +278,11 @@ def _print_opt(opt):
         elif opt_type == LISTOPT:
             assert(isinstance(opt_default, list))
             print('#%s=%s' % (opt_name, ','.join(opt_default)))
+        elif opt_type == DICTOPT:
+            assert(isinstance(opt_default, dict))
+            opt_default_strlist = [str(key) + ':' + str(value)
+                                   for (key, value) in opt_default.items()]
+            print('#%s=%s' % (opt_name, ','.join(opt_default_strlist)))
         elif opt_type == MULTISTROPT:
             assert(isinstance(opt_default, list))
             if not opt_default:
index 35c2f2a224df13b721eebc3d3490db37b54157e4..53336220fcd7604dfccd281762d9ebe71d4f9398 100644 (file)
 #extra_capabilities={}
 
 
-[fc-zone-manager]
+[BRCD_FABRIC_EXAMPLE]
 
 #
-# Options defined in cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver
+# Options defined in cinder.zonemanager.drivers.brocade.brcd_fabric_opts
 #
 
-# Southbound connector for zoning operation (string value)
-#brcd_sb_connector=cinder.zonemanager.drivers.brocade.brcd_fc_zone_client_cli.BrcdFCZoneClientCLI
+# Management IP of fabric (string value)
+#fc_fabric_address=
 
+# Fabric user ID (string value)
+#fc_fabric_user=
 
-#
-# Options defined in cinder.zonemanager.fc_zone_manager
-#
+# Password for user (string value)
+#fc_fabric_password=
 
-# FC Zone Driver responsible for zone management (string
-# value)
-#zone_driver=cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver.BrcdFCZoneDriver
+# Connecting port (integer value)
+#fc_fabric_port=22
 
-# Zoning policy configured by user (string value)
+# overridden zoning policy (string value)
 #zoning_policy=initiator-target
 
-# Comma separated list of fibre channel fabric names. This
-# list of names is used to retrieve other SAN credentials for
-# connecting to each SAN fabric (string value)
-#fc_fabric_names=<None>
-
-# FC San Lookup Service (string value)
-#fc_san_lookup_service=cinder.zonemanager.drivers.brocade.brcd_fc_san_lookup_service.BrcdFCSanLookupService
-
-
-[ssl]
-
-#
-# Options defined in cinder.openstack.common.sslutils
-#
-
-# CA certificate file to use to verify connecting clients
-# (string value)
-#ca_file=<None>
+# overridden zoning activation state (boolean value)
+#zone_activate=true
 
-# Certificate file to use when starting the server securely
-# (string value)
-#cert_file=<None>
+# overridden zone name prefix (string value)
+#zone_name_prefix=<None>
 
-# Private key file to use when starting the server securely
-# (string value)
-#key_file=<None>
+# Principal switch WWN of the fabric (string value)
+#principal_switch_wwn=<None>
 
 
 [database]
 #connection_trace=false
 
 
-[keymgr]
+[fc-zone-manager]
 
 #
-# Options defined in cinder.keymgr
+# Options defined in cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver
 #
 
-# The full class name of the key manager API class (string
-# value)
-#api_class=cinder.keymgr.conf_key_mgr.ConfKeyManager
+# Southbound connector for zoning operation (string value)
+#brcd_sb_connector=cinder.zonemanager.drivers.brocade.brcd_fc_zone_client_cli.BrcdFCZoneClientCLI
 
 
 #
-# Options defined in cinder.keymgr.conf_key_mgr
+# Options defined in cinder.zonemanager.fc_zone_manager
 #
 
-# Fixed key returned by key manager, specified in hex (string
+# FC Zone Driver responsible for zone management (string
 # value)
-#fixed_key=<None>
-
+#zone_driver=cinder.zonemanager.drivers.brocade.brcd_fc_zone_driver.BrcdFCZoneDriver
 
-[rpc_notifier2]
+# Zoning policy configured by user (string value)
+#zoning_policy=initiator-target
 
-#
-# Options defined in cinder.openstack.common.notifier.rpc_notifier2
-#
+# Comma separated list of fibre channel fabric names. This
+# list of names is used to retrieve other SAN credentials for
+# connecting to each SAN fabric (string value)
+#fc_fabric_names=<None>
 
-# AMQP topic(s) used for OpenStack notifications (list value)
-#topics=notifications
+# FC San Lookup Service (string value)
+#fc_san_lookup_service=cinder.zonemanager.drivers.brocade.brcd_fc_san_lookup_service.BrcdFCSanLookupService
 
 
-[matchmaker_redis]
+[keymgr]
 
 #
-# Options defined in cinder.openstack.common.rpc.matchmaker_redis
+# Options defined in cinder.keymgr
 #
 
-# Host to locate redis (string value)
-#host=127.0.0.1
+# The full class name of the key manager API class (string
+# value)
+#api_class=cinder.keymgr.conf_key_mgr.ConfKeyManager
 
-# Use this port to connect to redis host. (integer value)
-#port=6379
 
-# Password for Redis server. (optional) (string value)
-#password=<None>
+#
+# Options defined in cinder.keymgr.conf_key_mgr
+#
+
+# Fixed key returned by key manager, specified in hex (string
+# value)
+#fixed_key=<None>
 
 
 [keystone_authtoken]
 #enforce_token_bind=permissive
 
 
-[BRCD_FABRIC_EXAMPLE]
+[matchmaker_redis]
 
 #
-# Options defined in cinder.zonemanager.drivers.brocade.brcd_fabric_opts
+# Options defined in cinder.openstack.common.rpc.matchmaker_redis
 #
 
-# Management IP of fabric (string value)
-#fc_fabric_address=
-
-# Fabric user ID (string value)
-#fc_fabric_user=
-
-# Password for user (string value)
-#fc_fabric_password=
-
-# Connecting port (integer value)
-#fc_fabric_port=22
-
-# overridden zoning policy (string value)
-#zoning_policy=initiator-target
-
-# overridden zoning activation state (boolean value)
-#zone_activate=true
+# Host to locate redis (string value)
+#host=127.0.0.1
 
-# overridden zone name prefix (string value)
-#zone_name_prefix=<None>
+# Use this port to connect to redis host. (integer value)
+#port=6379
 
-# Principal switch WWN of the fabric (string value)
-#principal_switch_wwn=<None>
+# Password for Redis server. (optional) (string value)
+#password=<None>
 
 
 [matchmaker_ring]
 #ringfile=/etc/oslo/matchmaker_ring.json
 
 
+[rpc_notifier2]
+
+#
+# Options defined in cinder.openstack.common.notifier.rpc_notifier2
+#
+
+# AMQP topic(s) used for OpenStack notifications (list value)
+#topics=notifications
+
+
+[ssl]
+
+#
+# Options defined in cinder.openstack.common.sslutils
+#
+
+# CA certificate file to use to verify connecting clients
+# (string value)
+#ca_file=<None>
+
+# Certificate file to use when starting the server securely
+# (string value)
+#cert_file=<None>
+
+# Private key file to use when starting the server securely
+# (string value)
+#key_file=<None>
+
+
index 726ff438a07725f3a4538007ab0c864b0c43c58d..2dd7a0f6e21259bc0790c2365668af8cb61f5b27 100755 (executable)
@@ -221,7 +221,7 @@ fi
 
 if [ $just_pep8 -eq 1 ]; then
     run_pep8
-    ${wrapper}   bash ./tools/conf/check_uptodate.sh
+    ${wrapper}   bash ./tools/config/check_uptodate.sh
     exit
 fi
 
@@ -238,6 +238,6 @@ run_tests
 if [ -z "$testrargs" ]; then
   if [ $no_pep8 -eq 0 ]; then
     run_pep8
-    ${wrapper} bash ./tools/conf/check_uptodate.sh
+    ${wrapper} bash ./tools/config/check_uptodate.sh
   fi
 fi
diff --git a/tools/conf/check_uptodate.sh b/tools/conf/check_uptodate.sh
deleted file mode 100755 (executable)
index bfe199b..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-TEMPDIR=`mktemp -d`
-CFGFILE=cinder.conf.sample
-tools/conf/generate_sample.sh -o $TEMPDIR
-if ! diff $TEMPDIR/$CFGFILE etc/cinder/$CFGFILE
-then
-    echo "E: cinder.conf.sample is not up to date, please run tools/conf/generate_sample.sh in venv"
-    echo "E: e.g. \$ source .venv/bin/activate; tools/conf/generate_sample.sh"
-    rm -rf $TEMPDIR
-    exit 42
-fi
-rm -rf $TEMPDIR
diff --git a/tools/conf/generate_sample.sh b/tools/conf/generate_sample.sh
deleted file mode 100755 (executable)
index 9273079..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#!/usr/bin/env bash
-
-print_hint() {
-    echo "Try \`${0##*/} --help' for more information." >&2
-}
-
-PARSED_OPTIONS=$(getopt -n "${0##*/}" -o ho: \
-                 --long help,output-dir: -- "$@")
-
-if [ $? != 0 ] ; then print_hint ; exit 1 ; fi
-
-eval set -- "$PARSED_OPTIONS"
-
-while true; do
-    case "$1" in
-        -h|--help)
-            echo "${0##*/} [options]"
-            echo ""
-            echo "options:"
-            echo "-h, --help                show brief help"
-            echo "-o, --output-dir=DIR      File output directory"
-            exit 0
-            ;;
-        -o|--output-dir)
-            shift
-            OUTPUTDIR=`echo $1 | sed -e 's/\/*$//g'`
-            shift
-            ;;
-        --)
-            break
-            ;;
-    esac
-done
-
-OUTPUTDIR=${OUTPUTDIR:-etc/cinder}
-if ! [ -d $OUTPUTDIR ]
-then
-    echo "${0##*/}: cannot access \`$OUTPUTDIR': No such file or directory" >&2
-    exit 1
-fi
-
-OUTPUTFILE=$OUTPUTDIR/cinder.conf.sample
-FILES=$(find cinder -type f -name "*.py" ! -path "cinder/tests/*" -exec \
-    grep -l "Opt(" {} \; | sort -u)
-
-EXTRA_MODULES_FILE="`dirname $0`/oslo.config.generator.rc"
-if test -r "$EXTRA_MODULES_FILE"
-then
-    source "$EXTRA_MODULES_FILE"
-fi
-
-export EVENTLET_NO_GREENDNS=yes
-
-PYTHONPATH=./:${PYTHONPATH} \
-    python $(dirname "$0")/../../cinder/openstack/common/config/generator.py ${FILES} > \
-    $OUTPUTFILE
diff --git a/tools/conf/oslo.config.generator.rc b/tools/conf/oslo.config.generator.rc
deleted file mode 100644 (file)
index a5ee3e6..0000000
+++ /dev/null
@@ -1 +0,0 @@
-export OSLO_CONFIG_GENERATOR_EXTRA_MODULES=keystoneclient.middleware.auth_token
\ No newline at end of file
diff --git a/tools/config/check_uptodate.sh b/tools/config/check_uptodate.sh
new file mode 100755 (executable)
index 0000000..55f01c9
--- /dev/null
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+PROJECT_NAME=${PROJECT_NAME:-cinder}
+CFGFILE_NAME=${PROJECT_NAME}.conf.sample
+
+if [ -e etc/${PROJECT_NAME}/${CFGFILE_NAME} ]; then
+    CFGFILE=etc/${PROJECT_NAME}/${CFGFILE_NAME}
+elif [ -e etc/${CFGFILE_NAME} ]; then
+    CFGFILE=etc/${CFGFILE_NAME}
+else
+    echo "${0##*/}: can not find config file"
+    exit 1
+fi
+
+TEMPDIR=`mktemp -d /tmp/${PROJECT_NAME}.XXXXXX`
+trap "rm -rf $TEMPDIR" EXIT
+
+tools/config/generate_sample.sh -b ./ -p ${PROJECT_NAME} -o ${TEMPDIR}
+
+if ! diff -u ${TEMPDIR}/${CFGFILE_NAME} ${CFGFILE}
+then
+   echo "${0##*/}: ${PROJECT_NAME}.conf.sample is not up to date."
+   echo "${0##*/}: Please run ${0%%${0##*/}}generate_sample.sh."
+   exit 1
+fi
diff --git a/tools/config/generate_sample.sh b/tools/config/generate_sample.sh
new file mode 100755 (executable)
index 0000000..b947180
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/bin/env bash
+
+print_hint() {
+    echo "Try \`${0##*/} --help' for more information." >&2
+}
+
+PARSED_OPTIONS=$(getopt -n "${0##*/}" -o hb:p:m:l:o: \
+                 --long help,base-dir:,package-name:,output-dir:,module:,library: -- "$@")
+
+if [ $? != 0 ] ; then print_hint ; exit 1 ; fi
+
+eval set -- "$PARSED_OPTIONS"
+
+while true; do
+    case "$1" in
+        -h|--help)
+            echo "${0##*/} [options]"
+            echo ""
+            echo "options:"
+            echo "-h, --help                show brief help"
+            echo "-b, --base-dir=DIR        project base directory"
+            echo "-p, --package-name=NAME   project package name"
+            echo "-o, --output-dir=DIR      file output directory"
+            echo "-m, --module=MOD          extra python module to interrogate for options"
+            echo "-l, --library=LIB         extra library that registers options for discovery"
+            exit 0
+            ;;
+        -b|--base-dir)
+            shift
+            BASEDIR=`echo $1 | sed -e 's/\/*$//g'`
+            shift
+            ;;
+        -p|--package-name)
+            shift
+            PACKAGENAME=`echo $1`
+            shift
+            ;;
+        -o|--output-dir)
+            shift
+            OUTPUTDIR=`echo $1 | sed -e 's/\/*$//g'`
+            shift
+            ;;
+        -m|--module)
+            shift
+            MODULES="$MODULES -m $1"
+            shift
+            ;;
+        -l|--library)
+            shift
+            LIBRARIES="$LIBRARIES -l $1"
+            shift
+            ;;
+        --)
+            break
+            ;;
+    esac
+done
+
+BASEDIR=${BASEDIR:-`pwd`}
+if ! [ -d $BASEDIR ]
+then
+    echo "${0##*/}: missing project base directory" >&2 ; print_hint ; exit 1
+elif [[ $BASEDIR != /* ]]
+then
+    BASEDIR=$(cd "$BASEDIR" && pwd)
+fi
+
+PACKAGENAME=${PACKAGENAME:-${BASEDIR##*/}}
+TARGETDIR=$BASEDIR/$PACKAGENAME
+if ! [ -d $TARGETDIR ]
+then
+    echo "${0##*/}: invalid project package name" >&2 ; print_hint ; exit 1
+fi
+
+OUTPUTDIR=${OUTPUTDIR:-$BASEDIR/etc}
+# NOTE(bnemec): Some projects put their sample config in etc/,
+#               some in etc/$PACKAGENAME/
+if [ -d $OUTPUTDIR/$PACKAGENAME ]
+then
+    OUTPUTDIR=$OUTPUTDIR/$PACKAGENAME
+elif ! [ -d $OUTPUTDIR ]
+then
+    echo "${0##*/}: cannot access \`$OUTPUTDIR': No such file or directory" >&2
+    exit 1
+fi
+
+BASEDIRESC=`echo $BASEDIR | sed -e 's/\//\\\\\//g'`
+find $TARGETDIR -type f -name "*.pyc" -delete
+FILES=$(find $TARGETDIR -type f -name "*.py" ! -path "*/tests/*" \
+        -exec grep -l "Opt(" {} + | sed -e "s/^$BASEDIRESC\///g" | sort -u)
+
+RC_FILE="`dirname $0`/oslo.config.generator.rc"
+if test -r "$RC_FILE"
+then
+    source "$RC_FILE"
+fi
+
+for mod in ${CINDER_CONFIG_GENERATOR_EXTRA_MODULES}; do
+    MODULES="$MODULES -m $mod"
+done
+
+for lib in ${CINDER_CONFIG_GENERATOR_EXTRA_LIBRARIES}; do
+    LIBRARIES="$LIBRARIES -l $lib"
+done
+
+export EVENTLET_NO_GREENDNS=yes
+
+OS_VARS=$(set | sed -n '/^OS_/s/=[^=]*$//gp' | xargs)
+[ "$OS_VARS" ] && eval "unset \$OS_VARS"
+DEFAULT_MODULEPATH=cinder.openstack.common.config.generator
+MODULEPATH=${MODULEPATH:-$DEFAULT_MODULEPATH}
+OUTPUTFILE=$OUTPUTDIR/$PACKAGENAME.conf.sample
+python -m $MODULEPATH $MODULES $LIBRARIES $FILES > $OUTPUTFILE
+
+# Hook to allow projects to append custom config file snippets
+CONCAT_FILES=$(ls $BASEDIR/tools/config/*.conf.sample 2>/dev/null)
+for CONCAT_FILE in $CONCAT_FILES; do
+    cat $CONCAT_FILE >> $OUTPUTFILE
+done
diff --git a/tools/config/oslo.config.generator.rc b/tools/config/oslo.config.generator.rc
new file mode 100644 (file)
index 0000000..dec7f09
--- /dev/null
@@ -0,0 +1 @@
+export CINDER_CONFIG_GENERATOR_EXTRA_MODULES=keystoneclient.middleware.auth_token
diff --git a/tox.ini b/tox.ini
index e8732e96ecf171984f0ba218a5f1ac7614d38f00..2f306065eb8ff7b60cb24923f31c7b2de2931dc1 100644 (file)
--- a/tox.ini
+++ b/tox.ini
@@ -12,7 +12,7 @@ deps = -r{toxinidir}/requirements.txt
        -r{toxinidir}/test-requirements.txt
 commands =
   python setup.py testr --slowest --testr-args='--concurrency 1 {posargs}'
-  {toxinidir}/tools/conf/check_uptodate.sh
+  {toxinidir}/tools/config/check_uptodate.sh
 
 [tox:jenkins]
 downloadcache = ~/cache/pip