diff options
author | Crag Wolfe <cwolfe@redhat.com> | 2017-06-21 20:04:01 -0400 |
---|---|---|
committer | Zane Bitter <zbitter@redhat.com> | 2017-06-21 20:18:46 -0400 |
commit | 0550659f5ffa9c8b92529d980c75144b35e8864a (patch) | |
tree | 4d0d79e624a93b818a8851cbe481b356b9f4e401 /heat/objects | |
parent | 0c9adf8e48eb399f84fab9bdb5b13b167072f0b3 (diff) | |
download | heat-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.py | 29 | ||||
-rw-r--r-- | heat/objects/resource_properties_data.py | 9 |
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: |