Merge "Tear down of os-disk-config part 2"

This commit is contained in:
Jenkins 2016-06-20 13:33:12 +00:00 committed by Gerrit Code Review
commit 974b158f4f
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."""
@ -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':

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

View File

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