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:
Sean Dague 2016-06-14 11:58:10 -04:00
parent 2c437c0889
commit 56dce766d8
7 changed files with 27 additions and 203 deletions

View File

@ -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

View File

@ -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']
}
}

View File

@ -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,

View File

@ -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':

View File

@ -357,6 +357,10 @@ volume_size = {
'maximum': db.MAX_INT
}
disk_config = {
'type': 'string',
'enum': ['AUTO', 'MANUAL']
}
flavor_param_positive = copy.deepcopy(volume_size)

View File

@ -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.

View File

@ -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