]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commit
Migration for attached volumes
authorAvishay Traeger <avishay@il.ibm.com>
Mon, 19 Aug 2013 10:45:38 +0000 (13:45 +0300)
committerAvishay Traeger <avishay@il.ibm.com>
Tue, 27 Aug 2013 11:18:25 +0000 (14:18 +0300)
commit57141d6817809b5848d412ea5a2bf3dbb5da0064
treec00b40d5f83d91f88d01f80fe2c4987e78a5e56c
parentef4d1084f44cd90e366256086fbd55b55a21326c
Migration for attached volumes

Enable migration for attached volumes by calling Nova to have the
hypervisor copy the data (Nova's swap_volume feature). A new API
function is added for Nova to call once it is done copying to finish
the Cinder side of the migration.

The overall 'generic' migration flow (i.e., not performed by a driver)
is as follows:
1. Creates a new volume
2a. If the source volume's state is 'available', attach both volumes
    and run 'dd' to copy, then detach both. When finished, call the
    migrate_volume_completion function.
2b. If the source volume's state is 'in-use', call Nova to perform the
    copy. Nova will attach the new volume, copy the data from the
    original volume to the new one, and detach the original volume.
    When the copy completes, Nova will call Cinder's new
    migrate_volume_completion function.
3. The migrate_volume_completion function deletes the original volume,
   and calls the database API's finish_volume_migration function. This
   copies all of the new volume's information to the original, and
   deletes the new volume's row, and thus we can keep using the
   original volume_id (the user sees no change).

We also don't change the original volume's status, and instead add a
migration_status column which only selected users can see (e.g., admin).
The migration status is None when no migration is in progress, whether
it succeeded or failed. The admin should check the volume's current
host to determine success or failure. This is meant to simplify
operations. The user will only be aware of a migration if they try to
change the volume's state during the course of a migration.

As mentioned, we change the volume while keeping the original volume
ID. Because a volume's name depends on its ID, the new volume will have
a different name than the original. This is the purpose of the name_id
field in the database - the name is now based on name_id. So although
we keep the original volume's ID, we use the new volume's ID as the
name_id. Thus we can remove the rename_volume function - it is no
longer necessary because the name_id field in the database already
allows for the volume's name on the backend to not rely on its ID.
The user than can see the migration_status can also see the
name_id, in case they need to find it on the backend.

There were a few other places throughout the code that relied on
constructing a volume's name from its ID, and those were fixed.

DocImpact

Implements: bp online-volume-migration

Change-Id: I8daaee174e426fbd450fa75f04f9c8e6fa09f01a
37 files changed:
cinder/api/contrib/admin_actions.py
cinder/api/contrib/volume_mig_status_attribute.py [new file with mode: 0644]
cinder/brick/iscsi/iscsi.py
cinder/brick/iser/iser.py
cinder/compute/nova.py
cinder/db/sqlalchemy/api.py
cinder/db/sqlalchemy/migrate_repo/versions/019_add_migration_status.py [new file with mode: 0644]
cinder/db/sqlalchemy/models.py
cinder/scheduler/manager.py
cinder/tests/api/contrib/test_admin_actions.py
cinder/tests/api/contrib/test_volume_host_attribute.py
cinder/tests/api/contrib/test_volume_migration_status_attribute.py [new file with mode: 0644]
cinder/tests/api/contrib/test_volume_tenant_attribute.py
cinder/tests/api/v1/stubs.py
cinder/tests/api/v1/test_snapshot_metadata.py
cinder/tests/api/v2/stubs.py
cinder/tests/api/v2/test_snapshot_metadata.py
cinder/tests/compute/__init__.py [new file with mode: 0644]
cinder/tests/compute/test_nova.py
cinder/tests/db/test_finish_migration.py
cinder/tests/db/test_name_id.py
cinder/tests/policy.json
cinder/tests/scheduler/test_scheduler.py
cinder/tests/test_coraid.py
cinder/tests/test_iscsi.py
cinder/tests/test_iser.py
cinder/tests/test_migrations.py
cinder/tests/test_volume.py
cinder/tests/test_volume_rpcapi.py
cinder/tests/utils.py
cinder/volume/api.py
cinder/volume/driver.py
cinder/volume/drivers/block_device.py
cinder/volume/drivers/lvm.py
cinder/volume/manager.py
cinder/volume/rpcapi.py
etc/cinder/policy.json