You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by de...@apache.org on 2013/08/09 10:56:00 UTC
git commit: updated refs/heads/master to 32701f0
Updated Branches:
refs/heads/master ab5ea3feb -> 32701f027
CLOUDSTACK-2670. Migrate volume doesn't allow migration of volumes of a stopped vm.
The findStoragePoolsForMigration and migrateVolume api were explicitly blocking moving
a volume if the instance to which it was attached was stopped. Updated the check for
the same.
Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/32701f02
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/32701f02
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/32701f02
Branch: refs/heads/master
Commit: 32701f027a9bafca154af7eec7677e7557c911a2
Parents: ab5ea3f
Author: Devdeep Singh <de...@gmail.com>
Authored: Fri Aug 9 12:11:51 2013 +0530
Committer: Devdeep Singh <de...@gmail.com>
Committed: Fri Aug 9 14:28:01 2013 +0530
----------------------------------------------------------------------
.../com/cloud/server/ManagementServerImpl.java | 135 ++++++++++---------
.../com/cloud/storage/VolumeManagerImpl.java | 6 -
2 files changed, 72 insertions(+), 69 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/32701f02/server/src/com/cloud/server/ManagementServerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java
index 67496de..cdf7b6f 100755
--- a/server/src/com/cloud/server/ManagementServerImpl.java
+++ b/server/src/com/cloud/server/ManagementServerImpl.java
@@ -1244,18 +1244,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
// Volume must be attached to an instance for live migration.
List<StoragePool> allPools = new ArrayList<StoragePool>();
List<StoragePool> suitablePools = new ArrayList<StoragePool>();
- Long instanceId = volume.getInstanceId();
- VMInstanceVO vm = null;
- if (instanceId != null) {
- vm = _vmInstanceDao.findById(instanceId);
- }
-
- // Check that the VM is in correct state.
- if (vm == null || vm.getState() != State.Running) {
- s_logger.info("Volume " + volume + " isn't attached to any running vm. Only volumes attached to a running" +
- " VM can be migrated.");
- return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
- }
// Volume must be in Ready state to be migrated.
if (!Volume.State.Ready.equals(volume.getState())) {
@@ -1268,70 +1256,91 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe
return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
}
- // Check if the underlying hypervisor supports storage motion.
- boolean storageMotionSupported = false;
- Long hostId = vm.getHostId();
- if (hostId != null) {
- HostVO host = _hostDao.findById(hostId);
- HypervisorCapabilitiesVO capabilities = null;
- if (host != null) {
- capabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(host.getHypervisorType(),
- host.getHypervisorVersion());
- } else {
- s_logger.error("Details of the host on which the vm " + vm + ", to which volume "+ volume + " is "
- + "attached, couldn't be retrieved.");
+ Long instanceId = volume.getInstanceId();
+ VMInstanceVO vm = null;
+ if (instanceId != null) {
+ vm = _vmInstanceDao.findById(instanceId);
+ }
+
+ if (vm == null) {
+ s_logger.info("Volume " + volume + " isn't attached to any vm. Looking for storage pools in the " +
+ "zone to which this volumes can be migrated.");
+ } else if (vm.getState() != State.Running) {
+ s_logger.info("Volume " + volume + " isn't attached to any running vm. Looking for storage pools in the " +
+ "cluster to which this volumes can be migrated.");
+ } else {
+ s_logger.info("Volume " + volume + " is attached to any running vm. Looking for storage pools in the " +
+ "cluster to which this volumes can be migrated.");
+ boolean storageMotionSupported = false;
+ // Check if the underlying hypervisor supports storage motion.
+ Long hostId = vm.getHostId();
+ if (hostId != null) {
+ HostVO host = _hostDao.findById(hostId);
+ HypervisorCapabilitiesVO capabilities = null;
+ if (host != null) {
+ capabilities = _hypervisorCapabilitiesDao.findByHypervisorTypeAndVersion(host.getHypervisorType(),
+ host.getHypervisorVersion());
+ } else {
+ s_logger.error("Details of the host on which the vm " + vm + ", to which volume "+ volume + " is "
+ + "attached, couldn't be retrieved.");
+ }
+
+ if (capabilities != null) {
+ storageMotionSupported = capabilities.isStorageMotionSupported();
+ } else {
+ s_logger.error("Capabilities for host " + host + " couldn't be retrieved.");
+ }
}
- if (capabilities != null) {
- storageMotionSupported = capabilities.isStorageMotionSupported();
- } else {
- s_logger.error("Capabilities for host " + host + " couldn't be retrieved.");
+ if (!storageMotionSupported) {
+ s_logger.info("Volume " + volume + " is attached to a running vm and the hypervisor doesn't support" +
+ " storage motion.");
+ return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
}
}
- if (storageMotionSupported) {
- // Source pool of the volume.
- StoragePoolVO srcVolumePool = _poolDao.findById(volume.getPoolId());
-
- // Get all the pools available. Only shared pools are considered because only a volume on a shared pools
- // can be live migrated while the virtual machine stays on the same host.
- List<StoragePoolVO> storagePools = null;
- if (srcVolumePool.getClusterId() == null) {
- storagePools = _poolDao.findZoneWideStoragePoolsByTags(volume.getDataCenterId(), null);
- } else {
- storagePools = _poolDao.findPoolsByTags(volume.getDataCenterId(), srcVolumePool.getPodId(), srcVolumePool.getClusterId(), null);
- }
+ // Source pool of the volume.
+ StoragePoolVO srcVolumePool = _poolDao.findById(volume.getPoolId());
+ // Get all the pools available. Only shared pools are considered because only a volume on a shared pools
+ // can be live migrated while the virtual machine stays on the same host.
+ List<StoragePoolVO> storagePools = null;
+ if (srcVolumePool.getClusterId() == null) {
+ storagePools = _poolDao.findZoneWideStoragePoolsByTags(volume.getDataCenterId(), null);
+ } else {
+ storagePools = _poolDao.findPoolsByTags(volume.getDataCenterId(), srcVolumePool.getPodId(),
+ srcVolumePool.getClusterId(), null);
+ }
- storagePools.remove(srcVolumePool);
- for (StoragePoolVO pool : storagePools) {
- if (pool.isShared()) {
- allPools.add((StoragePool)dataStoreMgr.getPrimaryDataStore(pool.getId()));
- }
+ storagePools.remove(srcVolumePool);
+ for (StoragePoolVO pool : storagePools) {
+ if (pool.isShared()) {
+ allPools.add((StoragePool)dataStoreMgr.getPrimaryDataStore(pool.getId()));
}
+ }
- // Get all the suitable pools.
- // Exclude the current pool from the list of pools to which the volume can be migrated.
- ExcludeList avoid = new ExcludeList();
- avoid.addPool(srcVolumePool.getId());
+ // Get all the suitable pools.
+ // Exclude the current pool from the list of pools to which the volume can be migrated.
+ ExcludeList avoid = new ExcludeList();
+ avoid.addPool(srcVolumePool.getId());
- // Volume stays in the same cluster after migration.
- DataCenterDeployment plan = new DataCenterDeployment(volume.getDataCenterId(), srcVolumePool.getPodId(),
- srcVolumePool.getClusterId(), null, null, null);
- VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
+ // Volume stays in the same cluster after migration.
+ DataCenterDeployment plan = new DataCenterDeployment(volume.getDataCenterId(), srcVolumePool.getPodId(),
+ srcVolumePool.getClusterId(), null, null, null);
+ VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm);
- DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
- DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType());
+ DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId());
+ DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType());
- // Call the storage pool allocator to find the list of storage pools.
- for (StoragePoolAllocator allocator : _storagePoolAllocators) {
- List<StoragePool> pools = allocator.allocateToPool(diskProfile, profile, plan, avoid,
- StoragePoolAllocator.RETURN_UPTO_ALL);
- if (pools != null && !pools.isEmpty()) {
- suitablePools.addAll(pools);
- break;
- }
+ // Call the storage pool allocator to find the list of storage pools.
+ for (StoragePoolAllocator allocator : _storagePoolAllocators) {
+ List<StoragePool> pools = allocator.allocateToPool(diskProfile, profile, plan, avoid,
+ StoragePoolAllocator.RETURN_UPTO_ALL);
+ if (pools != null && !pools.isEmpty()) {
+ suitablePools.addAll(pools);
+ break;
}
}
+
return new Pair<List<? extends StoragePool>, List<? extends StoragePool>>(allPools, suitablePools);
}
http://git-wip-us.apache.org/repos/asf/cloudstack/blob/32701f02/server/src/com/cloud/storage/VolumeManagerImpl.java
----------------------------------------------------------------------
diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java
index 5cf7b8d..0c1ae228 100644
--- a/server/src/com/cloud/storage/VolumeManagerImpl.java
+++ b/server/src/com/cloud/storage/VolumeManagerImpl.java
@@ -2166,12 +2166,6 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager {
}
}
- // If the disk is not attached to any VM then it can be moved. Otherwise, it needs to be attached to a vm
- // running on a hypervisor that supports storage motion so that it be be migrated.
- if (instanceId != null && !liveMigrateVolume) {
- throw new InvalidParameterValueException("Volume needs to be detached from VM");
- }
-
if (liveMigrateVolume && !cmd.isLiveMigrate()) {
throw new InvalidParameterValueException("The volume " + vol + "is attached to a vm and for migrating it " +
"the parameter livemigrate should be specified");