summaryrefslogtreecommitdiffstats
path: root/nova/api
diff options
context:
space:
mode:
authorBrian Elliott <brian.elliott@rackspace.com>2013-01-18 21:11:00 +0000
committerBrian Elliott <brian.elliott@rackspace.com>2013-01-19 14:36:27 +0000
commit6e3fcd5e3f166a9d0e61dcb2549ea1f331aec956 (patch)
tree505647016526514f7458c3d60d1d4e263d40aae0 /nova/api
parent7d20f1fe553b0db5883e787992413e7a0ca4f099 (diff)
downloadnova-6e3fcd5e3f166a9d0e61dcb2549ea1f331aec956.tar.gz
nova-6e3fcd5e3f166a9d0e61dcb2549ea1f331aec956.tar.xz
nova-6e3fcd5e3f166a9d0e61dcb2549ea1f331aec956.zip
Prevent metadata updates until instance is active.
This avoids a race condition where setting metadata too early in the build process can cause a build failure due to the VM not existing in Xen. bug 1100866 Change-Id: I702128799997d91d5f0c0ac189f619bfdf011988
Diffstat (limited to 'nova/api')
-rw-r--r--nova/api/openstack/compute/server_metadata.py9
1 files changed, 9 insertions, 0 deletions
diff --git a/nova/api/openstack/compute/server_metadata.py b/nova/api/openstack/compute/server_metadata.py
index 023a054d0..0de5d536f 100644
--- a/nova/api/openstack/compute/server_metadata.py
+++ b/nova/api/openstack/compute/server_metadata.py
@@ -136,6 +136,10 @@ class Controller(object):
raise exc.HTTPRequestEntityTooLarge(explanation=unicode(error),
headers={'Retry-After': 0})
+ except exception.InstanceInvalidState as state_error:
+ common.raise_http_conflict_for_instance_invalid_state(state_error,
+ 'update metadata')
+
@wsgi.serializers(xml=common.MetaItemTemplate)
def show(self, req, server_id, id):
"""Return a single metadata item."""
@@ -162,10 +166,15 @@ class Controller(object):
try:
server = self.compute_api.get(context, server_id)
self.compute_api.delete_instance_metadata(context, server, id)
+
except exception.InstanceNotFound:
msg = _('Server does not exist')
raise exc.HTTPNotFound(explanation=msg)
+ except exception.InstanceInvalidState as state_error:
+ common.raise_http_conflict_for_instance_invalid_state(state_error,
+ 'delete metadata')
+
def create_resource():
return wsgi.Resource(Controller())