From 75209cd605a430131e023c40d0f63a87b03af062 Mon Sep 17 00:00:00 2001 From: Alex Meade Date: Mon, 9 Jul 2012 10:13:34 -0400 Subject: Migrations for deleted data for previously deleted instances. These migrations undelete metadata, system metadata, and block device mappings that were deleted when instances were deleted before the change: 0598db0a6c66eb2b6d2e0e3f0b3b2b921ebe8621 Before that change; metadata, system metadata, and block device mappings were deleted when and instance was deleted, this is no longer the behavior. These migrations undelete all of the data that was deleted within two seconds of the instance being deleted in order for old deleted instances to be consistent with the new behavior. Fixes bug 1022592 Change-Id: I36c66913abcb231f23e409f1f71c00ef0f6e69e5 --- .../versions/112_update_deleted_instance_data.py | 67 ++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 nova/db/sqlalchemy/migrate_repo/versions/112_update_deleted_instance_data.py diff --git a/nova/db/sqlalchemy/migrate_repo/versions/112_update_deleted_instance_data.py b/nova/db/sqlalchemy/migrate_repo/versions/112_update_deleted_instance_data.py new file mode 100644 index 000000000..24f7f7164 --- /dev/null +++ b/nova/db/sqlalchemy/migrate_repo/versions/112_update_deleted_instance_data.py @@ -0,0 +1,67 @@ +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2012 OpenStack LLC. +# All Rights Reserved. +# +# 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. + +import datetime +from sqlalchemy import MetaData, Table +from sqlalchemy import and_, between + + +TABLES = ('instance_metadata', + 'instance_system_metadata', + 'block_device_mapping') + + +def upgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + + instance_list = list(instances.select().\ + where(instances.c.deleted == True).execute()) + for table_name in TABLES: + table = Table(table_name, meta, autoload=True) + + for instance in instance_list: + table.update( + (and_(table.c.deleted == True, + table.c.instance_uuid == instance['uuid'], + between(table.c.deleted_at, + instance['deleted_at'] - datetime.timedelta(seconds=2), + instance['deleted_at'] + datetime.timedelta(seconds=2))) + ), + {table.c.deleted: False, + table.c.deleted_at: None} + ).execute() + + +def downgrade(migrate_engine): + meta = MetaData() + meta.bind = migrate_engine + instances = Table('instances', meta, autoload=True) + + instance_list = list(instances.select().\ + where(instances.c.deleted == True).execute()) + for table_name in TABLES: + table = Table(table_name, meta, autoload=True) + for instance in instance_list: + table.update( + (and_(table.c.deleted == False, + table.c.instance_uuid == instance['uuid']) + ), + {table.c.deleted: True, + table.c.deleted_at: instance['deleted_at']} + ).execute() -- cgit