diff --git a/heat/db/sqlalchemy/migrate_repo/versions/056_convergence_parameter_storage.py b/heat/db/sqlalchemy/migrate_repo/versions/056_convergence_parameter_storage.py index 74ae04419c..69318f987d 100644 --- a/heat/db/sqlalchemy/migrate_repo/versions/056_convergence_parameter_storage.py +++ b/heat/db/sqlalchemy/migrate_repo/versions/056_convergence_parameter_storage.py @@ -41,8 +41,8 @@ def upgrade(migrate_engine): stack_table = sqlalchemy.Table('stack', meta, autoload=True) update_query = tmpl_table.update().values( environment=sqlalchemy.select([stack_table.c.parameters]). - where(tmpl_table.c.id == stack_table.c.raw_template_id). - as_scalar()) + where(sqlalchemy.and_(stack_table.c.raw_template_id == tmpl_table.c.id, + stack_table.c.deleted_at.is_(None))).as_scalar()) migrate_engine.execute(update_query) stack_table.c.parameters.drop() @@ -76,14 +76,16 @@ def upgrade_sqlite(migrate_engine): stack_parameters = {} for s in stacks: - stack_parameters[s.raw_template_id] = s.parameters + stack_parameters[s.raw_template_id] = (s.parameters, s.deleted_at) colnames = [c.name for c in tmpl_table.columns] for template in templates: values = dict(zip(colnames, map(lambda colname: getattr(template, colname), colnames))) - values['environment'] = stack_parameters.get(values['id']) + params, del_at = stack_parameters.get(values['id'], (None, None)) + if params is not None and del_at is None: + values['environment'] = params migrate_engine.execute(new_template.insert(values)) # migrate stacks to new table diff --git a/heat/tests/db/test_migrations.py b/heat/tests/db/test_migrations.py index 02ab041d6d..69a4f1251f 100644 --- a/heat/tests/db/test_migrations.py +++ b/heat/tests/db/test_migrations.py @@ -434,11 +434,11 @@ class HeatMigrationsCheckers(test_migrations.WalkVersionsMixin, templ.append(t) user_creds = utils.get_table(engine, 'user_creds') - user = [dict(id=900, username='test_user', password='password', + user = [dict(id=uid, username='test_user', password='password', tenant='test_project', auth_url='bla', tenant_id=str(uuid.uuid4()), trust_id='', - trustor_user_id='')] + trustor_user_id='') for uid in range(900, 903)] engine.execute(user_creds.insert(), user) stack = utils.get_table(engine, 'stack') @@ -447,11 +447,14 @@ class HeatMigrationsCheckers(test_migrations.WalkVersionsMixin, ('9a4bd1e9-8b21-46cd-964a-f66cb1cfa2f9', 2)] data = [dict(id=ll_id, name=ll_id, raw_template_id=templ[templ_id]['id'], - user_creds_id=user[0]['id'], + user_creds_id=user[templ_id]['id'], username='test_user', disable_rollback=True, - parameters='test_params') + parameters='test_params', + created_at=datetime.datetime.utcnow(), + deleted_at=None) for ll_id, templ_id in stack_ids] + data[-1]['deleted_at'] = datetime.datetime.utcnow() engine.execute(stack.insert(), data) return data @@ -465,23 +468,29 @@ class HeatMigrationsCheckers(test_migrations.WalkVersionsMixin, # Get the parameters in stack table stack_parameters = {} for stack in data: - stack_parameters[stack['raw_template_id']] = stack['parameters'] + templ_id = stack['raw_template_id'] + stack_parameters[templ_id] = (stack['parameters'], + stack.get('deleted_at')) # validate whether its moved to raw_template raw_template_table = utils.get_table(engine, 'raw_template') raw_templates = raw_template_table.select().execute() for raw_template in raw_templates: - if stack_parameters.get(raw_template.id) is not None: - stack_param = stack_parameters[raw_template.id] + if raw_template.id in stack_parameters: + stack_param, deleted_at = stack_parameters[raw_template.id] tmpl_env = raw_template.environment - if engine.name == 'sqlite': + if engine.name == 'sqlite' and deleted_at is None: stack_param = '"%s"' % stack_param - - self.assertEqual(stack_param, - tmpl_env, - 'parameters migration from stack to ' - 'raw_template failed') + if deleted_at is None: + self.assertEqual(stack_param, + tmpl_env, + 'parameters migration from stack to ' + 'raw_template failed') + else: + self.assertIsNone(tmpl_env, + 'parameters migration did not skip ' + 'deleted stack') def _pre_upgrade_057(self, engine): # template