summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJason Koelker <jason@koelker.net>2011-09-14 17:11:21 -0500
committerJason Koelker <jason@koelker.net>2011-09-14 17:11:21 -0500
commite8a2a540e574ca2d242b9c2749c1f285498809e7 (patch)
treed0b0f56fb103ce3081d68b3a8e7d2fa299ca6804
parent9936e1e9457234f7285c794b7c2c286603c84e52 (diff)
fix up the filtering so it does not return duplicates if both the network and the db filters match
-rw-r--r--nova/compute/api.py9
-rw-r--r--nova/db/api.py4
-rw-r--r--nova/db/sqlalchemy/api.py24
3 files changed, 19 insertions, 18 deletions
diff --git a/nova/compute/api.py b/nova/compute/api.py
index 22ae17e0a..122e62208 100644
--- a/nova/compute/api.py
+++ b/nova/compute/api.py
@@ -930,7 +930,7 @@ class API(base.Base):
return instances
def _get_instances_by_filters(self, context, filters):
- ip_instances = None
+ ids = None
if 'ip6' in filters or 'ip' in filters:
res = self.network_api.get_instance_ids_by_ip_filter(context,
filters)
@@ -938,12 +938,7 @@ class API(base.Base):
# instance id twice (one for ipv4 and ipv4)
ids = set([r['instance_id'] for r in res])
- # NOTE(jkoelker) When this flips to using UUIDS the name
- # needs to be updated accordingingly
- ip_instances = [self.db.instance_get(context, id) for id in ids]
-
- return self.db.instance_get_all_by_filters(context, filters,
- ip_instances)
+ return self.db.instance_get_all_by_filters(context, filters, ids)
def _cast_compute_message(self, method, context, instance_id, host=None,
params=None):
diff --git a/nova/db/api.py b/nova/db/api.py
index 0db4622c9..10a85d273 100644
--- a/nova/db/api.py
+++ b/nova/db/api.py
@@ -503,10 +503,10 @@ def instance_get_all(context):
return IMPL.instance_get_all(context)
-def instance_get_all_by_filters(context, filters, instances=None):
+def instance_get_all_by_filters(context, filters, instance_ids=None):
"""Get all instances that match all filters."""
return IMPL.instance_get_all_by_filters(context, filters,
- instances=instances)
+ instance_ids=instance_ids)
def instance_get_active_by_window(context, begin, end=None, project_id=None):
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 66f9a9f8f..d613602b2 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1201,7 +1201,7 @@ def instance_get_all(context):
@require_context
-def instance_get_all_by_filters(context, filters, instances=None):
+def instance_get_all_by_filters(context, filters, instance_ids=None):
"""Return instances that match all filters. Deleted instances
will be returned by default, unless there's a filter that says
otherwise"""
@@ -1277,15 +1277,21 @@ def instance_get_all_by_filters(context, filters, instances=None):
query_prefix = _exact_match_filter(query_prefix, filter_name,
filters.pop(filter_name))
+ instances = query_prefix.all()
+ ids = [instance['id'] for instance in instances if instance['id']]
+ uuids = [instance['uuid'] for instance in instances if instance['uuid']]
+
+ if instance_ids is None:
+ instance_ids = []
+
# TODO(jkoelker): This is for ID or UUID compat
- if instances is None:
- instances = []
- elif isinstance(instances, types.StringType):
- instances = [instance_get_by_uuid(context, instances)]
- elif isinstance(instances, types.IntType):
- instances = [instance_get(context, instances)]
-
- instances.extend(query_prefix.all())
+ for instance_id in instance_ids:
+ if isinstance(instance_id,
+ types.StringType) and instance_id not in uuids:
+ instances.append(instance_get_by_uuid(context, instance_id))
+ elif isinstance(instance_id,
+ types.IntType) and instance_id not in ids:
+ instances.append(instance_get(context, instance_id))
if not instances:
return []