diff options
| author | Brian Waldon <brian.waldon@rackspace.com> | 2011-10-11 16:32:56 -0400 |
|---|---|---|
| committer | Brian Waldon <brian.waldon@rackspace.com> | 2011-10-17 13:48:22 -0400 |
| commit | edf3e39cd395150adfe36375b09253f2eef0bd2e (patch) | |
| tree | 8c63702a1005e65ff2de41732928095d4fc98f22 /nova/api | |
| parent | ddb49f7929bf29d2003ffdd3a14831d36d2f9d07 (diff) | |
| download | nova-edf3e39cd395150adfe36375b09253f2eef0bd2e.tar.gz nova-edf3e39cd395150adfe36375b09253f2eef0bd2e.tar.xz nova-edf3e39cd395150adfe36375b09253f2eef0bd2e.zip | |
Remove OSAPI v1.0
Change-Id: I92302c9c2b8f98d140c4844d4522adbcb45c8dd7
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/__init__.py | 60 | ||||
| -rw-r--r-- | nova/api/openstack/backup_schedules.py | 67 | ||||
| -rw-r--r-- | nova/api/openstack/common.py | 1 | ||||
| -rw-r--r-- | nova/api/openstack/contrib/createserverext.py | 4 | ||||
| -rw-r--r-- | nova/api/openstack/contrib/virtual_storage_arrays.py | 2 | ||||
| -rw-r--r-- | nova/api/openstack/contrib/volumes.py | 2 | ||||
| -rw-r--r-- | nova/api/openstack/faults.py | 14 | ||||
| -rw-r--r-- | nova/api/openstack/flavors.py | 31 | ||||
| -rw-r--r-- | nova/api/openstack/images.py | 102 | ||||
| -rw-r--r-- | nova/api/openstack/ips.py | 58 | ||||
| -rw-r--r-- | nova/api/openstack/limits.py | 47 | ||||
| -rw-r--r-- | nova/api/openstack/notes.txt | 20 | ||||
| -rw-r--r-- | nova/api/openstack/servers.py | 244 | ||||
| -rw-r--r-- | nova/api/openstack/shared_ip_groups.py | 52 | ||||
| -rw-r--r-- | nova/api/openstack/versions.py | 44 | ||||
| -rw-r--r-- | nova/api/openstack/views/addresses.py | 25 | ||||
| -rw-r--r-- | nova/api/openstack/views/flavors.py | 28 | ||||
| -rw-r--r-- | nova/api/openstack/views/images.py | 105 | ||||
| -rw-r--r-- | nova/api/openstack/views/limits.py | 28 | ||||
| -rw-r--r-- | nova/api/openstack/views/servers.py | 101 | ||||
| -rw-r--r-- | nova/api/openstack/zones.py | 4 |
21 files changed, 120 insertions, 919 deletions
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py index a49510816..63dc4266c 100644 --- a/nova/api/openstack/__init__.py +++ b/nova/api/openstack/__init__.py @@ -24,12 +24,8 @@ import routes import webob.dec import webob.exc -from nova import flags -from nova import log as logging -from nova import wsgi as base_wsgi from nova.api.openstack import accounts from nova.api.openstack import faults -from nova.api.openstack import backup_schedules from nova.api.openstack import consoles from nova.api.openstack import flavors from nova.api.openstack import images @@ -38,11 +34,13 @@ from nova.api.openstack import ips from nova.api.openstack import limits from nova.api.openstack import servers from nova.api.openstack import server_metadata -from nova.api.openstack import shared_ip_groups from nova.api.openstack import users from nova.api.openstack import versions from nova.api.openstack import wsgi from nova.api.openstack import zones +from nova import flags +from nova import log as logging +from nova import wsgi as base_wsgi LOG = logging.getLogger('nova.api.openstack') @@ -97,19 +95,11 @@ class APIRouter(base_wsgi.Router): def __init__(self, ext_mgr=None): self.server_members = {} - mapper = self._mapper() + mapper = ProjectMapper() self._setup_routes(mapper) super(APIRouter, self).__init__(mapper) - def _mapper(self): - return routes.Mapper() - def _setup_routes(self, mapper): - raise NotImplementedError(_("You must implement _setup_routes.")) - - def _setup_base_routes(self, mapper, version): - """Routes common to all versions.""" - server_members = self.server_members server_members['action'] = 'POST' if FLAGS.allow_admin_api: @@ -127,13 +117,13 @@ class APIRouter(base_wsgi.Router): collection={'detail': 'GET'}) mapper.resource("zone", "zones", - controller=zones.create_resource(version), + controller=zones.create_resource(), collection={'detail': 'GET', 'info': 'GET', 'select': 'POST'}) mapper.connect("versions", "/", - controller=versions.create_resource(version), + controller=versions.create_resource(), action='show') mapper.resource("console", "consoles", @@ -142,53 +132,25 @@ class APIRouter(base_wsgi.Router): collection_name='servers')) mapper.resource("server", "servers", - controller=servers.create_resource(version), + controller=servers.create_resource(), collection={'detail': 'GET'}, member=self.server_members) - mapper.resource("ip", "ips", controller=ips.create_resource(version), + mapper.resource("ip", "ips", controller=ips.create_resource(), parent_resource=dict(member_name='server', collection_name='servers')) mapper.resource("image", "images", - controller=images.create_resource(version), + controller=images.create_resource(), collection={'detail': 'GET'}) mapper.resource("limit", "limits", - controller=limits.create_resource(version)) + controller=limits.create_resource()) mapper.resource("flavor", "flavors", - controller=flavors.create_resource(version), + controller=flavors.create_resource(), collection={'detail': 'GET'}) - super(APIRouter, self).__init__(mapper) - - -class APIRouterV10(APIRouter): - """Define routes specific to OpenStack API V1.0.""" - - def _setup_routes(self, mapper): - self._setup_base_routes(mapper, '1.0') - - mapper.resource("shared_ip_group", "shared_ip_groups", - collection={'detail': 'GET'}, - controller=shared_ip_groups.create_resource()) - - mapper.resource("backup_schedule", "backup_schedule", - controller=backup_schedules.create_resource(), - parent_resource=dict(member_name='server', - collection_name='servers')) - - -class APIRouterV11(APIRouter): - """Define routes specific to OpenStack API V1.1.""" - - def _mapper(self): - return ProjectMapper() - - def _setup_routes(self, mapper): - self._setup_base_routes(mapper, '1.1') - image_metadata_controller = image_metadata.create_resource() mapper.resource("image_meta", "metadata", diff --git a/nova/api/openstack/backup_schedules.py b/nova/api/openstack/backup_schedules.py deleted file mode 100644 index 7ff0d999e..000000000 --- a/nova/api/openstack/backup_schedules.py +++ /dev/null @@ -1,67 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2010 OpenStack LLC. -# 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. - -import time - -from webob import exc - -from nova.api.openstack import wsgi - - -def _translate_keys(inst): - """ Coerces the backup schedule into proper dictionary format """ - return dict(backupSchedule=inst) - - -class Controller(object): - """ The backup schedule API controller for the Openstack API """ - - def __init__(self): - pass - - def index(self, req, server_id, **kwargs): - """ Returns the list of backup schedules for a given instance """ - raise exc.HTTPNotImplemented() - - def show(self, req, server_id, id, **kwargs): - """ Returns a single backup schedule for a given instance """ - raise exc.HTTPNotImplemented() - - def create(self, req, server_id, **kwargs): - """ No actual update method required, since the existing API allows - both create and update through a POST """ - raise exc.HTTPNotImplemented() - - def delete(self, req, server_id, id, **kwargs): - """ Deletes an existing backup schedule """ - raise exc.HTTPNotImplemented() - - -def create_resource(): - metadata = { - 'attributes': { - 'backupSchedule': [], - }, - } - - body_serializers = { - 'application/xml': wsgi.XMLDictSerializer(xmlns=wsgi.XMLNS_V10, - metadata=metadata), - } - - serializer = wsgi.ResponseSerializer(body_serializers) - return wsgi.Resource(Controller(), serializer=serializer) diff --git a/nova/api/openstack/common.py b/nova/api/openstack/common.py index bf5d415d5..30ca43414 100644 --- a/nova/api/openstack/common.py +++ b/nova/api/openstack/common.py @@ -37,7 +37,6 @@ LOG = logging.getLogger('nova.api.openstack.common') FLAGS = flags.FLAGS -XML_NS_V10 = 'http://docs.rackspacecloud.com/servers/api/v1.0' XML_NS_V11 = 'http://docs.openstack.org/compute/api/v1.1' diff --git a/nova/api/openstack/contrib/createserverext.py b/nova/api/openstack/contrib/createserverext.py index 1e13e10d4..7546bdeaa 100644 --- a/nova/api/openstack/contrib/createserverext.py +++ b/nova/api/openstack/contrib/createserverext.py @@ -20,7 +20,7 @@ from nova.api.openstack import servers from nova.api.openstack import wsgi -class CreateServerController(servers.ControllerV11): +class CreateServerController(servers.Controller): def _build_view(self, req, instance, is_detail=False): server = super(CreateServerController, self)._build_view(req, instance, @@ -65,7 +65,7 @@ class Createserverext(extensions.ExtensionDescriptor): } body_deserializers = { - 'application/xml': servers.ServerXMLDeserializerV11(), + 'application/xml': servers.ServerXMLDeserializer(), } serializer = wsgi.ResponseSerializer(body_serializers, diff --git a/nova/api/openstack/contrib/virtual_storage_arrays.py b/nova/api/openstack/contrib/virtual_storage_arrays.py index e09736a28..ca219cfa8 100644 --- a/nova/api/openstack/contrib/virtual_storage_arrays.py +++ b/nova/api/openstack/contrib/virtual_storage_arrays.py @@ -489,7 +489,7 @@ class VsaVPoolController(object): return faults.Fault(exc.HTTPBadRequest()) -class VsaVCController(servers.ControllerV11): +class VsaVCController(servers.Controller): """The VSA Virtual Controller API controller for the OpenStack API.""" def __init__(self): diff --git a/nova/api/openstack/contrib/volumes.py b/nova/api/openstack/contrib/volumes.py index 6c79a0538..50a1e42ab 100644 --- a/nova/api/openstack/contrib/volumes.py +++ b/nova/api/openstack/contrib/volumes.py @@ -331,7 +331,7 @@ class VolumeAttachmentController(object): return {'volumeAttachments': res} -class BootFromVolumeController(servers.ControllerV11): +class BootFromVolumeController(servers.Controller): """The boot from volume API controller for the Openstack API.""" def _get_block_device_mapping(self, data): diff --git a/nova/api/openstack/faults.py b/nova/api/openstack/faults.py index d0d078cb5..0ef863eed 100644 --- a/nova/api/openstack/faults.py +++ b/nova/api/openstack/faults.py @@ -60,13 +60,9 @@ class Fault(webob.exc.HTTPException): # 'code' is an attribute on the fault tag itself metadata = {'attributes': {fault_name: 'code'}} - content_type = req.best_match_content_type() - - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V10), - '1.1': wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V11), - }[common.get_version_from_href(req.url)] + xml_serializer = wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V11) + content_type = req.best_match_content_type() serializer = { 'application/xml': xml_serializer, 'application/json': wsgi.JSONDictSerializer(), @@ -105,11 +101,7 @@ class OverLimitFault(webob.exc.HTTPException): content_type = request.best_match_content_type() metadata = {"attributes": {"overLimitFault": "code"}} - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V10), - '1.1': wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V11), - }[common.get_version_from_href(request.url)] - + xml_serializer = wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V11) serializer = { 'application/xml': xml_serializer, 'application/json': wsgi.JSONDictSerializer(), diff --git a/nova/api/openstack/flavors.py b/nova/api/openstack/flavors.py index b9dd96f4e..cd6562e4f 100644 --- a/nova/api/openstack/flavors.py +++ b/nova/api/openstack/flavors.py @@ -75,19 +75,10 @@ class Controller(object): values = builder.build(flavor, is_detail=True) return dict(flavor=values) - -class ControllerV10(Controller): - - def _get_view_builder(self, req): - return views.flavors.ViewBuilder() - - -class ControllerV11(Controller): - def _get_view_builder(self, req): base_url = req.application_url project_id = getattr(req.environ['nova.context'], 'project_id', '') - return views.flavors.ViewBuilderV11(base_url, project_id) + return views.flavors.ViewBuilder(base_url, project_id) class FlavorXMLSerializer(wsgi.XMLDictSerializer): @@ -136,21 +127,7 @@ class FlavorXMLSerializer(wsgi.XMLDictSerializer): return self._to_xml(flavors) -def create_resource(version='1.0'): - controller = { - '1.0': ControllerV10, - '1.1': ControllerV11, - }[version]() - - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(xmlns=wsgi.XMLNS_V10), - '1.1': FlavorXMLSerializer(), - }[version] - - body_serializers = { - 'application/xml': xml_serializer, - } - +def create_resource(): + body_serializers = {'application/xml': FlavorXMLSerializer()} serializer = wsgi.ResponseSerializer(body_serializers) - - return wsgi.Resource(controller, serializer=serializer) + return wsgi.Resource(Controller(), serializer=serializer) diff --git a/nova/api/openstack/images.py b/nova/api/openstack/images.py index 64bd4a39d..11b847266 100644 --- a/nova/api/openstack/images.py +++ b/nova/api/openstack/images.py @@ -104,83 +104,11 @@ class Controller(object): raise webob.exc.HTTPNotFound(explanation=explanation) return webob.exc.HTTPNoContent() - def get_builder(self, request): - """Indicates that you must use a Controller subclass.""" - raise NotImplementedError() - - -class ControllerV10(Controller): - """Version 1.0 specific controller logic.""" - - @common.check_snapshots_enabled - def create(self, req, body): - """Snapshot a server instance and save the image.""" - try: - image = body["image"] - except (KeyError, TypeError): - msg = _("Invalid image entity") - raise webob.exc.HTTPBadRequest(explanation=msg) - - try: - image_name = image["name"] - instance_id = image["serverId"] - except KeyError as missing_key: - msg = _("Image entity requires %s") % missing_key - raise webob.exc.HTTPBadRequest(explanation=msg) - - context = req.environ["nova.context"] - props = {'instance_id': instance_id} - - try: - image = self._compute_service.snapshot(context, - instance_id, - image_name, - extra_properties=props) - except exception.InstanceBusy: - msg = _("Server is currently creating an image. Please wait.") - raise webob.exc.HTTPConflict(explanation=msg) - - return dict(image=self.get_builder(req).build(image, detail=True)) - - def get_builder(self, request): - """Property to get the ViewBuilder class we need to use.""" - base_url = request.application_url - return images_view.ViewBuilderV10(base_url) - - def index(self, req): - """Return an index listing of images available to the request. - - :param req: `wsgi.Request` object - - """ - context = req.environ['nova.context'] - filters = self._get_filters(req) - images = self._image_service.index(context, filters=filters) - images = common.limited(images, req) - return self.get_builder(req).build_list(images) - - def detail(self, req): - """Return a detailed index listing of images available to the request. - - :param req: `wsgi.Request` object. - - """ - context = req.environ['nova.context'] - filters = self._get_filters(req) - images = self._image_service.detail(context, filters=filters) - images = common.limited(images, req) - builder = self.get_builder(req).build - return dict(images=[builder(image, detail=True) for image in images]) - - -class ControllerV11(Controller): - """Version 1.1 specific controller logic.""" - def get_builder(self, req): """Property to get the ViewBuilder class we need to use.""" base_url = req.application_url project_id = getattr(req.environ['nova.context'], 'project_id', '') - return images_view.ViewBuilderV11(base_url, project_id) + return images_view.ViewBuilder(base_url, project_id) def index(self, req): """Return an index listing of images available to the request. @@ -298,29 +226,7 @@ class ImageXMLSerializer(wsgi.XMLDictSerializer): return self._to_xml(image) -def create_resource(version='1.0'): - controller = { - '1.0': ControllerV10, - '1.1': ControllerV11, - }[version]() - - metadata = { - "attributes": { - "image": ["id", "name", "updated", "created", "status", - "serverId", "progress", "serverRef"], - "link": ["rel", "type", "href"], - }, - } - - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V10), - '1.1': ImageXMLSerializer(), - }[version] - - body_serializers = { - 'application/xml': xml_serializer, - } - +def create_resource(): + body_serializers = {'application/xml': ImageXMLSerializer()} serializer = wsgi.ResponseSerializer(body_serializers) - - return wsgi.Resource(controller, serializer=serializer) + return wsgi.Resource(Controller(), serializer=serializer) diff --git a/nova/api/openstack/ips.py b/nova/api/openstack/ips.py index db0b7107b..48fd4eeb7 100644 --- a/nova/api/openstack/ips.py +++ b/nova/api/openstack/ips.py @@ -52,37 +52,6 @@ class Controller(object): def delete(self, req, server_id, id): raise exc.HTTPNotImplemented() - -class ControllerV10(Controller): - - def index(self, req, server_id): - context = req.environ['nova.context'] - instance = self._get_instance(context, server_id) - networks = common.get_networks_for_instance(context, instance) - builder = self._get_view_builder(req) - return {'addresses': builder.build(networks)} - - def show(self, req, server_id, id): - context = req.environ['nova.context'] - instance = self._get_instance(context, server_id) - networks = common.get_networks_for_instance(context, instance) - builder = self._get_view_builder(req) - if id == 'private': - view = builder.build_private_parts(networks) - elif id == 'public': - view = builder.build_public_parts(networks) - else: - msg = _("Only private and public networks available") - raise exc.HTTPNotFound(explanation=msg) - - return {id: view} - - def _get_view_builder(self, req): - return views_addresses.ViewBuilderV10() - - -class ControllerV11(Controller): - def index(self, req, server_id): context = req.environ['nova.context'] instance = self._get_instance(context, server_id) @@ -102,7 +71,7 @@ class ControllerV11(Controller): return network def _get_view_builder(self, req): - return views_addresses.ViewBuilderV11() + return views_addresses.ViewBuilder() class IPXMLSerializer(wsgi.XMLDictSerializer): @@ -138,24 +107,7 @@ class IPXMLSerializer(wsgi.XMLDictSerializer): return self._to_xml(addresses) -def create_resource(version): - controller = { - '1.0': ControllerV10, - '1.1': ControllerV11, - }[version]() - - metadata = { - 'list_collections': { - 'public': {'item_name': 'ip', 'item_key': 'addr'}, - 'private': {'item_name': 'ip', 'item_key': 'addr'}, - }, - } - - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(metadata=metadata, xmlns=wsgi.XMLNS_V11), - '1.1': IPXMLSerializer(), - }[version] - - serializer = wsgi.ResponseSerializer({'application/xml': xml_serializer}) - - return wsgi.Resource(controller, serializer=serializer) +def create_resource(): + body_serializers = {'application/xml': IPXMLSerializer()} + serializer = wsgi.ResponseSerializer(body_serializers) + return wsgi.Resource(Controller(), serializer=serializer) diff --git a/nova/api/openstack/limits.py b/nova/api/openstack/limits.py index f6df94eea..564f62b12 100644 --- a/nova/api/openstack/limits.py +++ b/nova/api/openstack/limits.py @@ -65,17 +65,7 @@ class LimitsController(object): return builder.build(rate_limits, abs_limits) def _get_view_builder(self, req): - raise NotImplementedError() - - -class LimitsControllerV10(LimitsController): - def _get_view_builder(self, req): - return limits_views.ViewBuilderV10() - - -class LimitsControllerV11(LimitsController): - def _get_view_builder(self, req): - return limits_views.ViewBuilderV11() + return limits_views.ViewBuilder() class LimitsXMLSerializer(wsgi.XMLDictSerializer): @@ -127,39 +117,10 @@ class LimitsXMLSerializer(wsgi.XMLDictSerializer): return self._to_xml(limits) -def create_resource(version='1.0'): - controller = { - '1.0': LimitsControllerV10, - '1.1': LimitsControllerV11, - }[version]() - - xmlns = { - '1.0': wsgi.XMLNS_V10, - '1.1': wsgi.XMLNS_V11, - }[version] - - metadata = { - "attributes": { - "limit": ["verb", "URI", "uri", "regex", "value", "unit", - "resetTime", "next-available", "remaining", "name"], - }, - "plurals": { - "rate": "limit", - }, - } - - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(xmlns=xmlns, metadata=metadata), - '1.1': LimitsXMLSerializer(), - }[version] - - body_serializers = { - 'application/xml': xml_serializer, - } - +def create_resource(): + body_serializers = {'application/xml': LimitsXMLSerializer()} serializer = wsgi.ResponseSerializer(body_serializers) - - return wsgi.Resource(controller, serializer=serializer) + return wsgi.Resource(LimitsController(), serializer=serializer) class Limit(object): diff --git a/nova/api/openstack/notes.txt b/nova/api/openstack/notes.txt deleted file mode 100644 index 4e95bffc8..000000000 --- a/nova/api/openstack/notes.txt +++ /dev/null @@ -1,20 +0,0 @@ -We will need: - -ImageService -a service that can do crud on image information. not user-specific. opaque -image ids. - -GlanceImageService(ImageService): -image ids are URIs. - -OpenstackAPITranslationStore: -translates RS server/images/flavor/etc ids into formats required -by a given ImageService strategy. - -api.openstack.images.Controller: -uses an ImageService strategy behind the scenes to do its fetching; it just -converts int image id into a strategy-specific image id. - -who maintains the mapping from user to [images he owns]? nobody, because -we have no way of enforcing access to his images, without kryptex which -won't be in Austin. diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py index 9cc0872c6..4d55f40f4 100644 --- a/nova/api/openstack/servers.py +++ b/nova/api/openstack/servers.py @@ -85,18 +85,6 @@ class Controller(object): return exc.HTTPNotFound() return servers - def _build_view(self, req, instance, is_detail=False): - raise NotImplementedError() - - def _build_list(self, req, instances, is_detail=False): - raise NotImplementedError() - - def _limit_items(self, items, req): - raise NotImplementedError() - - def _action_rebuild(self, info, request, instance_id): - raise NotImplementedError() - def _get_block_device_mapping(self, data): """Get block_device_mapping from 'server' dictionary. Overidden by volumes controller. @@ -346,10 +334,6 @@ class Controller(object): except exception.NotFound: raise exc.HTTPNotFound() - def _get_key_name(self, req, body): - """ Get default keypair if not set """ - raise NotImplementedError() - def create(self, req, body): """ Creates a new server for a given user """ @@ -556,10 +540,8 @@ class Controller(object): except exception.NotFound: raise exc.HTTPNotFound() - return self._update(ctxt, req, id, body) - - def _update(self, context, req, id, inst_dict): - return exc.HTTPNotImplemented() + instance = self.compute_api.routing_get(ctxt, id) + return self._build_view(req, instance, is_detail=True) @exception.novaclient_converter @scheduler_api.redirect_handler @@ -654,13 +636,6 @@ class Controller(object): resp.headers['Location'] = image_ref return resp - @common.check_snapshots_enabled - def _action_create_image(self, input_dict, req, id): - return exc.HTTPNotImplemented() - - def _action_change_password(self, input_dict, req, id): - return exc.HTTPNotImplemented() - def _action_confirm_resize(self, input_dict, req, id): try: self.compute_api.confirm_resize(req.environ['nova.context'], id) @@ -683,9 +658,6 @@ class Controller(object): raise exc.HTTPBadRequest() return webob.Response(status_int=202) - def _action_resize(self, input_dict, req, id): - return exc.HTTPNotImplemented() - def _action_reboot(self, input_dict, req, id): if 'reboot' in input_dict and 'type' in input_dict['reboot']: valid_reboot_types = ['HARD', 'SOFT'] @@ -783,96 +755,6 @@ class Controller(object): return webob.Response(status_int=202) - -class ControllerV10(Controller): - """v1.0 OpenStack API controller""" - - @exception.novaclient_converter - @scheduler_api.redirect_handler - def delete(self, req, id): - """ Destroys a server """ - try: - self._delete(req.environ['nova.context'], id) - except exception.NotFound: - raise exc.HTTPNotFound() - return webob.Response(status_int=202) - - def _get_key_name(self, req, body): - context = req.environ["nova.context"] - keypairs = db.key_pair_get_all_by_user(context, - context.user_id) - if keypairs: - return keypairs[0]['name'] - - def _image_ref_from_req_data(self, data): - return data['server']['imageId'] - - def _flavor_id_from_req_data(self, data): - return data['server']['flavorId'] - - def _build_view(self, req, instance, is_detail=False): - context = req.environ['nova.context'] - addresses = views_addresses.ViewBuilderV10() - builder = views_servers.ViewBuilderV10(context, addresses) - return builder.build(instance, is_detail=is_detail) - - def _build_list(self, req, instances, is_detail=False): - context = req.environ['nova.context'] - addresses = views_addresses.ViewBuilderV10() - builder = views_servers.ViewBuilderV10(context, addresses) - return builder.build_list(instances, is_detail=is_detail) - - def _limit_items(self, items, req): - return common.limited(items, req) - - def _update(self, context, req, id, inst_dict): - if 'adminPass' in inst_dict['server']: - self.compute_api.set_admin_password(context, id, - inst_dict['server']['adminPass']) - return exc.HTTPNoContent() - - def _action_resize(self, input_dict, req, id): - """ Resizes a given instance to the flavor size requested """ - try: - flavor_id = input_dict["resize"]["flavorId"] - except (KeyError, TypeError): - msg = _("Resize requests require 'flavorId' attribute.") - raise exc.HTTPBadRequest(explanation=msg) - - return self.resize(req, id, flavor_id) - - def _action_rebuild(self, info, request, instance_id): - context = request.environ['nova.context'] - - try: - image_id = info["rebuild"]["imageId"] - except (KeyError, TypeError): - msg = _("Could not parse imageId from request.") - LOG.debug(msg) - raise exc.HTTPBadRequest(explanation=msg) - - password = utils.generate_password(FLAGS.password_length) - - try: - self.compute_api.rebuild(context, instance_id, image_id, password) - except exception.RebuildRequiresActiveInstance: - msg = _("Instance %s must be active to rebuild.") % instance_id - raise exc.HTTPConflict(explanation=msg) - - return webob.Response(status_int=202) - - def _get_server_admin_password(self, server): - """ Determine the admin password for a server on creation """ - return self._get_server_admin_password_old_style(server) - - def _get_server_search_options(self): - """Return server search options allowed by non-admin""" - return 'reservation_id', 'fixed_ip', 'name', 'local_zone_only' - - -class ControllerV11(Controller): - """v1.1 OpenStack API controller""" - @exception.novaclient_converter @scheduler_api.redirect_handler def delete(self, req, id): @@ -910,10 +792,10 @@ class ControllerV11(Controller): context = req.environ['nova.context'] project_id = getattr(context, 'project_id', '') base_url = req.application_url - flavor_builder = views_flavors.ViewBuilderV11(base_url, project_id) - image_builder = views_images.ViewBuilderV11(base_url, project_id) - addresses_builder = views_addresses.ViewBuilderV11() - builder = views_servers.ViewBuilderV11(context, addresses_builder, + flavor_builder = views_flavors.ViewBuilder(base_url, project_id) + image_builder = views_images.ViewBuilder(base_url, project_id) + addresses_builder = views_addresses.ViewBuilder() + builder = views_servers.ViewBuilder(context, addresses_builder, flavor_builder, image_builder, base_url, project_id) return builder.build(instance, is_detail=is_detail) @@ -927,10 +809,10 @@ class ControllerV11(Controller): context = req.environ['nova.context'] project_id = getattr(context, 'project_id', '') base_url = req.application_url - flavor_builder = views_flavors.ViewBuilderV11(base_url, project_id) - image_builder = views_images.ViewBuilderV11(base_url, project_id) - addresses_builder = views_addresses.ViewBuilderV11() - builder = views_servers.ViewBuilderV11(context, addresses_builder, + flavor_builder = views_flavors.ViewBuilder(base_url, project_id) + image_builder = views_images.ViewBuilder(base_url, project_id) + addresses_builder = views_addresses.ViewBuilder() + builder = views_servers.ViewBuilder(context, addresses_builder, flavor_builder, image_builder, base_url, project_id) return builder.build_list(instances, is_detail=is_detail, **params) @@ -977,10 +859,6 @@ class ControllerV11(Controller): LOG.info(msg) raise exc.HTTPBadRequest(explanation=msg) - def _update(self, context, req, id, inst_dict): - instance = self.compute_api.routing_get(context, id) - return self._build_view(req, instance, is_detail=True) - def _action_resize(self, input_dict, req, id): """ Resizes a given instance to the flavor size requested """ try: @@ -1235,55 +1113,7 @@ class ServerXMLSerializer(wsgi.XMLDictSerializer): return self._to_xml(server) -class ServerXMLDeserializer(wsgi.XMLDeserializer): - """ - Deserializer to handle xml-formatted server create requests. - - Handles standard server attributes as well as optional metadata - and personality attributes - """ - - metadata_deserializer = common.MetadataXMLDeserializer() - - def create(self, string): - """Deserialize an xml-formatted server create request""" - dom = minidom.parseString(string) - server = self._extract_server(dom) - return {'body': {'server': server}} - - def _extract_server(self, node): - """Marshal the server attribute of a parsed request""" - server = {} - server_node = self.find_first_child_named(node, 'server') - - attributes = ["name", "imageId", "flavorId", "adminPass"] - for attr in attributes: - if server_node.getAttribute(attr): - server[attr] = server_node.getAttribute(attr) - - metadata_node = self.find_first_child_named(server_node, "metadata") - server["metadata"] = self.metadata_deserializer.extract_metadata( - metadata_node) - - server["personality"] = self._extract_personality(server_node) - - return server - - def _extract_personality(self, server_node): - """Marshal the personality attribute of a parsed request""" - node = self.find_first_child_named(server_node, "personality") - personality = [] - if node is not None: - for file_node in self.find_children_named(node, "file"): - item = {} - if file_node.hasAttribute("path"): - item["path"] = file_node.getAttribute("path") - item["contents"] = self.extract_text(file_node) - personality.append(item) - return personality - - -class ServerXMLDeserializerV11(wsgi.MetadataXMLDeserializer): +class ServerXMLDeserializer(wsgi.MetadataXMLDeserializer): """ Deserializer to handle xml-formatted server create requests. @@ -1456,57 +1286,13 @@ class ServerXMLDeserializerV11(wsgi.MetadataXMLDeserializer): return None -def create_resource(version='1.0'): - controller = { - '1.0': ControllerV10, - '1.1': ControllerV11, - }[version]() - - metadata = { - "attributes": { - "server": ["id", "imageId", "name", "flavorId", "hostId", - "status", "progress", "adminPass", "flavorRef", - "imageRef", "userId", "tenantId"], - "link": ["rel", "type", "href"], - }, - "dict_collections": { - "metadata": {"item_name": "meta", "item_key": "key"}, - }, - "list_collections": { - "public": {"item_name": "ip", "item_key": "addr"}, - "private": {"item_name": "ip", "item_key": "addr"}, - }, - } - - xmlns = { - '1.0': wsgi.XMLNS_V10, - '1.1': wsgi.XMLNS_V11, - }[version] - +def create_resource(): headers_serializer = HeadersSerializer() - - xml_serializer = { - '1.0': wsgi.XMLDictSerializer(metadata, wsgi.XMLNS_V10), - '1.1': ServerXMLSerializer(), - }[version] - - body_serializers = { - 'application/xml': xml_serializer, - } - - xml_deserializer = { - '1.0': ServerXMLDeserializer(), - '1.1': ServerXMLDeserializerV11(), - }[version] - - body_deserializers = { - 'application/xml': xml_deserializer, - } - + body_serializers = {'application/xml': ServerXMLSerializer()} serializer = wsgi.ResponseSerializer(body_serializers, headers_serializer) + body_deserializers = {'application/xml': ServerXMLDeserializer()} deserializer = wsgi.RequestDeserializer(body_deserializers) - - return wsgi.Resource(controller, deserializer, serializer) + return wsgi.Resource(Controller(), deserializer, serializer) def remove_invalid_options(context, search_options, allowed_search_options): diff --git a/nova/api/openstack/shared_ip_groups.py b/nova/api/openstack/shared_ip_groups.py deleted file mode 100644 index 54d0a8334..000000000 --- a/nova/api/openstack/shared_ip_groups.py +++ /dev/null @@ -1,52 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright 2010 OpenStack LLC. -# 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. - -from webob import exc - -from nova.api.openstack import wsgi - - -class Controller(object): - """ The Shared IP Groups Controller for the Openstack API """ - - def index(self, req, **kwargs): - """ Returns a list of Shared IP Groups for the user """ - raise exc.HTTPNotImplemented() - - def show(self, req, id, **kwargs): - """ Shows in-depth information on a specific Shared IP Group """ - raise exc.HTTPNotImplemented() - - def update(self, req, id, **kwargs): - """ You can't update a Shared IP Group """ - raise exc.HTTPNotImplemented() - - def delete(self, req, id, **kwargs): - """ Deletes a Shared IP Group """ - raise exc.HTTPNotImplemented() - - def detail(self, req, **kwargs): - """ Returns a complete list of Shared IP Groups """ - raise exc.HTTPNotImplemented() - - def create(self, req, **kwargs): - """ Creates a new Shared IP group """ - raise exc.HTTPNotImplemented() - - -def create_resource(): - return wsgi.Resource(Controller()) diff --git a/nova/api/openstack/versions.py b/nova/api/openstack/versions.py index 034287b10..5461ffce2 100644 --- a/nova/api/openstack/versions.py +++ b/nova/api/openstack/versions.py @@ -26,35 +26,6 @@ from nova.api.openstack import xmlutil VERSIONS = { - "v1.0": { - "id": "v1.0", - "status": "DEPRECATED", - "updated": "2011-01-21T11:33:21Z", - "links": [ - { - "rel": "describedby", - "type": "application/pdf", - "href": "http://docs.rackspacecloud.com/" - "servers/api/v1.0/cs-devguide-20110125.pdf", - }, - { - "rel": "describedby", - "type": "application/vnd.sun.wadl+xml", - "href": "http://docs.rackspacecloud.com/" - "servers/api/v1.0/application.wadl", - }, - ], - "media-types": [ - { - "base": "application/xml", - "type": "application/vnd.openstack.compute+xml;version=1.0", - }, - { - "base": "application/json", - "type": "application/vnd.openstack.compute+json;version=1.0", - } - ], - }, "v1.1": { "id": "v1.1", "status": "CURRENT", @@ -122,12 +93,6 @@ class Versions(wsgi.Resource): return builder.build_choices(VERSIONS, request) -class VersionV10(object): - def show(self, req): - builder = nova.api.openstack.views.versions.get_view_builder(req) - return builder.build_version(VERSIONS['v1.0']) - - class VersionV11(object): def show(self, req): builder = nova.api.openstack.views.versions.get_view_builder(req) @@ -282,12 +247,7 @@ class VersionsHeadersSerializer(wsgi.ResponseHeadersSerializer): response.status_int = 300 -def create_resource(version='1.0'): - controller = { - '1.0': VersionV10, - '1.1': VersionV11, - }[version]() - +def create_resource(): body_serializers = { 'application/xml': VersionsXMLSerializer(), 'application/atom+xml': VersionsAtomSerializer(), @@ -296,5 +256,5 @@ def create_resource(version='1.0'): deserializer = wsgi.RequestDeserializer() - return wsgi.Resource(controller, serializer=serializer, + return wsgi.Resource(VersionV11(), serializer=serializer, deserializer=deserializer) diff --git a/nova/api/openstack/views/addresses.py b/nova/api/openstack/views/addresses.py index 3454f50c8..2a5286646 100644 --- a/nova/api/openstack/views/addresses.py +++ b/nova/api/openstack/views/addresses.py @@ -28,9 +28,6 @@ LOG = logging.getLogger('nova.api.openstack.views.addresses') class ViewBuilder(object): """Models a server addresses response as a python dictionary.""" - def build(self, inst): - raise NotImplementedError() - def _extract_ips(self, network, key=None): if key: chain = network[key] @@ -41,28 +38,6 @@ class ViewBuilder(object): continue yield ip - -class ViewBuilderV10(ViewBuilder): - - def build(self, networks): - if not networks: - return dict(public=[], private=[]) - - return dict(public=self.build_public_parts(networks), - private=self.build_private_parts(networks)) - - def build_public_parts(self, nets): - ips = [self._extract_ips(nets[label], - key='floating_ips') for label in nets] - return [ip['addr'] for ip in itertools.chain(*ips)] - - def build_private_parts(self, nets): - ips = [self._extract_ips(nets[label], key='ips') for label in nets] - return [ip['addr'] for ip in itertools.chain(*ips)] - - -class ViewBuilderV11(ViewBuilder): - def build(self, networks): result = {} for network in networks: diff --git a/nova/api/openstack/views/flavors.py b/nova/api/openstack/views/flavors.py index def969a6c..302212aa8 100644 --- a/nova/api/openstack/views/flavors.py +++ b/nova/api/openstack/views/flavors.py @@ -23,6 +23,13 @@ from nova.api.openstack import common class ViewBuilder(object): + def __init__(self, base_url, project_id=""): + """ + :param base_url: url of the root wsgi application + """ + self.base_url = base_url + self.project_id = project_id + def build(self, flavor_obj, is_detail=False): """Generic method used to generate a flavor entity.""" if is_detail: @@ -30,7 +37,7 @@ class ViewBuilder(object): else: flavor = self._build_simple(flavor_obj) - self._build_extra(flavor) + flavor["links"] = self._build_links(flavor) return flavor @@ -57,26 +64,9 @@ class ViewBuilder(object): return detail - def _build_extra(self, flavor_obj): - """Hook for version-specific changes to newly created flavor object.""" - pass - - -class ViewBuilderV11(ViewBuilder): - """Openstack API v1.1 flavors view builder.""" - - def __init__(self, base_url, project_id=""): - """ - :param base_url: url of the root wsgi application - """ - self.base_url = base_url - self.project_id = project_id - - def _build_extra(self, flavor_obj): - flavor_obj["links"] = self._build_links(flavor_obj) - def _build_links(self, flavor_obj): """Generate a container of links that refer to the provided flavor.""" + print flavor_obj href = self.generate_href(flavor_obj["id"]) bookmark = self.generate_bookmark(flavor_obj["id"]) diff --git a/nova/api/openstack/views/images.py b/nova/api/openstack/views/images.py index 8eaf0ca6a..9ef4c3ea0 100644 --- a/nova/api/openstack/views/images.py +++ b/nova/api/openstack/views/images.py @@ -71,15 +71,6 @@ class ViewBuilder(object): """Return an href string pointing to this object.""" return os.path.join(self.base_url, "images", str(image_id)) - def build_list(self, image_objs, detail=False, **kwargs): - """Return a standardized image list structure for display.""" - images = [] - for image_obj in image_objs: - image = self.build(image_obj, detail=detail) - images.append(image) - - return dict(images=images) - def build(self, image_obj, detail=False): """Return a standardized image structure for display by the API.""" self._format_dates(image_obj) @@ -95,6 +86,27 @@ class ViewBuilder(object): self._build_server(image, image_obj) self._build_image_id(image, image_obj) + href = self.generate_href(image_obj["id"]) + bookmark = self.generate_bookmark(image_obj["id"]) + alternate = self.generate_alternate(image_obj["id"]) + + image["links"] = [ + { + "rel": "self", + "href": href, + }, + { + "rel": "bookmark", + "href": bookmark, + }, + { + "rel": "alternate", + "type": "application/vnd.openstack.image", + "href": alternate, + }, + + ] + if detail: image.update({ "created": image_obj.get("created_at"), @@ -103,27 +115,23 @@ class ViewBuilder(object): }) image["progress"] = self._get_progress_for_status(orig_status) - return image - - -class ViewBuilderV10(ViewBuilder): - """OpenStack API v1.0 Image Builder""" - - def _build_server(self, image, image_obj): - try: - image['serverId'] = int(image_obj['properties']['instance_id']) - except (KeyError, ValueError): - pass + image["metadata"] = image_obj.get("properties", {}) - def _build_image_id(self, image, image_obj): - try: - image['id'] = int(image_obj['id']) - except ValueError: - pass + min_ram = image_obj.get('min_ram') or 0 + try: + min_ram = int(min_ram) + except ValueError: + min_ram = 0 + image['minRam'] = min_ram + min_disk = image_obj.get('min_disk') or 0 + try: + min_disk = int(min_disk) + except ValueError: + min_disk = 0 + image['minDisk'] = min_disk -class ViewBuilderV11(ViewBuilder): - """OpenStack API v1.1 Image Builder""" + return image def _build_server(self, image, image_obj): try: @@ -179,49 +187,6 @@ class ViewBuilderV11(ViewBuilder): return reval - def build(self, image_obj, detail=False): - """Return a standardized image structure for display by the API.""" - image = ViewBuilder.build(self, image_obj, detail) - href = self.generate_href(image_obj["id"]) - bookmark = self.generate_bookmark(image_obj["id"]) - alternate = self.generate_alternate(image_obj["id"]) - - image["links"] = [ - { - "rel": "self", - "href": href, - }, - { - "rel": "bookmark", - "href": bookmark, - }, - { - "rel": "alternate", - "type": "application/vnd.openstack.image", - "href": alternate, - }, - - ] - - if detail: - image["metadata"] = image_obj.get("properties", {}) - - min_ram = image_obj.get('min_ram') or 0 - try: - min_ram = int(min_ram) - except ValueError: - min_ram = 0 - image['minRam'] = min_ram - - min_disk = image_obj.get('min_disk') or 0 - try: - min_disk = int(min_disk) - except ValueError: - min_disk = 0 - image['minDisk'] = min_disk - - return image - def generate_bookmark(self, image_id): """Create a URL that refers to a specific flavor id.""" return os.path.join(common.remove_version_from_href(self.base_url), diff --git a/nova/api/openstack/views/limits.py b/nova/api/openstack/views/limits.py index f603d7cb4..9c30318a7 100644 --- a/nova/api/openstack/views/limits.py +++ b/nova/api/openstack/views/limits.py @@ -25,12 +25,6 @@ from nova import utils class ViewBuilder(object): """Openstack API base limits view builder.""" - def _build_rate_limits(self, rate_limits): - raise NotImplementedError() - - def _build_rate_limit(self, rate_limit): - raise NotImplementedError() - def build(self, rate_limits, absolute_limits): rate_limits = self._build_rate_limits(rate_limits) absolute_limits = self._build_absolute_limits(absolute_limits) @@ -66,28 +60,6 @@ class ViewBuilder(object): limits[name] = value return limits - -class ViewBuilderV10(ViewBuilder): - """Openstack API v1.0 limits view builder.""" - - def _build_rate_limits(self, rate_limits): - return [self._build_rate_limit(r) for r in rate_limits] - - def _build_rate_limit(self, rate_limit): - return { - "verb": rate_limit["verb"], - "URI": rate_limit["URI"], - "regex": rate_limit["regex"], - "value": rate_limit["value"], - "remaining": int(rate_limit["remaining"]), - "unit": rate_limit["unit"], - "resetTime": rate_limit["resetTime"], - } - - -class ViewBuilderV11(ViewBuilder): - """Openstack API v1.1 limits view builder.""" - def _build_rate_limits(self, rate_limits): limits = [] for rate_limit in rate_limits: diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py index 646cf12ca..d756ec04f 100644 --- a/nova/api/openstack/views/servers.py +++ b/nova/api/openstack/views/servers.py @@ -30,16 +30,16 @@ LOG = logging.getLogger('nova.api.openstack.views.servers') class ViewBuilder(object): - """Model a server response as a python dictionary. + """Model a server response as a python dictionary.""" - Public methods: build - Abstract methods: _build_image, _build_flavor - - """ - - def __init__(self, context, addresses_builder): + def __init__(self, context, addresses_builder, flavor_builder, + image_builder, base_url, project_id=""): self.context = context self.addresses_builder = addresses_builder + self.flavor_builder = flavor_builder + self.image_builder = image_builder + self.base_url = base_url + self.project_id = project_id def build(self, inst, is_detail=False): """Return a dict that represenst a server.""" @@ -51,20 +51,11 @@ class ViewBuilder(object): else: server = self._build_simple(inst) - self._build_extra(server['server'], inst) + self._build_links(server['server'], inst) + server['server']['uuid'] = inst['uuid'] return server - def build_list(self, server_objs, is_detail=False, **kwargs): - limit = kwargs.get('limit', None) - servers = [] - servers_links = [] - - for server_obj in server_objs: - servers.append(self.build(server_obj, is_detail)['server']) - - return dict(servers=servers) - def _build_simple(self, inst): """Return a simple model of a server.""" return dict(server=dict(id=inst['id'], name=inst['display_name'])) @@ -96,68 +87,24 @@ class ViewBuilder(object): networks = common.get_networks_for_instance(self.context, inst) self._build_addresses(inst_dict, networks) - return dict(server=inst_dict) - - def _build_addresses(self, response, networks): - """Return the addresses sub-resource of a server.""" - response['addresses'] = self.addresses_builder.build(networks) - - def _build_image(self, response, inst): - """Return the image sub-resource of a server.""" - raise NotImplementedError() - - def _build_flavor(self, response, inst): - """Return the flavor sub-resource of a server.""" - raise NotImplementedError() - - def _build_extra(self, response, inst): - pass - - -class ViewBuilderV10(ViewBuilder): - """Model an Openstack API V1.0 server response.""" - - def _build_extra(self, response, inst): - response['uuid'] = inst['uuid'] - - def _build_image(self, response, inst): - if inst.get('image_ref', None): - image_ref = inst['image_ref'] - if str(image_ref).startswith('http'): - raise exception.ListingImageRefsNotSupported() - response['imageId'] = int(image_ref) - - def _build_flavor(self, response, inst): - if inst.get('instance_type', None): - response['flavorId'] = inst['instance_type']['flavorid'] - - -class ViewBuilderV11(ViewBuilder): - """Model an Openstack API V1.0 server response.""" - def __init__(self, context, addresses_builder, flavor_builder, - image_builder, base_url, project_id=""): - super(ViewBuilderV11, self).__init__(context, addresses_builder) - self.flavor_builder = flavor_builder - self.image_builder = image_builder - self.base_url = base_url - self.project_id = project_id - - def _build_detail(self, inst): - response = super(ViewBuilderV11, self)._build_detail(inst) - response['server']['created'] = utils.isotime(inst['created_at']) - response['server']['updated'] = utils.isotime(inst['updated_at']) + inst_dict['created'] = utils.isotime(inst['created_at']) + inst_dict['updated'] = utils.isotime(inst['updated_at']) - status = response['server'].get('status') + status = inst_dict.get('status') if status in ('ACTIVE', 'BUILD', 'REBUILD', 'RESIZE', 'VERIFY_RESIZE'): - response['server']['progress'] = inst['progress'] or 0 + inst_dict['progress'] = inst['progress'] or 0 - response['server']['accessIPv4'] = inst.get('access_ip_v4') or "" - response['server']['accessIPv6'] = inst.get('access_ip_v6') or "" - response['server']['key_name'] = inst.get('key_name', '') - response['server']['config_drive'] = inst.get('config_drive') + inst_dict['accessIPv4'] = inst.get('access_ip_v4') or "" + inst_dict['accessIPv6'] = inst.get('access_ip_v6') or "" + inst_dict['key_name'] = inst.get('key_name', '') + inst_dict['config_drive'] = inst.get('config_drive') - return response + return dict(server=inst_dict) + + def _build_addresses(self, response, networks): + """Return the addresses sub-resource of a server.""" + response['addresses'] = self.addresses_builder.build(networks) def _build_image(self, response, inst): if inst.get("image_ref", None): @@ -189,10 +136,6 @@ class ViewBuilderV11(ViewBuilder): ] } - def _build_extra(self, response, inst): - self._build_links(response, inst) - response['uuid'] = inst['uuid'] - def _build_links(self, response, inst): href = self.generate_href(inst["id"]) bookmark = self.generate_bookmark(inst["id"]) diff --git a/nova/api/openstack/zones.py b/nova/api/openstack/zones.py index 95e9eaa51..be1644df8 100644 --- a/nova/api/openstack/zones.py +++ b/nova/api/openstack/zones.py @@ -143,7 +143,7 @@ class Controller(object): return cooked -def create_resource(version): +def create_resource(): metadata = { "attributes": { "zone": ["id", "api_url", "name", "capabilities"], @@ -151,7 +151,7 @@ def create_resource(version): } body_serializers = { - 'application/xml': wsgi.XMLDictSerializer(xmlns=wsgi.XMLNS_V10, + 'application/xml': wsgi.XMLDictSerializer(xmlns=wsgi.XMLNS_V11, metadata=metadata), } serializer = wsgi.ResponseSerializer(body_serializers) |
