Merge "Tear down of os-disk-config part 2"
This commit is contained in:
commit
974b158f4f
@ -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."""
|
||||
@ -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':
|
||||
|
@ -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
|
||||
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user