conf: Move api options to a group
Change-Id: Ida4ee57d6e1822e35e3198f6d3a89410e211d57d Implements: bp centralize-config-options-ocata
This commit is contained in:
parent
80306af88b
commit
b7b282ed08
nova
api
conf
tests
functional
unit
releasenotes/notes
@ -55,7 +55,7 @@ def pipeline_factory(loader, global_conf, **local_conf):
|
|||||||
|
|
||||||
def pipeline_factory_v21(loader, global_conf, **local_conf):
|
def pipeline_factory_v21(loader, global_conf, **local_conf):
|
||||||
"""A paste pipeline replica that keys off of auth_strategy."""
|
"""A paste pipeline replica that keys off of auth_strategy."""
|
||||||
return _load_pipeline(loader, local_conf[CONF.auth_strategy].split())
|
return _load_pipeline(loader, local_conf[CONF.api.auth_strategy].split())
|
||||||
|
|
||||||
|
|
||||||
class InjectContext(wsgi.Middleware):
|
class InjectContext(wsgi.Middleware):
|
||||||
@ -82,7 +82,7 @@ class NovaKeystoneContext(wsgi.Middleware):
|
|||||||
|
|
||||||
# Build a context, including the auth_token...
|
# Build a context, including the auth_token...
|
||||||
remote_address = req.remote_addr
|
remote_address = req.remote_addr
|
||||||
if CONF.use_forwarded_for:
|
if CONF.api.use_forwarded_for:
|
||||||
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
||||||
|
|
||||||
service_catalog = None
|
service_catalog = None
|
||||||
|
@ -483,8 +483,8 @@ class InstanceMetadata(object):
|
|||||||
# specified an old style driver here, then use that. This second
|
# specified an old style driver here, then use that. This second
|
||||||
# bit can be removed once old style vendordata is fully deprecated
|
# bit can be removed once old style vendordata is fully deprecated
|
||||||
# and removed.
|
# and removed.
|
||||||
if (CONF.vendordata_providers and
|
if (CONF.api.vendordata_providers and
|
||||||
'StaticJSON' in CONF.vendordata_providers):
|
'StaticJSON' in CONF.api.vendordata_providers):
|
||||||
return jsonutils.dump_as_bytes(
|
return jsonutils.dump_as_bytes(
|
||||||
self.vendordata_providers['StaticJSON'].get())
|
self.vendordata_providers['StaticJSON'].get())
|
||||||
else:
|
else:
|
||||||
@ -499,7 +499,7 @@ class InstanceMetadata(object):
|
|||||||
self.set_mimetype(MIME_TYPE_APPLICATION_JSON)
|
self.set_mimetype(MIME_TYPE_APPLICATION_JSON)
|
||||||
|
|
||||||
j = {}
|
j = {}
|
||||||
for provider in CONF.vendordata_providers:
|
for provider in CONF.api.vendordata_providers:
|
||||||
if provider == 'StaticJSON':
|
if provider == 'StaticJSON':
|
||||||
j['static'] = self.vendordata_providers['StaticJSON'].get()
|
j['static'] = self.vendordata_providers['StaticJSON'].get()
|
||||||
else:
|
else:
|
||||||
@ -576,7 +576,7 @@ class InstanceMetadata(object):
|
|||||||
"""Yields (path, value) tuples for metadata elements."""
|
"""Yields (path, value) tuples for metadata elements."""
|
||||||
# EC2 style metadata
|
# EC2 style metadata
|
||||||
for version in VERSIONS + ["latest"]:
|
for version in VERSIONS + ["latest"]:
|
||||||
if version in CONF.config_drive_skip_versions.split(' '):
|
if version in CONF.api.config_drive_skip_versions.split(' '):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
data = self.get_ec2_metadata(version)
|
data = self.get_ec2_metadata(version)
|
||||||
|
@ -45,7 +45,7 @@ class MetadataRequestHandler(wsgi.Application):
|
|||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._cache = cache_utils.get_client(
|
self._cache = cache_utils.get_client(
|
||||||
expiration_time=CONF.metadata_cache_expiration)
|
expiration_time=CONF.api.metadata_cache_expiration)
|
||||||
if (CONF.neutron.service_metadata_proxy and
|
if (CONF.neutron.service_metadata_proxy and
|
||||||
not CONF.neutron.metadata_proxy_shared_secret):
|
not CONF.neutron.metadata_proxy_shared_secret):
|
||||||
LOG.warning(_LW("metadata_proxy_shared_secret is not configured, "
|
LOG.warning(_LW("metadata_proxy_shared_secret is not configured, "
|
||||||
@ -67,7 +67,7 @@ class MetadataRequestHandler(wsgi.Application):
|
|||||||
except exception.NotFound:
|
except exception.NotFound:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if CONF.metadata_cache_expiration > 0:
|
if CONF.api.metadata_cache_expiration > 0:
|
||||||
self._cache.set(cache_key, data)
|
self._cache.set(cache_key, data)
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@ -84,7 +84,7 @@ class MetadataRequestHandler(wsgi.Application):
|
|||||||
except exception.NotFound:
|
except exception.NotFound:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
if CONF.metadata_cache_expiration > 0:
|
if CONF.api.metadata_cache_expiration > 0:
|
||||||
self._cache.set(cache_key, data)
|
self._cache.set(cache_key, data)
|
||||||
|
|
||||||
return data
|
return data
|
||||||
@ -132,7 +132,7 @@ class MetadataRequestHandler(wsgi.Application):
|
|||||||
|
|
||||||
def _handle_remote_ip_request(self, req):
|
def _handle_remote_ip_request(self, req):
|
||||||
remote_address = req.remote_addr
|
remote_address = req.remote_addr
|
||||||
if CONF.use_forwarded_for:
|
if CONF.api.use_forwarded_for:
|
||||||
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
@ -65,11 +65,11 @@ class DynamicVendorData(vendordata.VendorDataDriver):
|
|||||||
# SSL verification
|
# SSL verification
|
||||||
verify = url.startswith('https://')
|
verify = url.startswith('https://')
|
||||||
|
|
||||||
if verify and CONF.vendordata_dynamic_ssl_certfile:
|
if verify and CONF.api.vendordata_dynamic_ssl_certfile:
|
||||||
verify = CONF.vendordata_dynamic_ssl_certfile
|
verify = CONF.api.vendordata_dynamic_ssl_certfile
|
||||||
|
|
||||||
timeout = (CONF.vendordata_dynamic_connect_timeout,
|
timeout = (CONF.api.vendordata_dynamic_connect_timeout,
|
||||||
CONF.vendordata_dynamic_read_timeout)
|
CONF.api.vendordata_dynamic_read_timeout)
|
||||||
|
|
||||||
res = requests.request('POST', url, data=jsonutils.dumps(body),
|
res = requests.request('POST', url, data=jsonutils.dumps(body),
|
||||||
headers=headers, verify=verify,
|
headers=headers, verify=verify,
|
||||||
@ -96,7 +96,7 @@ class DynamicVendorData(vendordata.VendorDataDriver):
|
|||||||
def get(self):
|
def get(self):
|
||||||
j = {}
|
j = {}
|
||||||
|
|
||||||
for target in CONF.vendordata_dynamic_targets:
|
for target in CONF.api.vendordata_dynamic_targets:
|
||||||
# NOTE(mikal): a target is composed of the following:
|
# NOTE(mikal): a target is composed of the following:
|
||||||
# name@url
|
# name@url
|
||||||
# where name is the name to use in the metadata handed to
|
# where name is the name to use in the metadata handed to
|
||||||
|
@ -32,7 +32,7 @@ class JsonFileVendorData(vendordata.VendorDataDriver):
|
|||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(JsonFileVendorData, self).__init__(*args, **kwargs)
|
super(JsonFileVendorData, self).__init__(*args, **kwargs)
|
||||||
data = {}
|
data = {}
|
||||||
fpath = CONF.vendordata_jsonfile_path
|
fpath = CONF.api.vendordata_jsonfile_path
|
||||||
logprefix = "vendordata_jsonfile_path[%s]:" % fpath
|
logprefix = "vendordata_jsonfile_path[%s]:" % fpath
|
||||||
if fpath:
|
if fpath:
|
||||||
try:
|
try:
|
||||||
|
@ -50,7 +50,7 @@ class NoAuthMiddlewareBase(base_wsgi.Middleware):
|
|||||||
user_id, _sep, project_id = token.partition(':')
|
user_id, _sep, project_id = token.partition(':')
|
||||||
project_id = project_id or user_id
|
project_id = project_id or user_id
|
||||||
remote_address = getattr(req, 'remote_address', '127.0.0.1')
|
remote_address = getattr(req, 'remote_address', '127.0.0.1')
|
||||||
if CONF.use_forwarded_for:
|
if CONF.api.use_forwarded_for:
|
||||||
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
remote_address = req.headers.get('X-Forwarded-For', remote_address)
|
||||||
is_admin = always_admin or (user_id == 'admin')
|
is_admin = always_admin or (user_id == 'admin')
|
||||||
ctx = context.RequestContext(user_id,
|
ctx = context.RequestContext(user_id,
|
||||||
|
@ -227,7 +227,7 @@ def limited(items, request):
|
|||||||
"""
|
"""
|
||||||
params = get_pagination_params(request)
|
params = get_pagination_params(request)
|
||||||
offset = params.get('offset', 0)
|
offset = params.get('offset', 0)
|
||||||
limit = CONF.osapi_max_limit
|
limit = CONF.api.max_limit
|
||||||
limit = min(limit, params.get('limit') or limit)
|
limit = min(limit, params.get('limit') or limit)
|
||||||
|
|
||||||
return items[offset:(offset + limit)]
|
return items[offset:(offset + limit)]
|
||||||
@ -236,7 +236,7 @@ def limited(items, request):
|
|||||||
def get_limit_and_marker(request):
|
def get_limit_and_marker(request):
|
||||||
"""Get limited parameter from request."""
|
"""Get limited parameter from request."""
|
||||||
params = get_pagination_params(request)
|
params = get_pagination_params(request)
|
||||||
limit = CONF.osapi_max_limit
|
limit = CONF.api.max_limit
|
||||||
limit = min(limit, params.get('limit', limit))
|
limit = min(limit, params.get('limit', limit))
|
||||||
marker = params.get('marker', None)
|
marker = params.get('marker', None)
|
||||||
|
|
||||||
@ -351,7 +351,7 @@ def raise_http_conflict_for_instance_invalid_state(exc, action, server_id):
|
|||||||
def check_snapshots_enabled(f):
|
def check_snapshots_enabled(f):
|
||||||
@functools.wraps(f)
|
@functools.wraps(f)
|
||||||
def inner(*args, **kwargs):
|
def inner(*args, **kwargs):
|
||||||
if not CONF.allow_instance_snapshots:
|
if not CONF.api.allow_instance_snapshots:
|
||||||
LOG.warning(_LW('Rejecting snapshot request, snapshots currently'
|
LOG.warning(_LW('Rejecting snapshot request, snapshots currently'
|
||||||
' disabled'))
|
' disabled'))
|
||||||
msg = _("Instance snapshots are not permitted at this time.")
|
msg = _("Instance snapshots are not permitted at this time.")
|
||||||
@ -433,15 +433,15 @@ class ViewBuilder(object):
|
|||||||
id_key="uuid"):
|
id_key="uuid"):
|
||||||
"""Retrieve 'next' link, if applicable. This is included if:
|
"""Retrieve 'next' link, if applicable. This is included if:
|
||||||
1) 'limit' param is specified and equals the number of items.
|
1) 'limit' param is specified and equals the number of items.
|
||||||
2) 'limit' param is specified but it exceeds CONF.osapi_max_limit,
|
2) 'limit' param is specified but it exceeds CONF.api.max_limit,
|
||||||
in this case the number of items is CONF.osapi_max_limit.
|
in this case the number of items is CONF.api.max_limit.
|
||||||
3) 'limit' param is NOT specified but the number of items is
|
3) 'limit' param is NOT specified but the number of items is
|
||||||
CONF.osapi_max_limit.
|
CONF.api.max_limit.
|
||||||
"""
|
"""
|
||||||
links = []
|
links = []
|
||||||
max_items = min(
|
max_items = min(
|
||||||
int(request.params.get("limit", CONF.osapi_max_limit)),
|
int(request.params.get("limit", CONF.api.max_limit)),
|
||||||
CONF.osapi_max_limit)
|
CONF.api.max_limit)
|
||||||
if max_items and max_items == len(items):
|
if max_items and max_items == len(items):
|
||||||
last_item = items[-1]
|
last_item = items[-1]
|
||||||
if id_key in last_item:
|
if id_key in last_item:
|
||||||
@ -468,12 +468,10 @@ class ViewBuilder(object):
|
|||||||
return urlparse.urlunsplit(url_parts).rstrip('/')
|
return urlparse.urlunsplit(url_parts).rstrip('/')
|
||||||
|
|
||||||
def _update_glance_link_prefix(self, orig_url):
|
def _update_glance_link_prefix(self, orig_url):
|
||||||
return self._update_link_prefix(orig_url,
|
return self._update_link_prefix(orig_url, CONF.api.glance_link_prefix)
|
||||||
CONF.osapi_glance_link_prefix)
|
|
||||||
|
|
||||||
def _update_compute_link_prefix(self, orig_url):
|
def _update_compute_link_prefix(self, orig_url):
|
||||||
return self._update_link_prefix(orig_url,
|
return self._update_link_prefix(orig_url, CONF.api.compute_link_prefix)
|
||||||
CONF.osapi_compute_link_prefix)
|
|
||||||
|
|
||||||
|
|
||||||
def get_instance(compute_api, context, instance_id, expected_attrs=None):
|
def get_instance(compute_api, context, instance_id, expected_attrs=None):
|
||||||
|
@ -128,7 +128,7 @@ class EvacuateController(wsgi.Controller):
|
|||||||
raise exc.HTTPBadRequest(explanation=e.format_message())
|
raise exc.HTTPBadRequest(explanation=e.format_message())
|
||||||
|
|
||||||
if (not api_version_request.is_supported(req, min_version='2.14') and
|
if (not api_version_request.is_supported(req, min_version='2.14') and
|
||||||
CONF.enable_instance_password):
|
CONF.api.enable_instance_password):
|
||||||
return {'adminPass': password}
|
return {'adminPass': password}
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
@ -43,13 +43,13 @@ class FpingController(wsgi.Controller):
|
|||||||
self.last_call = {}
|
self.last_call = {}
|
||||||
|
|
||||||
def check_fping(self):
|
def check_fping(self):
|
||||||
if not os.access(CONF.fping_path, os.X_OK):
|
if not os.access(CONF.api.fping_path, os.X_OK):
|
||||||
raise exc.HTTPServiceUnavailable(
|
raise exc.HTTPServiceUnavailable(
|
||||||
explanation=_("fping utility is not found."))
|
explanation=_("fping utility is not found."))
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def fping(ips):
|
def fping(ips):
|
||||||
fping_ret = utils.execute(CONF.fping_path, *ips,
|
fping_ret = utils.execute(CONF.api.fping_path, *ips,
|
||||||
check_exit_code=False)
|
check_exit_code=False)
|
||||||
if not fping_ret:
|
if not fping_ret:
|
||||||
return set()
|
return set()
|
||||||
|
@ -30,7 +30,7 @@ ALIAS = 'os-hide-server-addresses'
|
|||||||
class Controller(wsgi.Controller):
|
class Controller(wsgi.Controller):
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
super(Controller, self).__init__(*args, **kwargs)
|
super(Controller, self).__init__(*args, **kwargs)
|
||||||
hidden_states = CONF.osapi_hide_server_address_states
|
hidden_states = CONF.api.hide_server_address_states
|
||||||
|
|
||||||
# NOTE(jkoelker) _ is not considered uppercase ;)
|
# NOTE(jkoelker) _ is not considered uppercase ;)
|
||||||
valid_vm_states = [getattr(vm_states, state)
|
valid_vm_states = [getattr(vm_states, state)
|
||||||
|
@ -143,10 +143,10 @@ class QuotaSetsController(wsgi.Controller):
|
|||||||
|
|
||||||
quota_set = body['quota_set']
|
quota_set = body['quota_set']
|
||||||
|
|
||||||
# NOTE(alex_xu): The CONF.enable_network_quota was deprecated due to
|
# NOTE(alex_xu): The CONF.enable_network_quota was deprecated
|
||||||
# it is only used by nova-network, and nova-network will be deprecated
|
# due to it is only used by nova-network, and nova-network will be
|
||||||
# also. So when CONF.enable_newtork_quota is removed, the networks
|
# deprecated also. So when CONF.enable_newtork_quota is removed,
|
||||||
# quota will disappeare also.
|
# the networks quota will disappeare also.
|
||||||
if not CONF.enable_network_quota and 'networks' in quota_set:
|
if not CONF.enable_network_quota and 'networks' in quota_set:
|
||||||
raise webob.exc.HTTPBadRequest(
|
raise webob.exc.HTTPBadRequest(
|
||||||
explanation=_('The networks quota is disabled'))
|
explanation=_('The networks quota is disabled'))
|
||||||
|
@ -77,7 +77,7 @@ class RescueController(wsgi.Controller):
|
|||||||
raise exc.HTTPBadRequest(
|
raise exc.HTTPBadRequest(
|
||||||
explanation=non_rescuable.format_message())
|
explanation=non_rescuable.format_message())
|
||||||
|
|
||||||
if CONF.enable_instance_password:
|
if CONF.api.enable_instance_password:
|
||||||
return {'adminPass': password}
|
return {'adminPass': password}
|
||||||
else:
|
else:
|
||||||
return {}
|
return {}
|
||||||
|
@ -708,7 +708,7 @@ class ServersController(wsgi.Controller):
|
|||||||
req.cache_db_instances(instances)
|
req.cache_db_instances(instances)
|
||||||
server = self._view_builder.create(req, instances[0])
|
server = self._view_builder.create(req, instances[0])
|
||||||
|
|
||||||
if CONF.enable_instance_password:
|
if CONF.api.enable_instance_password:
|
||||||
server['server']['adminPass'] = password
|
server['server']['adminPass'] = password
|
||||||
|
|
||||||
robj = wsgi.ResponseObject(server)
|
robj = wsgi.ResponseObject(server)
|
||||||
@ -1032,7 +1032,7 @@ class ServersController(wsgi.Controller):
|
|||||||
|
|
||||||
# Add on the admin_password attribute since the view doesn't do it
|
# Add on the admin_password attribute since the view doesn't do it
|
||||||
# unless instance passwords are disabled
|
# unless instance passwords are disabled
|
||||||
if CONF.enable_instance_password:
|
if CONF.api.enable_instance_password:
|
||||||
view['server']['adminPass'] = password
|
view['server']['adminPass'] = password
|
||||||
|
|
||||||
robj = wsgi.ResponseObject(view)
|
robj = wsgi.ResponseObject(view)
|
||||||
|
@ -60,14 +60,14 @@ class TenantNetworkController(wsgi.Controller):
|
|||||||
|
|
||||||
def _refresh_default_networks(self):
|
def _refresh_default_networks(self):
|
||||||
self._default_networks = []
|
self._default_networks = []
|
||||||
if CONF.use_neutron_default_nets:
|
if CONF.api.use_neutron_default_nets:
|
||||||
try:
|
try:
|
||||||
self._default_networks = self._get_default_networks()
|
self._default_networks = self._get_default_networks()
|
||||||
except Exception:
|
except Exception:
|
||||||
LOG.exception(_LE("Failed to get default networks"))
|
LOG.exception(_LE("Failed to get default networks"))
|
||||||
|
|
||||||
def _get_default_networks(self):
|
def _get_default_networks(self):
|
||||||
project_id = CONF.neutron_default_tenant_id
|
project_id = CONF.api.neutron_default_tenant_id
|
||||||
ctx = nova_context.RequestContext(user_id=None,
|
ctx = nova_context.RequestContext(user_id=None,
|
||||||
project_id=project_id)
|
project_id=project_id)
|
||||||
networks = {}
|
networks = {}
|
||||||
|
@ -34,7 +34,7 @@ objects.register_all()
|
|||||||
|
|
||||||
def deploy(conf, project_name):
|
def deploy(conf, project_name):
|
||||||
"""Assemble the middleware pipeline leading to the placement app."""
|
"""Assemble the middleware pipeline leading to the placement app."""
|
||||||
if conf.auth_strategy == 'noauth2':
|
if conf.api.auth_strategy == 'noauth2':
|
||||||
auth_middleware = auth.NoAuthMiddleware
|
auth_middleware = auth.NoAuthMiddleware
|
||||||
else:
|
else:
|
||||||
# Do not provide global conf to middleware here.
|
# Do not provide global conf to middleware here.
|
||||||
|
137
nova/conf/api.py
137
nova/conf/api.py
@ -15,10 +15,15 @@
|
|||||||
|
|
||||||
from oslo_config import cfg
|
from oslo_config import cfg
|
||||||
|
|
||||||
|
api_group = cfg.OptGroup('api', title='API options', help="""
|
||||||
|
Options under this group are used to define Nova API.
|
||||||
|
""")
|
||||||
|
|
||||||
auth_opts = [
|
auth_opts = [
|
||||||
cfg.StrOpt("auth_strategy",
|
cfg.StrOpt("auth_strategy",
|
||||||
default="keystone",
|
default="keystone",
|
||||||
choices=("keystone", "noauth2"),
|
choices=("keystone", "noauth2"),
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
This determines the strategy to use for authentication: keystone or noauth2.
|
This determines the strategy to use for authentication: keystone or noauth2.
|
||||||
'noauth2' is designed for testing only, as it does no actual credential
|
'noauth2' is designed for testing only, as it does no actual credential
|
||||||
@ -27,6 +32,7 @@ specified as the username.
|
|||||||
"""),
|
"""),
|
||||||
cfg.BoolOpt("use_forwarded_for",
|
cfg.BoolOpt("use_forwarded_for",
|
||||||
default=False,
|
default=False,
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
When True, the 'X-Forwarded-For' header is treated as the canonical remote
|
When True, the 'X-Forwarded-For' header is treated as the canonical remote
|
||||||
address. When False (the default), the 'remote_address' header is used.
|
address. When False (the default), the 'remote_address' header is used.
|
||||||
@ -39,6 +45,7 @@ metadata_opts = [
|
|||||||
cfg.StrOpt("config_drive_skip_versions",
|
cfg.StrOpt("config_drive_skip_versions",
|
||||||
default=("1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 "
|
default=("1.0 2007-01-19 2007-03-01 2007-08-29 2007-10-10 "
|
||||||
"2007-12-15 2008-02-01 2008-09-01"),
|
"2007-12-15 2008-02-01 2008-09-01"),
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
When gathering the existing metadata for a config drive, the EC2-style
|
When gathering the existing metadata for a config drive, the EC2-style
|
||||||
metadata is returned for all versions that don't appear in this option.
|
metadata is returned for all versions that don't appear in this option.
|
||||||
@ -60,22 +67,10 @@ by a space.
|
|||||||
Possible values:
|
Possible values:
|
||||||
|
|
||||||
* Any string that represents zero or more versions, separated by spaces.
|
* Any string that represents zero or more versions, separated by spaces.
|
||||||
"""),
|
|
||||||
cfg.StrOpt("vendordata_driver",
|
|
||||||
default="nova.api.metadata.vendordata_json.JsonFileVendorData",
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_since="13.0.0",
|
|
||||||
help="""
|
|
||||||
When returning instance metadata, this is the class that is used
|
|
||||||
for getting vendor metadata when that class isn't specified in the individual
|
|
||||||
request. The value should be the full dot-separated path to the class to use.
|
|
||||||
|
|
||||||
Possible values:
|
|
||||||
|
|
||||||
* Any valid dot-separated class path that can be imported.
|
|
||||||
"""),
|
"""),
|
||||||
cfg.ListOpt('vendordata_providers',
|
cfg.ListOpt('vendordata_providers',
|
||||||
default=[],
|
default=[],
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
A list of vendordata providers.
|
A list of vendordata providers.
|
||||||
|
|
||||||
@ -109,6 +104,7 @@ Related options:
|
|||||||
"""),
|
"""),
|
||||||
cfg.ListOpt('vendordata_dynamic_targets',
|
cfg.ListOpt('vendordata_dynamic_targets',
|
||||||
default=[],
|
default=[],
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
A list of targets for the dynamic vendordata provider. These targets are of
|
A list of targets for the dynamic vendordata provider. These targets are of
|
||||||
the form <name>@<url>.
|
the form <name>@<url>.
|
||||||
@ -119,6 +115,7 @@ is documented in the vendordata.rst file in the nova developer reference.
|
|||||||
"""),
|
"""),
|
||||||
cfg.StrOpt('vendordata_dynamic_ssl_certfile',
|
cfg.StrOpt('vendordata_dynamic_ssl_certfile',
|
||||||
default='',
|
default='',
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
Path to an optional certificate file or CA bundle to verify dynamic
|
Path to an optional certificate file or CA bundle to verify dynamic
|
||||||
vendordata REST services ssl certificates against.
|
vendordata REST services ssl certificates against.
|
||||||
@ -137,6 +134,7 @@ Related options:
|
|||||||
cfg.IntOpt('vendordata_dynamic_connect_timeout',
|
cfg.IntOpt('vendordata_dynamic_connect_timeout',
|
||||||
default=5,
|
default=5,
|
||||||
min=3,
|
min=3,
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
Maximum wait time for an external REST service to connect.
|
Maximum wait time for an external REST service to connect.
|
||||||
|
|
||||||
@ -156,6 +154,7 @@ Related options:
|
|||||||
cfg.IntOpt('vendordata_dynamic_read_timeout',
|
cfg.IntOpt('vendordata_dynamic_read_timeout',
|
||||||
default=5,
|
default=5,
|
||||||
min=0,
|
min=0,
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
Maximum wait time for an external REST service to return data once connected.
|
Maximum wait time for an external REST service to return data once connected.
|
||||||
|
|
||||||
@ -174,6 +173,7 @@ Related options:
|
|||||||
cfg.IntOpt("metadata_cache_expiration",
|
cfg.IntOpt("metadata_cache_expiration",
|
||||||
default=15,
|
default=15,
|
||||||
min=0,
|
min=0,
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
This option is the time (in seconds) to cache metadata. When set to 0,
|
This option is the time (in seconds) to cache metadata. When set to 0,
|
||||||
metadata caching is disabled entirely; this is generally not recommended for
|
metadata caching is disabled entirely; this is generally not recommended for
|
||||||
@ -185,6 +185,7 @@ usage, and result in longer times for host metadata changes to take effect.
|
|||||||
|
|
||||||
file_opts = [
|
file_opts = [
|
||||||
cfg.StrOpt("vendordata_jsonfile_path",
|
cfg.StrOpt("vendordata_jsonfile_path",
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
Cloud providers may store custom data in vendor data file that will then be
|
Cloud providers may store custom data in vendor data file that will then be
|
||||||
available to the instances via the metadata service, and to the rendering of
|
available to the instances via the metadata service, and to the rendering of
|
||||||
@ -200,14 +201,18 @@ Possible values:
|
|||||||
]
|
]
|
||||||
|
|
||||||
osapi_opts = [
|
osapi_opts = [
|
||||||
cfg.IntOpt("osapi_max_limit",
|
cfg.IntOpt("max_limit",
|
||||||
default=1000,
|
default=1000,
|
||||||
min=0,
|
min=0,
|
||||||
|
deprecated_group="default",
|
||||||
|
deprecated_name="osapi_max_limit",
|
||||||
help="""
|
help="""
|
||||||
As a query can potentially return many thousands of items, you can limit the
|
As a query can potentially return many thousands of items, you can limit the
|
||||||
maximum number of items in a single response by setting this option.
|
maximum number of items in a single response by setting this option.
|
||||||
"""),
|
"""),
|
||||||
cfg.StrOpt("osapi_compute_link_prefix",
|
cfg.StrOpt("compute_link_prefix",
|
||||||
|
deprecated_group="default",
|
||||||
|
deprecated_name="osapi_compute_link_prefix",
|
||||||
help="""
|
help="""
|
||||||
This string is prepended to the normal URL that is returned in links to the
|
This string is prepended to the normal URL that is returned in links to the
|
||||||
OpenStack Compute API. If it is empty (the default), the URLs are returned
|
OpenStack Compute API. If it is empty (the default), the URLs are returned
|
||||||
@ -217,7 +222,9 @@ Possible values:
|
|||||||
|
|
||||||
* Any string, including an empty string (the default).
|
* Any string, including an empty string (the default).
|
||||||
"""),
|
"""),
|
||||||
cfg.StrOpt("osapi_glance_link_prefix",
|
cfg.StrOpt("glance_link_prefix",
|
||||||
|
deprecated_group="default",
|
||||||
|
deprecated_name="osapi_glance_link_prefix",
|
||||||
help="""
|
help="""
|
||||||
This string is prepended to the normal URL that is returned in links to
|
This string is prepended to the normal URL that is returned in links to
|
||||||
Glance resources. If it is empty (the default), the URLs are returned
|
Glance resources. If it is empty (the default), the URLs are returned
|
||||||
@ -232,6 +239,7 @@ Possible values:
|
|||||||
allow_instance_snapshots_opts = [
|
allow_instance_snapshots_opts = [
|
||||||
cfg.BoolOpt("allow_instance_snapshots",
|
cfg.BoolOpt("allow_instance_snapshots",
|
||||||
default=True,
|
default=True,
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
Operators can turn off the ability for a user to take snapshots of their
|
Operators can turn off the ability for a user to take snapshots of their
|
||||||
instances by setting this option to False. When disabled, any attempt to
|
instances by setting this option to False. When disabled, any attempt to
|
||||||
@ -244,8 +252,10 @@ take a snapshot will result in a HTTP 400 response ("Bad Request").
|
|||||||
# is not likely to be changed, I'm copy/pasting it here.
|
# is not likely to be changed, I'm copy/pasting it here.
|
||||||
BUILDING = "building" # VM only exists in DB
|
BUILDING = "building" # VM only exists in DB
|
||||||
osapi_hide_opts = [
|
osapi_hide_opts = [
|
||||||
cfg.ListOpt("osapi_hide_server_address_states",
|
cfg.ListOpt("hide_server_address_states",
|
||||||
default=[BUILDING],
|
default=[BUILDING],
|
||||||
|
deprecated_group="default",
|
||||||
|
deprecated_name="osapi_hide_server_address_states",
|
||||||
help="""
|
help="""
|
||||||
This option is a list of all instance states for which network address
|
This option is a list of all instance states for which network address
|
||||||
information should not be returned from the API.
|
information should not be returned from the API.
|
||||||
@ -273,26 +283,14 @@ Possible values:
|
|||||||
fping_path_opts = [
|
fping_path_opts = [
|
||||||
cfg.StrOpt("fping_path",
|
cfg.StrOpt("fping_path",
|
||||||
default="/usr/sbin/fping",
|
default="/usr/sbin/fping",
|
||||||
|
deprecated_group="default",
|
||||||
help="The full path to the fping binary.")
|
help="The full path to the fping binary.")
|
||||||
]
|
]
|
||||||
|
|
||||||
os_network_opts = [
|
os_network_opts = [
|
||||||
cfg.BoolOpt("enable_network_quota",
|
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_since="14.0.0",
|
|
||||||
deprecated_reason="""
|
|
||||||
CRUD operations on tenant networks are only available when using nova-network
|
|
||||||
and nova-network is itself deprecated.""",
|
|
||||||
default=False,
|
|
||||||
help="""
|
|
||||||
This option is used to enable or disable quota checking for tenant networks.
|
|
||||||
|
|
||||||
Related options:
|
|
||||||
|
|
||||||
* quota_networks
|
|
||||||
"""),
|
|
||||||
cfg.BoolOpt("use_neutron_default_nets",
|
cfg.BoolOpt("use_neutron_default_nets",
|
||||||
default=False,
|
default=False,
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
When True, the TenantNetworkController will query the Neutron API to get the
|
When True, the TenantNetworkController will query the Neutron API to get the
|
||||||
default networks to use.
|
default networks to use.
|
||||||
@ -303,6 +301,7 @@ Related options:
|
|||||||
"""),
|
"""),
|
||||||
cfg.StrOpt("neutron_default_tenant_id",
|
cfg.StrOpt("neutron_default_tenant_id",
|
||||||
default="default",
|
default="default",
|
||||||
|
deprecated_group="default",
|
||||||
help="""
|
help="""
|
||||||
Tenant ID for getting the default network from Neutron API (also referred in
|
Tenant ID for getting the default network from Neutron API (also referred in
|
||||||
some places as the 'project ID') to use.
|
some places as the 'project ID') to use.
|
||||||
@ -311,15 +310,57 @@ Related options:
|
|||||||
|
|
||||||
* use_neutron_default_nets
|
* use_neutron_default_nets
|
||||||
"""),
|
"""),
|
||||||
cfg.IntOpt("quota_networks",
|
]
|
||||||
deprecated_for_removal=True,
|
|
||||||
deprecated_since="14.0.0",
|
enable_inst_pw_opts = [
|
||||||
deprecated_reason="""
|
cfg.BoolOpt("enable_instance_password",
|
||||||
|
default=True,
|
||||||
|
deprecated_group="default",
|
||||||
|
help="""
|
||||||
|
Enables returning of the instance password by the relevant server API calls
|
||||||
|
such as create, rebuild, evacuate, or rescue. If the hypervisor does not
|
||||||
|
support password injection, then the password returned will not be correct,
|
||||||
|
so if your hypervisor does not support password injection, set this to False.
|
||||||
|
""")
|
||||||
|
]
|
||||||
|
|
||||||
|
deprecated_opts = [
|
||||||
|
cfg.StrOpt("vendordata_driver",
|
||||||
|
default="nova.api.metadata.vendordata_json.JsonFileVendorData",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_since="13.0.0",
|
||||||
|
help="""
|
||||||
|
When returning instance metadata, this is the class that is used
|
||||||
|
for getting vendor metadata when that class isn't specified in the individual
|
||||||
|
request. The value should be the full dot-separated path to the class to use.
|
||||||
|
|
||||||
|
Possible values:
|
||||||
|
|
||||||
|
* Any valid dot-separated class path that can be imported.
|
||||||
|
"""),
|
||||||
|
cfg.BoolOpt("enable_network_quota",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_since="14.0.0",
|
||||||
|
deprecated_reason="""
|
||||||
CRUD operations on tenant networks are only available when using nova-network
|
CRUD operations on tenant networks are only available when using nova-network
|
||||||
and nova-network is itself deprecated.""",
|
and nova-network is itself deprecated.""",
|
||||||
default=3,
|
default=False,
|
||||||
min=0,
|
help="""
|
||||||
help="""
|
This option is used to enable or disable quota checking for tenant networks.
|
||||||
|
|
||||||
|
Related options:
|
||||||
|
|
||||||
|
* quota_networks
|
||||||
|
"""),
|
||||||
|
cfg.IntOpt("quota_networks",
|
||||||
|
deprecated_for_removal=True,
|
||||||
|
deprecated_since="14.0.0",
|
||||||
|
deprecated_reason="""
|
||||||
|
CRUD operations on tenant networks are only available when using nova-network
|
||||||
|
and nova-network is itself deprecated.""",
|
||||||
|
default=3,
|
||||||
|
min=0,
|
||||||
|
help="""
|
||||||
This option controls the number of private networks that can be created per
|
This option controls the number of private networks that can be created per
|
||||||
project (or per tenant).
|
project (or per tenant).
|
||||||
|
|
||||||
@ -329,17 +370,7 @@ Related options:
|
|||||||
"""),
|
"""),
|
||||||
]
|
]
|
||||||
|
|
||||||
enable_inst_pw_opts = [
|
API_OPTS = (auth_opts +
|
||||||
cfg.BoolOpt("enable_instance_password",
|
|
||||||
default=True,
|
|
||||||
help="""
|
|
||||||
Enables returning of the instance password by the relevant server API calls
|
|
||||||
such as create, rebuild, evacuate, or rescue. If the hypervisor does not
|
|
||||||
support password injection, then the password returned will not be correct,
|
|
||||||
so if your hypervisor does not support password injection, set this to False.
|
|
||||||
""")
|
|
||||||
]
|
|
||||||
ALL_OPTS = (auth_opts +
|
|
||||||
metadata_opts +
|
metadata_opts +
|
||||||
file_opts +
|
file_opts +
|
||||||
osapi_opts +
|
osapi_opts +
|
||||||
@ -351,9 +382,11 @@ ALL_OPTS = (auth_opts +
|
|||||||
|
|
||||||
|
|
||||||
def register_opts(conf):
|
def register_opts(conf):
|
||||||
conf.register_opts(ALL_OPTS)
|
conf.register_group(api_group)
|
||||||
|
conf.register_opts(API_OPTS, group=api_group)
|
||||||
|
conf.register_opts(deprecated_opts)
|
||||||
|
|
||||||
|
|
||||||
def list_opts():
|
def list_opts():
|
||||||
# TODO(macsz) add opt group
|
return {api_group: API_OPTS,
|
||||||
return {"DEFAULT": ALL_OPTS}
|
'DEFAULT': deprecated_opts}
|
||||||
|
@ -47,7 +47,7 @@ class APIFixture(fixture.GabbiFixture):
|
|||||||
self.output_stream_fixture.setUp()
|
self.output_stream_fixture.setUp()
|
||||||
|
|
||||||
self.conf = CONF
|
self.conf = CONF
|
||||||
self.conf.set_override('auth_strategy', 'noauth2')
|
self.conf.set_override('auth_strategy', 'noauth2', group='api')
|
||||||
# Be explicit about all three database connections to avoid
|
# Be explicit about all three database connections to avoid
|
||||||
# potential conflicts with config on disk.
|
# potential conflicts with config on disk.
|
||||||
self.conf.set_override('connection', "sqlite://", group='database')
|
self.conf.set_override('connection', "sqlite://", group='database')
|
||||||
|
@ -48,7 +48,7 @@ class SchedulerReportClientTests(test.TestCase):
|
|||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(SchedulerReportClientTests, self).setUp()
|
super(SchedulerReportClientTests, self).setUp()
|
||||||
self.flags(auth_strategy='noauth2')
|
self.flags(auth_strategy='noauth2', group='api')
|
||||||
|
|
||||||
self.app = lambda: deploy.loadapp(CONF)
|
self.app = lambda: deploy.loadapp(CONF)
|
||||||
self.client = NoAuthReportClient()
|
self.client = NoAuthReportClient()
|
||||||
|
@ -78,9 +78,10 @@ class ApiSampleTestBaseV21(testscenarios.WithScenarios,
|
|||||||
]
|
]
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.flags(use_ipv6=False,
|
self.flags(use_ipv6=False)
|
||||||
osapi_compute_link_prefix=self._get_host(),
|
self.flags(glance_link_prefix=self._get_glance_host(),
|
||||||
osapi_glance_link_prefix=self._get_glance_host())
|
compute_link_prefix=self._get_host(),
|
||||||
|
group='api')
|
||||||
|
|
||||||
# load any additional fixtures specified by the scenario
|
# load any additional fixtures specified by the scenario
|
||||||
for fix in self._additional_fixtures:
|
for fix in self._additional_fixtures:
|
||||||
|
@ -24,9 +24,9 @@ class ServersSampleHideAddressesJsonTest(test_servers.ServersSampleJsonTest):
|
|||||||
sample_dir = 'os-hide-server-addresses'
|
sample_dir = 'os-hide-server-addresses'
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
# We override osapi_hide_server_address_states in order
|
# We override hide_server_address_states in order
|
||||||
# to have an example of in the json samples of the
|
# to have an example of in the json samples of the
|
||||||
# addresses being hidden
|
# addresses being hidden
|
||||||
CONF.set_override("osapi_hide_server_address_states",
|
CONF.set_override("hide_server_address_states",
|
||||||
[vm_states.ACTIVE])
|
[vm_states.ACTIVE], group='api')
|
||||||
super(ServersSampleHideAddressesJsonTest, self).setUp()
|
super(ServersSampleHideAddressesJsonTest, self).setUp()
|
||||||
|
@ -107,7 +107,8 @@ class MetadataTest(test.TestCase):
|
|||||||
vendordata_dynamic_targets=[
|
vendordata_dynamic_targets=[
|
||||||
'testing@http://127.0.0.1:123',
|
'testing@http://127.0.0.1:123',
|
||||||
'hamster@http://127.0.0.1:123'
|
'hamster@http://127.0.0.1:123'
|
||||||
]
|
],
|
||||||
|
group='api'
|
||||||
)
|
)
|
||||||
|
|
||||||
self.useFixture(fixtures.MonkeyPatch('requests.request',
|
self.useFixture(fixtures.MonkeyPatch('requests.request',
|
||||||
@ -130,7 +131,8 @@ class MetadataTest(test.TestCase):
|
|||||||
vendordata_dynamic_targets=[
|
vendordata_dynamic_targets=[
|
||||||
'testing@http://127.0.0.1:123',
|
'testing@http://127.0.0.1:123',
|
||||||
'testing@http://127.0.0.1:124'
|
'testing@http://127.0.0.1:124'
|
||||||
]
|
],
|
||||||
|
group='api'
|
||||||
)
|
)
|
||||||
|
|
||||||
self.useFixture(fixtures.MonkeyPatch('requests.request',
|
self.useFixture(fixtures.MonkeyPatch('requests.request',
|
||||||
@ -156,7 +158,8 @@ class MetadataTest(test.TestCase):
|
|||||||
vendordata_providers=['DynamicJSON'],
|
vendordata_providers=['DynamicJSON'],
|
||||||
vendordata_dynamic_targets=[
|
vendordata_dynamic_targets=[
|
||||||
'testing@http://127.0.0.1:125'
|
'testing@http://127.0.0.1:125'
|
||||||
]
|
],
|
||||||
|
group='api'
|
||||||
)
|
)
|
||||||
|
|
||||||
self.useFixture(fixtures.MonkeyPatch('requests.request',
|
self.useFixture(fixtures.MonkeyPatch('requests.request',
|
||||||
|
@ -91,7 +91,7 @@ class AccessIPsAPIValidationTestV21(test.TestCase):
|
|||||||
|
|
||||||
def test_create_server_with_access_ip_pass_disabled(self):
|
def test_create_server_with_access_ip_pass_disabled(self):
|
||||||
# test with admin passwords disabled See lp bug 921814
|
# test with admin passwords disabled See lp bug 921814
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
params = {v4_key: '192.168.0.10',
|
params = {v4_key: '192.168.0.10',
|
||||||
v6_key: '2001:db8::9abc'}
|
v6_key: '2001:db8::9abc'}
|
||||||
res = self._test_create(params)
|
res = self._test_create(params)
|
||||||
|
@ -139,7 +139,7 @@ class AdminPasswordTestV21(test.NoDBTestCase):
|
|||||||
def test_server_change_password_pass_disabled(self):
|
def test_server_change_password_pass_disabled(self):
|
||||||
# run with enable_instance_password disabled to verify adminPass
|
# run with enable_instance_password disabled to verify adminPass
|
||||||
# is missing from response. See lp bug 921814
|
# is missing from response. See lp bug 921814
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
body = {'changePassword': {'adminPass': '1234pass'}}
|
body = {'changePassword': {'adminPass': '1234pass'}}
|
||||||
res = self._get_action()(self.fake_req, '1', body=body)
|
res = self._get_action()(self.fake_req, '1', body=body)
|
||||||
self._check_status(202, res, self._get_action())
|
self._check_status(202, res, self._get_action())
|
||||||
|
@ -222,7 +222,7 @@ class EvacuateTestV21(test.NoDBTestCase):
|
|||||||
@mock.patch('nova.objects.Instance.save')
|
@mock.patch('nova.objects.Instance.save')
|
||||||
def _test_evacuate_enable_instance_password_conf(self, mock_save,
|
def _test_evacuate_enable_instance_password_conf(self, mock_save,
|
||||||
enable_pass):
|
enable_pass):
|
||||||
self.flags(enable_instance_password=enable_pass)
|
self.flags(enable_instance_password=enable_pass, group='api')
|
||||||
|
|
||||||
res = self._get_evacuate_response({'host': 'underscore_hostname',
|
res = self._get_evacuate_response({'host': 'underscore_hostname',
|
||||||
'onSharedStorage': 'False'})
|
'onSharedStorage': 'False'})
|
||||||
|
@ -100,8 +100,9 @@ class FlavorsTestV21(test.TestCase):
|
|||||||
self.assertEqual(flavor, expected)
|
self.assertEqual(flavor, expected)
|
||||||
|
|
||||||
def test_get_flavor_with_custom_link_prefix(self):
|
def test_get_flavor_with_custom_link_prefix(self):
|
||||||
self.flags(osapi_compute_link_prefix='http://zoo.com:42',
|
self.flags(compute_link_prefix='http://zoo.com:42',
|
||||||
osapi_glance_link_prefix='http://circus.com:34')
|
glance_link_prefix='http://circus.com:34',
|
||||||
|
group='api')
|
||||||
req = self.fake_request.blank(self._prefix + '/flavors/1')
|
req = self.fake_request.blank(self._prefix + '/flavors/1')
|
||||||
flavor = self.controller.show(req, '1')
|
flavor = self.controller.show(req, '1')
|
||||||
expected = {
|
expected = {
|
||||||
@ -297,7 +298,7 @@ class FlavorsTestV21(test.TestCase):
|
|||||||
def test_get_flavor_with_default_limit(self):
|
def test_get_flavor_with_default_limit(self):
|
||||||
self.stubs.Set(common, "get_limit_and_marker",
|
self.stubs.Set(common, "get_limit_and_marker",
|
||||||
fake_get_limit_and_marker)
|
fake_get_limit_and_marker)
|
||||||
self.flags(osapi_max_limit=1)
|
self.flags(max_limit=1, group='api')
|
||||||
req = fakes.HTTPRequest.blank('/v2/fake/flavors?limit=2')
|
req = fakes.HTTPRequest.blank('/v2/fake/flavors?limit=2')
|
||||||
response = self.controller.index(req)
|
response = self.controller.index(req)
|
||||||
response_list = response["flavors"]
|
response_list = response["flavors"]
|
||||||
|
@ -152,8 +152,9 @@ class ImagesControllerTestV21(test.NoDBTestCase):
|
|||||||
|
|
||||||
@mock.patch('nova.image.api.API.get', return_value=IMAGE_FIXTURES[1])
|
@mock.patch('nova.image.api.API.get', return_value=IMAGE_FIXTURES[1])
|
||||||
def test_get_image_with_custom_prefix(self, _get_mocked):
|
def test_get_image_with_custom_prefix(self, _get_mocked):
|
||||||
self.flags(osapi_compute_link_prefix='https://zoo.com:42',
|
self.flags(compute_link_prefix='https://zoo.com:42',
|
||||||
osapi_glance_link_prefix='http://circus.com:34')
|
glance_link_prefix='http://circus.com:34',
|
||||||
|
group='api')
|
||||||
fake_req = self.http_request.blank(self.url_base + 'images/124')
|
fake_req = self.http_request.blank(self.url_base + 'images/124')
|
||||||
actual_image = self.controller.show(fake_req, '124')
|
actual_image = self.controller.show(fake_req, '124')
|
||||||
|
|
||||||
|
@ -46,8 +46,8 @@ class MultiCreateExtensionTestV21(test.TestCase):
|
|||||||
"""Shared implementation for tests below that create instance."""
|
"""Shared implementation for tests below that create instance."""
|
||||||
super(MultiCreateExtensionTestV21, self).setUp()
|
super(MultiCreateExtensionTestV21, self).setUp()
|
||||||
|
|
||||||
self.flags(verbose=True,
|
self.flags(verbose=True)
|
||||||
enable_instance_password=True)
|
self.flags(enable_instance_password=True, group='api')
|
||||||
self.instance_cache_num = 0
|
self.instance_cache_num = 0
|
||||||
self.instance_cache_by_id = {}
|
self.instance_cache_by_id = {}
|
||||||
self.instance_cache_by_uuid = {}
|
self.instance_cache_by_uuid = {}
|
||||||
@ -352,7 +352,7 @@ class MultiCreateExtensionTestV21(test.TestCase):
|
|||||||
"""Test creating multiple instances but not asking for
|
"""Test creating multiple instances but not asking for
|
||||||
reservation_id
|
reservation_id
|
||||||
"""
|
"""
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6'
|
image_href = '76fa36fc-c930-4bf3-8c8a-ea2a2420deb6'
|
||||||
flavor_ref = 'http://localhost/123/flavors/3'
|
flavor_ref = 'http://localhost/123/flavors/3'
|
||||||
body = {
|
body = {
|
||||||
|
@ -207,7 +207,7 @@ class RescueTestV21(test.NoDBTestCase):
|
|||||||
self.assertEqual(CONF.password_length, len(resp['adminPass']))
|
self.assertEqual(CONF.password_length, len(resp['adminPass']))
|
||||||
|
|
||||||
def test_rescue_disable_password(self):
|
def test_rescue_disable_password(self):
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
body = dict(rescue=None)
|
body = dict(rescue=None)
|
||||||
resp_json = self.controller._rescue(self.fake_req, UUID, body=body)
|
resp_json = self.controller._rescue(self.fake_req, UUID, body=body)
|
||||||
self.assertNotIn('adminPass', resp_json)
|
self.assertNotIn('adminPass', resp_json)
|
||||||
|
@ -89,7 +89,8 @@ class ServerActionsControllerTestV21(test.TestCase):
|
|||||||
fakes.stub_out_compute_api_snapshot(self.stubs)
|
fakes.stub_out_compute_api_snapshot(self.stubs)
|
||||||
fake.stub_out_image_service(self)
|
fake.stub_out_image_service(self)
|
||||||
self.flags(allow_instance_snapshots=True,
|
self.flags(allow_instance_snapshots=True,
|
||||||
enable_instance_password=True)
|
enable_instance_password=True,
|
||||||
|
group='api')
|
||||||
self._image_href = '155d900f-4e14-4e4c-a73d-069cbf4541e6'
|
self._image_href = '155d900f-4e14-4e4c-a73d-069cbf4541e6'
|
||||||
|
|
||||||
self.controller = self._get_controller()
|
self.controller = self._get_controller()
|
||||||
@ -354,7 +355,7 @@ class ServerActionsControllerTestV21(test.TestCase):
|
|||||||
def test_rebuild_accepted_minimum_pass_disabled(self):
|
def test_rebuild_accepted_minimum_pass_disabled(self):
|
||||||
# run with enable_instance_password disabled to verify adminPass
|
# run with enable_instance_password disabled to verify adminPass
|
||||||
# is missing from response. See lp bug 921814
|
# is missing from response. See lp bug 921814
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
|
|
||||||
return_server = fakes.fake_instance_get(image_ref='2',
|
return_server = fakes.fake_instance_get(image_ref='2',
|
||||||
vm_state=vm_states.ACTIVE, host='fake_host')
|
vm_state=vm_states.ACTIVE, host='fake_host')
|
||||||
@ -470,7 +471,7 @@ class ServerActionsControllerTestV21(test.TestCase):
|
|||||||
def test_rebuild_admin_pass_pass_disabled(self):
|
def test_rebuild_admin_pass_pass_disabled(self):
|
||||||
# run with enable_instance_password disabled to verify adminPass
|
# run with enable_instance_password disabled to verify adminPass
|
||||||
# is missing from response. See lp bug 921814
|
# is missing from response. See lp bug 921814
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
|
|
||||||
return_server = fakes.fake_instance_get(image_ref='2',
|
return_server = fakes.fake_instance_get(image_ref='2',
|
||||||
vm_state=vm_states.ACTIVE, host='fake_host')
|
vm_state=vm_states.ACTIVE, host='fake_host')
|
||||||
@ -1103,7 +1104,7 @@ class ServerActionsControllerTestV21(test.TestCase):
|
|||||||
"""Don't permit a snapshot if the allow_instance_snapshots flag is
|
"""Don't permit a snapshot if the allow_instance_snapshots flag is
|
||||||
False
|
False
|
||||||
"""
|
"""
|
||||||
self.flags(allow_instance_snapshots=False)
|
self.flags(allow_instance_snapshots=False, group='api')
|
||||||
body = {
|
body = {
|
||||||
'createImage': {
|
'createImage': {
|
||||||
'name': 'Snapshot 1',
|
'name': 'Snapshot 1',
|
||||||
|
@ -2359,8 +2359,8 @@ class ServersControllerCreateTest(test.TestCase):
|
|||||||
"""Shared implementation for tests below that create instance."""
|
"""Shared implementation for tests below that create instance."""
|
||||||
super(ServersControllerCreateTest, self).setUp()
|
super(ServersControllerCreateTest, self).setUp()
|
||||||
|
|
||||||
self.flags(verbose=True,
|
self.flags(verbose=True)
|
||||||
enable_instance_password=True)
|
self.flags(enable_instance_password=True, group='api')
|
||||||
self.instance_cache_num = 0
|
self.instance_cache_num = 0
|
||||||
self.instance_cache_by_id = {}
|
self.instance_cache_by_id = {}
|
||||||
self.instance_cache_by_uuid = {}
|
self.instance_cache_by_uuid = {}
|
||||||
@ -2744,9 +2744,9 @@ class ServersControllerCreateTest(test.TestCase):
|
|||||||
|
|
||||||
def test_create_instance_with_pass_disabled(self):
|
def test_create_instance_with_pass_disabled(self):
|
||||||
# test with admin passwords disabled See lp bug 921814
|
# test with admin passwords disabled See lp bug 921814
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
|
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
self.req.body = jsonutils.dump_as_bytes(self.body)
|
self.req.body = jsonutils.dump_as_bytes(self.body)
|
||||||
res = self.controller.create(self.req, body=self.body).obj
|
res = self.controller.create(self.req, body=self.body).obj
|
||||||
|
|
||||||
@ -2853,7 +2853,7 @@ class ServersControllerCreateTest(test.TestCase):
|
|||||||
self.controller.create, req, body=body)
|
self.controller.create, req, body=body)
|
||||||
|
|
||||||
def test_create_instance_pass_disabled(self):
|
def test_create_instance_pass_disabled(self):
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
self.req.body = jsonutils.dump_as_bytes(self.body)
|
self.req.body = jsonutils.dump_as_bytes(self.body)
|
||||||
res = self.controller.create(self.req, body=self.body).obj
|
res = self.controller.create(self.req, body=self.body).obj
|
||||||
|
|
||||||
@ -3016,7 +3016,7 @@ class ServersControllerCreateTest(test.TestCase):
|
|||||||
self.body['server']['adminPass'])
|
self.body['server']['adminPass'])
|
||||||
|
|
||||||
def test_create_instance_admin_password_pass_disabled(self):
|
def test_create_instance_admin_password_pass_disabled(self):
|
||||||
self.flags(enable_instance_password=False)
|
self.flags(enable_instance_password=False, group='api')
|
||||||
self.body['server']['flavorRef'] = 3
|
self.body['server']['flavorRef'] = 3
|
||||||
self.body['server']['adminPass'] = 'testpass'
|
self.body['server']['adminPass'] = 'testpass'
|
||||||
self.req.body = jsonutils.dump_as_bytes(self.body)
|
self.req.body = jsonutils.dump_as_bytes(self.body)
|
||||||
@ -3621,8 +3621,8 @@ class ServersControllerCreateTestWithMock(test.TestCase):
|
|||||||
"""Shared implementation for tests below that create instance."""
|
"""Shared implementation for tests below that create instance."""
|
||||||
super(ServersControllerCreateTestWithMock, self).setUp()
|
super(ServersControllerCreateTestWithMock, self).setUp()
|
||||||
|
|
||||||
self.flags(verbose=True,
|
self.flags(verbose=True)
|
||||||
enable_instance_password=True)
|
self.flags(enable_instance_password=True, group='api')
|
||||||
self.instance_cache_num = 0
|
self.instance_cache_num = 0
|
||||||
self.instance_cache_by_id = {}
|
self.instance_cache_by_id = {}
|
||||||
self.instance_cache_by_uuid = {}
|
self.instance_cache_by_uuid = {}
|
||||||
|
@ -50,7 +50,7 @@ DEFAULT_NETWORK = [
|
|||||||
NETWORKS_WITH_DEFAULT_NET = copy.deepcopy(NETWORKS)
|
NETWORKS_WITH_DEFAULT_NET = copy.deepcopy(NETWORKS)
|
||||||
NETWORKS_WITH_DEFAULT_NET.extend(DEFAULT_NETWORK)
|
NETWORKS_WITH_DEFAULT_NET.extend(DEFAULT_NETWORK)
|
||||||
|
|
||||||
DEFAULT_TENANT_ID = CONF.neutron_default_tenant_id
|
DEFAULT_TENANT_ID = CONF.api.neutron_default_tenant_id
|
||||||
|
|
||||||
|
|
||||||
def fake_network_api_get_all(context):
|
def fake_network_api_get_all(context):
|
||||||
@ -69,11 +69,12 @@ class TenantNetworksTestV21(test.NoDBTestCase):
|
|||||||
self.controller = self.ctrlr()
|
self.controller = self.ctrlr()
|
||||||
self.flags(enable_network_quota=True)
|
self.flags(enable_network_quota=True)
|
||||||
self.req = fakes.HTTPRequest.blank('')
|
self.req = fakes.HTTPRequest.blank('')
|
||||||
self.original_value = CONF.use_neutron_default_nets
|
self.original_value = CONF.api.use_neutron_default_nets
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
super(TenantNetworksTestV21, self).tearDown()
|
super(TenantNetworksTestV21, self).tearDown()
|
||||||
CONF.set_override("use_neutron_default_nets", self.original_value)
|
CONF.set_override("use_neutron_default_nets", self.original_value,
|
||||||
|
group='api')
|
||||||
|
|
||||||
def _fake_network_api_create(self, context, **kwargs):
|
def _fake_network_api_create(self, context, **kwargs):
|
||||||
self.assertEqual(context.project_id, kwargs['project_id'])
|
self.assertEqual(context.project_id, kwargs['project_id'])
|
||||||
@ -159,7 +160,7 @@ class TenantNetworksTestV21(test.NoDBTestCase):
|
|||||||
|
|
||||||
@mock.patch('nova.network.api.API.get_all')
|
@mock.patch('nova.network.api.API.get_all')
|
||||||
def _test_network_index(self, get_all_mock, default_net=True):
|
def _test_network_index(self, get_all_mock, default_net=True):
|
||||||
CONF.set_override("use_neutron_default_nets", default_net)
|
CONF.set_override("use_neutron_default_nets", default_net, group='api')
|
||||||
get_all_mock.side_effect = fake_network_api_get_all
|
get_all_mock.side_effect = fake_network_api_get_all
|
||||||
|
|
||||||
expected = NETWORKS
|
expected = NETWORKS
|
||||||
|
@ -53,8 +53,8 @@ class ServersControllerCreateTest(test.TestCase):
|
|||||||
"""Shared implementation for tests below that create instance."""
|
"""Shared implementation for tests below that create instance."""
|
||||||
super(ServersControllerCreateTest, self).setUp()
|
super(ServersControllerCreateTest, self).setUp()
|
||||||
|
|
||||||
self.flags(verbose=True,
|
self.flags(verbose=True)
|
||||||
enable_instance_password=True)
|
self.flags(enable_instance_password=True, group='api')
|
||||||
self.instance_cache_num = 0
|
self.instance_cache_num = 0
|
||||||
self.instance_cache_by_id = {}
|
self.instance_cache_by_id = {}
|
||||||
self.instance_cache_by_uuid = {}
|
self.instance_cache_by_uuid = {}
|
||||||
|
@ -383,7 +383,7 @@ class VersionsViewBuilderTests(test.NoDBTestCase):
|
|||||||
self.assertEqual(expected, output)
|
self.assertEqual(expected, output)
|
||||||
|
|
||||||
def test_view_builder_with_osapi_compute_link_prefix(self):
|
def test_view_builder_with_osapi_compute_link_prefix(self):
|
||||||
self.flags(osapi_compute_link_prefix='http://zoo.com:42')
|
self.flags(compute_link_prefix='http://zoo.com:42', group='api')
|
||||||
href = "http://zoo.com:42/v2.1/"
|
href = "http://zoo.com:42/v2.1/"
|
||||||
self._test_view_builder_osapi_compute_link_prefix(href)
|
self._test_view_builder_osapi_compute_link_prefix(href)
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ class LimiterTest(test.NoDBTestCase):
|
|||||||
def test_limiter_custom_max_limit(self):
|
def test_limiter_custom_max_limit(self):
|
||||||
# Test a max_limit other than 1000.
|
# Test a max_limit other than 1000.
|
||||||
max_limit = 2000
|
max_limit = 2000
|
||||||
self.flags(osapi_max_limit=max_limit)
|
self.flags(max_limit=max_limit, group='api')
|
||||||
items = range(max_limit)
|
items = range(max_limit)
|
||||||
req = webob.Request.blank('/?offset=1&limit=3')
|
req = webob.Request.blank('/?offset=1&limit=3')
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
@ -494,7 +494,7 @@ class TestCollectionLinks(test.NoDBTestCase):
|
|||||||
req = mock.MagicMock()
|
req = mock.MagicMock()
|
||||||
params = mock.PropertyMock(return_value=dict())
|
params = mock.PropertyMock(return_value=dict())
|
||||||
type(req).params = params
|
type(req).params = params
|
||||||
self.flags(osapi_max_limit=1)
|
self.flags(max_limit=1, group='api')
|
||||||
|
|
||||||
builder = common.ViewBuilder()
|
builder = common.ViewBuilder()
|
||||||
results = builder._get_collection_links(req, items,
|
results = builder._get_collection_links(req, items,
|
||||||
@ -514,7 +514,7 @@ class TestCollectionLinks(test.NoDBTestCase):
|
|||||||
# Given limit is greater than default max, only return default max
|
# Given limit is greater than default max, only return default max
|
||||||
params = mock.PropertyMock(return_value=dict(limit=2))
|
params = mock.PropertyMock(return_value=dict(limit=2))
|
||||||
type(req).params = params
|
type(req).params = params
|
||||||
self.flags(osapi_max_limit=1)
|
self.flags(max_limit=1, group='api')
|
||||||
|
|
||||||
builder = common.ViewBuilder()
|
builder = common.ViewBuilder()
|
||||||
results = builder._get_collection_links(req, items,
|
results = builder._get_collection_links(req, items,
|
||||||
|
@ -142,7 +142,7 @@ class TestPipeLineFactory(test.NoDBTestCase):
|
|||||||
|
|
||||||
def test_pipeline_factory_v21(self):
|
def test_pipeline_factory_v21(self):
|
||||||
fake_pipeline = 'test1 test2 test3'
|
fake_pipeline = 'test1 test2 test3'
|
||||||
CONF.set_override('auth_strategy', 'noauth2')
|
CONF.set_override('auth_strategy', 'noauth2', group='api')
|
||||||
app = nova.api.auth.pipeline_factory_v21(
|
app = nova.api.auth.pipeline_factory_v21(
|
||||||
TestPipeLineFactory.FakeLoader(), None, noauth2=fake_pipeline)
|
TestPipeLineFactory.FakeLoader(), None, noauth2=fake_pipeline)
|
||||||
self._test_pipeline(fake_pipeline, app)
|
self._test_pipeline(fake_pipeline, app)
|
||||||
|
@ -46,7 +46,7 @@ class ConfFixture(config_fixture.Config):
|
|||||||
self.conf.set_default('num_networks', 2)
|
self.conf.set_default('num_networks', 2)
|
||||||
self.conf.set_default('use_ipv6', True)
|
self.conf.set_default('use_ipv6', True)
|
||||||
self.conf.set_default('vlan_interface', 'eth0')
|
self.conf.set_default('vlan_interface', 'eth0')
|
||||||
self.conf.set_default('auth_strategy', 'noauth2')
|
self.conf.set_default('auth_strategy', 'noauth2', group='api')
|
||||||
config.parse_args([], default_config_files=[], configure_db=False,
|
config.parse_args([], default_config_files=[], configure_db=False,
|
||||||
init_rpc=False)
|
init_rpc=False)
|
||||||
self.conf.set_default('connection', "sqlite://", group='database')
|
self.conf.set_default('connection', "sqlite://", group='database')
|
||||||
|
@ -341,7 +341,7 @@ class TestGetImageService(test.NoDBTestCase):
|
|||||||
class TestCreateGlanceClient(test.NoDBTestCase):
|
class TestCreateGlanceClient(test.NoDBTestCase):
|
||||||
@mock.patch('glanceclient.Client')
|
@mock.patch('glanceclient.Client')
|
||||||
def test_headers_passed_glanceclient(self, init_mock):
|
def test_headers_passed_glanceclient(self, init_mock):
|
||||||
self.flags(auth_strategy='keystone')
|
self.flags(auth_strategy='keystone', group='api')
|
||||||
auth_token = 'token'
|
auth_token = 'token'
|
||||||
ctx = context.RequestContext('fake', 'fake', auth_token=auth_token)
|
ctx = context.RequestContext('fake', 'fake', auth_token=auth_token)
|
||||||
|
|
||||||
|
@ -844,7 +844,8 @@ class OpenStackMetadataTestCase(test.TestCase):
|
|||||||
self.flags(vendordata_providers=['StaticJSON', 'DynamicJSON'],
|
self.flags(vendordata_providers=['StaticJSON', 'DynamicJSON'],
|
||||||
vendordata_jsonfile_path=jsonfile,
|
vendordata_jsonfile_path=jsonfile,
|
||||||
vendordata_dynamic_targets=[
|
vendordata_dynamic_targets=[
|
||||||
'web@http://fake.com/foobar']
|
'web@http://fake.com/foobar'],
|
||||||
|
group='api'
|
||||||
)
|
)
|
||||||
|
|
||||||
inst = self.instance.obj_clone()
|
inst = self.instance.obj_clone()
|
||||||
@ -907,7 +908,8 @@ class OpenStackMetadataTestCase(test.TestCase):
|
|||||||
self.flags(vendordata_providers=['StaticJSON', 'DynamicJSON'],
|
self.flags(vendordata_providers=['StaticJSON', 'DynamicJSON'],
|
||||||
vendordata_jsonfile_path=jsonfile,
|
vendordata_jsonfile_path=jsonfile,
|
||||||
vendordata_dynamic_targets=[
|
vendordata_dynamic_targets=[
|
||||||
'web@http://fake.com/foobar']
|
'web@http://fake.com/foobar'],
|
||||||
|
group='api'
|
||||||
)
|
)
|
||||||
|
|
||||||
inst = self.instance.obj_clone()
|
inst = self.instance.obj_clone()
|
||||||
@ -1084,7 +1086,7 @@ class MetadataHandlerTestCase(test.TestCase):
|
|||||||
raise Exception("Expected addr of %s, got %s" %
|
raise Exception("Expected addr of %s, got %s" %
|
||||||
(expected_addr, address))
|
(expected_addr, address))
|
||||||
|
|
||||||
self.flags(use_forwarded_for=True)
|
self.flags(use_forwarded_for=True, group='api')
|
||||||
response = fake_request(self, self.mdinst,
|
response = fake_request(self, self.mdinst,
|
||||||
relpath="/2009-04-04/user-data",
|
relpath="/2009-04-04/user-data",
|
||||||
address="168.168.168.1",
|
address="168.168.168.1",
|
||||||
@ -1284,7 +1286,7 @@ class MetadataHandlerTestCase(test.TestCase):
|
|||||||
def test_metadata_handler_with_instance_id(self, get_by_uuid):
|
def test_metadata_handler_with_instance_id(self, get_by_uuid):
|
||||||
# test twice to ensure that the cache works
|
# test twice to ensure that the cache works
|
||||||
get_by_uuid.return_value = self.mdinst
|
get_by_uuid.return_value = self.mdinst
|
||||||
self.flags(metadata_cache_expiration=15)
|
self.flags(metadata_cache_expiration=15, group='api')
|
||||||
hnd = handler.MetadataRequestHandler()
|
hnd = handler.MetadataRequestHandler()
|
||||||
self._metadata_handler_with_instance_id(hnd)
|
self._metadata_handler_with_instance_id(hnd)
|
||||||
self._metadata_handler_with_instance_id(hnd)
|
self._metadata_handler_with_instance_id(hnd)
|
||||||
@ -1294,7 +1296,7 @@ class MetadataHandlerTestCase(test.TestCase):
|
|||||||
def test_metadata_handler_with_instance_id_no_cache(self, get_by_uuid):
|
def test_metadata_handler_with_instance_id_no_cache(self, get_by_uuid):
|
||||||
# test twice to ensure that disabling the cache works
|
# test twice to ensure that disabling the cache works
|
||||||
get_by_uuid.return_value = self.mdinst
|
get_by_uuid.return_value = self.mdinst
|
||||||
self.flags(metadata_cache_expiration=0)
|
self.flags(metadata_cache_expiration=0, group='api')
|
||||||
hnd = handler.MetadataRequestHandler()
|
hnd = handler.MetadataRequestHandler()
|
||||||
self._metadata_handler_with_instance_id(hnd)
|
self._metadata_handler_with_instance_id(hnd)
|
||||||
self._metadata_handler_with_instance_id(hnd)
|
self._metadata_handler_with_instance_id(hnd)
|
||||||
@ -1315,7 +1317,7 @@ class MetadataHandlerTestCase(test.TestCase):
|
|||||||
def test_metadata_handler_with_remote_address(self, get_by_uuid):
|
def test_metadata_handler_with_remote_address(self, get_by_uuid):
|
||||||
# test twice to ensure that the cache works
|
# test twice to ensure that the cache works
|
||||||
get_by_uuid.return_value = self.mdinst
|
get_by_uuid.return_value = self.mdinst
|
||||||
self.flags(metadata_cache_expiration=15)
|
self.flags(metadata_cache_expiration=15, group='api')
|
||||||
hnd = handler.MetadataRequestHandler()
|
hnd = handler.MetadataRequestHandler()
|
||||||
self._metadata_handler_with_remote_address(hnd)
|
self._metadata_handler_with_remote_address(hnd)
|
||||||
self._metadata_handler_with_remote_address(hnd)
|
self._metadata_handler_with_remote_address(hnd)
|
||||||
@ -1325,7 +1327,7 @@ class MetadataHandlerTestCase(test.TestCase):
|
|||||||
def test_metadata_handler_with_remote_address_no_cache(self, get_by_uuid):
|
def test_metadata_handler_with_remote_address_no_cache(self, get_by_uuid):
|
||||||
# test twice to ensure that disabling the cache works
|
# test twice to ensure that disabling the cache works
|
||||||
get_by_uuid.return_value = self.mdinst
|
get_by_uuid.return_value = self.mdinst
|
||||||
self.flags(metadata_cache_expiration=0)
|
self.flags(metadata_cache_expiration=0, group='api')
|
||||||
hnd = handler.MetadataRequestHandler()
|
hnd = handler.MetadataRequestHandler()
|
||||||
self._metadata_handler_with_remote_address(hnd)
|
self._metadata_handler_with_remote_address(hnd)
|
||||||
self._metadata_handler_with_remote_address(hnd)
|
self._metadata_handler_with_remote_address(hnd)
|
||||||
|
@ -0,0 +1,26 @@
|
|||||||
|
---
|
||||||
|
upgrade:
|
||||||
|
- |
|
||||||
|
API configuration options have been moved to the 'api' group. They
|
||||||
|
should no longer be included in the 'DEFAULT' group. Options affected by
|
||||||
|
this change:
|
||||||
|
|
||||||
|
* ``auth_strategy``
|
||||||
|
* ``use_forwarded_for``
|
||||||
|
* ``config_drive_skip_versions``
|
||||||
|
* ``vendordata_providers``
|
||||||
|
* ``vendordata_dynamic_targets``
|
||||||
|
* ``vendordata_dynamic_ssl_certfile``
|
||||||
|
* ``vendordata_dynamic_connect_timeout``
|
||||||
|
* ``vendordata_dynamic_read_timeout``
|
||||||
|
* ``metadata_cache_expiration``
|
||||||
|
* ``vendordata_jsonfile_path``
|
||||||
|
* ``max_limit`` (was ``osapi_max_limit``)
|
||||||
|
* ``compute_link_prefix`` (was ``osapi_compute_link_prefix``)
|
||||||
|
* ``glance_link_prefix`` (was ``osapi_glance_link_prefix``)
|
||||||
|
* ``allow_instance_snapshots``
|
||||||
|
* ``hide_server_address_states`` (was ``osapi_hide_server_address_states``)
|
||||||
|
* ``fping_path``
|
||||||
|
* ``use_neutron_default_nets``
|
||||||
|
* ``neutron_default_tenant_id``
|
||||||
|
* ``enable_instance_password``
|
Loading…
Reference in New Issue
Block a user