From 56dce766d8f367647ceae4b35885bcedc9d57663 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Tue, 14 Jun 2016 11:58:10 -0400 Subject: [PATCH] Tear down of os-disk-config part 2 This removes the portions of the os-disk-config extension that handles additional attributes being passed in during create/update/resize/rebuild. These are folded directly into servers.py with a new module wide function for translating REST in => attr dict data structures. Tests which use disk_config as the example for loading and using these extensions are removed. As this is the only in tree extension that hooks the resize entry point, that is fully removed from setup.cfg and well as any extension manager processing. Part of bp:api-no-more-extensions Change-Id: I691a3a917a3dbaa86072d689e9ebf42ba356ca60 --- nova/api/openstack/compute/disk_config.py | 40 -------- .../openstack/compute/schemas/disk_config.py | 20 ---- nova/api/openstack/compute/schemas/servers.py | 6 +- nova/api/openstack/compute/servers.py | 62 ++++--------- nova/api/validation/parameter_types.py | 4 + .../api/openstack/compute/test_serversV21.py | 92 ------------------- setup.cfg | 6 -- 7 files changed, 27 insertions(+), 203 deletions(-) delete mode 100644 nova/api/openstack/compute/schemas/disk_config.py diff --git a/nova/api/openstack/compute/disk_config.py b/nova/api/openstack/compute/disk_config.py index 939374968ee5..be865cb9695d 100644 --- a/nova/api/openstack/compute/disk_config.py +++ b/nova/api/openstack/compute/disk_config.py @@ -17,7 +17,6 @@ from oslo_utils import strutils from webob import exc -from nova.api.openstack.compute.schemas import disk_config from nova.api.openstack import extensions from nova.api.openstack import wsgi from nova.i18n import _ @@ -81,42 +80,3 @@ class DiskConfig(extensions.V21APIExtensionBase): def get_resources(self): return [] - - def _extend_server(self, server_dict, create_kwargs): - """Extends server create/update/rebuild/resize. - - This extends the server create/update/rebuild/resize - operations to add disk_config into the mix. Because all these - methods act similarly a common method is used. - - """ - if API_DISK_CONFIG in server_dict: - api_value = server_dict[API_DISK_CONFIG] - internal_value = disk_config_from_api(api_value) - create_kwargs[INTERNAL_DISK_CONFIG] = internal_value - - # Extend server for the 4 extended points - def server_create(self, server_dict, create_kwargs, body_deprecated): - self._extend_server(server_dict, create_kwargs) - - def server_update(self, server_dict, update_kwargs): - self._extend_server(server_dict, update_kwargs) - - def server_rebuild(self, server_dict, rebuild_kwargs): - self._extend_server(server_dict, rebuild_kwargs) - - def server_resize(self, server_dict, resize_kwargs): - self._extend_server(server_dict, resize_kwargs) - - # Extend schema for the 4 extended points - def get_server_create_schema(self, version): - return disk_config.server_create - - def get_server_update_schema(self, version): - return disk_config.server_create - - def get_server_rebuild_schema(self, version): - return disk_config.server_create - - def get_server_resize_schema(self, version): - return disk_config.server_create diff --git a/nova/api/openstack/compute/schemas/disk_config.py b/nova/api/openstack/compute/schemas/disk_config.py deleted file mode 100644 index 0b2fda93e594..000000000000 --- a/nova/api/openstack/compute/schemas/disk_config.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright 2014 NEC Corporation. All rights reserved. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -server_create = { - 'OS-DCF:diskConfig': { - 'type': 'string', - 'enum': ['AUTO', 'MANUAL'] - } -} diff --git a/nova/api/openstack/compute/schemas/servers.py b/nova/api/openstack/compute/schemas/servers.py index d857a6071937..61b7a005f825 100644 --- a/nova/api/openstack/compute/schemas/servers.py +++ b/nova/api/openstack/compute/schemas/servers.py @@ -42,7 +42,8 @@ base_create = { }, 'additionalProperties': False, } - } + }, + 'OS-DCF:diskConfig': parameter_types.disk_config, }, 'required': ['name', 'flavorRef'], 'additionalProperties': False, @@ -70,6 +71,7 @@ base_update = { 'type': 'object', 'properties': { 'name': parameter_types.name, + 'OS-DCF:diskConfig': parameter_types.disk_config, }, 'additionalProperties': False, }, @@ -98,6 +100,7 @@ base_rebuild = { 'adminPass': parameter_types.admin_password, 'metadata': parameter_types.metadata, 'preserve_ephemeral': parameter_types.boolean, + 'OS-DCF:diskConfig': parameter_types.disk_config }, 'required': ['imageRef'], 'additionalProperties': False, @@ -123,6 +126,7 @@ base_resize = { 'type': 'object', 'properties': { 'flavorRef': parameter_types.flavor_ref, + 'OS-DCF:diskConfig': parameter_types.disk_config, }, 'required': ['flavorRef'], 'additionalProperties': False, diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index 97d4b96df2bd..175a5578174f 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -29,6 +29,7 @@ from webob import exc from nova.api.openstack import api_version_request from nova.api.openstack import common +from nova.api.openstack.compute import disk_config from nova.api.openstack.compute.schemas import servers as schema_servers from nova.api.openstack.compute.views import servers as views_servers from nova.api.openstack import extensions @@ -54,6 +55,16 @@ LOG = logging.getLogger(__name__) authorize = extensions.os_compute_authorizer(ALIAS) +def translate_attributes(server_dict, server_kwargs): + # Disk config + # Translate create kwargs to internal representation + auto_disk_config_raw = server_dict.pop("OS-DCF:diskConfig", None) + if auto_disk_config_raw is not None: + auto_disk_config = disk_config.disk_config_from_api( + auto_disk_config_raw) + server_kwargs['auto_disk_config'] = auto_disk_config + + class ServersController(wsgi.Controller): """The Server API base controller class for the OpenStack API.""" @@ -63,8 +74,6 @@ class ServersController(wsgi.Controller): EXTENSION_UPDATE_NAMESPACE = 'nova.api.v21.extensions.server.update' - EXTENSION_RESIZE_NAMESPACE = 'nova.api.v21.extensions.server.resize' - _view_builder_class = views_servers.ViewBuilderV21 schema_server_create = schema_servers.base_create @@ -184,17 +193,6 @@ class ServersController(wsgi.Controller): if not list(self.update_extension_manager): LOG.debug("Did not find any server update extensions") - # Look for implementation of extension point of server resize - self.resize_extension_manager = \ - stevedore.enabled.EnabledExtensionManager( - namespace=self.EXTENSION_RESIZE_NAMESPACE, - check_func=_check_load_extension('server_resize'), - invoke_on_load=True, - invoke_kwds={"extension_info": self.extension_info}, - propagate_map_exceptions=True) - if not list(self.resize_extension_manager): - LOG.debug("Did not find any server resize extensions") - # Look for API schema of server create extension self.create_schema_manager = \ stevedore.enabled.EnabledExtensionManager( @@ -255,20 +253,6 @@ class ServersController(wsgi.Controller): else: LOG.debug("Did not find any server rebuild schemas") - # Look for API schema of server resize extension - self.resize_schema_manager = \ - stevedore.enabled.EnabledExtensionManager( - namespace=self.EXTENSION_RESIZE_NAMESPACE, - check_func=_check_load_extension('get_server_resize_schema'), - invoke_on_load=True, - invoke_kwds={"extension_info": self.extension_info}, - propagate_map_exceptions=True) - if list(self.resize_schema_manager): - self.resize_schema_manager.map(self._resize_extension_schema, - self.schema_server_resize, '2.1') - else: - LOG.debug("Did not find any server resize schemas") - @extensions.expected_errors((400, 403)) def index(self, req): """Returns a list of server names and ids for a given user.""" @@ -581,6 +565,8 @@ class ServersController(wsgi.Controller): availability_zone = create_kwargs.pop("availability_zone", None) + translate_attributes(server_dict, create_kwargs) + target = { 'project_id': context.project_id, 'user_id': context.user_id, @@ -755,12 +741,6 @@ class ServersController(wsgi.Controller): handler.server_rebuild(rebuild_dict, rebuild_kwargs) - def _resize_extension_point(self, ext, resize_dict, resize_kwargs): - handler = ext.obj - LOG.debug("Running _resize_extension_point for %s", ext.obj) - - handler.server_resize(resize_dict, resize_kwargs) - def _update_extension_point(self, ext, update_dict, update_kwargs): handler = ext.obj LOG.debug("Running _update_extension_point for %s", ext.obj) @@ -793,13 +773,6 @@ class ServersController(wsgi.Controller): schema = handler.get_server_rebuild_schema(version) rebuild_schema['properties']['rebuild']['properties'].update(schema) - def _resize_extension_schema(self, ext, resize_schema, version): - handler = ext.obj - LOG.debug("Running _resize_extension_schema for %s", ext.obj) - - schema = handler.get_server_resize_schema(version) - resize_schema['properties']['resize']['properties'].update(schema) - def _delete(self, context, req, instance_uuid): authorize(context, action='delete') instance = self._get_server(context, req, instance_uuid) @@ -837,6 +810,8 @@ class ServersController(wsgi.Controller): self.update_extension_manager.map(self._update_extension_point, body['server'], update_dict) + translate_attributes(body['server'], update_dict) + instance = self._get_server(ctxt, req, id, is_detail=True) try: # NOTE(mikal): this try block needs to stay because save() still @@ -1000,10 +975,7 @@ class ServersController(wsgi.Controller): flavor_ref = str(resize_dict["flavorRef"]) resize_kwargs = {} - - if list(self.resize_extension_manager): - self.resize_extension_manager.map(self._resize_extension_point, - resize_dict, resize_kwargs) + translate_attributes(resize_dict, resize_kwargs) self._resize(req, id, flavor_ref, **resize_kwargs) @@ -1038,6 +1010,8 @@ class ServersController(wsgi.Controller): self.rebuild_extension_manager.map(self._rebuild_extension_point, rebuild_dict, rebuild_kwargs) + translate_attributes(rebuild_dict, rebuild_kwargs) + for request_attribute, instance_attribute in attr_map.items(): try: if request_attribute == 'name': diff --git a/nova/api/validation/parameter_types.py b/nova/api/validation/parameter_types.py index 5dbc44e70350..712de2f64236 100644 --- a/nova/api/validation/parameter_types.py +++ b/nova/api/validation/parameter_types.py @@ -357,6 +357,10 @@ volume_size = { 'maximum': db.MAX_INT } +disk_config = { + 'type': 'string', + 'enum': ['AUTO', 'MANUAL'] +} flavor_param_positive = copy.deepcopy(volume_size) diff --git a/nova/tests/unit/api/openstack/compute/test_serversV21.py b/nova/tests/unit/api/openstack/compute/test_serversV21.py index b618495f8bc7..da4f7d1275f1 100644 --- a/nova/tests/unit/api/openstack/compute/test_serversV21.py +++ b/nova/tests/unit/api/openstack/compute/test_serversV21.py @@ -16,7 +16,6 @@ import base64 import collections -import copy import datetime import uuid @@ -35,11 +34,9 @@ import webob from nova.api.openstack import api_version_request from nova.api.openstack import common from nova.api.openstack import compute -from nova.api.openstack.compute import disk_config from nova.api.openstack.compute import extension_info from nova.api.openstack.compute import ips from nova.api.openstack.compute import keypairs -from nova.api.openstack.compute.schemas import servers as servers_schema from nova.api.openstack.compute import servers from nova.api.openstack.compute import views from nova.api.openstack import extensions @@ -4126,95 +4123,6 @@ class FakeExt(extensions.V21APIExtensionBase): return [] -class TestServersExtensionPoint(test.NoDBTestCase): - def setUp(self): - super(TestServersExtensionPoint, self).setUp() - CONF.set_override('extensions_whitelist', ['os-disk-config'], - 'osapi_v21') - self.stubs.Set(disk_config, 'DiskConfig', FakeExt) - - def _test_load_extension_point(self, name): - setattr(FakeExt, 'server_%s' % name, - FakeExt.fake_extension_point) - ext_info = extension_info.LoadedExtensionInfo() - controller = servers.ServersController(extension_info=ext_info) - self.assertEqual( - 'os-disk-config', - list(getattr(controller, - '%s_extension_manager' % name))[0].obj.alias) - delattr(FakeExt, 'server_%s' % name) - - def test_load_update_extension_point(self): - self._test_load_extension_point('update') - - def test_load_rebuild_extension_point(self): - self._test_load_extension_point('rebuild') - - def test_load_create_extension_point(self): - self._test_load_extension_point('create') - - def test_load_resize_extension_point(self): - self._test_load_extension_point('resize') - - -class TestServersExtensionSchema(test.NoDBTestCase): - def setUp(self): - super(TestServersExtensionSchema, self).setUp() - CONF.set_override('extensions_whitelist', ['os-disk-config'], - 'osapi_v21') - self.stubs.Set(disk_config, 'DiskConfig', FakeExt) - - def _test_load_extension_schema(self, name): - setattr(FakeExt, 'get_server_%s_schema' % name, - FakeExt.fake_schema_extension_point) - ext_info = extension_info.LoadedExtensionInfo() - controller = servers.ServersController(extension_info=ext_info) - self.assertTrue(hasattr(controller, '%s_schema_manager' % name)) - - delattr(FakeExt, 'get_server_%s_schema' % name) - return getattr(controller, 'schema_server_%s' % name) - - def test_load_create_extension_point(self): - # The expected is the schema combination of base and keypairs - # because of the above extensions_whitelist. - expected_schema = copy.deepcopy(servers_schema.base_create) - expected_schema['properties']['server']['properties'].update( - FakeExt.fake_schema) - - actual_schema = self._test_load_extension_schema('create') - self.assertEqual(expected_schema, actual_schema) - - def test_load_update_extension_point(self): - # keypair extension does not contain update_server() and - # here checks that any extension is not added to the schema. - expected_schema = copy.deepcopy(servers_schema.base_update) - expected_schema['properties']['server']['properties'].update( - FakeExt.fake_schema) - - actual_schema = self._test_load_extension_schema('update') - self.assertEqual(expected_schema, actual_schema) - - def test_load_rebuild_extension_point(self): - # keypair extension does not contain rebuild_server() and - # here checks that any extension is not added to the schema. - expected_schema = copy.deepcopy(servers_schema.base_rebuild) - expected_schema['properties']['rebuild']['properties'].update( - FakeExt.fake_schema) - - actual_schema = self._test_load_extension_schema('rebuild') - self.assertEqual(expected_schema, actual_schema) - - def test_load_resize_extension_point(self): - # keypair extension does not contain resize_server() and - # here checks that any extension is not added to the schema. - expected_schema = copy.deepcopy(servers_schema.base_resize) - expected_schema['properties']['resize']['properties'].update( - FakeExt.fake_schema) - - actual_schema = self._test_load_extension_schema('resize') - self.assertEqual(expected_schema, actual_schema) - - # TODO(alex_xu): There isn't specified file for ips extension. Most of # unittest related to ips extension is in this file. So put the ips policy # enforcement tests at here until there is specified file for ips extension. diff --git a/setup.cfg b/setup.cfg index d460f5d08431..2c125b8eca99 100644 --- a/setup.cfg +++ b/setup.cfg @@ -161,7 +161,6 @@ nova.api.v21.extensions.server.create = block_device_mapping = nova.api.openstack.compute.block_device_mapping:BlockDeviceMapping block_device_mapping_v1 = nova.api.openstack.compute.block_device_mapping_v1:BlockDeviceMappingV1 config_drive = nova.api.openstack.compute.config_drive:ConfigDrive - disk_config = nova.api.openstack.compute.disk_config:DiskConfig keypairs_create = nova.api.openstack.compute.keypairs:Keypairs multiple_create = nova.api.openstack.compute.multiple_create:MultipleCreate personality = nova.api.openstack.compute.personality:Personality @@ -171,16 +170,11 @@ nova.api.v21.extensions.server.create = nova.api.v21.extensions.server.rebuild = access_ips = nova.api.openstack.compute.access_ips:AccessIPs - disk_config = nova.api.openstack.compute.disk_config:DiskConfig personality = nova.api.openstack.compute.personality:Personality preserve_ephemeral_rebuild = nova.api.openstack.compute.preserve_ephemeral_rebuild:PreserveEphemeralRebuild nova.api.v21.extensions.server.update = access_ips = nova.api.openstack.compute.access_ips:AccessIPs - disk_config = nova.api.openstack.compute.disk_config:DiskConfig - -nova.api.v21.extensions.server.resize = - disk_config = nova.api.openstack.compute.disk_config:DiskConfig nova.api.v21.test_extensions = basic = nova.tests.unit.api.openstack.compute.basic:Basic