summaryrefslogtreecommitdiff
path: root/heat/objects
diff options
context:
space:
mode:
authorCrag Wolfe <cwolfe@redhat.com>2017-06-21 20:04:01 -0400
committerZane Bitter <zbitter@redhat.com>2017-06-21 20:18:46 -0400
commit0550659f5ffa9c8b92529d980c75144b35e8864a (patch)
tree4d0d79e624a93b818a8851cbe481b356b9f4e401 /heat/objects
parent0c9adf8e48eb399f84fab9bdb5b13b167072f0b3 (diff)
downloadheat-0550659f5ffa9c8b92529d980c75144b35e8864a.tar.gz
Store resource attributes in the DB
Store resource attributes that may be cached in the DB, saving the cost of re-resolving them later. This works for most resources, specifically those that do not override the get_attribute() method. Change-Id: I71f8aa431a60457326167b8c82adc03ca750eda6 Partial-Bug: #1660831
Diffstat (limited to 'heat/objects')
-rw-r--r--heat/objects/resource.py29
-rw-r--r--heat/objects/resource_properties_data.py9
2 files changed, 31 insertions, 7 deletions
diff --git a/heat/objects/resource.py b/heat/objects/resource.py
index e656a26e4..102aa45c7 100644
--- a/heat/objects/resource.py
+++ b/heat/objects/resource.py
@@ -111,7 +111,7 @@ class Resource(
resource['data'] = [resource_data.ResourceData._from_db_object(
resource_data.ResourceData(context), resd
) for resd in db_resource.data]
- else:
+ elif field != 'attr_data':
resource[field] = db_resource[field]
if db_resource['rsrc_prop_data'] is not None:
@@ -139,16 +139,21 @@ class Resource(
resource._properties_data = {}
if db_resource['attr_data'] is not None:
- resource['attr_data'] = \
- rpd.ResourcePropertiesData._from_db_object(
- rpd.ResourcePropertiesData(context), context,
- db_resource['attr_data'])
+ resource._attr_data = rpd.ResourcePropertiesData._from_db_object(
+ rpd.ResourcePropertiesData(context), context,
+ db_resource['attr_data']).data
+ else:
+ resource._attr_data = None
resource._context = context
resource.obj_reset_changes()
return resource
@property
+ def attr_data(self):
+ return self._attr_data
+
+ @property
def properties_data(self):
return self._properties_data
@@ -186,6 +191,10 @@ class Resource(
db_api.resource_delete(context, resource_id)
@classmethod
+ def attr_data_delete(cls, context, resource_id, attr_id):
+ db_api.resource_attr_data_delete(context, resource_id, attr_id)
+
+ @classmethod
def exchange_stacks(cls, context, resource_id1, resource_id2):
return db_api.resource_exchange_stacks(
context,
@@ -278,6 +287,16 @@ class Resource(
atomic_key=atomic_key,
expected_engine_id=expected_engine_id)
+ @classmethod
+ def store_attributes(cls, context, resource_id, atomic_key,
+ attr_data, attr_id):
+ attr_id = rpd.ResourcePropertiesData.create_or_update(
+ context, attr_data, attr_id).id
+ if db_api.resource_attr_id_set(
+ context, resource_id, atomic_key, attr_id):
+ return attr_id
+ return None
+
def refresh(self):
resource_db = db_api.resource_get(self._context, self.id, refresh=True)
return self.__class__._from_db_object(
diff --git a/heat/objects/resource_properties_data.py b/heat/objects/resource_properties_data.py
index c5670aa6e..c1c313c25 100644
--- a/heat/objects/resource_properties_data.py
+++ b/heat/objects/resource_properties_data.py
@@ -55,14 +55,19 @@ class ResourcePropertiesData(
return rpd
@classmethod
- def create(cls, context, data):
+ def create_or_update(cls, context, data, rpd_id=None):
properties_data_encrypted, properties_data = \
ResourcePropertiesData.encrypt_properties_data(data)
values = {'encrypted': properties_data_encrypted,
'data': properties_data}
- db_obj = db_api.resource_prop_data_create(context, values)
+ db_obj = db_api.resource_prop_data_create_or_update(
+ context, values, rpd_id)
return cls._from_db_object(cls(), context, db_obj, data)
+ @classmethod
+ def create(cls, context, data):
+ return ResourcePropertiesData.create_or_update(context, data)
+
@staticmethod
def encrypt_properties_data(data):
if cfg.CONF.encrypt_parameters_and_properties and data: