From 11507eeceb2c56e50e9fe030a70470a02f577f2a Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Wed, 19 Aug 2015 13:46:52 +0100 Subject: [PATCH] api: deprecate the concept of extensions in v2.1 We want to remove the extension infrastructure in the v2.1 API during the next release. To make that possible, we must deprecate the configuration now. Also deprecating the osapi_v3 group, and moving to osapi_v21. UpgradeImpact DocImpact Part of blueprint nova-api-deprecate-extensions Change-Id: I084444b11dceda7cf8f88c157aa67d36490fce49 --- nova/api/openstack/__init__.py | 49 ++++++++++++------- nova/api/openstack/compute/servers.py | 13 +++-- nova/api/openstack/compute/versions.py | 4 +- nova/api/opts.py | 2 +- nova/test.py | 2 +- .../api_sample_tests/api_sample_base.py | 2 +- .../compute/test_availability_zone.py | 2 +- .../compute/test_block_device_mapping.py | 4 +- .../compute/test_block_device_mapping_v1.py | 10 ++-- .../openstack/compute/test_config_drive.py | 2 +- .../api/openstack/compute/test_extensions.py | 10 ++-- .../openstack/compute/test_multiple_create.py | 2 +- .../openstack/compute/test_scheduler_hints.py | 2 +- .../api/openstack/compute/test_serversV21.py | 4 +- .../api/openstack/compute/test_user_data.py | 2 +- .../openstack/compute/test_v3_extensions.py | 10 ++-- nova/tests/unit/conf_fixture.py | 2 +- 17 files changed, 70 insertions(+), 52 deletions(-) diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index e7222abb7d..1e1ebf5fa2 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -43,20 +43,26 @@ from nova import wsgi as base_wsgi api_opts = [ cfg.BoolOpt('enabled', default=True, - help='DEPRECATED: Whether the V3 API is enabled or not. ' - 'This option will be removed in the 14.0.0 "N" release.', - deprecated_for_removal=True), + help='DEPRECATED: Whether the V2.1 API is enabled or not. ' + 'This option will be removed in the near future.', + deprecated_for_removal=True, deprecated_group='osapi_v21'), cfg.ListOpt('extensions_blacklist', default=[], - help='A list of v3 API extensions to never load. ' - 'Specify the extension aliases here.'), + help='DEPRECATED: A list of v2.1 API extensions to never ' + 'load. Specify the extension aliases here. ' + 'This option will be removed in the near future. ' + 'After that point you have to run all of the API.', + deprecated_for_removal=True, deprecated_group='osapi_v21'), cfg.ListOpt('extensions_whitelist', default=[], - help='If the list is not empty then a v3 API extension ' - 'will only be loaded if it exists in this list. Specify ' - 'the extension aliases here.') + help='DEPRECATED: If the list is not empty then a v2.1 ' + 'API extension will only be loaded if it exists in this ' + 'list. Specify the extension aliases here. ' + 'This option will be removed in the near future. ' + 'After that point you have to run all of the API.', + deprecated_for_removal=True, deprecated_group='osapi_v21') ] -api_opts_group = cfg.OptGroup(name='osapi_v3', title='API v3 Options') +api_opts_group = cfg.OptGroup(name='osapi_v21', title='API v2.1 Options') LOG = logging.getLogger(__name__) CONF = cfg.CONF @@ -323,27 +329,36 @@ class APIRouterV21(base_wsgi.Router): # Check whitelist is either empty or if not then the extension # is in the whitelist - if (not CONF.osapi_v3.extensions_whitelist or - ext.obj.alias in CONF.osapi_v3.extensions_whitelist): + if (not CONF.osapi_v21.extensions_whitelist or + ext.obj.alias in CONF.osapi_v21.extensions_whitelist): # Check the extension is not in the blacklist - if ext.obj.alias not in CONF.osapi_v3.extensions_blacklist: + blacklist = CONF.osapi_v21.extensions_blacklist + if ext.obj.alias not in blacklist: return self._register_extension(ext) return False - if not CONF.osapi_v3.enabled: + if not CONF.osapi_v21.enabled: LOG.info(_LI("V3 API has been disabled by configuration")) + LOG.warning(_LW("In the M release you must run the v2.1 API.")) return + if (CONF.osapi_v21.extensions_blacklist or + CONF.osapi_v21.extensions_whitelist): + LOG.warning( + _LW('In the M release you must run all of the API. ' + 'The concept of API extensions will be removed from ' + 'the codebase to ensure there is a single Compute API.')) + self.init_only = init_only LOG.debug("v3 API Extension Blacklist: %s", - CONF.osapi_v3.extensions_blacklist) + CONF.osapi_v21.extensions_blacklist) LOG.debug("v3 API Extension Whitelist: %s", - CONF.osapi_v3.extensions_whitelist) + CONF.osapi_v21.extensions_whitelist) in_blacklist_and_whitelist = set( - CONF.osapi_v3.extensions_whitelist).intersection( - CONF.osapi_v3.extensions_blacklist) + CONF.osapi_v21.extensions_whitelist).intersection( + CONF.osapi_v21.extensions_blacklist) if len(in_blacklist_and_whitelist) != 0: LOG.warning(_LW("Extensions in both blacklist and whitelist: %s"), list(in_blacklist_and_whitelist)) diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index 71d984e40e..17a9f674be 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -51,8 +51,10 @@ CONF.import_opt('enable_instance_password', 'nova.api.openstack.compute.legacy_v2.servers') CONF.import_opt('network_api_class', 'nova.network') CONF.import_opt('reclaim_instance_interval', 'nova.compute.manager') -CONF.import_opt('extensions_blacklist', 'nova.api.openstack', group='osapi_v3') -CONF.import_opt('extensions_whitelist', 'nova.api.openstack', group='osapi_v3') +CONF.import_opt('extensions_blacklist', 'nova.api.openstack', + group='osapi_v21') +CONF.import_opt('extensions_whitelist', 'nova.api.openstack', + group='osapi_v21') LOG = logging.getLogger(__name__) authorize = extensions.os_compute_authorizer(ALIAS) @@ -100,11 +102,12 @@ class ServersController(wsgi.Controller): def check_whiteblack_lists(ext): # Check whitelist is either empty or if not then the extension # is in the whitelist - if (not CONF.osapi_v3.extensions_whitelist or - ext.obj.alias in CONF.osapi_v3.extensions_whitelist): + if (not CONF.osapi_v21.extensions_whitelist or + ext.obj.alias in CONF.osapi_v21.extensions_whitelist): # Check the extension is not in the blacklist - if ext.obj.alias not in CONF.osapi_v3.extensions_blacklist: + extensions_blacklist = CONF.osapi_v21.extensions_blacklist + if ext.obj.alias not in extensions_blacklist: return True else: LOG.warning(_LW("Not loading %s because it is " diff --git a/nova/api/openstack/compute/versions.py b/nova/api/openstack/compute/versions.py index e1611725c3..54daaeba63 100644 --- a/nova/api/openstack/compute/versions.py +++ b/nova/api/openstack/compute/versions.py @@ -21,7 +21,7 @@ from nova.api.openstack import wsgi CONF = cfg.CONF -CONF.import_opt('enabled', 'nova.api.openstack', group='osapi_v3') +CONF.import_opt('enabled', 'nova.api.openstack', group='osapi_v21') LINKS = { 'v2.0': { @@ -80,7 +80,7 @@ VERSIONS = { class Versions(wsgi.Resource): def __init__(self): super(Versions, self).__init__(None) - if not CONF.osapi_v3.enabled: + if not CONF.osapi_v21.enabled: del VERSIONS["v2.1"] def index(self, req, body=None): diff --git a/nova/api/opts.py b/nova/api/opts.py index bffb77bc64..18505a92b0 100644 --- a/nova/api/opts.py +++ b/nova/api/opts.py @@ -143,5 +143,5 @@ def list_opts(): nova.api.openstack.compute.legacy_v2.servers.server_opts, )), ('neutron', nova.api.metadata.handler.metadata_proxy_opts), - ('osapi_v3', nova.api.openstack.api_opts), + ('osapi_v21', nova.api.openstack.api_opts), ] diff --git a/nova/test.py b/nova/test.py index 88a9b33789..b6fe401209 100644 --- a/nova/test.py +++ b/nova/test.py @@ -55,7 +55,7 @@ from nova import utils CONF = cfg.CONF -CONF.import_opt('enabled', 'nova.api.openstack', group='osapi_v3') +CONF.import_opt('enabled', 'nova.api.openstack', group='osapi_v21') logging.register_options(CONF) CONF.set_override('use_stderr', False) diff --git a/nova/tests/functional/api_sample_tests/api_sample_base.py b/nova/tests/functional/api_sample_tests/api_sample_base.py index 39f8a1586b..315082b77d 100644 --- a/nova/tests/functional/api_sample_tests/api_sample_base.py +++ b/nova/tests/functional/api_sample_tests/api_sample_base.py @@ -54,7 +54,7 @@ class ApiSampleTestBaseV3(testscenarios.WithScenarios, whitelist.update(set(self.extra_extensions_to_load)) CONF.set_override('extensions_whitelist', whitelist, - 'osapi_v3') + 'osapi_v21') expected_middleware = [] if (not hasattr(self, '_test') or (self._test == 'v2.1')): # NOTE(gmann)For v2.1 API testing, override /v2 endpoint with v2.1 diff --git a/nova/tests/unit/api/openstack/compute/test_availability_zone.py b/nova/tests/unit/api/openstack/compute/test_availability_zone.py index 643a5a87ca..04c22c78bd 100644 --- a/nova/tests/unit/api/openstack/compute/test_availability_zone.py +++ b/nova/tests/unit/api/openstack/compute/test_availability_zone.py @@ -241,7 +241,7 @@ class ServersControllerCreateTestV21(test.TestCase): extension_info=ext_info) CONF.set_override('extensions_blacklist', 'os-availability-zone', - 'osapi_v3') + 'osapi_v21') self.no_availability_zone_controller = servers_v21.ServersController( extension_info=ext_info) diff --git a/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py b/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py index 1915c376f0..a5c205a02c 100644 --- a/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py +++ b/nova/tests/unit/api/openstack/compute/test_block_device_mapping.py @@ -45,10 +45,10 @@ class BlockDeviceMappingTestV21(test.TestCase): self.controller = servers_v21.ServersController( extension_info=ext_info) CONF.set_override('extensions_blacklist', 'os-block-device-mapping', - 'osapi_v3') + 'osapi_v21') self.no_bdm_v2_controller = servers_v21.ServersController( extension_info=ext_info) - CONF.set_override('extensions_blacklist', '', 'osapi_v3') + CONF.set_override('extensions_blacklist', '', 'osapi_v21') def setUp(self): super(BlockDeviceMappingTestV21, self).setUp() diff --git a/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py b/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py index 8914123636..c5cdf85d4a 100644 --- a/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py +++ b/nova/tests/unit/api/openstack/compute/test_block_device_mapping_v1.py @@ -40,16 +40,16 @@ class BlockDeviceMappingTestV21(test.TestCase): def _setup_controller(self): ext_info = extension_info.LoadedExtensionInfo() CONF.set_override('extensions_blacklist', 'os-block-device-mapping', - 'osapi_v3') + 'osapi_v21') self.controller = servers_v21.ServersController( extension_info=ext_info) CONF.set_override('extensions_blacklist', ['os-block-device-mapping-v1', 'os-block-device-mapping'], - 'osapi_v3') + 'osapi_v21') self.no_volumes_controller = servers_v21.ServersController( extension_info=ext_info) - CONF.set_override('extensions_blacklist', '', 'osapi_v3') + CONF.set_override('extensions_blacklist', '', 'osapi_v21') def setUp(self): super(BlockDeviceMappingTestV21, self).setUp() @@ -299,7 +299,7 @@ class BlockDeviceMappingTestV21(test.TestCase): CONF.set_override('extensions_blacklist', ['os-block-device-mapping', 'os-block-device-mapping-v1'], - 'osapi_v3') + 'osapi_v21') controller = servers_v21.ServersController(extension_info=ext_info) bdm = [{'device_name': 'foo1', 'volume_id': fakes.FAKE_UUID, @@ -328,7 +328,7 @@ class BlockDeviceMappingTestV21(test.TestCase): def test_create_instance_both_bdm_formats(self): ext_info = extension_info.LoadedExtensionInfo() - CONF.set_override('extensions_blacklist', '', 'osapi_v3') + CONF.set_override('extensions_blacklist', '', 'osapi_v21') both_controllers = servers_v21.ServersController( extension_info=ext_info) bdm = [{'device_name': 'foo'}] diff --git a/nova/tests/unit/api/openstack/compute/test_config_drive.py b/nova/tests/unit/api/openstack/compute/test_config_drive.py index 1799acb6a0..aed5788616 100644 --- a/nova/tests/unit/api/openstack/compute/test_config_drive.py +++ b/nova/tests/unit/api/openstack/compute/test_config_drive.py @@ -98,7 +98,7 @@ class ServersControllerCreateTestV21(test.TestCase): extension_info=ext_info) CONF.set_override('extensions_blacklist', 'os-config-drive', - 'osapi_v3') + 'osapi_v21') self.no_config_drive_controller = servers_v21.ServersController( extension_info=ext_info) diff --git a/nova/tests/unit/api/openstack/compute/test_extensions.py b/nova/tests/unit/api/openstack/compute/test_extensions.py index 966408bfd0..281bf47d23 100644 --- a/nova/tests/unit/api/openstack/compute/test_extensions.py +++ b/nova/tests/unit/api/openstack/compute/test_extensions.py @@ -73,7 +73,7 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): def test_extensions_blacklist(self): app = compute.APIRouterV21() self.assertIn('os-hosts', app._loaded_extension_info.extensions) - CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v3') + CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v21') app = compute.APIRouterV21() self.assertNotIn('os-hosts', app._loaded_extension_info.extensions) @@ -102,7 +102,7 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): app = compute.APIRouterV21() self.assertIn('os-hosts', app._loaded_extension_info.extensions) CONF.set_override('extensions_whitelist', ['servers', 'os-hosts'], - 'osapi_v3') + 'osapi_v21') app = compute.APIRouterV21() self.assertIn('os-hosts', app._loaded_extension_info.extensions) @@ -115,7 +115,7 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): app = compute.APIRouterV21() self.assertIn('os-hosts', app._loaded_extension_info.extensions) - CONF.set_override('extensions_whitelist', ['servers'], 'osapi_v3') + CONF.set_override('extensions_whitelist', ['servers'], 'osapi_v21') app = compute.APIRouterV21() self.assertNotIn('os-hosts', app._loaded_extension_info.extensions) @@ -129,8 +129,8 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): app = compute.APIRouterV21() self.assertIn('os-hosts', app._loaded_extension_info.extensions) CONF.set_override('extensions_whitelist', ['servers', 'os-hosts'], - 'osapi_v3') - CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v3') + 'osapi_v21') + CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v21') app = compute.APIRouterV21() self.assertNotIn('os-hosts', app._loaded_extension_info.extensions) self.assertIn('servers', app._loaded_extension_info.extensions) diff --git a/nova/tests/unit/api/openstack/compute/test_multiple_create.py b/nova/tests/unit/api/openstack/compute/test_multiple_create.py index 31a47524be..1a5295d0ed 100644 --- a/nova/tests/unit/api/openstack/compute/test_multiple_create.py +++ b/nova/tests/unit/api/openstack/compute/test_multiple_create.py @@ -65,7 +65,7 @@ class MultiCreateExtensionTestV21(test.TestCase): self.controller = servers_v21.ServersController( extension_info=ext_info) CONF.set_override('extensions_blacklist', 'os-multiple-create', - 'osapi_v3') + 'osapi_v21') self.no_mult_create_controller = servers_v21.ServersController( extension_info=ext_info) diff --git a/nova/tests/unit/api/openstack/compute/test_scheduler_hints.py b/nova/tests/unit/api/openstack/compute/test_scheduler_hints.py index 36c92ee258..4758453dd3 100644 --- a/nova/tests/unit/api/openstack/compute/test_scheduler_hints.py +++ b/nova/tests/unit/api/openstack/compute/test_scheduler_hints.py @@ -181,7 +181,7 @@ class ServersControllerCreateTestV21(test.TestCase): def _set_up_controller(self): ext_info = extension_info.LoadedExtensionInfo() CONF.set_override('extensions_blacklist', 'os-scheduler-hints', - 'osapi_v3') + 'osapi_v21') self.no_scheduler_hints_controller = servers_v21.ServersController( extension_info=ext_info) diff --git a/nova/tests/unit/api/openstack/compute/test_serversV21.py b/nova/tests/unit/api/openstack/compute/test_serversV21.py index 64f4652ad1..f2c896c521 100644 --- a/nova/tests/unit/api/openstack/compute/test_serversV21.py +++ b/nova/tests/unit/api/openstack/compute/test_serversV21.py @@ -3546,7 +3546,7 @@ class TestServersExtensionPoint(test.NoDBTestCase): def setUp(self): super(TestServersExtensionPoint, self).setUp() CONF.set_override('extensions_whitelist', ['os-disk-config'], - 'osapi_v3') + 'osapi_v21') self.stubs.Set(disk_config, 'DiskConfig', FakeExt) def _test_load_extension_point(self, name): @@ -3576,7 +3576,7 @@ class TestServersExtensionPoint(test.NoDBTestCase): class TestServersExtensionSchema(test.NoDBTestCase): def setUp(self): super(TestServersExtensionSchema, self).setUp() - CONF.set_override('extensions_whitelist', ['disk_config'], 'osapi_v3') + CONF.set_override('extensions_whitelist', ['disk_config'], 'osapi_v21') def _test_load_extension_schema(self, name): setattr(FakeExt, 'get_server_%s_schema' % name, diff --git a/nova/tests/unit/api/openstack/compute/test_user_data.py b/nova/tests/unit/api/openstack/compute/test_user_data.py index 485bdb1513..3be774df60 100644 --- a/nova/tests/unit/api/openstack/compute/test_user_data.py +++ b/nova/tests/unit/api/openstack/compute/test_user_data.py @@ -62,7 +62,7 @@ class ServersControllerCreateTest(test.TestCase): ext_info = extension_info.LoadedExtensionInfo() self.controller = servers.ServersController(extension_info=ext_info) CONF.set_override('extensions_blacklist', 'os-user-data', - 'osapi_v3') + 'osapi_v21') self.no_user_data_controller = servers.ServersController( extension_info=ext_info) diff --git a/nova/tests/unit/api/openstack/compute/test_v3_extensions.py b/nova/tests/unit/api/openstack/compute/test_v3_extensions.py index 9f3d946d04..4ae6d0c4e9 100644 --- a/nova/tests/unit/api/openstack/compute/test_v3_extensions.py +++ b/nova/tests/unit/api/openstack/compute/test_v3_extensions.py @@ -71,7 +71,7 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): def test_extensions_blacklist(self): app = compute.APIRouterV3() self.assertIn('os-hosts', app._loaded_extension_info.extensions) - CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v3') + CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v21') app = compute.APIRouterV3() self.assertNotIn('os-hosts', app._loaded_extension_info.extensions) @@ -85,7 +85,7 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): app = compute.APIRouterV3() self.assertIn('os-hosts', app._loaded_extension_info.extensions) CONF.set_override('extensions_whitelist', ['servers', 'os-hosts'], - 'osapi_v3') + 'osapi_v21') app = compute.APIRouterV3() self.assertIn('os-hosts', app._loaded_extension_info.extensions) @@ -98,7 +98,7 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): app = compute.APIRouterV3() self.assertIn('os-hosts', app._loaded_extension_info.extensions) - CONF.set_override('extensions_whitelist', ['servers'], 'osapi_v3') + CONF.set_override('extensions_whitelist', ['servers'], 'osapi_v21') app = compute.APIRouterV3() self.assertNotIn('os-hosts', app._loaded_extension_info.extensions) @@ -112,8 +112,8 @@ class ExtensionLoadingTestCase(test.NoDBTestCase): app = compute.APIRouterV3() self.assertIn('os-hosts', app._loaded_extension_info.extensions) CONF.set_override('extensions_whitelist', ['servers', 'os-hosts'], - 'osapi_v3') - CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v3') + 'osapi_v21') + CONF.set_override('extensions_blacklist', ['os-hosts'], 'osapi_v21') app = compute.APIRouterV3() self.assertNotIn('os-hosts', app._loaded_extension_info.extensions) self.assertIn('servers', app._loaded_extension_info.extensions) diff --git a/nova/tests/unit/conf_fixture.py b/nova/tests/unit/conf_fixture.py index e2caade904..3fabf5e2e4 100644 --- a/nova/tests/unit/conf_fixture.py +++ b/nova/tests/unit/conf_fixture.py @@ -63,7 +63,7 @@ class ConfFixture(config_fixture.Config): self.conf.set_default('sqlite_synchronous', False, group='api_database') self.conf.set_default('fatal_exception_format_errors', True) - self.conf.set_default('enabled', True, 'osapi_v3') + self.conf.set_default('enabled', True, 'osapi_v21') self.conf.set_default('force_dhcp_release', False) self.conf.set_default('periodic_enable', False) self.addCleanup(utils.cleanup_dns_managers)