From 9c35506c1053bf9812a882931dfa945c3bd7c5b3 Mon Sep 17 00:00:00 2001 From: Mark McLoughlin Date: Tue, 29 May 2012 08:57:58 +0100 Subject: [PATCH] Use cfg's new global CONF object Implements blueprint cfg-global-object Replace nova.flags.FLAGS with openstack.common.cfg.CONF. In future, we can do a s/FLAGS/CONF/ across the codebase. Change-Id: Ib293873089a5399febd7a3b0410f66e9bef115f1 --- bin/clear_rabbit_queues | 4 +-- bin/instance-usage-audit | 3 +- bin/nova-all | 3 +- bin/nova-api | 3 +- bin/nova-api-ec2 | 3 +- bin/nova-api-metadata | 3 +- bin/nova-api-os-compute | 3 +- bin/nova-api-os-volume | 3 +- bin/nova-cert | 3 +- bin/nova-compute | 3 +- bin/nova-console | 4 +-- bin/nova-consoleauth | 4 +-- bin/nova-dhcpbridge | 3 +- bin/nova-manage | 31 +++++++++---------- bin/nova-network | 3 +- bin/nova-objectstore | 3 +- bin/nova-scheduler | 3 +- bin/nova-volume | 3 +- bin/nova-xvpvncproxy | 4 +-- nova/flags.py | 17 ++++------- nova/tests/test_flags.py | 66 +++++++++++++++------------------------- 21 files changed, 63 insertions(+), 109 deletions(-) diff --git a/bin/clear_rabbit_queues b/bin/clear_rabbit_queues index 37394add..1912046b 100755 --- a/bin/clear_rabbit_queues +++ b/bin/clear_rabbit_queues @@ -46,7 +46,6 @@ from nova import flags from nova import log as logging from nova.openstack.common import cfg from nova import rpc -from nova import utils delete_exchange_opt = \ @@ -71,8 +70,7 @@ def delete_queues(queues): x.queue_delete(q) if __name__ == '__main__': - utils.default_cfgfile() - args = flags.FLAGS(sys.argv) + args = flags.parse_args(sys.argv) logging.setup() rpc.register_opts(flags.FLAGS) delete_queues(args[1:]) diff --git a/bin/instance-usage-audit b/bin/instance-usage-audit index 3db812bd..59fff108 100755 --- a/bin/instance-usage-audit +++ b/bin/instance-usage-audit @@ -65,8 +65,7 @@ FLAGS = flags.FLAGS if __name__ == '__main__': rpc.register_opts(FLAGS) admin_context = context.get_admin_context() - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() begin, end = utils.last_completed_audit_period() print "Starting instance usage audit" diff --git a/bin/nova-all b/bin/nova-all index 529d98ed..57e84b0d 100755 --- a/bin/nova-all +++ b/bin/nova-all @@ -51,8 +51,7 @@ from nova.vnc import xvp_proxy LOG = logging.getLogger('nova.all') if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() servers = [] diff --git a/bin/nova-api b/bin/nova-api index 7a601c3a..e6779df4 100755 --- a/bin/nova-api +++ b/bin/nova-api @@ -42,8 +42,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() servers = [] diff --git a/bin/nova-api-ec2 b/bin/nova-api-ec2 index e1a1549c..b53c9158 100755 --- a/bin/nova-api-ec2 +++ b/bin/nova-api-ec2 @@ -38,8 +38,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.WSGIService('ec2') diff --git a/bin/nova-api-metadata b/bin/nova-api-metadata index c4ca541f..2f2ef945 100755 --- a/bin/nova-api-metadata +++ b/bin/nova-api-metadata @@ -38,8 +38,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.WSGIService('metadata') diff --git a/bin/nova-api-os-compute b/bin/nova-api-os-compute index 9c49815f..75c92194 100755 --- a/bin/nova-api-os-compute +++ b/bin/nova-api-os-compute @@ -38,8 +38,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.WSGIService('osapi_compute') diff --git a/bin/nova-api-os-volume b/bin/nova-api-os-volume index 21d5dc3d..b93fd51a 100755 --- a/bin/nova-api-os-volume +++ b/bin/nova-api-os-volume @@ -38,8 +38,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.WSGIService('osapi_volume') diff --git a/bin/nova-cert b/bin/nova-cert index f6a5cbbd..a845c105 100755 --- a/bin/nova-cert +++ b/bin/nova-cert @@ -38,8 +38,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.Service.create(binary='nova-cert') diff --git a/bin/nova-compute b/bin/nova-compute index 8f7e9177..bef7bce8 100755 --- a/bin/nova-compute +++ b/bin/nova-compute @@ -40,8 +40,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.Service.create(binary='nova-compute') diff --git a/bin/nova-console b/bin/nova-console index 06e352f4..f5a760b3 100755 --- a/bin/nova-console +++ b/bin/nova-console @@ -36,11 +36,9 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): from nova import flags from nova import log as logging from nova import service -from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() server = service.Service.create(binary='nova-console') service.serve(server) diff --git a/bin/nova-consoleauth b/bin/nova-consoleauth index 9c566cb7..71d77b28 100755 --- a/bin/nova-consoleauth +++ b/bin/nova-consoleauth @@ -35,12 +35,10 @@ from nova.consoleauth import manager from nova import flags from nova import log as logging from nova import service -from nova import utils if __name__ == "__main__": - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() server = service.Service.create(binary='nova-consoleauth') diff --git a/bin/nova-dhcpbridge b/bin/nova-dhcpbridge index fab334bf..c11947da 100755 --- a/bin/nova-dhcpbridge +++ b/bin/nova-dhcpbridge @@ -96,8 +96,7 @@ def init_leases(network_id): def main(): """Parse environment and arguments and call the approproate action.""" flagfile = os.environ.get('FLAGFILE', FLAGS.dhcpbridge_flagfile) - utils.default_cfgfile(flagfile) - argv = FLAGS(sys.argv) + argv = flags.parse_args(sys.argv) logging.setup() rpc.register_opts(FLAGS) diff --git a/bin/nova-manage b/bin/nova-manage index a4eaf9d6..f0d54d81 100755 --- a/bin/nova-manage +++ b/bin/nova-manage @@ -87,6 +87,7 @@ from nova.db import migration from nova import exception from nova import flags from nova import log as logging +from nova.openstack.common import cfg from nova.openstack.common import importutils from nova import quota from nova import rpc @@ -1668,26 +1669,24 @@ def methods_of(obj): def main(): """Parse options and call the appropriate class/method.""" - cfgfile = utils.default_cfgfile() - - if cfgfile and not os.access(cfgfile, os.R_OK): - st = os.stat(cfgfile) - print "Could not read %s. Re-running with sudo" % cfgfile - try: - os.execvp('sudo', ['sudo', '-u', '#%s' % st.st_uid] + sys.argv) - except Exception: - print 'sudo failed, continuing as if nothing happened' - rpc.register_opts(FLAGS) try: - argv = FLAGS(sys.argv) + argv = flags.parse_args(sys.argv) logging.setup() - except IOError, e: - if e.errno == errno.EACCES: - print _('Please re-run nova-manage as root.') - sys.exit(2) - raise + except cfg.ConfigFilesNotFoundError: + cfgfile = FLAGS.config_file[-1] if FLAGS.config_file else None + if cfgfile and not os.access(cfgfile, os.R_OK): + st = os.stat(cfgfile) + print _("Could not read %s. Re-running with sudo") % cfgfile + try: + os.execvp('sudo', ['sudo', '-u', '#%s' % st.st_uid] + sys.argv) + except Exception: + print _('sudo failed, continuing as if nothing happened') + + print _('Please re-run nova-manage as root.') + sys.exit(2) + script_name = argv.pop(0) if len(argv) < 1: print _("\nOpenStack Nova version: %(version)s (%(vcs)s)\n") % \ diff --git a/bin/nova-network b/bin/nova-network index d176eb27..306eddaf 100755 --- a/bin/nova-network +++ b/bin/nova-network @@ -40,8 +40,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.Service.create(binary='nova-network') diff --git a/bin/nova-objectstore b/bin/nova-objectstore index e52160c2..e9bd0f42 100755 --- a/bin/nova-objectstore +++ b/bin/nova-objectstore @@ -42,8 +42,7 @@ from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = s3server.get_wsgi_server() diff --git a/bin/nova-scheduler b/bin/nova-scheduler index 52db4de7..fb803ab5 100755 --- a/bin/nova-scheduler +++ b/bin/nova-scheduler @@ -42,8 +42,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.Service.create(binary='nova-scheduler') diff --git a/bin/nova-volume b/bin/nova-volume index 1c6ffb58..d8c13b9a 100755 --- a/bin/nova-volume +++ b/bin/nova-volume @@ -40,8 +40,7 @@ from nova import service from nova import utils if __name__ == '__main__': - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() utils.monkey_patch() server = service.Service.create(binary='nova-volume') diff --git a/bin/nova-xvpvncproxy b/bin/nova-xvpvncproxy index 9db07f14..d338d3a3 100755 --- a/bin/nova-xvpvncproxy +++ b/bin/nova-xvpvncproxy @@ -35,15 +35,13 @@ from nova import flags from nova import log as logging from nova import rpc from nova import service -from nova import utils from nova.vnc import xvp_proxy FLAGS = flags.FLAGS if __name__ == "__main__": rpc.register_opts(FLAGS) - utils.default_cfgfile() - flags.FLAGS(sys.argv) + flags.parse_args(sys.argv) logging.setup() wsgi_server = xvp_proxy.get_wsgi_server() diff --git a/nova/flags.py b/nova/flags.py index 337dc979..22b5d7d2 100644 --- a/nova/flags.py +++ b/nova/flags.py @@ -33,19 +33,14 @@ import sys from nova.openstack.common import cfg -class NovaConfigOpts(cfg.CommonConfigOpts): - - def __init__(self, *args, **kwargs): - if 'project' not in kwargs: - kwargs['project'] = 'nova' - super(NovaConfigOpts, self).__init__(*args, **kwargs) - self.disable_interspersed_args() - - def __call__(self, argv): - return argv[:1] + super(NovaConfigOpts, self).__call__(argv[1:]) +FLAGS = cfg.CONF -FLAGS = NovaConfigOpts() +def parse_args(argv, default_config_files=None): + FLAGS.disable_interspersed_args() + return argv[:1] + FLAGS(argv[1:], + project='nova', + default_config_files=default_config_files) class UnrecognizedFlag(Exception): diff --git a/nova/tests/test_flags.py b/nova/tests/test_flags.py index af5198dc..f1baffa0 100644 --- a/nova/tests/test_flags.py +++ b/nova/tests/test_flags.py @@ -34,54 +34,50 @@ class FlagsTestCase(test.TestCase): def setUp(self): super(FlagsTestCase, self).setUp() - self.FLAGS = flags.NovaConfigOpts() - self.global_FLAGS = flags.FLAGS - self.flags(config_file=[]) def test_declare(self): - self.assert_('answer' not in self.global_FLAGS) + self.assert_('answer' not in FLAGS) flags.DECLARE('answer', 'nova.tests.declare_flags') - self.assert_('answer' in self.global_FLAGS) - self.assertEqual(self.global_FLAGS.answer, 42) + self.assert_('answer' in FLAGS) + self.assertEqual(FLAGS.answer, 42) # Make sure we don't overwrite anything - self.global_FLAGS.set_override('answer', 256) - self.assertEqual(self.global_FLAGS.answer, 256) + FLAGS.set_override('answer', 256) + self.assertEqual(FLAGS.answer, 256) flags.DECLARE('answer', 'nova.tests.declare_flags') - self.assertEqual(self.global_FLAGS.answer, 256) + self.assertEqual(FLAGS.answer, 256) def test_getopt_non_interspersed_args(self): - self.assert_('runtime_answer' not in self.global_FLAGS) + self.assert_('runtime_answer' not in FLAGS) argv = ['flags_test', 'extra_arg', '--runtime_answer=60'] - args = self.global_FLAGS(argv) + args = flags.parse_args(argv, default_config_files=[]) self.assertEqual(len(args), 3) self.assertEqual(argv, args) def test_runtime_and_unknown_flags(self): - self.assert_('runtime_answer' not in self.global_FLAGS) + self.assert_('runtime_answer' not in FLAGS) import nova.tests.runtime_flags - self.assert_('runtime_answer' in self.global_FLAGS) - self.assertEqual(self.global_FLAGS.runtime_answer, 54) + self.assert_('runtime_answer' in FLAGS) + self.assertEqual(FLAGS.runtime_answer, 54) def test_long_vs_short_flags(self): - self.global_FLAGS.clear() - self.global_FLAGS.register_cli_opt(cfg.StrOpt('duplicate_answer_long', - default='val', - help='desc')) + FLAGS.clear() + FLAGS.register_cli_opt(cfg.StrOpt('duplicate_answer_long', + default='val', + help='desc')) argv = ['flags_test', '--duplicate_answer=60', 'extra_arg'] - args = self.global_FLAGS(argv) + args = flags.parse_args(argv, default_config_files=[]) - self.assert_('duplicate_answer' not in self.global_FLAGS) - self.assert_(self.global_FLAGS.duplicate_answer_long, 60) + self.assert_('duplicate_answer' not in FLAGS) + self.assert_(FLAGS.duplicate_answer_long, 60) - self.global_FLAGS.clear() - self.global_FLAGS.register_cli_opt(cfg.IntOpt('duplicate_answer', - default=60, - help='desc')) - args = self.global_FLAGS(argv) - self.assertEqual(self.global_FLAGS.duplicate_answer, 60) - self.assertEqual(self.global_FLAGS.duplicate_answer_long, 'val') + FLAGS.clear() + FLAGS.register_cli_opt(cfg.IntOpt('duplicate_answer', + default=60, help='desc')) + args = flags.parse_args(argv, default_config_files=[]) + self.assertEqual(FLAGS.duplicate_answer, 60) + self.assertEqual(FLAGS.duplicate_answer_long, 'val') def test_flag_leak_left(self): self.assertEqual(FLAGS.flags_unittest, 'foo') @@ -99,17 +95,3 @@ class FlagsTestCase(test.TestCase): self.assertEqual(FLAGS.flags_unittest, 'bar') FLAGS.reset() self.assertEqual(FLAGS.flags_unittest, 'foo') - - def test_defaults(self): - self.FLAGS.register_opt(cfg.StrOpt('foo', default='bar', help='desc')) - self.assertEqual(self.FLAGS.foo, 'bar') - - self.FLAGS.set_default('foo', 'blaa') - self.assertEqual(self.FLAGS.foo, 'blaa') - - def test_templated_values(self): - self.FLAGS.register_opt(cfg.StrOpt('foo', default='foo', help='desc')) - self.FLAGS.register_opt(cfg.StrOpt('bar', default='bar', help='desc')) - self.FLAGS.register_opt(cfg.StrOpt('blaa', - default='$foo$bar', help='desc')) - self.assertEqual(self.FLAGS.blaa, 'foobar')