From e8a2a540e574ca2d242b9c2749c1f285498809e7 Mon Sep 17 00:00:00 2001 From: Jason Koelker Date: Wed, 14 Sep 2011 17:11:21 -0500 Subject: fix up the filtering so it does not return duplicates if both the network and the db filters match --- nova/compute/api.py | 9 ++------- nova/db/api.py | 4 ++-- nova/db/sqlalchemy/api.py | 24 +++++++++++++++--------- 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 [] -- cgit