Refactor away the flags.DEFINE_* helpers
The next obvious step in porting to cfg is to define all options using
cfg schemas directly rather than using the flags.DEFINE_* helpers.
This is a large change, but it is almost entirely pure refactoring and
does not result in any functional changes.
The only change to note is that the default values for glance_host,
glance_api_servers and default_publisher_id options are now using opt
value interpolation i.e.
 -glance_host=_get_my_ip()
 +glance_host='$my_ip'
 -glance_api_servers=['%s:%d' % (FLAGS.glance_host, FLAGS.glance_port)]
 +glance_api_servers=['$glance_host:$glance_port']
 -default_publisher_id=FLAGS.host
 +default_publisher_id='$host'
Also note that the lower_bound check on the {report,periodic}_interval
options are no more, but this has been true since cfg was first added.
Change-Id: Ia58c8f0aaf61628bb55b1b8485118a2a9852ed17
			
			
This commit is contained in:
		| @@ -40,6 +40,7 @@ if os.path.exists(os.path.join(POSSIBLE_TOPDIR, 'nova', '__init__.py')): | ||||
| gettext.install('nova', unicode=1) | ||||
|  | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import context | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| @@ -48,8 +49,13 @@ from nova import rpc | ||||
| from nova import utils | ||||
|  | ||||
|  | ||||
| delete_exchange_opt = \ | ||||
|     cfg.BoolOpt('delete_exchange', | ||||
|                 default=False, | ||||
|                 help='delete nova exchange too.') | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_boolean('delete_exchange', False, 'delete nova exchange too.') | ||||
| FLAGS.add_option(delete_exchange_opt) | ||||
|  | ||||
|  | ||||
| def delete_exchange(exch): | ||||
|   | ||||
| @@ -38,6 +38,7 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): | ||||
|     sys.path.insert(0, possible_topdir) | ||||
|  | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| from nova import rpc | ||||
| @@ -45,9 +46,14 @@ from nova import service | ||||
| from nova import utils | ||||
| from nova import wsgi | ||||
|  | ||||
|  | ||||
| ajax_console_idle_timeout_opt = \ | ||||
|     cfg.IntOpt('ajax_console_idle_timeout', | ||||
|                default=300, | ||||
|                help='Seconds before idle connection destroyed') | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_integer('ajax_console_idle_timeout', 300, | ||||
|                      'Seconds before idle connection destroyed') | ||||
| FLAGS.add_option(ajax_console_idle_timeout_opt) | ||||
|  | ||||
| LOG = logging.getLogger('nova.ajax_console_proxy') | ||||
|  | ||||
|   | ||||
| @@ -35,6 +35,7 @@ if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')): | ||||
|     sys.path.insert(0, possible_topdir) | ||||
|  | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import compute | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| @@ -46,9 +47,17 @@ from nova import wsgi | ||||
| from nova.api import direct | ||||
|  | ||||
|  | ||||
| direct_api_opts = [ | ||||
|     cfg.IntOpt('direct_port', | ||||
|                default=8001, | ||||
|                help='Direct API port'), | ||||
|     cfg.StrOpt('direct_host', | ||||
|                default='0.0.0.0', | ||||
|                help='Direct API host'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_integer('direct_port', 8001, 'Direct API port') | ||||
| flags.DEFINE_string('direct_host', '0.0.0.0', 'Direct API host') | ||||
| FLAGS.add_options(direct_api_opts) | ||||
|  | ||||
|  | ||||
| # An example of an API that only exposes read-only methods. | ||||
|   | ||||
| @@ -27,44 +27,68 @@ public methods. | ||||
| import functools | ||||
| import sys | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
|  | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_integer('ldap_schema_version', 2, | ||||
|                      'Current version of the LDAP schema') | ||||
| flags.DEFINE_string('ldap_url', 'ldap://localhost', | ||||
|                     'Point this at your ldap server') | ||||
| flags.DEFINE_string('ldap_password', 'changeme', 'LDAP password') | ||||
| flags.DEFINE_string('ldap_user_dn', 'cn=Manager,dc=example,dc=com', | ||||
|                     'DN of admin user') | ||||
| flags.DEFINE_string('ldap_user_id_attribute', 'uid', 'Attribute to use as id') | ||||
| flags.DEFINE_string('ldap_user_name_attribute', 'cn', | ||||
|                     'Attribute to use as name') | ||||
| flags.DEFINE_string('ldap_user_unit', 'Users', 'OID for Users') | ||||
| flags.DEFINE_string('ldap_user_subtree', 'ou=Users,dc=example,dc=com', | ||||
|                     'OU for Users') | ||||
| flags.DEFINE_boolean('ldap_user_modify_only', False, | ||||
|                     'Modify attributes for users instead of creating/deleting') | ||||
| flags.DEFINE_string('ldap_project_subtree', 'ou=Groups,dc=example,dc=com', | ||||
|                     'OU for Projects') | ||||
| flags.DEFINE_string('role_project_subtree', 'ou=Groups,dc=example,dc=com', | ||||
|                     'OU for Roles') | ||||
| ldap_opts = [ | ||||
|     cfg.IntOpt('ldap_schema_version', | ||||
|                default=2, | ||||
|                help='Current version of the LDAP schema'), | ||||
|     cfg.StrOpt('ldap_url', | ||||
|                default='ldap://localhost', | ||||
|                help='Point this at your ldap server'), | ||||
|     cfg.StrOpt('ldap_password', | ||||
|                default='changeme', | ||||
|                help='LDAP password'), | ||||
|     cfg.StrOpt('ldap_user_dn', | ||||
|                default='cn=Manager,dc=example,dc=com', | ||||
|                help='DN of admin user'), | ||||
|     cfg.StrOpt('ldap_user_id_attribute', | ||||
|                default='uid', | ||||
|                help='Attribute to use as id'), | ||||
|     cfg.StrOpt('ldap_user_name_attribute', | ||||
|                default='cn', | ||||
|                help='Attribute to use as name'), | ||||
|     cfg.StrOpt('ldap_user_unit', | ||||
|                default='Users', | ||||
|                help='OID for Users'), | ||||
|     cfg.StrOpt('ldap_user_subtree', | ||||
|                default='ou=Users,dc=example,dc=com', | ||||
|                help='OU for Users'), | ||||
|     cfg.BoolOpt('ldap_user_modify_only', | ||||
|                 default=False, | ||||
|                 help='Modify user attributes instead of creating/deleting'), | ||||
|     cfg.StrOpt('ldap_project_subtree', | ||||
|                default='ou=Groups,dc=example,dc=com', | ||||
|                help='OU for Projects'), | ||||
|     cfg.StrOpt('role_project_subtree', | ||||
|                default='ou=Groups,dc=example,dc=com', | ||||
|                help='OU for Roles'), | ||||
|  | ||||
| # NOTE(vish): mapping with these flags is necessary because we're going | ||||
| #             to tie in to an existing ldap schema | ||||
| flags.DEFINE_string('ldap_cloudadmin', | ||||
|     'cn=cloudadmins,ou=Groups,dc=example,dc=com', 'cn for Cloud Admins') | ||||
| flags.DEFINE_string('ldap_itsec', | ||||
|     'cn=itsec,ou=Groups,dc=example,dc=com', 'cn for ItSec') | ||||
| flags.DEFINE_string('ldap_sysadmin', | ||||
|     'cn=sysadmins,ou=Groups,dc=example,dc=com', 'cn for Sysadmins') | ||||
| flags.DEFINE_string('ldap_netadmin', | ||||
|     'cn=netadmins,ou=Groups,dc=example,dc=com', 'cn for NetAdmins') | ||||
| flags.DEFINE_string('ldap_developer', | ||||
|     'cn=developers,ou=Groups,dc=example,dc=com', 'cn for Developers') | ||||
|     # NOTE(vish): mapping with these flags is necessary because we're going | ||||
|     #             to tie in to an existing ldap schema | ||||
|     cfg.StrOpt('ldap_cloudadmin', | ||||
|                default='cn=cloudadmins,ou=Groups,dc=example,dc=com', | ||||
|                help='cn for Cloud Admins'), | ||||
|     cfg.StrOpt('ldap_itsec', | ||||
|                default='cn=itsec,ou=Groups,dc=example,dc=com', | ||||
|                help='cn for ItSec'), | ||||
|     cfg.StrOpt('ldap_sysadmin', | ||||
|                default='cn=sysadmins,ou=Groups,dc=example,dc=com', | ||||
|                help='cn for Sysadmins'), | ||||
|     cfg.StrOpt('ldap_netadmin', | ||||
|                default='cn=netadmins,ou=Groups,dc=example,dc=com', | ||||
|                help='cn for NetAdmins'), | ||||
|     cfg.StrOpt('ldap_developer', | ||||
|                default='cn=developers,ou=Groups,dc=example,dc=com', | ||||
|                help='cn for Developers'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_options(ldap_opts) | ||||
|  | ||||
| LOG = logging.getLogger("nova.ldapdriver") | ||||
|  | ||||
|   | ||||
| @@ -30,6 +30,7 @@ import tempfile | ||||
| import uuid | ||||
| import zipfile | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import context | ||||
| from nova import crypto | ||||
| from nova import db | ||||
| @@ -40,45 +41,61 @@ from nova import utils | ||||
| from nova.auth import signer | ||||
|  | ||||
|  | ||||
| auth_opts = [ | ||||
|     cfg.BoolOpt('use_deprecated_auth', | ||||
|                 default=False, | ||||
|                 help='This flag must be set to use old style auth'), | ||||
|     cfg.ListOpt('allowed_roles', | ||||
|                 default=[ | ||||
|                   'cloudadmin', | ||||
|                   'itsec', | ||||
|                   'sysadmin', | ||||
|                   'netadmin', | ||||
|                   'developer' | ||||
|                   ], | ||||
|                 help='Allowed roles for project'), | ||||
|  | ||||
|     # NOTE(vish): a user with one of these roles will be a superuser and | ||||
|     #             have access to all api commands | ||||
|     cfg.ListOpt('superuser_roles', | ||||
|                 default=['cloudadmin'], | ||||
|                 help='Roles that ignore authorization checking completely'), | ||||
|  | ||||
|     # NOTE(vish): a user with one of these roles will have it for every | ||||
|     #             project, even if he or she is not a member of the project | ||||
|     cfg.ListOpt('global_roles', | ||||
|                 default=['cloudadmin', 'itsec'], | ||||
|                 help='Roles that apply to all projects'), | ||||
|  | ||||
|     cfg.StrOpt('credentials_template', | ||||
|                default=utils.abspath('auth/novarc.template'), | ||||
|                help='Template for creating users rc file'), | ||||
|     cfg.StrOpt('vpn_client_template', | ||||
|                default=utils.abspath('cloudpipe/client.ovpn.template'), | ||||
|                help='Template for creating users vpn file'), | ||||
|     cfg.StrOpt('credential_vpn_file', | ||||
|                default='nova-vpn.conf', | ||||
|                help='Filename of certificate in credentials zip'), | ||||
|     cfg.StrOpt('credential_key_file', | ||||
|                default='pk.pem', | ||||
|                help='Filename of private key in credentials zip'), | ||||
|     cfg.StrOpt('credential_cert_file', | ||||
|                default='cert.pem', | ||||
|                help='Filename of certificate in credentials zip'), | ||||
|     cfg.StrOpt('credential_rc_file', | ||||
|                default='%src', | ||||
|                help='Filename of rc in credentials zip %s will be replaced by ' | ||||
|                     'name of the region (nova by default)'), | ||||
|     cfg.StrOpt('auth_driver', | ||||
|                default='nova.auth.dbdriver.DbDriver', | ||||
|                help='Driver that auth manager uses'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_bool('use_deprecated_auth', | ||||
|                   False, | ||||
|                   'This flag must be set to use old style auth') | ||||
|  | ||||
| flags.DEFINE_list('allowed_roles', | ||||
|                   ['cloudadmin', 'itsec', 'sysadmin', 'netadmin', 'developer'], | ||||
|                   'Allowed roles for project') | ||||
| # NOTE(vish): a user with one of these roles will be a superuser and | ||||
| #             have access to all api commands | ||||
| flags.DEFINE_list('superuser_roles', ['cloudadmin'], | ||||
|                   'Roles that ignore authorization checking completely') | ||||
|  | ||||
| # NOTE(vish): a user with one of these roles will have it for every | ||||
| #             project, even if he or she is not a member of the project | ||||
| flags.DEFINE_list('global_roles', ['cloudadmin', 'itsec'], | ||||
|                   'Roles that apply to all projects') | ||||
|  | ||||
| flags.DEFINE_string('credentials_template', | ||||
|                     utils.abspath('auth/novarc.template'), | ||||
|                     'Template for creating users rc file') | ||||
| flags.DEFINE_string('vpn_client_template', | ||||
|                     utils.abspath('cloudpipe/client.ovpn.template'), | ||||
|                     'Template for creating users vpn file') | ||||
| flags.DEFINE_string('credential_vpn_file', 'nova-vpn.conf', | ||||
|                     'Filename of certificate in credentials zip') | ||||
| flags.DEFINE_string('credential_key_file', 'pk.pem', | ||||
|                     'Filename of private key in credentials zip') | ||||
| flags.DEFINE_string('credential_cert_file', 'cert.pem', | ||||
|                     'Filename of certificate in credentials zip') | ||||
| flags.DEFINE_string('credential_rc_file', '%src', | ||||
|                     'Filename of rc in credentials zip, %s will be ' | ||||
|                     'replaced by name of the region (nova by default)') | ||||
| flags.DEFINE_string('auth_driver', 'nova.auth.dbdriver.DbDriver', | ||||
|                     'Driver that auth manager uses') | ||||
| FLAGS.add_options(auth_opts) | ||||
|  | ||||
| flags.DECLARE('osapi_compute_listen_port', 'nova.service') | ||||
|  | ||||
|  | ||||
| LOG = logging.getLogger('nova.auth.manager') | ||||
|  | ||||
|  | ||||
|   | ||||
							
								
								
									
										616
									
								
								nova/flags.py
									
									
									
									
									
								
							
							
						
						
									
										616
									
								
								nova/flags.py
									
									
									
									
									
								
							| @@ -151,7 +151,7 @@ class FlagValues(object): | ||||
|             ret[opt.dest] = getattr(self, opt.dest) | ||||
|         return ret | ||||
|  | ||||
|     def _add_option(self, opt): | ||||
|     def add_option(self, opt): | ||||
|         if opt.dest in self._opts: | ||||
|             return | ||||
|  | ||||
| @@ -164,57 +164,14 @@ class FlagValues(object): | ||||
|             self._conf.register_cli_opts(self._opts.values()) | ||||
|             self._extra = None | ||||
|  | ||||
|     def define_string(self, name, default, help): | ||||
|         self._add_option(cfg.StrOpt(name, default=default, help=help)) | ||||
|  | ||||
|     def define_integer(self, name, default, help): | ||||
|         self._add_option(cfg.IntOpt(name, default=default, help=help)) | ||||
|  | ||||
|     def define_float(self, name, default, help): | ||||
|         self._add_option(cfg.FloatOpt(name, default=default, help=help)) | ||||
|  | ||||
|     def define_bool(self, name, default, help): | ||||
|         self._add_option(cfg.BoolOpt(name, default=default, help=help)) | ||||
|  | ||||
|     def define_list(self, name, default, help): | ||||
|         self._add_option(cfg.ListOpt(name, default=default, help=help)) | ||||
|  | ||||
|     def define_multistring(self, name, default, help): | ||||
|         self._add_option(cfg.MultiStrOpt(name, default=default, help=help)) | ||||
|     def add_options(self, opts): | ||||
|         for opt in opts: | ||||
|             self.add_option(opt) | ||||
|  | ||||
|  | ||||
| FLAGS = FlagValues() | ||||
|  | ||||
|  | ||||
| def DEFINE_string(name, default, help, flag_values=FLAGS): | ||||
|     flag_values.define_string(name, default, help) | ||||
|  | ||||
|  | ||||
| def DEFINE_integer(name, default, help, lower_bound=None, flag_values=FLAGS): | ||||
|     # FIXME(markmc): ignoring lower_bound | ||||
|     flag_values.define_integer(name, default, help) | ||||
|  | ||||
|  | ||||
| def DEFINE_bool(name, default, help, flag_values=FLAGS): | ||||
|     flag_values.define_bool(name, default, help) | ||||
|  | ||||
|  | ||||
| def DEFINE_boolean(name, default, help, flag_values=FLAGS): | ||||
|     DEFINE_bool(name, default, help, flag_values) | ||||
|  | ||||
|  | ||||
| def DEFINE_list(name, default, help, flag_values=FLAGS): | ||||
|     flag_values.define_list(name, default, help) | ||||
|  | ||||
|  | ||||
| def DEFINE_float(name, default, help, flag_values=FLAGS): | ||||
|     flag_values.define_float(name, default, help) | ||||
|  | ||||
|  | ||||
| def DEFINE_multistring(name, default, help, flag_values=FLAGS): | ||||
|     flag_values.define_multistring(name, default, help) | ||||
|  | ||||
|  | ||||
| class UnrecognizedFlag(Exception): | ||||
|     pass | ||||
|  | ||||
| @@ -238,227 +195,346 @@ def _get_my_ip(): | ||||
|         return "127.0.0.1" | ||||
|  | ||||
|  | ||||
| # __GLOBAL FLAGS ONLY__ | ||||
| # Define any app-specific flags in their own files, docs at: | ||||
| # http://code.google.com/p/python-gflags/source/browse/trunk/gflags.py#a9 | ||||
| DEFINE_string('my_ip', _get_my_ip(), 'host ip address') | ||||
| DEFINE_list('region_list', | ||||
|             [], | ||||
|             'list of region=fqdn pairs separated by commas') | ||||
| DEFINE_string('connection_type', None, 'libvirt, xenapi or fake') | ||||
| DEFINE_string('aws_access_key_id', 'admin', 'AWS Access ID') | ||||
| DEFINE_string('aws_secret_access_key', 'admin', 'AWS Access Key') | ||||
| # NOTE(sirp): my_ip interpolation doesn't work within nested structures | ||||
| DEFINE_string('glance_host', _get_my_ip(), 'default glance host') | ||||
| DEFINE_integer('glance_port', 9292, 'default glance port') | ||||
| DEFINE_list('glance_api_servers', | ||||
|             ['%s:%d' % (FLAGS.glance_host, FLAGS.glance_port)], | ||||
|             'list of glance api servers available to nova (host:port)') | ||||
| DEFINE_integer('glance_num_retries', 0, | ||||
|                'The number of times to retry downloading an image from glance') | ||||
| DEFINE_integer('s3_port', 3333, 's3 port') | ||||
| DEFINE_string('s3_host', '$my_ip', 's3 host (for infrastructure)') | ||||
| DEFINE_string('s3_dmz', '$my_ip', 's3 dmz ip (for instances)') | ||||
| DEFINE_string('cert_topic', 'cert', 'the topic cert nodes listen on') | ||||
| DEFINE_string('compute_topic', 'compute', 'the topic compute nodes listen on') | ||||
| DEFINE_string('console_topic', 'console', | ||||
|               'the topic console proxy nodes listen on') | ||||
| DEFINE_string('scheduler_topic', 'scheduler', | ||||
|               'the topic scheduler nodes listen on') | ||||
| DEFINE_string('volume_topic', 'volume', 'the topic volume nodes listen on') | ||||
| DEFINE_string('network_topic', 'network', 'the topic network nodes listen on') | ||||
| DEFINE_string('ajax_console_proxy_topic', 'ajax_proxy', | ||||
|               'the topic ajax proxy nodes listen on') | ||||
| DEFINE_string('ajax_console_proxy_url', | ||||
|               'http://127.0.0.1:8000', | ||||
|               'location of ajax console proxy, \ | ||||
|                in the form "http://127.0.0.1:8000"') | ||||
| DEFINE_integer('ajax_console_proxy_port', | ||||
|                8000, 'port that ajax_console_proxy binds') | ||||
| DEFINE_string('vsa_topic', 'vsa', 'the topic that nova-vsa service listens on') | ||||
| DEFINE_bool('verbose', False, 'show debug output') | ||||
| DEFINE_boolean('fake_rabbit', False, 'use a fake rabbit') | ||||
| DEFINE_bool('fake_network', False, | ||||
|             'should we use fake network devices and addresses') | ||||
| DEFINE_string('rabbit_host', 'localhost', 'rabbit host') | ||||
| DEFINE_integer('rabbit_port', 5672, 'rabbit port') | ||||
| DEFINE_bool('rabbit_use_ssl', False, 'connect over SSL') | ||||
| DEFINE_string('rabbit_userid', 'guest', 'rabbit userid') | ||||
| DEFINE_string('rabbit_password', 'guest', 'rabbit password') | ||||
| DEFINE_string('rabbit_virtual_host', '/', 'rabbit virtual host') | ||||
| DEFINE_integer('rabbit_retry_interval', 1, | ||||
|         'rabbit connection retry interval to start') | ||||
| DEFINE_integer('rabbit_retry_backoff', 2, | ||||
|         'rabbit connection retry backoff in seconds') | ||||
| DEFINE_integer('rabbit_max_retries', 0, | ||||
|         'maximum rabbit connection attempts (0=try forever)') | ||||
| DEFINE_string('control_exchange', 'nova', 'the main exchange to connect to') | ||||
| DEFINE_boolean('rabbit_durable_queues', False, 'use durable queues') | ||||
| DEFINE_list('enabled_apis', | ||||
|             ['ec2', 'osapi_compute', 'osapi_volume', 'metadata'], | ||||
|             'list of APIs to enable by default') | ||||
| DEFINE_string('ec2_host', '$my_ip', 'ip of api server') | ||||
| DEFINE_string('ec2_dmz_host', '$my_ip', 'internal ip of api server') | ||||
| DEFINE_integer('ec2_port', 8773, 'cloud controller port') | ||||
| DEFINE_string('ec2_scheme', 'http', 'prefix for ec2') | ||||
| DEFINE_string('ec2_path', '/services/Cloud', 'suffix for ec2') | ||||
| DEFINE_multistring('osapi_compute_extension', | ||||
|                    ['nova.api.openstack.compute.contrib.standard_extensions'], | ||||
|                    'osapi compute extension to load') | ||||
| DEFINE_multistring('osapi_volume_extension', | ||||
|                    ['nova.api.openstack.volume.contrib.standard_extensions'], | ||||
|                    'osapi volume extension to load') | ||||
| DEFINE_string('osapi_scheme', 'http', 'prefix for openstack') | ||||
| DEFINE_string('osapi_path', '/v1.1/', 'suffix for openstack') | ||||
| DEFINE_integer('osapi_max_limit', 1000, | ||||
|                'max number of items returned in a collection response') | ||||
| DEFINE_string('metadata_host', '$my_ip', 'ip of metadata server') | ||||
| DEFINE_integer('metadata_port', 8775, 'Metadata API port') | ||||
| DEFINE_string('default_project', 'openstack', 'default project for openstack') | ||||
| DEFINE_string('default_image', 'ami-11111', | ||||
|               'default image to use, testing only') | ||||
| DEFINE_string('default_instance_type', 'm1.small', | ||||
|               'default instance type to use, testing only') | ||||
| DEFINE_string('null_kernel', 'nokernel', | ||||
|               'kernel image that indicates not to use a kernel,' | ||||
|               ' but to use a raw disk image instead') | ||||
| global_opts = [ | ||||
|     cfg.StrOpt('my_ip', | ||||
|                default=_get_my_ip(), | ||||
|                help='host ip address'), | ||||
|     cfg.ListOpt('region_list', | ||||
|                 default=[], | ||||
|                 help='list of region=fqdn pairs separated by commas'), | ||||
|     cfg.StrOpt('connection_type', | ||||
|                default=None, | ||||
|                help='libvirt, xenapi or fake'), | ||||
|     cfg.StrOpt('aws_access_key_id', | ||||
|                default='admin', | ||||
|                help='AWS Access ID'), | ||||
|     cfg.StrOpt('aws_secret_access_key', | ||||
|                default='admin', | ||||
|                help='AWS Access Key'), | ||||
|     cfg.StrOpt('glance_host', | ||||
|                default='$my_ip', | ||||
|                help='default glance host'), | ||||
|     cfg.IntOpt('glance_port', | ||||
|                default=9292, | ||||
|                help='default glance port'), | ||||
|     cfg.ListOpt('glance_api_servers', | ||||
|                 default=['$glance_host:$glance_port'], | ||||
|                 help='glance api servers available to nova (host:port)'), | ||||
|     cfg.IntOpt('glance_num_retries', | ||||
|                default=0, | ||||
|                help='Number retries when downloading an image from glance'), | ||||
|     cfg.IntOpt('s3_port', | ||||
|                default=3333, | ||||
|                help='s3 port'), | ||||
|     cfg.StrOpt('s3_host', | ||||
|                default='$my_ip', | ||||
|                help='s3 host (for infrastructure)'), | ||||
|     cfg.StrOpt('s3_dmz', | ||||
|                default='$my_ip', | ||||
|                help='s3 dmz ip (for instances)'), | ||||
|     cfg.StrOpt('cert_topic', | ||||
|                default='cert', | ||||
|                help='the topic cert nodes listen on'), | ||||
|     cfg.StrOpt('compute_topic', | ||||
|                default='compute', | ||||
|                help='the topic compute nodes listen on'), | ||||
|     cfg.StrOpt('console_topic', | ||||
|                default='console', | ||||
|                help='the topic console proxy nodes listen on'), | ||||
|     cfg.StrOpt('scheduler_topic', | ||||
|                default='scheduler', | ||||
|                help='the topic scheduler nodes listen on'), | ||||
|     cfg.StrOpt('volume_topic', | ||||
|                default='volume', | ||||
|                help='the topic volume nodes listen on'), | ||||
|     cfg.StrOpt('network_topic', | ||||
|                default='network', | ||||
|                help='the topic network nodes listen on'), | ||||
|     cfg.StrOpt('ajax_console_proxy_topic', | ||||
|                default='ajax_proxy', | ||||
|                help='the topic ajax proxy nodes listen on'), | ||||
|     cfg.StrOpt('ajax_console_proxy_url', | ||||
|                default='http://127.0.0.1:8000', | ||||
|                help='URL of ajax console proxy, in the form http://host:port'), | ||||
|     cfg.IntOpt('ajax_console_proxy_port', | ||||
|                default=8000, | ||||
|                help='port that ajax_console_proxy binds'), | ||||
|     cfg.StrOpt('vsa_topic', | ||||
|                default='vsa', | ||||
|                help='the topic that nova-vsa service listens on'), | ||||
|     cfg.BoolOpt('verbose', | ||||
|                 default=False, | ||||
|                 help='show debug output'), | ||||
|     cfg.BoolOpt('fake_rabbit', | ||||
|                 default=False, | ||||
|                 help='use a fake rabbit'), | ||||
|     cfg.BoolOpt('fake_network', | ||||
|                 default=False, | ||||
|                 help='should we use fake network devices and addresses'), | ||||
|     cfg.StrOpt('rabbit_host', | ||||
|                default='localhost', | ||||
|                help='rabbit host'), | ||||
|     cfg.IntOpt('rabbit_port', | ||||
|                default=5672, | ||||
|                help='rabbit port'), | ||||
|     cfg.BoolOpt('rabbit_use_ssl', | ||||
|                 default=False, | ||||
|                 help='connect over SSL'), | ||||
|     cfg.StrOpt('rabbit_userid', | ||||
|                default='guest', | ||||
|                help='rabbit userid'), | ||||
|     cfg.StrOpt('rabbit_password', | ||||
|                default='guest', | ||||
|                help='rabbit password'), | ||||
|     cfg.StrOpt('rabbit_virtual_host', | ||||
|                default='/', | ||||
|                help='rabbit virtual host'), | ||||
|     cfg.IntOpt('rabbit_retry_interval', | ||||
|                default=1, | ||||
|                help='rabbit connection retry interval to start'), | ||||
|     cfg.IntOpt('rabbit_retry_backoff', | ||||
|                default=2, | ||||
|                help='rabbit connection retry backoff in seconds'), | ||||
|     cfg.IntOpt('rabbit_max_retries', | ||||
|                default=0, | ||||
|                help='maximum rabbit connection attempts (0=try forever)'), | ||||
|     cfg.StrOpt('control_exchange', | ||||
|                default='nova', | ||||
|                help='the main exchange to connect to'), | ||||
|     cfg.BoolOpt('rabbit_durable_queues', | ||||
|                 default=False, | ||||
|                 help='use durable queues'), | ||||
|     cfg.ListOpt('enabled_apis', | ||||
|                 default=['ec2', 'osapi_compute', 'osapi_volume', 'metadata'], | ||||
|                 help='list of APIs to enable by default'), | ||||
|     cfg.StrOpt('ec2_host', | ||||
|                default='$my_ip', | ||||
|                help='ip of api server'), | ||||
|     cfg.StrOpt('ec2_dmz_host', | ||||
|                default='$my_ip', | ||||
|                help='internal ip of api server'), | ||||
|     cfg.IntOpt('ec2_port', | ||||
|                default=8773, | ||||
|                help='cloud controller port'), | ||||
|     cfg.StrOpt('ec2_scheme', | ||||
|                default='http', | ||||
|                help='prefix for ec2'), | ||||
|     cfg.StrOpt('ec2_path', | ||||
|                default='/services/Cloud', | ||||
|                help='suffix for ec2'), | ||||
|     cfg.MultiStrOpt('osapi_compute_extension', | ||||
|                     default=[ | ||||
|                       'nova.api.openstack.compute.contrib.standard_extensions' | ||||
|                       ], | ||||
|                     help='osapi compute extension to load'), | ||||
|     cfg.MultiStrOpt('osapi_volume_extension', | ||||
|                     default=[ | ||||
|                       'nova.api.openstack.volume.contrib.standard_extensions' | ||||
|                       ], | ||||
|                     help='osapi volume extension to load'), | ||||
|     cfg.StrOpt('osapi_scheme', | ||||
|                default='http', | ||||
|                help='prefix for openstack'), | ||||
|     cfg.StrOpt('osapi_path', | ||||
|                default='/v1.1/', | ||||
|                help='suffix for openstack'), | ||||
|     cfg.IntOpt('osapi_max_limit', | ||||
|                default=1000, | ||||
|                help='max number of items returned in a collection response'), | ||||
|     cfg.StrOpt('metadata_host', | ||||
|                default='$my_ip', | ||||
|                help='ip of metadata server'), | ||||
|     cfg.IntOpt('metadata_port', | ||||
|                default=8775, | ||||
|                help='Metadata API port'), | ||||
|     cfg.StrOpt('default_project', | ||||
|                default='openstack', | ||||
|                help='default project for openstack'), | ||||
|     cfg.StrOpt('default_image', | ||||
|                default='ami-11111', | ||||
|                help='default image to use, testing only'), | ||||
|     cfg.StrOpt('default_instance_type', | ||||
|                default='m1.small', | ||||
|                help='default instance type to use, testing only'), | ||||
|     cfg.StrOpt('null_kernel', | ||||
|                default='nokernel', | ||||
|                help='kernel image that indicates not to use a kernel, but to ' | ||||
|                     'use a raw disk image instead'), | ||||
|     cfg.StrOpt('vpn_image_id', | ||||
|                default='0', | ||||
|                help='image id for cloudpipe vpn server'), | ||||
|     cfg.StrOpt('vpn_key_suffix', | ||||
|                default='-vpn', | ||||
|                help='Suffix to add to project name for vpn key and secgroups'), | ||||
|     cfg.IntOpt('auth_token_ttl', | ||||
|                default=3600, | ||||
|                help='Seconds for auth tokens to linger'), | ||||
|     cfg.StrOpt('state_path', | ||||
|                default=os.path.join(os.path.dirname(__file__), '../'), | ||||
|                help="Top-level directory for maintaining nova's state"), | ||||
|     cfg.StrOpt('lock_path', | ||||
|                default=os.path.join(os.path.dirname(__file__), '../'), | ||||
|                help='Directory for lock files'), | ||||
|     cfg.StrOpt('logdir', | ||||
|                default=None, | ||||
|                help='output to a per-service log file in named directory'), | ||||
|     cfg.StrOpt('logfile_mode', | ||||
|                default='0644', | ||||
|                help='Default file mode of the logs.'), | ||||
|     cfg.StrOpt('sqlite_db', | ||||
|                default='nova.sqlite', | ||||
|                help='file name for sqlite'), | ||||
|     cfg.BoolOpt('sqlite_synchronous', | ||||
|                 default=True, | ||||
|                 help='Synchronous mode for sqlite'), | ||||
|     cfg.StrOpt('sql_connection', | ||||
|                default='sqlite:///$state_path/$sqlite_db', | ||||
|                help='connection string for sql database'), | ||||
|     cfg.IntOpt('sql_idle_timeout', | ||||
|                default=3600, | ||||
|                help='timeout for idle sql database connections'), | ||||
|     cfg.IntOpt('sql_max_retries', | ||||
|                default=12, | ||||
|                help='sql connection attempts'), | ||||
|     cfg.IntOpt('sql_retry_interval', | ||||
|                default=10, | ||||
|                help='sql connection retry interval'), | ||||
|     cfg.StrOpt('compute_manager', | ||||
|                default='nova.compute.manager.ComputeManager', | ||||
|                help='Manager for compute'), | ||||
|     cfg.StrOpt('console_manager', | ||||
|                default='nova.console.manager.ConsoleProxyManager', | ||||
|                help='Manager for console proxy'), | ||||
|     cfg.StrOpt('cert_manager', | ||||
|                default='nova.cert.manager.CertManager', | ||||
|                help='Manager for cert'), | ||||
|     cfg.StrOpt('instance_dns_manager', | ||||
|                default='nova.network.dns_driver.DNSDriver', | ||||
|                help='DNS Manager for instance IPs'), | ||||
|     cfg.StrOpt('instance_dns_domain', | ||||
|                default='', | ||||
|                help='DNS Zone for instance IPs'), | ||||
|     cfg.StrOpt('floating_ip_dns_manager', | ||||
|                default='nova.network.dns_driver.DNSDriver', | ||||
|                help='DNS Manager for floating IPs'), | ||||
|     cfg.StrOpt('network_manager', | ||||
|                default='nova.network.manager.VlanManager', | ||||
|                help='Manager for network'), | ||||
|     cfg.StrOpt('volume_manager', | ||||
|                default='nova.volume.manager.VolumeManager', | ||||
|                help='Manager for volume'), | ||||
|     cfg.StrOpt('scheduler_manager', | ||||
|                default='nova.scheduler.manager.SchedulerManager', | ||||
|                help='Manager for scheduler'), | ||||
|     cfg.StrOpt('vsa_manager', | ||||
|                default='nova.vsa.manager.VsaManager', | ||||
|                help='Manager for vsa'), | ||||
|     cfg.StrOpt('vc_image_name', | ||||
|                default='vc_image', | ||||
|                help='the VC image ID (for a VC image that exists in Glance)'), | ||||
|     cfg.StrOpt('default_vsa_instance_type', | ||||
|                default='m1.small', | ||||
|                help='default instance type for VSA instances'), | ||||
|     cfg.IntOpt('max_vcs_in_vsa', | ||||
|                default=32, | ||||
|                help='maxinum VCs in a VSA'), | ||||
|     cfg.IntOpt('vsa_part_size_gb', | ||||
|                default=100, | ||||
|                help='default partition size for shared capacity'), | ||||
|     cfg.StrOpt('firewall_driver', | ||||
|                default='nova.virt.libvirt.firewall.IptablesFirewallDriver', | ||||
|                help='Firewall driver (defaults to iptables)'), | ||||
|     cfg.StrOpt('image_service', | ||||
|                default='nova.image.glance.GlanceImageService', | ||||
|                help='The service to use for retrieving and searching images.'), | ||||
|     cfg.StrOpt('host', | ||||
|                default=socket.gethostname(), | ||||
|                help='Name of this node.  This can be an opaque identifier.  ' | ||||
|                     'It is not necessarily a hostname, FQDN, or IP address.'), | ||||
|     cfg.StrOpt('node_availability_zone', | ||||
|                default='nova', | ||||
|                help='availability zone of this node'), | ||||
|     cfg.StrOpt('notification_driver', | ||||
|                default='nova.notifier.no_op_notifier', | ||||
|                help='Default driver for sending notifications'), | ||||
|     cfg.ListOpt('memcached_servers', | ||||
|                 default=None, | ||||
|                 help='Memcached servers or None for in process cache.'), | ||||
|     cfg.StrOpt('zone_name', | ||||
|                default='nova', | ||||
|                help='name of this zone'), | ||||
|     cfg.ListOpt('zone_capabilities', | ||||
|                 default=['hypervisor=xenserver;kvm', 'os=linux;windows'], | ||||
|                 help='Key/Multi-value list with the capabilities of the zone'), | ||||
|     cfg.StrOpt('build_plan_encryption_key', | ||||
|                default=None, | ||||
|                help='128bit (hex) encryption key for scheduler build plans.'), | ||||
|     cfg.StrOpt('instance_usage_audit_period', | ||||
|                default='month', | ||||
|                help='time period to generate instance usages for.'), | ||||
|     cfg.IntOpt('bandwith_poll_interval', | ||||
|                default=600, | ||||
|                help='interval to pull bandwidth usage info'), | ||||
|     cfg.BoolOpt('start_guests_on_host_boot', | ||||
|                 default=False, | ||||
|                 help='Whether to restart guests when the host reboots'), | ||||
|     cfg.BoolOpt('resume_guests_state_on_host_boot', | ||||
|                 default=False, | ||||
|                 help='Whether to start guests that were running before the ' | ||||
|                      'host rebooted'), | ||||
|     cfg.StrOpt('default_ephemeral_format', | ||||
|                default=None, | ||||
|                help='The default format a ephemeral_volume will be ' | ||||
|                     'formatted with on creation.'), | ||||
|     cfg.StrOpt('root_helper', | ||||
|                default='sudo', | ||||
|                help='Command prefix to use for running commands as root'), | ||||
|     cfg.StrOpt('network_driver', | ||||
|                default='nova.network.linux_net', | ||||
|                help='Driver to use for network creation'), | ||||
|     cfg.BoolOpt('use_ipv6', | ||||
|                 default=False, | ||||
|                 help='use ipv6'), | ||||
|     cfg.IntOpt('password_length', | ||||
|                default=12, | ||||
|                help='Length of generated instance admin passwords'), | ||||
|     cfg.BoolOpt('monkey_patch', | ||||
|                 default=False, | ||||
|                 help='Whether to log monkey patching'), | ||||
|     cfg.ListOpt('monkey_patch_modules', | ||||
|                 default=[ | ||||
|                   'nova.api.ec2.cloud:nova.notifier.api.notify_decorator', | ||||
|                   'nova.compute.api:nova.notifier.api.notify_decorator' | ||||
|                   ], | ||||
|                 help='List of modules/decorators to monkey patch'), | ||||
|     cfg.BoolOpt('allow_resize_to_same_host', | ||||
|                 default=False, | ||||
|                 help='Allow destination machine to match source for resize. ' | ||||
|                      'Useful when testing in single-host environments.'), | ||||
|     cfg.StrOpt('stub_network', | ||||
|                default=False, | ||||
|                help='Stub network related code'), | ||||
|     cfg.IntOpt('reclaim_instance_interval', | ||||
|                default=0, | ||||
|                help='Interval in seconds for reclaiming deleted instances'), | ||||
|     cfg.IntOpt('zombie_instance_updated_at_window', | ||||
|                default=172800, | ||||
|                help='Number of seconds zombie instances are cleaned up.'), | ||||
|     cfg.BoolOpt('allow_ec2_admin_api', | ||||
|                 default=False, | ||||
|                 help='Enable/Disable EC2 Admin API'), | ||||
|     cfg.IntOpt('service_down_time', | ||||
|                default=60, | ||||
|                help='maximum time since last check-in for up service'), | ||||
|     cfg.StrOpt('default_schedule_zone', | ||||
|                default=None, | ||||
|                help='zone to use when user doesnt specify one'), | ||||
|     cfg.ListOpt('isolated_images', | ||||
|                 default=[], | ||||
|                 help='Images to run on isolated host'), | ||||
|     cfg.ListOpt('isolated_hosts', | ||||
|                 default=[], | ||||
|                 help='Host reserved for specific images'), | ||||
|     ] | ||||
|  | ||||
| DEFINE_string('vpn_image_id', '0', 'image id for cloudpipe vpn server') | ||||
| DEFINE_string('vpn_key_suffix', | ||||
|               '-vpn', | ||||
|               'Suffix to add to project name for vpn key and secgroups') | ||||
|  | ||||
| DEFINE_integer('auth_token_ttl', 3600, 'Seconds for auth tokens to linger') | ||||
|  | ||||
| DEFINE_string('state_path', os.path.join(os.path.dirname(__file__), '../'), | ||||
|               "Top-level directory for maintaining nova's state") | ||||
| DEFINE_string('lock_path', os.path.join(os.path.dirname(__file__), '../'), | ||||
|               'Directory for lock files') | ||||
| DEFINE_string('logdir', None, 'output to a per-service log file in named ' | ||||
|                               'directory') | ||||
| DEFINE_string('logfile_mode', '0644', 'Default file mode of the logs.') | ||||
| DEFINE_string('sqlite_db', 'nova.sqlite', 'file name for sqlite') | ||||
| DEFINE_bool('sqlite_synchronous', True, 'Synchronous mode for sqlite') | ||||
| DEFINE_string('sql_connection', | ||||
|               'sqlite:///$state_path/$sqlite_db', | ||||
|               'connection string for sql database') | ||||
| DEFINE_integer('sql_idle_timeout', | ||||
|               3600, | ||||
|               'timeout for idle sql database connections') | ||||
| DEFINE_integer('sql_max_retries', 12, 'sql connection attempts') | ||||
| DEFINE_integer('sql_retry_interval', 10, 'sql connection retry interval') | ||||
|  | ||||
| DEFINE_string('compute_manager', 'nova.compute.manager.ComputeManager', | ||||
|               'Manager for compute') | ||||
| DEFINE_string('console_manager', 'nova.console.manager.ConsoleProxyManager', | ||||
|               'Manager for console proxy') | ||||
| DEFINE_string('cert_manager', 'nova.cert.manager.CertManager', | ||||
|               'Manager for cert') | ||||
| DEFINE_string('instance_dns_manager', | ||||
|               'nova.network.dns_driver.DNSDriver', | ||||
|               'DNS Manager for instance IPs') | ||||
| DEFINE_string('instance_dns_domain', '', | ||||
|               'DNS Zone for instance IPs') | ||||
| DEFINE_string('floating_ip_dns_manager', | ||||
|               'nova.network.dns_driver.DNSDriver', | ||||
|               'DNS Manager for floating IPs') | ||||
| DEFINE_string('network_manager', 'nova.network.manager.VlanManager', | ||||
|               'Manager for network') | ||||
| DEFINE_string('volume_manager', 'nova.volume.manager.VolumeManager', | ||||
|               'Manager for volume') | ||||
| DEFINE_string('scheduler_manager', 'nova.scheduler.manager.SchedulerManager', | ||||
|               'Manager for scheduler') | ||||
| DEFINE_string('vsa_manager', 'nova.vsa.manager.VsaManager', | ||||
|               'Manager for vsa') | ||||
| DEFINE_string('vc_image_name', 'vc_image', | ||||
|               'the VC image ID (for a VC image that exists in DB Glance)') | ||||
| # VSA constants and enums | ||||
| DEFINE_string('default_vsa_instance_type', 'm1.small', | ||||
|               'default instance type for VSA instances') | ||||
| DEFINE_integer('max_vcs_in_vsa', 32, | ||||
|                'maxinum VCs in a VSA') | ||||
| DEFINE_integer('vsa_part_size_gb', 100, | ||||
|                'default partition size for shared capacity') | ||||
| # Default firewall driver for security groups and provider firewall | ||||
| DEFINE_string('firewall_driver', | ||||
|               'nova.virt.libvirt.firewall.IptablesFirewallDriver', | ||||
|               'Firewall driver (defaults to iptables)') | ||||
| # The service to use for image search and retrieval | ||||
| DEFINE_string('image_service', 'nova.image.glance.GlanceImageService', | ||||
|               'The service to use for retrieving and searching for images.') | ||||
|  | ||||
| DEFINE_string('host', socket.gethostname(), | ||||
|               'Name of this node.  This can be an opaque identifier.  It is ' | ||||
|               'not necessarily a hostname, FQDN, or IP address.') | ||||
|  | ||||
| DEFINE_string('node_availability_zone', 'nova', | ||||
|               'availability zone of this node') | ||||
|  | ||||
| DEFINE_string('notification_driver', | ||||
|               'nova.notifier.no_op_notifier', | ||||
|               'Default driver for sending notifications') | ||||
| DEFINE_list('memcached_servers', None, | ||||
|             'Memcached servers or None for in process cache.') | ||||
|  | ||||
| DEFINE_string('zone_name', 'nova', 'name of this zone') | ||||
| DEFINE_list('zone_capabilities', | ||||
|                 ['hypervisor=xenserver;kvm', 'os=linux;windows'], | ||||
|                  'Key/Multi-value list representng capabilities of this zone') | ||||
| DEFINE_string('build_plan_encryption_key', None, | ||||
|         '128bit (hex) encryption key for scheduler build plans.') | ||||
| DEFINE_string('instance_usage_audit_period', 'month', | ||||
|               'time period to generate instance usages for.') | ||||
| DEFINE_integer('bandwith_poll_interval', 600, | ||||
|                'interval to pull bandwidth usage info') | ||||
|  | ||||
| DEFINE_bool('start_guests_on_host_boot', False, | ||||
|             'Whether to restart guests when the host reboots') | ||||
| DEFINE_bool('resume_guests_state_on_host_boot', False, | ||||
|             'Whether to start guests, that was running before the host reboot') | ||||
| DEFINE_string('default_ephemeral_format', | ||||
|               None, | ||||
|               'The default format a ephemeral_volume will be formatted ' | ||||
|               'with on creation.') | ||||
|  | ||||
| DEFINE_string('root_helper', 'sudo', | ||||
|               'Command prefix to use for running commands as root') | ||||
|  | ||||
| DEFINE_string('network_driver', 'nova.network.linux_net', | ||||
|               'Driver to use for network creation') | ||||
|  | ||||
| DEFINE_bool('use_ipv6', False, 'use ipv6') | ||||
|  | ||||
| DEFINE_integer('password_length', 12, | ||||
|                     'Length of generated instance admin passwords') | ||||
|  | ||||
| DEFINE_bool('monkey_patch', False, | ||||
|               'Whether to log monkey patching') | ||||
|  | ||||
| DEFINE_list('monkey_patch_modules', | ||||
|         ['nova.api.ec2.cloud:nova.notifier.api.notify_decorator', | ||||
|         'nova.compute.api:nova.notifier.api.notify_decorator'], | ||||
|         'Module list representing monkey ' | ||||
|         'patched module and decorator') | ||||
|  | ||||
| DEFINE_bool('allow_resize_to_same_host', False, | ||||
|             'Allow destination machine to match source for resize. Useful' | ||||
|             ' when testing in environments with only one host machine.') | ||||
|  | ||||
| DEFINE_string('stub_network', False, | ||||
|               'Stub network related code') | ||||
|  | ||||
| DEFINE_integer('reclaim_instance_interval', 0, | ||||
|                'Interval in seconds for reclaiming deleted instances') | ||||
|  | ||||
| DEFINE_integer('zombie_instance_updated_at_window', 172800, | ||||
|                'Limit in seconds that a zombie instance can exist before ' | ||||
|                'being cleaned up.') | ||||
|  | ||||
| DEFINE_boolean('allow_ec2_admin_api', False, 'Enable/Disable EC2 Admin API') | ||||
|  | ||||
| DEFINE_integer('service_down_time', 60, | ||||
|         'maximum time since last check-in for up service') | ||||
| DEFINE_string('default_schedule_zone', None, | ||||
|               'zone to use when user doesnt specify one') | ||||
| DEFINE_list('isolated_images', [], 'Images to run on isolated host') | ||||
| DEFINE_list('isolated_hosts', [], 'Host reserved for specific images') | ||||
| FLAGS.add_options(global_opts) | ||||
|   | ||||
							
								
								
									
										68
									
								
								nova/log.py
									
									
									
									
									
								
							
							
						
						
									
										68
									
								
								nova/log.py
									
									
									
									
									
								
							| @@ -38,40 +38,52 @@ import sys | ||||
| import traceback | ||||
|  | ||||
| import nova | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import local | ||||
| from nova import version | ||||
|  | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_string('logging_context_format_string', | ||||
|                     '%(asctime)s %(levelname)s %(name)s ' | ||||
|                     '[%(request_id)s %(user_id)s ' | ||||
|                     '%(project_id)s] %(message)s', | ||||
|                     'format string to use for log messages with context') | ||||
| flags.DEFINE_string('logging_default_format_string', | ||||
|                     '%(asctime)s %(levelname)s %(name)s [-] ' | ||||
|                     '%(message)s', | ||||
|                     'format string to use for log messages without context') | ||||
| flags.DEFINE_string('logging_debug_format_suffix', | ||||
|                     'from (pid=%(process)d) %(funcName)s' | ||||
|                     ' %(pathname)s:%(lineno)d', | ||||
|                     'data to append to log format when level is DEBUG') | ||||
| flags.DEFINE_string('logging_exception_prefix', | ||||
|                     '(%(name)s): TRACE: ', | ||||
|                     'prefix each line of exception output with this format') | ||||
| flags.DEFINE_list('default_log_levels', | ||||
|                   ['amqplib=WARN', | ||||
|                    'sqlalchemy=WARN', | ||||
|                    'boto=WARN', | ||||
|                    'suds=INFO', | ||||
|                    'eventlet.wsgi.server=WARN'], | ||||
|                   'list of logger=LEVEL pairs') | ||||
| flags.DEFINE_bool('use_syslog', False, 'output to syslog') | ||||
| flags.DEFINE_bool('publish_errors', False, 'publish error events') | ||||
| flags.DEFINE_string('logfile', None, 'output to named file') | ||||
| flags.DEFINE_bool('use_stderr', True, 'log to standard error') | ||||
| log_opts = [ | ||||
|     cfg.StrOpt('logging_context_format_string', | ||||
|                default='%(asctime)s %(levelname)s %(name)s [%(request_id)s ' | ||||
|                        '%(user_id)s %(project_id)s] %(message)s', | ||||
|                help='format string to use for log messages with context'), | ||||
|     cfg.StrOpt('logging_default_format_string', | ||||
|                default='%(asctime)s %(levelname)s %(name)s [-] %(message)s', | ||||
|                help='format string to use for log messages without context'), | ||||
|     cfg.StrOpt('logging_debug_format_suffix', | ||||
|                default='from (pid=%(process)d) %(funcName)s ' | ||||
|                        '%(pathname)s:%(lineno)d', | ||||
|                help='data to append to log format when level is DEBUG'), | ||||
|     cfg.StrOpt('logging_exception_prefix', | ||||
|                default='(%(name)s): TRACE: ', | ||||
|                help='prefix each line of exception output with this format'), | ||||
|     cfg.ListOpt('default_log_levels', | ||||
|                 default=[ | ||||
|                   'amqplib=WARN', | ||||
|                   'sqlalchemy=WARN', | ||||
|                   'boto=WARN', | ||||
|                   'suds=INFO', | ||||
|                   'eventlet.wsgi.server=WARN' | ||||
|                   ], | ||||
|                 help='list of logger=LEVEL pairs'), | ||||
|     cfg.BoolOpt('use_syslog', | ||||
|                 default=False, | ||||
|                 help='output to syslog'), | ||||
|     cfg.BoolOpt('publish_errors', | ||||
|                 default=False, | ||||
|                 help='publish error events'), | ||||
|     cfg.StrOpt('logfile', | ||||
|                default=None, | ||||
|                help='output to named file'), | ||||
|     cfg.BoolOpt('use_stderr', | ||||
|                 default=True, | ||||
|                 help='log to standard error'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_options(log_opts) | ||||
|  | ||||
| # A list of things we want to replicate from logging. | ||||
| # levels | ||||
|   | ||||
| @@ -15,19 +15,25 @@ | ||||
|  | ||||
| import uuid | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import utils | ||||
| from nova import log as logging | ||||
|  | ||||
|  | ||||
| LOG = logging.getLogger('nova.exception') | ||||
|  | ||||
| notifier_opts = [ | ||||
|     cfg.StrOpt('default_notification_level', | ||||
|                default='INFO', | ||||
|                help='Default notification level for outgoing notifications'), | ||||
|     cfg.StrOpt('default_publisher_id', | ||||
|                default='$host', | ||||
|                help='Default publisher_id for outgoing notifications'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
|  | ||||
| flags.DEFINE_string('default_notification_level', 'INFO', | ||||
|                     'Default notification level for outgoing notifications') | ||||
| flags.DEFINE_string('default_publisher_id', FLAGS.host, | ||||
|                     'Default publisher_id for outgoing notifications') | ||||
|  | ||||
| FLAGS.add_options(notifier_opts) | ||||
|  | ||||
| WARN = 'WARN' | ||||
| INFO = 'INFO' | ||||
|   | ||||
| @@ -13,16 +13,20 @@ | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| from nova import utils | ||||
| from nova.exception import ClassNotFound | ||||
|  | ||||
| flags.DEFINE_multistring('list_notifier_drivers', | ||||
|                          ['nova.notifier.no_op_notifier'], | ||||
|                          'List of drivers to send notifications') | ||||
|  | ||||
| list_notifier_drivers_opt = \ | ||||
|     cfg.MultiStrOpt('list_notifier_drivers', | ||||
|                     default=['nova.notifier.no_op_notifier'], | ||||
|                     help='List of drivers to send notifications') | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_option(list_notifier_drivers_opt) | ||||
|  | ||||
| LOG = logging.getLogger('nova.notifier.list_notifier') | ||||
|  | ||||
|   | ||||
| @@ -16,14 +16,18 @@ | ||||
|  | ||||
| import nova.context | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import rpc | ||||
|  | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| notification_topic_opt = \ | ||||
|     cfg.StrOpt('notification_topic', | ||||
|                default='notifications', | ||||
|                help='RabbitMQ topic used for Nova notifications') | ||||
|  | ||||
| flags.DEFINE_string('notification_topic', 'notifications', | ||||
|                     'RabbitMQ topic used for Nova notifications') | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_option(notification_topic_opt) | ||||
|  | ||||
|  | ||||
| def notify(message): | ||||
|   | ||||
| @@ -17,15 +17,19 @@ | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova.utils import import_object | ||||
| from nova.rpc.common import RemoteError, LOG | ||||
| from nova import flags | ||||
|  | ||||
|  | ||||
| rpc_backend_opt = \ | ||||
|     cfg.StrOpt('rpc_backend', | ||||
|                default='nova.rpc.impl_kombu', | ||||
|                help="The messaging module to use, defaults to kombu.") | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_string('rpc_backend', | ||||
|                     'nova.rpc.impl_kombu', | ||||
|                     "The messaging module to use, defaults to kombu.") | ||||
| FLAGS.add_option(rpc_backend_opt) | ||||
|  | ||||
|  | ||||
| def create_connection(new=True): | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
|  | ||||
| import copy | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| @@ -26,10 +27,16 @@ from nova import log as logging | ||||
|  | ||||
| LOG = logging.getLogger('nova.rpc') | ||||
|  | ||||
| flags.DEFINE_integer('rpc_thread_pool_size', 1024, | ||||
|                              'Size of RPC thread pool') | ||||
| flags.DEFINE_integer('rpc_conn_pool_size', 30, | ||||
|                              'Size of RPC connection pool') | ||||
| rpc_opts = [ | ||||
|     cfg.IntOpt('rpc_thread_pool_size', | ||||
|                default=1024, | ||||
|                help='Size of RPC thread pool'), | ||||
|     cfg.IntOpt('rpc_conn_pool_size', | ||||
|                default=30, | ||||
|                help='Size of RPC connection pool'), | ||||
|     ] | ||||
|  | ||||
| flags.FLAGS.add_options(rpc_opts) | ||||
|  | ||||
|  | ||||
| class RemoteError(exception.NovaException): | ||||
|   | ||||
| @@ -25,36 +25,59 @@ import greenlet | ||||
| import qpid.messaging | ||||
| import qpid.messaging.exceptions | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova.rpc import amqp as rpc_amqp | ||||
| from nova.rpc.common import LOG | ||||
|  | ||||
|  | ||||
| flags.DEFINE_string('qpid_hostname', 'localhost', 'Qpid broker hostname') | ||||
| flags.DEFINE_string('qpid_port', '5672', 'Qpid broker port') | ||||
| flags.DEFINE_string('qpid_username', '', 'Username for qpid connection') | ||||
| flags.DEFINE_string('qpid_password', '', 'Password for qpid connection') | ||||
| flags.DEFINE_string('qpid_sasl_mechanisms', '', | ||||
|                 'Space separated list of SASL mechanisms to use for auth') | ||||
| flags.DEFINE_boolean('qpid_reconnect', True, 'Automatically reconnect') | ||||
| flags.DEFINE_integer('qpid_reconnect_timeout', 0, | ||||
|                 'Reconnection timeout in seconds') | ||||
| flags.DEFINE_integer('qpid_reconnect_limit', 0, | ||||
|                 'Max reconnections before giving up') | ||||
| flags.DEFINE_integer('qpid_reconnect_interval_min', 0, | ||||
|                 'Minimum seconds between reconnection attempts') | ||||
| flags.DEFINE_integer('qpid_reconnect_interval_max', 0, | ||||
|                 'Maximum seconds between reconnection attempts') | ||||
| flags.DEFINE_integer('qpid_reconnect_interval', 0, | ||||
|                 'Equivalent to setting max and min to the same value') | ||||
| flags.DEFINE_integer('qpid_heartbeat', 5, | ||||
|                 'Seconds between heartbeats used to keep the connection alive') | ||||
| flags.DEFINE_string('qpid_protocol', 'tcp', | ||||
|                 "Transport to use, either 'tcp' or 'ssl'") | ||||
| flags.DEFINE_boolean('qpid_tcp_nodelay', True, 'Disable Nagle algorithm') | ||||
|  | ||||
| qpid_opts = [ | ||||
|     cfg.StrOpt('qpid_hostname', | ||||
|                default='localhost', | ||||
|                help='Qpid broker hostname'), | ||||
|     cfg.StrOpt('qpid_port', | ||||
|                default='5672', | ||||
|                help='Qpid broker port'), | ||||
|     cfg.StrOpt('qpid_username', | ||||
|                default='', | ||||
|                help='Username for qpid connection'), | ||||
|     cfg.StrOpt('qpid_password', | ||||
|                default='', | ||||
|                help='Password for qpid connection'), | ||||
|     cfg.StrOpt('qpid_sasl_mechanisms', | ||||
|                default='', | ||||
|                help='Space separated list of SASL mechanisms to use for auth'), | ||||
|     cfg.BoolOpt('qpid_reconnect', | ||||
|                 default=True, | ||||
|                 help='Automatically reconnect'), | ||||
|     cfg.IntOpt('qpid_reconnect_timeout', | ||||
|                default=0, | ||||
|                help='Reconnection timeout in seconds'), | ||||
|     cfg.IntOpt('qpid_reconnect_limit', | ||||
|                default=0, | ||||
|                help='Max reconnections before giving up'), | ||||
|     cfg.IntOpt('qpid_reconnect_interval_min', | ||||
|                default=0, | ||||
|                help='Minimum seconds between reconnection attempts'), | ||||
|     cfg.IntOpt('qpid_reconnect_interval_max', | ||||
|                default=0, | ||||
|                help='Maximum seconds between reconnection attempts'), | ||||
|     cfg.IntOpt('qpid_reconnect_interval', | ||||
|                default=0, | ||||
|                help='Equivalent to setting max and min to the same value'), | ||||
|     cfg.IntOpt('qpid_heartbeat', | ||||
|                default=5, | ||||
|                help='Seconds between connection keepalive heartbeats'), | ||||
|     cfg.StrOpt('qpid_protocol', | ||||
|                default='tcp', | ||||
|                help="Transport to use, either 'tcp' or 'ssl'"), | ||||
|     cfg.BoolOpt('qpid_tcp_nodelay', | ||||
|                 default=True, | ||||
|                 help='Disable Nagle algorithm'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_options(qpid_opts) | ||||
|  | ||||
|  | ||||
| class ConsumerBase(object): | ||||
|   | ||||
| @@ -22,6 +22,7 @@ import functools | ||||
| from novaclient import v1_1 as novaclient | ||||
| from novaclient import exceptions as novaclient_exceptions | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import db | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| @@ -31,10 +32,14 @@ from nova import utils | ||||
|  | ||||
| from eventlet import greenpool | ||||
|  | ||||
|  | ||||
| enable_zone_routing_opt = \ | ||||
|     cfg.BoolOpt('enable_zone_routing', | ||||
|                 default=False, | ||||
|                 help='When True, routing to child zones will occur.') | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_bool('enable_zone_routing', | ||||
|     False, | ||||
|     'When True, routing to child zones will occur.') | ||||
| FLAGS.add_option(enable_zone_routing_opt) | ||||
|  | ||||
| LOG = logging.getLogger('nova.scheduler.api') | ||||
|  | ||||
|   | ||||
| @@ -22,24 +22,32 @@ The cost-function and weights are tabulated, and the host with the least cost | ||||
| is then selected for provisioning. | ||||
| """ | ||||
|  | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
|  | ||||
|  | ||||
| LOG = logging.getLogger('nova.scheduler.least_cost') | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_list('least_cost_functions', | ||||
|         ['nova.scheduler.least_cost.compute_fill_first_cost_fn'], | ||||
|         'Which cost functions the LeastCostScheduler should use.') | ||||
| least_cost_opts = [ | ||||
|     cfg.ListOpt('least_cost_functions', | ||||
|                 default=[ | ||||
|                   'nova.scheduler.least_cost.compute_fill_first_cost_fn' | ||||
|                   ], | ||||
|                 help='Which cost functions the LeastCostScheduler should use'), | ||||
|     cfg.FloatOpt('noop_cost_fn_weight', | ||||
|              default=1.0, | ||||
|                help='How much weight to give the noop cost function'), | ||||
|     cfg.FloatOpt('compute_fill_first_cost_fn_weight', | ||||
|              default=1.0, | ||||
|                help='How much weight to give the fill-first cost function'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_options(least_cost_opts) | ||||
|  | ||||
| # TODO(sirp): Once we have enough of these rules, we can break them out into a | ||||
| # cost_functions.py file (perhaps in a least_cost_scheduler directory) | ||||
| flags.DEFINE_float('noop_cost_fn_weight', 1.0, | ||||
|              'How much weight to give the noop cost function') | ||||
| flags.DEFINE_float('compute_fill_first_cost_fn_weight', 1.0, | ||||
|              'How much weight to give the fill-first cost function') | ||||
|  | ||||
|  | ||||
| class WeightedHost(object): | ||||
|   | ||||
| @@ -20,19 +20,24 @@ | ||||
| """ | ||||
| Scheduler that allows routing some calls to one driver and others to another. | ||||
| """ | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import utils | ||||
| from nova.scheduler import driver | ||||
|  | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_string('compute_scheduler_driver', | ||||
|                     'nova.scheduler.chance.ChanceScheduler', | ||||
|                     'Driver to use for scheduling compute calls') | ||||
| flags.DEFINE_string('volume_scheduler_driver', | ||||
|                     'nova.scheduler.chance.ChanceScheduler', | ||||
|                     'Driver to use for scheduling volume calls') | ||||
| multi_scheduler_opts = [ | ||||
|     cfg.StrOpt('compute_scheduler_driver', | ||||
|                default='nova.scheduler.chance.ChanceScheduler', | ||||
|                help='Driver to use for scheduling compute calls'), | ||||
|     cfg.StrOpt('volume_scheduler_driver', | ||||
|                default='nova.scheduler.chance.ChanceScheduler', | ||||
|                help='Driver to use for scheduling volume calls'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| FLAGS.add_options(multi_scheduler_opts) | ||||
|  | ||||
| # A mapping of methods to topics so we can figure out which driver to use. | ||||
| _METHOD_MAP = {'run_instance': 'compute', | ||||
|   | ||||
| @@ -21,6 +21,7 @@ | ||||
| Simple Scheduler | ||||
| """ | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import db | ||||
| from nova import flags | ||||
| from nova import exception | ||||
| @@ -28,15 +29,24 @@ from nova.scheduler import driver | ||||
| from nova.scheduler import chance | ||||
| from nova import utils | ||||
|  | ||||
|  | ||||
| simple_scheduler_opts = [ | ||||
|     cfg.IntOpt("max_cores", | ||||
|                default=16, | ||||
|                help="maximum number of instance cores to allow per host"), | ||||
|     cfg.IntOpt("max_gigabytes", | ||||
|                default=10000, | ||||
|                help="maximum number of volume gigabytes to allow per host"), | ||||
|     cfg.IntOpt("max_networks", | ||||
|                default=1000, | ||||
|                help="maximum number of networks to allow per host"), | ||||
|     cfg.BoolOpt('skip_isolated_core_check', | ||||
|                 default=True, | ||||
|                 help='Allow overcommitting vcpus on isolated hosts'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_integer("max_cores", 16, | ||||
|                      "maximum number of instance cores to allow per host") | ||||
| flags.DEFINE_integer("max_gigabytes", 10000, | ||||
|                      "maximum number of volume gigabytes to allow per host") | ||||
| flags.DEFINE_integer("max_networks", 1000, | ||||
|                      "maximum number of networks to allow per host") | ||||
| flags.DEFINE_boolean('skip_isolated_core_check', True, | ||||
|                      'Allow overcommitting vcpus on isolated hosts') | ||||
| FLAGS.add_options(simple_scheduler_opts) | ||||
|  | ||||
|  | ||||
| class SimpleScheduler(chance.ChanceScheduler): | ||||
|   | ||||
| @@ -19,6 +19,7 @@ | ||||
| VSA Simple Scheduler | ||||
| """ | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import context | ||||
| from nova import db | ||||
| from nova import flags | ||||
| @@ -31,15 +32,23 @@ from nova.scheduler import simple | ||||
| from nova.vsa.api import VsaState | ||||
| from nova.volume import volume_types | ||||
|  | ||||
|  | ||||
| LOG = logging.getLogger('nova.scheduler.vsa') | ||||
|  | ||||
| vsa_scheduler_opts = [ | ||||
|     cfg.IntOpt('drive_type_approx_capacity_percent', | ||||
|                default=10, | ||||
|                help='The percentage range for capacity comparison'), | ||||
|     cfg.IntOpt('vsa_unique_hosts_per_alloc', | ||||
|                default=10, | ||||
|                help='The number of unique hosts per storage allocation'), | ||||
|     cfg.BoolOpt('vsa_select_unique_drives', | ||||
|                 default=True, | ||||
|                 help='Allow selection of same host for multiple drives'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_integer('drive_type_approx_capacity_percent', 10, | ||||
|                     'The percentage range for capacity comparison') | ||||
| flags.DEFINE_integer('vsa_unique_hosts_per_alloc', 10, | ||||
|                     'The number of unique hosts per storage allocation') | ||||
| flags.DEFINE_boolean('vsa_select_unique_drives', True, | ||||
|                      'Allow selection of same host for multiple drives') | ||||
| FLAGS.add_options(vsa_scheduler_opts) | ||||
|  | ||||
|  | ||||
| def BYTES_TO_GB(bytes): | ||||
|   | ||||
| @@ -23,16 +23,24 @@ import traceback | ||||
| from eventlet import greenpool | ||||
| from novaclient import v1_1 as novaclient | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import db | ||||
| from nova import flags | ||||
| from nova import log as logging | ||||
| from nova import utils | ||||
|  | ||||
|  | ||||
| zone_manager_opts = [ | ||||
|     cfg.IntOpt('zone_db_check_interval', | ||||
|                default=60, | ||||
|                help='Seconds between getting fresh zone info from db.'), | ||||
|     cfg.IntOpt('zone_failures_to_offline', | ||||
|                default=3, | ||||
|                help='Number of consecutive errors before offlining a zone'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_integer('zone_db_check_interval', 60, | ||||
|         'Seconds between getting fresh zone info from db.') | ||||
| flags.DEFINE_integer('zone_failures_to_offline', 3, | ||||
|         'Number of consecutive errors before marking zone offline') | ||||
| FLAGS.add_options(zone_manager_opts) | ||||
|  | ||||
| LOG = logging.getLogger('nova.scheduler.zone_manager') | ||||
|  | ||||
|   | ||||
| @@ -16,8 +16,8 @@ | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
|  | ||||
| flags.DEFINE_integer('answer', 42, 'test flag') | ||||
| FLAGS.add_option(cfg.IntOpt('answer', default=42, help='test flag')) | ||||
|   | ||||
| @@ -16,8 +16,8 @@ | ||||
| #    License for the specific language governing permissions and limitations | ||||
| #    under the License. | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
|  | ||||
| flags.DEFINE_integer('runtime_answer', 54, 'test flag') | ||||
| FLAGS.add_option(cfg.IntOpt('runtime_answer', default=54, help='test flag')) | ||||
|   | ||||
| @@ -21,11 +21,14 @@ import exceptions | ||||
| import os | ||||
| import tempfile | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import flags | ||||
| from nova import test | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_string('flags_unittest', 'foo', 'for testing purposes only') | ||||
| FLAGS.add_option(cfg.StrOpt('flags_unittest', | ||||
|                             default='foo', | ||||
|                             help='for testing purposes only')) | ||||
|  | ||||
|  | ||||
| class FlagsTestCase(test.TestCase): | ||||
| @@ -41,11 +44,11 @@ class FlagsTestCase(test.TestCase): | ||||
|         self.assert_('false' not in self.FLAGS) | ||||
|         self.assert_('true' not in self.FLAGS) | ||||
|  | ||||
|         flags.DEFINE_string('string', 'default', 'desc', | ||||
|                             flag_values=self.FLAGS) | ||||
|         flags.DEFINE_integer('int', 1, 'desc', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_bool('false', False, 'desc', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_bool('true', True, 'desc', flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.StrOpt('string', | ||||
|                                          default='default', help='desc')) | ||||
|         self.FLAGS.add_option(cfg.IntOpt('int', default=1, help='desc')) | ||||
|         self.FLAGS.add_option(cfg.BoolOpt('false', default=False, help='desc')) | ||||
|         self.FLAGS.add_option(cfg.BoolOpt('true', default=True, help='desc')) | ||||
|  | ||||
|         self.assert_(self.FLAGS['string']) | ||||
|         self.assert_(self.FLAGS['int']) | ||||
| @@ -69,12 +72,12 @@ class FlagsTestCase(test.TestCase): | ||||
|         self.assertEqual(self.FLAGS.true, False) | ||||
|  | ||||
|     def test_define_float(self): | ||||
|         flags.DEFINE_float('float', 6.66, 'desc', flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.FloatOpt('float', default=6.66, help='desc')) | ||||
|         self.assertEqual(self.FLAGS.float, 6.66) | ||||
|  | ||||
|     def test_define_multistring(self): | ||||
|         flags.DEFINE_multistring('multi', ['blaa'], 'desc', | ||||
|                                  flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.MultiStrOpt('multi', | ||||
|                                               default=['blaa'], help='desc')) | ||||
|  | ||||
|         self.assert_(self.FLAGS['multi']) | ||||
|         self.assertEqual(self.FLAGS.multi, ['blaa']) | ||||
| @@ -89,7 +92,8 @@ class FlagsTestCase(test.TestCase): | ||||
|         self.assertEqual(self.FLAGS.multi, ['foo', 'bar']) | ||||
|  | ||||
|     def test_define_list(self): | ||||
|         flags.DEFINE_list('list', ['foo'], 'desc', flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.ListOpt('list', | ||||
|                                           default=['foo'], help='desc')) | ||||
|  | ||||
|         self.assert_(self.FLAGS['list']) | ||||
|         self.assertEqual(self.FLAGS.list, ['foo']) | ||||
| @@ -100,7 +104,7 @@ class FlagsTestCase(test.TestCase): | ||||
|         self.assertEqual(self.FLAGS.list, ['a', 'b', 'c', 'd']) | ||||
|  | ||||
|     def test_error(self): | ||||
|         flags.DEFINE_integer('error', 1, 'desc', flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.IntOpt('error', default=1, help='desc')) | ||||
|  | ||||
|         self.assertEqual(self.FLAGS.error, 1) | ||||
|  | ||||
| @@ -143,16 +147,16 @@ class FlagsTestCase(test.TestCase): | ||||
|         self.assertEqual(self.global_FLAGS.runtime_answer, 60) | ||||
|  | ||||
|     def test_long_vs_short_flags(self): | ||||
|         flags.DEFINE_string('duplicate_answer_long', 'val', 'desc', | ||||
|                             flag_values=self.global_FLAGS) | ||||
|         self.global_FLAGS.add_option(cfg.StrOpt('duplicate_answer_long', | ||||
|                                                 default='val', help='desc')) | ||||
|         argv = ['flags_test', '--duplicate_answer=60', 'extra_arg'] | ||||
|         args = self.global_FLAGS(argv) | ||||
|  | ||||
|         self.assert_('duplicate_answer' not in self.global_FLAGS) | ||||
|         self.assert_(self.global_FLAGS.duplicate_answer_long, 60) | ||||
|  | ||||
|         flags.DEFINE_integer('duplicate_answer', 60, 'desc', | ||||
|                              flag_values=self.global_FLAGS) | ||||
|         self.global_FLAGS.add_option(cfg.IntOpt('duplicate_answer', | ||||
|                                                 default=60, help='desc')) | ||||
|         self.assertEqual(self.global_FLAGS.duplicate_answer, 60) | ||||
|         self.assertEqual(self.global_FLAGS.duplicate_answer_long, 'val') | ||||
|  | ||||
| @@ -178,13 +182,13 @@ class FlagsTestCase(test.TestCase): | ||||
|         self.assertEqual(FLAGS.FlagValuesDict()['flags_unittest'], 'foo') | ||||
|  | ||||
|     def test_flagfile(self): | ||||
|         flags.DEFINE_string('string', 'default', 'desc', | ||||
|                             flag_values=self.FLAGS) | ||||
|         flags.DEFINE_integer('int', 1, 'desc', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_bool('false', False, 'desc', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_bool('true', True, 'desc', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_multistring('multi', ['blaa'], 'desc', | ||||
|                                  flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.StrOpt('string', | ||||
|                                          default='default', help='desc')) | ||||
|         self.FLAGS.add_option(cfg.IntOpt('int', default=1, help='desc')) | ||||
|         self.FLAGS.add_option(cfg.BoolOpt('false', default=False, help='desc')) | ||||
|         self.FLAGS.add_option(cfg.BoolOpt('true', default=True, help='desc')) | ||||
|         self.FLAGS.add_option(cfg.MultiStrOpt('multi', | ||||
|                                               default=['blaa'], help='desc')) | ||||
|  | ||||
|         (fd, path) = tempfile.mkstemp(prefix='nova', suffix='.flags') | ||||
|  | ||||
| @@ -208,14 +212,15 @@ class FlagsTestCase(test.TestCase): | ||||
|             os.remove(path) | ||||
|  | ||||
|     def test_defaults(self): | ||||
|         flags.DEFINE_string('foo', 'bar', 'help', flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.StrOpt('foo', default='bar', help='desc')) | ||||
|         self.assertEqual(self.FLAGS.foo, 'bar') | ||||
|  | ||||
|         self.FLAGS['foo'].SetDefault('blaa') | ||||
|         self.assertEqual(self.FLAGS.foo, 'blaa') | ||||
|  | ||||
|     def test_templated_values(self): | ||||
|         flags.DEFINE_string('foo', 'foo', 'help', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_string('bar', 'bar', 'help', flag_values=self.FLAGS) | ||||
|         flags.DEFINE_string('blaa', '$foo$bar', 'help', flag_values=self.FLAGS) | ||||
|         self.FLAGS.add_option(cfg.StrOpt('foo', default='foo', help='desc')) | ||||
|         self.FLAGS.add_option(cfg.StrOpt('bar', default='bar', help='desc')) | ||||
|         self.FLAGS.add_option(cfg.StrOpt('blaa', | ||||
|                                          default='$foo$bar', help='desc')) | ||||
|         self.assertEqual(self.FLAGS.blaa, 'foobar') | ||||
|   | ||||
| @@ -25,6 +25,7 @@ For assistance and guidelines pls contact | ||||
|  | ||||
| import sys | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import compute | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| @@ -45,15 +46,23 @@ class VsaState: | ||||
|     DELETING = 'deleting'       # VSA started the deletion procedure | ||||
|  | ||||
|  | ||||
| vsa_opts = [ | ||||
|     cfg.StrOpt('vsa_ec2_access_key', | ||||
|                default=None, | ||||
|                help='EC2 access key used by VSA for accessing nova'), | ||||
|     cfg.StrOpt('vsa_ec2_user_id', | ||||
|                default=None, | ||||
|                help='User ID used by VSA for accessing nova'), | ||||
|     cfg.BoolOpt('vsa_multi_vol_creation', | ||||
|                 default=True, | ||||
|                 help='Ask scheduler to create multiple volumes in one call'), | ||||
|     cfg.StrOpt('vsa_volume_type_name', | ||||
|                default='VSA volume type', | ||||
|                help='Name of volume type associated with FE VSA volumes'), | ||||
|     ] | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_string('vsa_ec2_access_key', None, | ||||
|                     'EC2 access key used by VSA for accessing nova') | ||||
| flags.DEFINE_string('vsa_ec2_user_id', None, | ||||
|                     'User ID used by VSA for accessing nova') | ||||
| flags.DEFINE_boolean('vsa_multi_vol_creation', True, | ||||
|                   'Ask scheduler to create multiple volumes in one call') | ||||
| flags.DEFINE_string('vsa_volume_type_name', 'VSA volume type', | ||||
|                     'Name of volume type associated with FE VSA volumes') | ||||
| FLAGS.add_options(vsa_opts) | ||||
|  | ||||
| LOG = logging.getLogger('nova.vsa') | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,7 @@ Handles all processes relating to Virtual Storage Arrays (VSA). | ||||
|  | ||||
| """ | ||||
|  | ||||
| from nova.common import cfg | ||||
| from nova import compute | ||||
| from nova import exception | ||||
| from nova import flags | ||||
| @@ -34,9 +35,13 @@ from nova.compute import instance_types | ||||
| from nova.vsa import utils as vsa_utils | ||||
| from nova.vsa.api import VsaState | ||||
|  | ||||
| vsa_driver_opt = \ | ||||
|     cfg.StrOpt('vsa_driver', | ||||
|                default='nova.vsa.connection.get_connection', | ||||
|                help='Driver to use for controlling VSAs') | ||||
|  | ||||
| FLAGS = flags.FLAGS | ||||
| flags.DEFINE_string('vsa_driver', 'nova.vsa.connection.get_connection', | ||||
|                     'Driver to use for controlling VSAs') | ||||
| FLAGS.add_option(vsa_driver_opt) | ||||
|  | ||||
| LOG = logging.getLogger('nova.vsa.manager') | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Mark McLoughlin
					Mark McLoughlin