cloudstack-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From bhais...@apache.org
Subject [4/7] git commit: updated refs/heads/4.5 to 48c1ffd
Date Fri, 17 Apr 2015 14:06:13 GMT
CLOUDSTACK-8319. For both 'MigrateVolume' and 'MigrateVMWithVolumes, ensure VM's vconfiguration
files are migrated along with VM's root volume.

(cherry picked from commit bdd28a45ed1cc8046c63d0e840e54975e5b74ab5)
Signed-off-by: Rohit Yadav <rohit.yadav@shapeblue.com>


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/55f2e45d
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/55f2e45d
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/55f2e45d

Branch: refs/heads/4.5
Commit: 55f2e45d14fe08fc88540616b7b3720fe12f5d4b
Parents: 89dbd1e
Author: Likitha Shetty <likitha.shetty@citrix.com>
Authored: Thu Mar 5 14:24:46 2015 +0530
Committer: Rohit Yadav <rohit.yadav@shapeblue.com>
Committed: Fri Apr 17 15:42:02 2015 +0200

----------------------------------------------------------------------
 .../agent/api/storage/MigrateVolumeCommand.java |  9 +++-
 .../motion/AncientDataMotionStrategy.java       |  2 +-
 .../vmware/resource/VmwareResource.java         | 45 +++++++++++++++-----
 .../hypervisor/vmware/mo/VirtualMachineMO.java  | 20 +++++++++
 4 files changed, 63 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/55f2e45d/core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java
----------------------------------------------------------------------
diff --git a/core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java b/core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java
index e5ba211..b409944 100644
--- a/core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java
+++ b/core/src/com/cloud/agent/api/storage/MigrateVolumeCommand.java
@@ -22,6 +22,7 @@ package com.cloud.agent.api.storage;
 import com.cloud.agent.api.Command;
 import com.cloud.agent.api.to.StorageFilerTO;
 import com.cloud.storage.StoragePool;
