summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-08-09 15:27:56 +0000
committerTarmac <>2011-08-09 15:27:56 +0000
commit9d43baf7d392056c92f84508d2f20d94ec7e4737 (patch)
tree8701f1a5bb5fa5e93fedb3aec55ffa9a8e997248 /nova/api
parent2b50db44ee1b9b1d8c011a752eab6773694992a3 (diff)
parentd72e36d63b1aefe7731d5c832c2b2fa52227407c (diff)
Instance metadata now functionally works (completely to spec) through OSAPI
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/server_metadata.py51
1 files changed, 27 insertions, 24 deletions
diff --git a/nova/api/openstack/server_metadata.py b/nova/api/openstack/server_metadata.py
index b0b014f86..2b235f79a 100644
--- a/nova/api/openstack/server_metadata.py
+++ b/nova/api/openstack/server_metadata.py
@@ -57,18 +57,12 @@ class Controller(object):
context = req.environ['nova.context']
- try:
- self.compute_api.update_or_create_instance_metadata(context,
- server_id,
- metadata)
- except exception.InstanceNotFound:
- msg = _('Server does not exist')
- raise exc.HTTPNotFound(explanation=msg)
+ new_metadata = self._update_instance_metadata(context,
+ server_id,
+ metadata,
+ delete=False)
- except quota.QuotaError as error:
- self._handle_quota_error(error)
-
- return body
+ return {'metadata': new_metadata}
def update(self, req, server_id, id, body):
try:
@@ -78,19 +72,22 @@ class Controller(object):
raise exc.HTTPBadRequest(explanation=expl)
try:
- meta_value = meta_item.pop(id)
+ meta_value = meta_item[id]
except (AttributeError, KeyError):
expl = _('Request body and URI mismatch')
raise exc.HTTPBadRequest(explanation=expl)
- if len(meta_item) > 0:
+ if len(meta_item) > 1:
expl = _('Request body contains too many items')
raise exc.HTTPBadRequest(explanation=expl)
context = req.environ['nova.context']
- self._set_instance_metadata(context, server_id, meta_item)
+ self._update_instance_metadata(context,
+ server_id,
+ meta_item,
+ delete=False)
- return {'meta': {id: meta_value}}
+ return {'meta': meta_item}
def update_all(self, req, server_id, body):
try:
@@ -100,20 +97,26 @@ class Controller(object):
raise exc.HTTPBadRequest(explanation=expl)
context = req.environ['nova.context']
- self._set_instance_metadata(context, server_id, metadata)
+ new_metadata = self._update_instance_metadata(context,
+ server_id,
+ metadata,
+ delete=True)
- return {'metadata': metadata}
+ return {'metadata': new_metadata}
- def _set_instance_metadata(self, context, server_id, metadata):
+ def _update_instance_metadata(self, context, server_id, metadata,
+ delete=False):
try:
- self.compute_api.update_or_create_instance_metadata(context,
- server_id,
- metadata)
+ return self.compute_api.update_instance_metadata(context,
+ server_id,
+ metadata,
+ delete)
+
except exception.InstanceNotFound:
msg = _('Server does not exist')
raise exc.HTTPNotFound(explanation=msg)
- except ValueError:
+ except (ValueError, AttributeError):
msg = _("Malformed request body")
raise exc.HTTPBadRequest(explanation=msg)
@@ -138,12 +141,12 @@ class Controller(object):
metadata = self._get_metadata(context, server_id)
try:
- meta_key = metadata[id]
+ meta_value = metadata[id]
except KeyError:
msg = _("Metadata item was not found")
raise exc.HTTPNotFound(explanation=msg)
- self.compute_api.delete_instance_metadata(context, server_id, meta_key)
+ self.compute_api.delete_instance_metadata(context, server_id, id)
def _handle_quota_error(self, error):
"""Reraise quota errors as api-specific http exceptions."""