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 462479426d6d..1ff826252c8d 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.""" @@ -583,6 +567,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, @@ -758,12 +744,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) @@ -796,13 +776,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) @@ -840,6 +813,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 @@ -1003,10 +978,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) @@ -1041,6 +1013,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 4b4b8f61c1ad..64096564d01e 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 @@ -4138,95 +4135,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 63a1265cc2cc..1775e9c2d486 100644 --- a/setup.cfg +++ b/setup.cfg @@ -160,7 +160,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 @@ -170,16 +169,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