summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorvladimir.p <vladimir@zadarastorage.com>2011-08-11 11:54:35 -0700
committervladimir.p <vladimir@zadarastorage.com>2011-08-11 11:54:35 -0700
commitf9cf0d334330f034d0e0fb2ae8c88dda38e62832 (patch)
treecf887941a94a57b93effe2401e419e31762765ab /nova/db
parentfe0bde67193ce76376e72a7263b89240a63722a8 (diff)
Added search instance by metadata. get_all_by_filters should filter deleted
Diffstat (limited to 'nova/db')
-rw-r--r--nova/db/sqlalchemy/api.py20
1 files changed, 19 insertions, 1 deletions
diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py
index 8119cdfb8..65977a8bf 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1175,6 +1175,19 @@ def instance_get_all_by_filters(context, filters):
return True
return False
+ def _regexp_filter_by_metadata(instance, meta):
+ inst_metadata = [{node['key']: node['value']} \
+ for node in instance['metadata']]
+ if isinstance(meta, list):
+ for node in meta:
+ if node not in inst_metadata:
+ return False
+ elif isinstance(meta, dict):
+ for k, v in meta.iteritems():
+ if {k: v} not in inst_metadata:
+ return False
+ return True
+
def _regexp_filter_by_column(instance, filter_name, filter_re):
try:
v = getattr(instance, filter_name)
@@ -1232,7 +1245,9 @@ def instance_get_all_by_filters(context, filters):
query_prefix = _exact_match_filter(query_prefix, filter_name,
filters.pop(filter_name))
- instances = query_prefix.all()
+ instances = query_prefix.\
+ filter_by(deleted=can_read_deleted(context)).\
+ all()
if not instances:
return []
@@ -1248,6 +1263,9 @@ def instance_get_all_by_filters(context, filters):
filter_re = re.compile(str(filters[filter_name]))
if filter_func:
filter_l = lambda instance: filter_func(instance, filter_re)
+ elif filter_name == 'metadata':
+ filter_l = lambda instance: _regexp_filter_by_metadata(instance,
+ filters[filter_name])
else:
filter_l = lambda instance: _regexp_filter_by_column(instance,
filter_name, filter_re)