diff --git a/nova/db/sqlalchemy/api.py b/nova/db/sqlalchemy/api.py index 10c2d689854f..acee95e6b142 100644 --- a/nova/db/sqlalchemy/api.py +++ b/nova/db/sqlalchemy/api.py @@ -240,7 +240,7 @@ def exact_filter(query, model, filters, legal_keys): # OK, filtering on this key; what value do we search for? value = filters.pop(key) - if key == 'metadata': + if key == 'metadata' or key == 'system_metadata': column_attr = getattr(model, key) if isinstance(value, list): for item in value: @@ -1691,7 +1691,8 @@ def instance_get_all_by_filters(context, filters, sort_key, sort_dir, # For other filters that don't match this, we will do regexp matching exact_match_filter_names = ['project_id', 'user_id', 'image_ref', 'vm_state', 'instance_type_id', 'uuid', - 'metadata', 'task_state'] + 'metadata', 'host', 'task_state', + 'system_metadata'] # Filter the query query_prefix = exact_filter(query_prefix, models.Instance, diff --git a/nova/scheduler/driver.py b/nova/scheduler/driver.py index 4f4a37cd3b4c..5e7a0db84c2e 100644 --- a/nova/scheduler/driver.py +++ b/nova/scheduler/driver.py @@ -144,7 +144,7 @@ class Scheduler(object): # The system_metadata 'group' will be filtered members = db.instance_get_all_by_filters(context, - {'deleted': False, 'group': group}) + {'deleted': False, 'system_metadata': {'group': group}}) return [member['host'] for member in members if member.get('host') is not None] diff --git a/nova/tests/test_db_api.py b/nova/tests/test_db_api.py index 8a60293a0233..6ee342fb0404 100644 --- a/nova/tests/test_db_api.py +++ b/nova/tests/test_db_api.py @@ -181,6 +181,14 @@ class DbApiTestCase(DbTestCase): {'metadata': {'foo': 'bar'}}) self.assertEqual(1, len(result)) + def test_instance_get_all_by_filters_system_metadata(self): + instance = self.create_instances_with_args( + system_metadata={'foo': 'bar'}) + self.create_instances_with_args() + result = db.instance_get_all_by_filters(self.context, + {'system_metadata': {'foo': 'bar'}}) + self.assertEqual(1, len(result)) + def test_instance_get_all_by_filters_unicode_value(self): self.create_instances_with_args(display_name=u'test♥') result = db.instance_get_all_by_filters(self.context,