Repository: cloudstack
Updated Branches:
  refs/heads/master 77bd069cc -> cb211f18d


CLOUDSTACK-8113. VM migration fails with "Message: No such disk device: " error.
Consolidate VM disks once VM/volumes are migrated.


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

Branch: refs/heads/master
Commit: cb211f18d14dcc9d988254a4b50b55ca0b080ed5
Parents: 77bd069
Author: Likitha Shetty <likitha.she...@citrix.com>
Authored: Tue Dec 23 14:20:34 2014 +0530
Committer: Likitha Shetty <likitha.she...@citrix.com>
Committed: Tue Dec 23 14:28:17 2014 +0530

----------------------------------------------------------------------
 .../vmware/resource/VmwareResource.java         | 24 ++++++++++++++++++++
 .../hypervisor/vmware/mo/VirtualMachineMO.java  | 12 ++++++++++
 2 files changed, 36 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb211f18/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 c2cf9e9..5a16f03 100644
--- 
a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ 
b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -3054,6 +3054,18 @@ public class VmwareResource implements 
StoragePoolResource, ServerResource, Vmwa
                 s_logger.debug("Successfully migrated storage of VM " + vmName 
+ " to target datastore(s)");
             }
 
+            // Consolidate VM disks.
+            // In case of a linked clone VM, if VM's disks are not 
consolidated,
+            // further VM operations such as volume snapshot, VM 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. Yet proceeding with VM migration.");
+                } else {
+                    s_logger.debug("Successfully consolidated disks of VM " + 
vmName + ".");
+                }
+            }
+
             // Update and return volume path for every disk because that could 
have changed after migration
             for (Entry<VolumeTO, StorageFilerTO> entry : 
volToFiler.entrySet()) {
                 volume = entry.getKey();
@@ -3163,6 +3175,18 @@ public class VmwareResource implements 
StoragePoolResource, ServerResource, Vmwa
                 s_logger.debug("Successfully migrated volume " + volumePath + 
" to target datastore " + tgtDsName);
             }
 
+            // Consolidate VM disks.
+            // 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 + ".");
+                }
+            }
+
             // Update and return volume path because that could have changed 
after migration
             if (!targetDsMo.fileExists(fullVolumePath)) {
                 VirtualDisk[] disks = vmMo.getAllDiskDevice();

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/cb211f18/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 c2e9d7f..471b4a8 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -2638,4 +2638,16 @@ public class VirtualMachineMO extends BaseMO {
         }
         return guestOsSupportsMemoryHotAdd && 
virtualHardwareSupportsMemoryHotAdd;
     }
+
+    public boolean consolidateVmDisks() throws Exception {
+        ManagedObjectReference morTask = 
_context.getService().consolidateVMDisksTask(_mor);
+        boolean result = _context.getVimClient().waitForTask(morTask);
+        if (result) {
+            _context.waitForTaskProgressDone(morTask);
+            return true;
+        } else {
+            s_logger.error("VMware ConsolidateVMDisks_Task failed due to " + 
TaskMO.getTaskFailureInfo(_context, morTask));
+        }
+        return false;
+    }
 }

Reply via email to