From 8f112b270af0965a6f9aafbd83976c1ad22314f8 Mon Sep 17 00:00:00 2001 From: Juan Manuel Olle Date: Wed, 23 Apr 2014 17:44:28 -0300 Subject: [PATCH] Cinder list does not filter admin metadata. For example, if you want to filter by 'readonly' attribute, you do not get results. This patch adds the admin metadata for filtering. Change-Id: Ia2a72776e649abd82160cb13ad63489cc760b190 Closes-Bug: #1311277 --- cinder/db/sqlalchemy/api.py | 10 ++++++---- cinder/tests/test_db_api.py | 8 +++++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/cinder/db/sqlalchemy/api.py b/cinder/db/sqlalchemy/api.py index b3244577d..5a6477afa 100644 --- a/cinder/db/sqlalchemy/api.py +++ b/cinder/db/sqlalchemy/api.py @@ -1259,11 +1259,13 @@ def _generate_paginate_query(context, session, marker, limit, sort_key, for key, value in filters.iteritems(): if key == 'metadata': # model.VolumeMetadata defines the backref to Volumes as - # 'volume_metadata', use that column attribute key - key = 'volume_metadata' - column_attr = getattr(models.Volume, key) + # 'volume_metadata' or 'volume_admin_metadata', use those as + # column attribute keys + col_attr = getattr(models.Volume, 'volume_metadata') + col_ad_attr = getattr(models.Volume, 'volume_admin_metadata') for k, v in value.iteritems(): - query = query.filter(column_attr.any(key=k, value=v)) + query = query.filter(or_(col_attr.any(key=k, value=v), + col_ad_attr.any(key=k, value=v))) elif isinstance(value, (list, tuple, set, frozenset)): # Looking for values in a list; apply to query directly column_attr = getattr(models.Volume, key) diff --git a/cinder/tests/test_db_api.py b/cinder/tests/test_db_api.py index ddd0726fd..8fb6d72a5 100644 --- a/cinder/tests/test_db_api.py +++ b/cinder/tests/test_db_api.py @@ -569,6 +569,9 @@ class DBAPIVolumeTestCase(BaseTest): 'metadata': {'key2': 'val2', 'key3': 'val3'}, 'host': 'host5'}) + db.volume_admin_metadata_update(self.ctxt, vol5.id, + {"readonly": "True"}, False) + vols = [vol1, vol2, vol3, vol4, vol5] # Ensure we have 5 total instances @@ -588,7 +591,7 @@ class DBAPIVolumeTestCase(BaseTest): self._assertEqualsVolumeOrderResult([vol2, vol3], limit=100, filters=filters) - # metdata filters + # metadata filters filters = {'metadata': {'key1': 'val1'}} self._assertEqualsVolumeOrderResult([vol3, vol4], filters=filters) self._assertEqualsVolumeOrderResult([vol3], limit=1, @@ -596,6 +599,9 @@ class DBAPIVolumeTestCase(BaseTest): self._assertEqualsVolumeOrderResult([vol3, vol4], limit=10, filters=filters) + filters = {'metadata': {'readonly': 'True'}} + self._assertEqualsVolumeOrderResult([vol5], filters=filters) + filters = {'metadata': {'key1': 'val1', 'key2': 'val2'}} self._assertEqualsVolumeOrderResult([vol4], filters=filters) -- 2.45.2