diff options
| author | Alex Meade <alex.meade@rackspace.com> | 2012-07-09 10:13:34 -0400 |
|---|---|---|
| committer | Alex Meade <alex.meade@rackspace.com> | 2012-07-23 10:36:45 -0400 |
| commit | 75209cd605a430131e023c40d0f63a87b03af062 (patch) | |
| tree | f58358bd4375a0ffedee25cece9d50473577cc8b | |
| parent | c94cbe223fffa57969d91219538bc3576e9893da (diff) | |
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
| -rw-r--r-- | nova/db/sqlalchemy/migrate_repo/versions/112_update_deleted_instance_data.py | 67 |
1 files changed, 67 insertions, 0 deletions
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() |
