diff options
| author | Brian Elliott <brian.elliott@rackspace.com> | 2013-01-18 21:11:00 +0000 |
|---|---|---|
| committer | Brian Elliott <brian.elliott@rackspace.com> | 2013-01-19 14:36:27 +0000 |
| commit | 6e3fcd5e3f166a9d0e61dcb2549ea1f331aec956 (patch) | |
| tree | 505647016526514f7458c3d60d1d4e263d40aae0 /nova/api | |
| parent | 7d20f1fe553b0db5883e787992413e7a0ca4f099 (diff) | |
| download | nova-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.py | 9 |
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()) |
