Alter models and add migration

We must have correct models i.e. models that correspond
database schema to use sqlalchemy features.
Update models.py and add migration script to correct
database schema and get rid of the difference between
schema and models.
Remove Stack.user_creds_id nullable=False parameter
because  we can soft-delete stack, that leads to deletion
user_credits and setting stack.user_creds_id to null
(by cascade).
Remove resource.id default value(in database) as specified
in models.
Since we will have sync check between models and migrations
we need to add missing indexes to models for consistency.

Partially implements bp: db-sync-models-with-migrations

Change-Id: Iabc4aced0a95e29cea9c48abc4c31be98e8ff9b1
This commit is contained in:
Oleksii Chuprykov 2014-10-10 16:12:13 +03:00 committed by Zhenguo Niu
parent c0f8529dab
commit 38e7ad70e0
2 changed files with 43 additions and 8 deletions

View File

@ -0,0 +1,34 @@
#
# 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 sqlalchemy import MetaData, Sequence, Table
def upgrade(migrate_engine):
meta = MetaData()
meta.bind = migrate_engine
meta.reflect(meta.bind)
if migrate_engine.name == 'postgresql':
resource = Table('resource', meta)
resource.c.id.alter(server_default=None)
def downgrade(migrate_engine):
meta = MetaData()
meta.bind = migrate_engine
if migrate_engine.name == 'postgresql':
resource = Table('resource', meta, autoload=True)
resource.c.id.alter(server_default=Sequence('resource_id_seq')
.next_value())

View File

@ -127,8 +127,7 @@ class Stack(BASE, HeatBase, SoftDelete, StateAware):
parameters = sqlalchemy.Column('parameters', Json)
user_creds_id = sqlalchemy.Column(
sqlalchemy.Integer,
sqlalchemy.ForeignKey('user_creds.id'),
nullable=False)
sqlalchemy.ForeignKey('user_creds.id'))
owner_id = sqlalchemy.Column(sqlalchemy.String(36), nullable=True)
timeout = sqlalchemy.Column(sqlalchemy.Integer)
disable_rollback = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False)
@ -167,7 +166,7 @@ class UserCreds(BASE, HeatBase):
password = sqlalchemy.Column(sqlalchemy.String(255))
decrypt_method = sqlalchemy.Column(sqlalchemy.String(64))
tenant = sqlalchemy.Column(sqlalchemy.String(1024))
auth_url = sqlalchemy.Column(sqlalchemy.String)
auth_url = sqlalchemy.Column(sqlalchemy.Text)
tenant_id = sqlalchemy.Column(sqlalchemy.String(256))
trust_id = sqlalchemy.Column(sqlalchemy.String(255))
trustor_user_id = sqlalchemy.Column(sqlalchemy.String(64))
@ -216,7 +215,7 @@ class ResourceData(BASE, HeatBase):
primary_key=True,
nullable=False)
key = sqlalchemy.Column('key', sqlalchemy.String(255))
value = sqlalchemy.Column('value', sqlalchemy.String)
value = sqlalchemy.Column('value', sqlalchemy.Text)
redact = sqlalchemy.Column('redact', sqlalchemy.Boolean)
decrypt_method = sqlalchemy.Column(sqlalchemy.String(64))
resource_id = sqlalchemy.Column('resource_id',
@ -301,7 +300,7 @@ class SoftwareConfig(BASE, HeatBase):
group = sqlalchemy.Column('group', sqlalchemy.String(255))
config = sqlalchemy.Column('config', Json)
tenant = sqlalchemy.Column(
'tenant', sqlalchemy.String(64), nullable=False)
'tenant', sqlalchemy.String(64), nullable=False, index=True)
class SoftwareDeployment(BASE, HeatBase, StateAware):
@ -311,6 +310,8 @@ class SoftwareDeployment(BASE, HeatBase, StateAware):
"""
__tablename__ = 'software_deployment'
__table_args__ = (
sqlalchemy.Index('ix_software_deployment_created_at', 'created_at'),)
id = sqlalchemy.Column('id', sqlalchemy.String(36), primary_key=True,
default=lambda: str(uuid.uuid4()))
@ -321,11 +322,11 @@ class SoftwareDeployment(BASE, HeatBase, StateAware):
nullable=False)
config = relationship(SoftwareConfig, backref=backref('deployments'))
server_id = sqlalchemy.Column('server_id', sqlalchemy.String(36),
nullable=False)
nullable=False, index=True)
input_values = sqlalchemy.Column('input_values', Json)
output_values = sqlalchemy.Column('output_values', Json)
tenant = sqlalchemy.Column(
'tenant', sqlalchemy.String(64), nullable=False)
'tenant', sqlalchemy.String(64), nullable=False, index=True)
stack_user_project_id = sqlalchemy.Column(sqlalchemy.String(64),
nullable=True)
@ -342,7 +343,7 @@ class Snapshot(BASE, HeatBase):
name = sqlalchemy.Column('name', sqlalchemy.String(255), nullable=True)
data = sqlalchemy.Column('data', Json)
tenant = sqlalchemy.Column(
'tenant', sqlalchemy.String(64), nullable=False)
'tenant', sqlalchemy.String(64), nullable=False, index=True)
status = sqlalchemy.Column('status', sqlalchemy.String(255))
status_reason = sqlalchemy.Column('status_reason', sqlalchemy.String(255))
stack = relationship(Stack, backref=backref('snapshot'))