summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorBrian Lamar <brian.lamar@rackspace.com>2011-03-28 17:23:14 -0400
committerBrian Lamar <brian.lamar@rackspace.com>2011-03-28 17:23:14 -0400
commit4738400abc226bd7231760054eae3ef0e8f9c252 (patch)
tree72b302096500cfa60eb9816890f49e4c7bc79439 /nova/api
parent6efd9dc30870008750c9754de4672d3eea656cce (diff)
parent848c8212a4c9c53f0e2a6b4154fb9504b95db060 (diff)
Merged trunk.
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/ec2/cloud.py2
-rw-r--r--nova/api/openstack/__init__.py10
-rw-r--r--nova/api/openstack/backup_schedules.py6
-rw-r--r--nova/api/openstack/extensions.py19
-rw-r--r--nova/api/openstack/servers.py10
-rw-r--r--nova/api/openstack/views/servers.py63
6 files changed, 83 insertions, 27 deletions
diff --git a/nova/api/ec2/cloud.py b/nova/api/ec2/cloud.py
index 0da642318..9e34d3317 100644
--- a/nova/api/ec2/cloud.py
+++ b/nova/api/ec2/cloud.py
@@ -890,6 +890,8 @@ class CloudController(object):
i['imageOwnerId'] = image['properties'].get('owner_id')
i['imageLocation'] = image['properties'].get('image_location')
i['imageState'] = image['properties'].get('image_state')
+ i['displayName'] = image.get('name')
+ i['description'] = image.get('description')
i['type'] = image_type
i['isPublic'] = str(image['properties'].get('is_public', '')) == 'True'
i['architecture'] = image['properties'].get('architecture')
diff --git a/nova/api/openstack/__init__.py b/nova/api/openstack/__init__.py
index cfeddd8b1..0a5b4395b 100644
--- a/nova/api/openstack/__init__.py
+++ b/nova/api/openstack/__init__.py
@@ -106,11 +106,6 @@ class APIRouter(wsgi.Router):
controller=accounts.Controller(),
collection={'detail': 'GET'})
- mapper.resource("backup_schedule", "backup_schedule",
- controller=backup_schedules.Controller(),
- parent_resource=dict(member_name='server',
- collection_name='servers'))
-
mapper.resource("console", "consoles",
controller=consoles.Controller(),
parent_resource=dict(member_name='server',
@@ -142,6 +137,11 @@ class APIRouterV10(APIRouter):
controller=flavors.ControllerV10(),
collection={'detail': 'GET'})
+ mapper.resource("backup_schedule", "backup_schedule",
+ controller=backup_schedules.Controller(),
+ parent_resource=dict(member_name='server',
+ collection_name='servers'))
+
class APIRouterV11(APIRouter):
"""Define routes specific to OpenStack API V1.1."""
diff --git a/nova/api/openstack/backup_schedules.py b/nova/api/openstack/backup_schedules.py
index 7abb5f884..f2d2d86e8 100644
--- a/nova/api/openstack/backup_schedules.py
+++ b/nova/api/openstack/backup_schedules.py
@@ -42,7 +42,11 @@ class Controller(wsgi.Controller):
def index(self, req, server_id):
""" Returns the list of backup schedules for a given instance """
- return _translate_keys({})
+ return faults.Fault(exc.HTTPNotImplemented())
+
+ def show(self, req, server_id, id):
+ """ Returns a single backup schedule for a given instance """
+ return faults.Fault(exc.HTTPNotImplemented())
def create(self, req, server_id):
""" No actual update method required, since the existing API allows
diff --git a/nova/api/openstack/extensions.py b/nova/api/openstack/extensions.py
index 9d98d849a..b9b7f998d 100644
--- a/nova/api/openstack/extensions.py
+++ b/nova/api/openstack/extensions.py
@@ -317,16 +317,19 @@ class ExtensionManager(object):
LOG.audit(_('Loading extension file: %s'), f)
mod_name, file_ext = os.path.splitext(os.path.split(f)[-1])
ext_path = os.path.join(self.path, f)
- if file_ext.lower() == '.py':
+ if file_ext.lower() == '.py' and not mod_name.startswith('_'):
mod = imp.load_source(mod_name, ext_path)
ext_name = mod_name[0].upper() + mod_name[1:]
- try:
- new_ext = getattr(mod, ext_name)()
- self._check_extension(new_ext)
- self.extensions[new_ext.get_alias()] = new_ext
- except AttributeError as ex:
- LOG.exception(_("Exception loading extension: %s"),
- unicode(ex))
+ new_ext_class = getattr(mod, ext_name, None)
+ if not new_ext_class:
+ LOG.warn(_('Did not find expected name '
+ '"%(ext_name)" in %(file)s'),
+ {'ext_name': ext_name,
+ 'file': ext_path})
+ continue
+ new_ext = new_ext_class()
+ self._check_extension(new_ext)
+ self.extensions[new_ext.get_alias()] = new_ext
class ResponseExtension(object):
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index ac9e29f07..75a305a14 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -48,11 +48,15 @@ class Controller(wsgi.Controller):
""" The Server API controller for the OpenStack API """
_serialization_metadata = {
- 'application/xml': {
+ "application/xml": {
"attributes": {
"server": ["id", "imageId", "name", "flavorId", "hostId",
"status", "progress", "adminPass", "flavorRef",
- "imageRef"]}}}
+ "imageRef"],
+ "link": ["rel", "type", "href"],
+ },
+ },
+ }
def __init__(self):
self.compute_api = compute.API()
@@ -580,7 +584,7 @@ class ControllerV11(Controller):
base_url)
addresses_builder = nova.api.openstack.views.addresses.ViewBuilderV11()
return nova.api.openstack.views.servers.ViewBuilderV11(
- addresses_builder, flavor_builder, image_builder)
+ addresses_builder, flavor_builder, image_builder, base_url)
def _get_addresses_view_builder(self, req):
return nova.api.openstack.views.addresses.ViewBuilderV11(req)
diff --git a/nova/api/openstack/views/servers.py b/nova/api/openstack/views/servers.py
index f93435198..4e7f62eb3 100644
--- a/nova/api/openstack/views/servers.py
+++ b/nova/api/openstack/views/servers.py
@@ -16,6 +16,7 @@
# under the License.
import hashlib
+import os
from nova.compute import power_state
import nova.compute
@@ -41,9 +42,13 @@ class ViewBuilder(object):
def build(self, inst, is_detail):
"""Return a dict that represenst a server."""
if is_detail:
- return self._build_detail(inst)
+ server = self._build_detail(inst)
else:
- return self._build_simple(inst)
+ server = self._build_simple(inst)
+
+ self._build_extra(server, inst)
+
+ return server
def _build_simple(self, inst):
"""Return a simple model of a server."""
@@ -97,29 +102,67 @@ class ViewBuilder(object):
"""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_image(self, response, inst):
- response['imageId'] = inst['image_id']
+ if 'image_id' in dict(inst):
+ response['imageId'] = inst['image_id']
def _build_flavor(self, response, inst):
- response['flavorId'] = inst['instance_type']
+ if 'instance_type' in dict(inst):
+ response['flavorId'] = inst['instance_type']
class ViewBuilderV11(ViewBuilder):
"""Model an Openstack API V1.0 server response."""
-
- def __init__(self, addresses_builder, flavor_builder, image_builder):
+ def __init__(self, addresses_builder, flavor_builder, image_builder,
+ base_url):
ViewBuilder.__init__(self, addresses_builder)
self.flavor_builder = flavor_builder
self.image_builder = image_builder
+ self.base_url = base_url
def _build_image(self, response, inst):
- image_id = inst["image_id"]
- response["imageRef"] = self.image_builder.generate_href(image_id)
+ if "image_id" in dict(inst):
+ image_id = inst.get("image_id")
+ response["imageRef"] = self.image_builder.generate_href(image_id)
def _build_flavor(self, response, inst):
- flavor_id = inst["instance_type"]
- response["flavorRef"] = self.flavor_builder.generate_href(flavor_id)
+ if "instance_type" in dict(inst):
+ flavor_id = inst["instance_type"]
+ flavor_ref = self.flavor_builder.generate_href(flavor_id)
+ response["flavorRef"] = flavor_ref
+
+ def _build_extra(self, response, inst):
+ self._build_links(response, inst)
+
+ def _build_links(self, response, inst):
+ href = self.generate_href(inst["id"])
+
+ links = [
+ {
+ "rel": "self",
+ "href": href,
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/json",
+ "href": href,
+ },
+ {
+ "rel": "bookmark",
+ "type": "application/xml",
+ "href": href,
+ },
+ ]
+
+ response["server"]["links"] = links
+
+ def generate_href(self, server_id):
+ """Create an url that refers to a specific server id."""
+ return os.path.join(self.base_url, "servers", str(server_id))