Optional data for resource_data_get_all

resource_data_get_all queries the database for the data, and
transforms the results to a decrypted dict.

If the data is already loaded then it is unnecessary to do the
database query again.

This change allows data to be passed in as an optional argument.
If the passed data is not None then no database call will be made
and the dict transformation will occur on passed data.

Change-Id: I579225d9a3f3b038e0ca41a5900c58413d6e25ac
Related-Bug: #1306743
This commit is contained in:
Steve Baker 2014-04-18 15:22:30 +12:00
parent 772192047a
commit 5808fbffe0
3 changed files with 15 additions and 7 deletions

View File

@ -55,8 +55,8 @@ def raw_template_create(context, values):
return IMPL.raw_template_create(context, values)
def resource_data_get_all(resource):
return IMPL.resource_data_get_all(resource)
def resource_data_get_all(resource, data=None):
return IMPL.resource_data_get_all(resource, data)
def resource_data_get(resource, key):

View File

@ -138,20 +138,21 @@ def resource_get_all(context):
return results
def resource_data_get_all(resource):
def resource_data_get_all(resource, data=None):
"""
Looks up resource_data by resource.id. If data is encrypted,
this method will decrypt the results.
"""
result = (model_query(resource.context, models.ResourceData)
.filter_by(resource_id=resource.id))
if data is None:
data = (model_query(resource.context, models.ResourceData)
.filter_by(resource_id=resource.id))
if not result:
if not data:
raise exception.NotFound(_('no resource data found'))
ret = {}
for res in result:
for res in data:
if res.redact:
ret[res.key] = _decrypt(res.value, res.decrypt_method)
else:

View File

@ -1399,11 +1399,18 @@ class DBAPIResourceDataTest(HeatTestCase):
val = db_api.resource_data_get(self.resource, 'encryped_resource_key')
self.assertEqual('test_value', val)
# get all by querying for data
vals = db_api.resource_data_get_all(self.resource)
self.assertEqual(2, len(vals))
self.assertEqual('foo', vals.get('test_resource_key'))
self.assertEqual('test_value', vals.get('encryped_resource_key'))
# get all by using associated resource data
vals = db_api.resource_data_get_all(None, self.resource.data)
self.assertEqual(2, len(vals))
self.assertEqual('foo', vals.get('test_resource_key'))
self.assertEqual('test_value', vals.get('encryped_resource_key'))
def test_resource_data_delete(self):
create_resource_data(self.ctx, self.resource)
res_data = db_api.resource_data_get_by_key(self.ctx, self.resource.id,