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
This commit is contained in:
parent
2c437c0889
commit
56dce766d8
@ -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
|
||||
|
@ -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']
|
||||
}
|
||||
}
|
@ -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,
|
||||
|
@ -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':
|
||||
|
@ -357,6 +357,10 @@ volume_size = {
|
||||
'maximum': db.MAX_INT
|
||||
}
|
||||
|
||||
disk_config = {
|
||||
'type': 'string',
|
||||
'enum': ['AUTO', 'MANUAL']
|
||||
}
|
||||
|
||||
flavor_param_positive = copy.deepcopy(volume_size)
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user