summaryrefslogtreecommitdiffstats
path: root/nova/db
diff options
context:
space:
mode:
authorvladimir.p <vladimir@zadarastorage.com>2011-08-16 17:34:38 +0000
committerTarmac <>2011-08-16 17:34:38 +0000
commit3df69958daa57f267cbce84e29d48bf69d79c509 (patch)
treefd39022376c97276aed5f0248fe99b0c5110ba07 /nova/db
parentcb967b7b726e0678ccb7f0c6fb7daf77c1aa3aab (diff)
parentf9cf0d334330f034d0e0fb2ae8c88dda38e62832 (diff)
* Added search instance by metadata.
* instance_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 184ad60d5..95ec3f715 100644
--- a/nova/db/sqlalchemy/api.py
+++ b/nova/db/sqlalchemy/api.py
@@ -1178,6 +1178,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)
@@ -1236,7 +1249,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 []
@@ -1252,6 +1267,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)