summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-10-11 16:32:56 -0400
committerBrian Waldon <brian.waldon@rackspace.com>2011-10-17 13:48:22 -0400
commitedf3e39cd395150adfe36375b09253f2eef0bd2e (patch)
tree8c63702a1005e65ff2de41732928095d4fc98f22 /nova/api
parentddb49f7929bf29d2003ffdd3a14831d36d2f9d07 (diff)
downloadnova-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__.py60
-rw-r--r--nova/api/openstack/backup_schedules.py67
-rw-r--r--nova/api/openstack/common.py1
-rw-r--r--nova/api/openstack/contrib/createserverext.py4
-rw-r--r--nova/api/openstack/contrib/virtual_storage_arrays.py2
-rw-r--r--nova/api/openstack/contrib/volumes.py2
-rw-r--r--nova/api/openstack/faults.py14
-rw-r--r--nova/api/openstack/flavors.py31
-rw-r--r--nova/api/openstack/images.py102
-rw-r--r--nova/api/openstack/ips.py58
-rw-r--r--nova/api/openstack/limits.py47
-rw-r--r--nova/api/openstack/notes.txt20
-rw-r--r--nova/api/openstack/servers.py244
-rw-r--r--nova/api/openstack/shared_ip_groups.py52
-rw-r--r--nova/api/openstack/versions.py44
-rw-r--r--nova/api/openstack/views/addresses.py25
-rw-r--r--nova/api/openstack/views/flavors.py28
-rw-r--r--nova/api/openstack/views/images.py105
-rw-r--r--nova/api/openstack/views/limits.py28
-rw-r--r--nova/api/openstack/views/servers.py101
-rw-r--r--nova/api/openstack/zones.py4
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)