Data migration enabling storage of resource attributes

Working towards the goal of storing resource attributes in the db so
as to avoid re-resolving them when appropriate. Adds an 'attr_data'
object to the resource object, defined as a relationship on the
already existing resource_properties_data table.

Change-Id: I2104078d850da08b22547d7feab2bde00c543478
Partial-Bug: #1660831
This commit is contained in:
Crag Wolfe 2017-01-19 19:54:54 -05:00
parent efdb00d628
commit 9ebbd1e6f1
4 changed files with 50 additions and 1 deletions

View File

@ -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()

View File

@ -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

View File

@ -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

View File

@ -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):