]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Cinder list does not filter admin metadata.
authorJuan Manuel Olle <juan.m.olle@intel.com>
Wed, 23 Apr 2014 20:44:28 +0000 (17:44 -0300)
committerJuan Manuel Olle <juan.m.olle@intel.com>
Thu, 24 Apr 2014 12:37:21 +0000 (09:37 -0300)
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
cinder/tests/test_db_api.py

index b3244577d90ec7dafea5ae167afe42d8b70153e0..5a6477afaf1a0479b6b23518667c9d98b76daacf 100644 (file)
@@ -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)
index ddd0726fd7815b4ac6393871af7f3893b62f1e60..8fb6d72a5c510ab1335d3d356acafe3d6039fee6 100644 (file)
@@ -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)