summaryrefslogtreecommitdiffstats
path: root/nova
diff options
context:
space:
mode:
authorChris Behrens <cbehrens@codestud.com>2011-06-23 07:03:42 -0700
committerChris Behrens <cbehrens@codestud.com>2011-06-23 07:03:42 -0700
commit82e7bb113cdf0297d69ed863a2ba66bad46bece9 (patch)
tree2aa424c50edc8d25076475cea3c81d9fa58d5e37 /nova
parent37758dfe6a2b963d6acfdf9fe886167e42e4ec52 (diff)
parente241f5301621e66360bb884193884f9f98bc8832 (diff)
downloadnova-82e7bb113cdf0297d69ed863a2ba66bad46bece9.tar.gz
nova-82e7bb113cdf0297d69ed863a2ba66bad46bece9.tar.xz
nova-82e7bb113cdf0297d69ed863a2ba66bad46bece9.zip
Merged list-zone-recurse
Diffstat (limited to 'nova')
-rw-r--r--nova/api/openstack/servers.py12
-rw-r--r--nova/compute/api.py68
2 files changed, 46 insertions, 34 deletions
diff --git a/nova/api/openstack/servers.py b/nova/api/openstack/servers.py
index 31ec46e8e..decbfd6e6 100644
--- a/nova/api/openstack/servers.py
+++ b/nova/api/openstack/servers.py
@@ -76,10 +76,18 @@ class Controller(object):
builder - the response model builder
"""
- reservation_id = req.str_GET.get('reservation_id')
+ query_str = req.str_GET
+ reservation_id = query_str.get('reservation_id')
+ project_id = query_str.get('project_id')
+ fixed_ip = query_str.get('fixed_ip')
+ recurse_zones = query_str.get('recurse_zones')
+ recurse_zones = recurse_zones and True or False
instance_list = self.compute_api.get_all(
req.environ['nova.context'],
- reservation_id=reservation_id)
+ reservation_id=reservation_id,
+ project_id=project_id,
+ fixed_ip=fixed_ip,
+ recurse_zones=recurse_zones)
limited_list = self._limit_items(instance_list, req)
builder = self._get_view_builder(req)
servers = [builder.build(inst, is_detail)['server']
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 44e11d187..02963068a 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -607,50 +607,54 @@ class API(base.Base):
"""
return self.get(context, instance_id)
- def get_all_across_zones(self, context, reservation_id):
- """Get all instances with this reservation_id, across
- all available Zones (if any).
- """
- context = context.elevated()
- instances = self.db.instance_get_all_by_reservation(
- context, reservation_id)
-
- children = scheduler_api.call_zone_method(context, "list",
- novaclient_collection_name="servers",
- reservation_id=reservation_id)
-
- for zone, servers in children:
- for server in servers:
- # Results are ready to send to user. No need to scrub.
- server._info['_is_precooked'] = True
- instances.append(server._info)
- return instances
-
def get_all(self, context, project_id=None, reservation_id=None,
- fixed_ip=None):
+ fixed_ip=None, recurse_zones=False):
"""Get all instances filtered by one of the given parameters.
If there is no filter and the context is an admin, it will retreive
all instances in the system.
"""
- if reservation_id is not None:
- return self.get_all_across_zones(context, reservation_id)
- if fixed_ip is not None:
- return self.db.fixed_ip_get_instance(context, fixed_ip)
-
- if project_id or not context.is_admin:
+ if reservation_id is not None:
+ recurse_zones = True
+ instances = self.db.instance_get_all_by_reservation(
+ context, reservation_id)
+ elif fixed_ip is not None:
+ instances = self.db.fixed_ip_get_instance(context, fixed_ip)
+ elif project_id or not context.is_admin:
if not context.project:
- return self.db.instance_get_all_by_user(
+ instances = self.db.instance_get_all_by_user(
context, context.user_id)
+ else:
+ if project_id is None:
+ project_id = context.project_id
+ instances = self.db.instance_get_all_by_project(
+ context, project_id)
+ else:
+ instances = self.db.instance_get_all(context)
+
+ if instances is None:
+ instances = []
+ elif not isinstance(instances, list):
+ instances = [instances]
- if project_id is None:
- project_id = context.project_id
+ if not recurse_zones:
+ return instances
- return self.db.instance_get_all_by_project(
- context, project_id)
+ admin_context = context.elevated()
+ children = scheduler_api.call_zone_method(admin_context, "list",
+ novaclient_collection_name="servers",
+ reservation_id=reservation_id,
+ project_id=project_id,
+ fixed_ip=fixed_ip,
+ recurse_zones=True)
- return self.db.instance_get_all(context)
+ for zone, servers in children:
+ for server in servers:
+ # Results are ready to send to user. No need to scrub.
+ server._info['_is_precooked'] = True
+ instances.append(server._info)
+ return instances
def _cast_compute_message(self, method, context, instance_id, host=None,
params=None):