summaryrefslogtreecommitdiff
path: root/heat/engine/resource.py
diff options
context:
space:
mode:
Diffstat (limited to 'heat/engine/resource.py')
-rw-r--r--heat/engine/resource.py31
1 files changed, 30 insertions, 1 deletions
diff --git a/heat/engine/resource.py b/heat/engine/resource.py
index 46849cec7..b6318bb55 100644
--- a/heat/engine/resource.py
+++ b/heat/engine/resource.py
@@ -244,6 +244,7 @@ class Resource(status.ResourceStatus):
self.id = None
self.uuid = None
self._data = None
+ self._attr_data_id = None
self._rsrc_metadata = None
self._rsrc_prop_data = None
self._stored_properties_data = None
@@ -289,6 +290,8 @@ class Resource(status.ResourceStatus):
self, resource.data)
except exception.NotFound:
self._data = {}
+ self.attributes.cached_attrs = resource.attr_data
+ self._attr_data_id = resource.attr_data_id
self._rsrc_metadata = resource.rsrc_metadata
self._stored_properties_data = resource.properties_data
self._rsrc_prop_data = resource.rsrc_prop_data
@@ -921,6 +924,7 @@ class Resource(status.ResourceStatus):
self._stored_properties_data = function.resolve(self.properties.data)
if self._stored_properties_data != old_props:
self._rsrc_prop_data = None
+ self.attributes.reset_resolved_values()
def node_data(self):
def get_attrs(attrs):
@@ -2092,13 +2096,38 @@ class Resource(status.ResourceStatus):
if new_state != old_state:
self._add_event(action, status, reason)
- self.attributes.reset_resolved_values()
+ if status != self.COMPLETE:
+ self.clear_stored_attributes()
@property
def state(self):
"""Returns state, tuple of action, status."""
return (self.action, self.status)
+ def store_attributes(self):
+ assert self.id is not None
+ if self.status != self.COMPLETE or self.action in (self.INIT,
+ self.DELETE):
+ return
+ if not self.attributes.has_new_cached_attrs():
+ return
+
+ try:
+ attr_data_id = resource_objects.Resource.store_attributes(
+ self.context, self.id, self._atomic_key,
+ self.attributes.cached_attrs, self._attr_data_id)
+ if attr_data_id is not None:
+ self._attr_data_id = attr_data_id
+ except Exception as ex:
+ LOG.error('store_attributes rsrc %(name)s %(id)s DB error %(ex)s',
+ {'name': self.name, 'id': self.id, 'ex': ex})
+
+ def clear_stored_attributes(self):
+ if self._attr_data_id:
+ resource_objects.Resource.attr_data_delete(
+ self.context, self.id, self._attr_data_id)
+ self.attributes.reset_resolved_values()
+
def get_reference_id(self):
"""Default implementation for function get_resource.