+import com.cloud.storage.Volume;
 
 public class MigrateVolumeCommand extends Command {
 
@@ -29,6 +30,7 @@ public class MigrateVolumeCommand extends Command {
     String volumePath;
     StorageFilerTO pool;
     String attachedVmName;
+    Volume.Type volumeType;
 
     public MigrateVolumeCommand(long volumeId, String volumePath, StoragePool pool, int timeout)
{
         this.volumeId = volumeId;
@@ -37,11 +39,12 @@ public class MigrateVolumeCommand extends Command {
         this.setWait(timeout);
     }
 
-    public MigrateVolumeCommand(long volumeId, String volumePath, StoragePool pool, String
attachedVmName, int timeout) {
+    public MigrateVolumeCommand(long volumeId, String volumePath, StoragePool pool, String
attachedVmName, Volume.Type volumeType, int timeout) {
         this.volumeId = volumeId;
         this.volumePath = volumePath;
         this.pool = new StorageFilerTO(pool);
         this.attachedVmName = attachedVmName;
+        this.volumeType = volumeType;
         this.setWait(timeout);
     }
 
@@ -65,4 +68,8 @@ public class MigrateVolumeCommand extends Command {
     public String getAttachedVmName() {
         return attachedVmName;
     }
+
+    public Volume.Type getVolumeType() {
+        return volumeType;
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/55f2e45d/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
----------------------------------------------------------------------
diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
index 203cfa4..7e572c3 100644
--- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
+++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java
@@ -389,7 +389,7 @@ public class AncientDataMotionStrategy implements DataMotionStrategy {
 
         VolumeInfo volume = (VolumeInfo)srcData;
         StoragePool destPool = (StoragePool)dataStoreMgr.getDataStore(destData.getDataStore().getId(),
DataStoreRole.Primary);
-        MigrateVolumeCommand command = new MigrateVolumeCommand(volume.getId(), volume.getPath(),
destPool, volume.getAttachedVmName(), waitInterval);
+        MigrateVolumeCommand command = new MigrateVolumeCommand(volume.getId(), volume.getPath(),
destPool, volume.getAttachedVmName(), volume.getVolumeType(), waitInterval);
         EndPoint ep = selector.select(srcData, StorageAction.MIGRATEVOLUME);
         Answer answer = null;
         if (ep == null) {

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/55f2e45d/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index 8c7a012..ac93f9d 100755
--- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -3029,7 +3029,6 @@ public class VmwareResource implements StoragePoolResource, ServerResource,
Vmwa
         List<VirtualMachineRelocateSpecDiskLocator> diskLocators = new ArrayList<VirtualMachineRelocateSpecDiskLocator>();
         VirtualMachineRelocateSpecDiskLocator diskLocator = null;
 
-        boolean isFirstDs = true;
         String tgtDsName = "";
         String tgtDsHost;
         String tgtDsPath;
@@ -3118,9 +3117,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource,
Vmwa
                     morTgtDatastore = morDsAtSource;
                 }
 
-                if (isFirstDs) {
+                if (volume.getType() == Volume.Type.ROOT) {
                     relocateSpec.setDatastore(morTgtDatastore);
-                    isFirstDs = false;
                 }
                 diskLocator = new VirtualMachineRelocateSpecDiskLocator();
                 diskLocator.setDatastore(morTgtDatastore);
@@ -3130,6 +3128,18 @@ public class VmwareResource implements StoragePoolResource, ServerResource,
Vmwa
                 diskLocators.add(diskLocator);
                 volumeDeviceKey.put(volume.getId(), diskId);
             }
+            // If a target datastore is provided for the VM, then by default all volumes
associated with the VM will be migrated to that target datastore.
+            // Hence set the existing datastore as target datastore for volumes that are
not to be migrated.
+            List<Pair<Integer, ManagedObjectReference>> diskDatastores = vmMo.getAllDiskDatastores();
+            for (Pair<Integer, ManagedObjectReference> diskDatastore : diskDatastores)
{
+                if (!volumeDeviceKey.containsValue(diskDatastore.first().intValue())) {
+                    diskLocator = new VirtualMachineRelocateSpecDiskLocator();
+                    diskLocator.setDiskId(diskDatastore.first().intValue());
+                    diskLocator.setDatastore(diskDatastore.second());
+                    diskLocators.add(diskLocator);
+                }
+            }
+
             relocateSpec.getDisk().addAll(diskLocators);
 
             // Prepare network at target before migration
@@ -3231,6 +3241,7 @@ public class VmwareResource implements StoragePoolResource, ServerResource,
Vmwa
     private Answer execute(MigrateVolumeCommand cmd) {
         String volumePath = cmd.getVolumePath();
         StorageFilerTO poolTo = cmd.getPool();
+        Volume.Type volumeType = cmd.getVolumeType();
 
         if (s_logger.isInfoEnabled()) {
             s_logger.info("Executing resource MigrateVolumeCommand: " + _gson.toJson(cmd));
@@ -3277,9 +3288,23 @@ public class VmwareResource implements StoragePoolResource, ServerResource,
Vmwa
             diskLocator = new VirtualMachineRelocateSpecDiskLocator();
             diskLocator.setDatastore(morDs);
             diskLocator.setDiskId(diskId);
-
             diskLocators.add(diskLocator);
-            relocateSpec.getDisk().add(diskLocator);
+            if (cmd.getVolumeType() == Volume.Type.ROOT) {
+                relocateSpec.setDatastore(morDs);
+                // If a target datastore is provided for the VM, then by default all volumes
associated with the VM will be migrated to that target datastore.
+                // Hence set the existing datastore as target datastore for volumes that
are not to be migrated.
+                List<Pair<Integer, ManagedObjectReference>> diskDatastores =
vmMo.getAllDiskDatastores();
+                for (Pair<Integer, ManagedObjectReference> diskDatastore : diskDatastores)
{
+                    if (diskDatastore.first().intValue() != diskId) {
+                        diskLocator = new VirtualMachineRelocateSpecDiskLocator();
+                        diskLocator.setDiskId(diskDatastore.first().intValue());
+                        diskLocator.setDatastore(diskDatastore.second());
+                        diskLocators.add(diskLocator);
+                    }
+                }
+            }
+
+            relocateSpec.getDisk().addAll(diskLocators);
 
             // Change datastore
             if (!vmMo.changeDatastore(relocateSpec)) {
@@ -3292,12 +3317,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource,
Vmwa
             // In case of a linked clone VM, if VM's disks are not consolidated,
             // further volume operations on the ROOT volume such as volume snapshot etc.
will result in DB inconsistencies.
             String apiVersion = HypervisorHostHelper.getVcenterApiVersion(vmMo.getContext());
-            if (apiVersion.compareTo("5.0") >= 0) {
-                if (!vmMo.consolidateVmDisks()) {
-                    s_logger.warn("VM disk consolidation failed after storage migration.");
-                } else {
-                    s_logger.debug("Successfully consolidated disks of VM " + vmName + ".");
-                }
+            if (!vmMo.consolidateVmDisks()) {
+                s_logger.warn("VM disk consolidation failed after storage migration.");
+            } else {
+                s_logger.debug("Successfully consolidated disks of VM " + vmName + ".");
             }
 
             // Update and return volume path because that could have changed after migration

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/55f2e45d/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 51ddd75..c037842 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -2083,6 +2083,26 @@ public class VirtualMachineMO extends BaseMO {
         return builder;
     }
 
+    public List<Pair<Integer, ManagedObjectReference>> getAllDiskDatastores()
throws Exception {
+        List<Pair<Integer, ManagedObjectReference>> disks = new ArrayList<Pair<Integer,
ManagedObjectReference>>();
+
+        List<VirtualDevice> devices = _context.getVimClient().getDynamicProperty(_mor,
"config.hardware.device");
+        if (devices != null && devices.size() > 0) {
+            for (VirtualDevice device : devices) {
+                if (device instanceof VirtualDisk) {
+                    VirtualDeviceBackingInfo backingInfo = ((VirtualDisk)device).getBacking();
+                    if (backingInfo instanceof VirtualDiskFlatVer2BackingInfo) {
+                        VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo;
+                        disks.add(new Pair<Integer, ManagedObjectReference>(new Integer(device.getKey()),
diskBackingInfo.getDatastore()));
+                    }
+                }
+            }
+        }
+
+        return disks;
+    }
+
+
     @Deprecated
     public List<Pair<String, ManagedObjectReference>> getDiskDatastorePathChain(VirtualDisk
disk, boolean followChain) throws Exception {
         VirtualDeviceBackingInfo backingInfo = disk.getBacking();


Mime
View raw message