diff options
| author | vladimir.p <vladimir@zadarastorage.com> | 2011-08-16 17:34:38 +0000 |
|---|---|---|
| committer | Tarmac <> | 2011-08-16 17:34:38 +0000 |
| commit | 3df69958daa57f267cbce84e29d48bf69d79c509 (patch) | |
| tree | fd39022376c97276aed5f0248fe99b0c5110ba07 /nova/db | |
| parent | cb967b7b726e0678ccb7f0c6fb7daf77c1aa3aab (diff) | |
| parent | f9cf0d334330f034d0e0fb2ae8c88dda38e62832 (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.py | 20 |
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) |
