diff --git a/heat/db/sqlalchemy/migrate_repo/versions/080_resource_attrs_data.py b/heat/db/sqlalchemy/migrate_repo/versions/080_resource_attrs_data.py new file mode 100644 index 0000000000..4636d1e76e --- /dev/null +++ b/heat/db/sqlalchemy/migrate_repo/versions/080_resource_attrs_data.py @@ -0,0 +1,31 @@ +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +from migrate.changeset import constraint +import sqlalchemy + + +def upgrade(migrate_engine): + meta = sqlalchemy.MetaData(bind=migrate_engine) + + resource = sqlalchemy.Table('resource', meta, autoload=True) + resource_properties_data = sqlalchemy.Table('resource_properties_data', + meta, autoload=True) + attr_data_id = sqlalchemy.Column('attr_data_id', + sqlalchemy.Integer) + attr_data_id.create(resource) + res_fkey = constraint.ForeignKeyConstraint( + columns=[resource.c.attr_data_id], + refcolumns=[resource_properties_data.c.id], + name='rsrc_attr_data_ref') + res_fkey.create() diff --git a/heat/db/sqlalchemy/models.py b/heat/db/sqlalchemy/models.py index a9a5fd126f..6a6c7a6c71 100644 --- a/heat/db/sqlalchemy/models.py +++ b/heat/db/sqlalchemy/models.py @@ -278,7 +278,12 @@ class Resource(BASE, HeatBase, StateAware): sqlalchemy.ForeignKey( 'resource_properties_data.id')) rsrc_prop_data = relationship(ResourcePropertiesData, - backref=backref('resource')) + foreign_keys=[rsrc_prop_data_id]) + attr_data_id = sqlalchemy.Column(sqlalchemy.Integer, + sqlalchemy.ForeignKey( + 'resource_properties_data.id')) + attr_data = relationship(ResourcePropertiesData, + foreign_keys=[attr_data_id]) # Override timestamp column to store the correct value: it should be the # time the create/update call was issued, not the time the DB entry is diff --git a/heat/objects/resource.py b/heat/objects/resource.py index c1a365c2f9..f5dee285fe 100644 --- a/heat/objects/resource.py +++ b/heat/objects/resource.py @@ -78,6 +78,9 @@ class Resource( 'status': fields.StringField(nullable=True), 'status_reason': fields.StringField(nullable=True), 'action': fields.StringField(nullable=True), + 'attr_data': fields.ObjectField( + rpd.ResourcePropertiesData, nullable=True), + 'attr_data_id': fields.IntegerField(nullable=True), 'rsrc_metadata': heat_fields.JsonField(nullable=True), 'data': fields.ListOfObjectsField( resource_data.ResourceData, @@ -133,6 +136,12 @@ class Resource( else: 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._context = context resource.obj_reset_changes() return resource diff --git a/heat/tests/db/test_migrations.py b/heat/tests/db/test_migrations.py index d90c85d203..e61fa3341f 100644 --- a/heat/tests/db/test_migrations.py +++ b/heat/tests/db/test_migrations.py @@ -733,6 +733,10 @@ class HeatMigrationsCheckers(test_migrations.WalkVersionsMixin, 'resource_properties_data', column[0]) + def _check_080(self, engine, data): + self.assertColumnExists(engine, 'resource', + 'attr_data_id') + class TestHeatMigrationsMySQL(HeatMigrationsCheckers, test_base.MySQLOpportunisticTestCase):