def migrate_volume(context, volume_id): volume = context.src_cloud.cinder.volumes.get(volume_id) volume_id = volume.id tenant_id = volume._info["os-vol-tenant-attr:tenant_id"] tenant_retrieve = "tenant-{}-retrieve".format(tenant_id) try: users = context.src_cloud.keystone.tenants.list_users(tenant_id) except exceptions.keystone_excs.NotFound: LOG.info("No users in tenant %s, using %s", tenant_id, context.dst_cloud.keystone.auth_ref["user"]["name"]) user_id = None else: user = users.pop() if str(user.name) == "admin": user_id = None else: user_id = user.id user_retrieve = "user-{}-retrieve".format(user_id) resources = [] if tenant_retrieve not in context.store: tenant_flow = tenant_tasks.migrate_tenant(context, tenant_id) if user_id and user_retrieve not in context.store: user_flow = user_tasks.migrate_user(context, user_id) resources.append(tenant_flow) volume_flow = volume_tasks.migrate_detached_volume(context, volume_id, user_id, tenant_id) return resources, volume_flow
def migrate_volumes(ctx, flow, ids): volumes = ctx.src_cloud.cinder.volumes.list(search_opts={'all_tenants': 1}) for volume in volumes: if volume.id in ids: volume_flow = volume_tasks.migrate_detached_volume( ctx, volume) flow.add(volume_flow) return flow
def migrate_project_volumes(context, flow, tenant_id): volumes = context.src_cloud.cinder.volumes.list( search_opts={"all_tenants": 1}) for volume in volumes: volume_tenant_id = getattr(volume, "os-vol-tenant-attr:tenant_id") volume_binding = "volume-{}".format(volume.id) if volume_binding not in context.store \ and volume.status == "available" \ and volume_tenant_id == tenant_id: volume_flow = volume_tasks.migrate_detached_volume( context, volume.id, None, tenant_id) flow.add(volume_flow)
def test_migrate_detached_volume(self, flow_mock, retrieve_vol_mock, upload_vol_mock, create_vol_mock, ensure_img_mock): volume_binding = "volume-{}".format(self.test_volume_id) volume_retrieve = "{}-retrieve".format(volume_binding) volume_upload = "{}-upload".format(volume_binding) image_ensure = "{}-image-ensure".format(volume_binding) user_id = "none" user_ensure = "user-{}-ensure".format(user_id) volume_ensure = "{}-ensure".format(volume_binding) expected_store_dict = {volume_retrieve: self.test_volume_id, user_ensure: None} flow = volume.migrate_detached_volume(self.context, self.volume) retrieve_vol_mock.assert_called_once_with(self.context.src_cloud, name=volume_binding, provides=volume_binding, rebind=[volume_retrieve]) upload_vol_mock.assert_called_once_with(self.context.src_cloud, name=volume_upload, provides=volume_upload, rebind=[volume_binding]) create_vol_mock.assert_called_once_with(self.context.dst_cloud, name=volume_ensure, provides=volume_ensure, rebind=[volume_binding, image_ensure]) ensure_img_mock.assert_called_once_with(self.context.src_cloud, self.context.dst_cloud, name=image_ensure, provides=image_ensure, rebind=[volume_upload, user_ensure]) flow_mock.assert_called_once_with("migrate-{}".format(volume_binding)) self.assertEqual(self.context.store, expected_store_dict) self.assertEqual(flow.add.call_args_list, [call(retrieve_vol_mock()), call(upload_vol_mock()), call(ensure_img_mock()), call(create_vol_mock())])
def test_migrate_detached_volume(self, flow_mock, retrieve_vol_mock, upload_vol_mock, create_vol_mock, ensure_img_mock): self.test_tenant_id = "1111" self.tenant_ensure = "tenant-{}-ensure".format(self.test_tenant_id) self.user_ensure = "user-none-ensure" expected_store_dict = {self.volume_retrieve: self.test_volume_id, self.user_ensure: None} flow = volume.migrate_detached_volume(self.context, self.test_volume_id, None, self.test_tenant_id) retrieve_vol_mock.assert_called_once_with( self.context.src_cloud, name=self.volume_binding, provides=self.volume_binding, rebind=[self.volume_retrieve]) upload_vol_mock.assert_called_once_with( self.context.src_cloud, name=self.volume_upload, provides=self.volume_upload, rebind=[self.volume_binding], inject={"timeout": int(self.timeout)}) create_vol_mock.assert_called_once_with( self.context.dst_cloud, name=self.volume_ensure, provides=self.volume_ensure, rebind=[self.volume_binding, self.image_ensure, self.user_ensure, self.tenant_ensure], inject={"timeout": int(self.timeout)}) ensure_img_mock.assert_called_once_with( self.context.src_cloud, self.context.dst_cloud, name=self.image_ensure, provides=self.image_ensure, rebind=[self.volume_upload, self.tenant_ensure]) flow_mock.assert_called_once_with( "migrate-{}".format(self.volume_binding)) self.assertEqual(self.context.store, expected_store_dict) self.assertEqual(flow.add.call_args_list, [call(retrieve_vol_mock()), call(upload_vol_mock()), call(ensure_img_mock()), call(create_vol_mock())])