diff options
| author | Brian Waldon <bcwaldon@gmail.com> | 2012-01-31 14:02:30 -0800 |
|---|---|---|
| committer | Brian Waldon <bcwaldon@gmail.com> | 2012-01-31 14:04:12 -0800 |
| commit | e1b3010dd91df2d8dda69d2322c98e1575fb3fd7 (patch) | |
| tree | e44520292ac26a279f6b3e2a7c335c6c0efa0c97 /nova/api | |
| parent | 2757b81116d5d6c508a83616e1341e03115240f2 (diff) | |
| download | nova-e1b3010dd91df2d8dda69d2322c98e1575fb3fd7.tar.gz nova-e1b3010dd91df2d8dda69d2322c98e1575fb3fd7.tar.xz nova-e1b3010dd91df2d8dda69d2322c98e1575fb3fd7.zip | |
Use single call in ExtendedStatus extension
Fixes bug 917400
Change-Id: I8bc78f5e5f03c1ea30e7ff23236774af48a2c059
Diffstat (limited to 'nova/api')
| -rw-r--r-- | nova/api/openstack/compute/contrib/extended_status.py | 36 |
1 files changed, 19 insertions, 17 deletions
diff --git a/nova/api/openstack/compute/contrib/extended_status.py b/nova/api/openstack/compute/contrib/extended_status.py index 4ab7ca756..d68dee4e2 100644 --- a/nova/api/openstack/compute/contrib/extended_status.py +++ b/nova/api/openstack/compute/contrib/extended_status.py @@ -35,16 +35,15 @@ class ExtendedStatusController(wsgi.Controller): super(ExtendedStatusController, self).__init__(*args, **kwargs) self.compute_api = compute.API() - def _get_and_extend_one(self, context, server_id, body): - try: - inst_ref = self.compute_api.routing_get(context, server_id) - except exception.NotFound: - LOG.warn("Instance %s not found" % server_id) - raise + def _get_instances(self, context, instance_uuids): + filters = {'uuid': instance_uuids} + instances = self.compute_api.get_all(context, filters) + return dict((instance['uuid'], instance) for instance in instances) + def _extend_server(self, server, instance): for state in ['task_state', 'vm_state', 'power_state']: key = "%s:%s" % (Extended_status.alias, state) - body[key] = inst_ref[state] + server[key] = instance[state] @wsgi.extends def show(self, req, resp_obj, id): @@ -54,11 +53,13 @@ class ExtendedStatusController(wsgi.Controller): resp_obj.attach(xml=ExtendedStatusTemplate()) try: - self._get_and_extend_one(context, id, resp_obj.obj['server']) + instance = self.compute_api.routing_get(context, id) except exception.NotFound: explanation = _("Server not found.") raise exc.HTTPNotFound(explanation=explanation) + self._extend_server(resp_obj.obj['server'], instance) + @wsgi.extends def detail(self, req, resp_obj): context = req.environ['nova.context'] @@ -66,18 +67,19 @@ class ExtendedStatusController(wsgi.Controller): # Attach our slave template to the response object resp_obj.attach(xml=ExtendedStatusesTemplate()) - for server in list(resp_obj.obj['servers']): + servers = list(resp_obj.obj['servers']) + instance_uuids = [server['id'] for server in servers] + instances = self._get_instances(context, instance_uuids) + + for server_object in servers: try: - self._get_and_extend_one(context, server['id'], server) - except exception.NotFound: - # NOTE(dtroyer): A NotFound exception at this point - # happens because a delete was in progress and the - # server that was present in the original call to - # compute.api.get_all() is no longer present. - # Delete it from the response and move on. - resp_obj.obj['servers'].remove(server) + instance_data = instances[server_object['id']] + except KeyError: + # Ignore missing instance data continue + self._extend_server(server_object, instance_data) + class Extended_status(extensions.ExtensionDescriptor): """Extended Status support""" |
