From 65fe8c421251a406dcd453f5a0d3b7fcd465f6ba Mon Sep 17 00:00:00 2001 From: cloudops Date: Thu, 29 Apr 2021 20:34:58 -0400 Subject: [PATCH 1/3] draft fix to enable creation of vms with solidfire root volumes on vmware67 --- .../motion/StorageSystemDataMotionStrategy.java | 8 +++++--- .../resource/VmwareStorageProcessor.java | 3 ++- .../cloud/hypervisor/vmware/mo/DatastoreMO.java | 17 +++++++++-------- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java index d2d73137721c..28349ef05aab 100644 --- a/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java +++ b/engine/storage/datamotion/src/main/java/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java @@ -1390,10 +1390,12 @@ else if (volumeInfo.getFormat() == ImageFormat.OVA) { verifyCopyCmdAnswer(copyCmdAnswer, templateInfo); + // Seems like vmware 6.5 and above does not automatically remount the datastore after rescanning the storage. + // Not sure if this is needed. // If using VMware, have the host rescan its software HBA if dynamic discovery is in use. - if (HypervisorType.VMware.equals(templateInfo.getHypervisorType())) { - disconnectHostFromVolume(hostVO, volumeInfo.getPoolId(), volumeInfo.get_iScsiName()); - } + //if (HypervisorType.VMware.equals(templateInfo.getHypervisorType())) { + // disconnectHostFromVolume(hostVO, volumeInfo.getPoolId(), volumeInfo.get_iScsiName()); + //} } else { VolumeObjectTO newVolume = new VolumeObjectTO(); diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java index 1584bd003dc4..a15a22912128 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -280,7 +280,8 @@ public ResignatureAnswer resignature(ResignatureCommand cmd) { } } - removeVmfsDatastore(cmd, hyperHost, datastoreName, storageHost, storagePortNumber, trimIqn(iScsiName), lstHosts); + //vmware 6.7 does not automatically mount datastores after rescanning once removed + //removeVmfsDatastore(cmd, hyperHost, datastoreName, storageHost, storagePortNumber, trimIqn(iScsiName), lstHosts); if (!foundExtent) { throw new CloudRuntimeException("Unable to locate the applicable extent"); diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java index 804af6286d10..2d03fd6d77fa 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java @@ -311,14 +311,15 @@ public boolean fileExists(String fileFullPath) throws Exception { DatastoreFile dirFile = new DatastoreFile(file.getDatastoreName(), file.getDir()); HostDatastoreBrowserMO browserMo = getHostDatastoreBrowserMO(); - - s_logger.info("Search file " + file.getFileName() + " on " + dirFile.getPath()); - HostDatastoreBrowserSearchResults results = browserMo.searchDatastore(dirFile.getPath(), file.getFileName(), true); - if (results != null) { - List info = results.getFile(); - if (info != null && info.size() > 0) { - s_logger.info("File " + fileFullPath + " exists on datastore"); - return true; + if(folderExists(String.format("[%s]", file.getDatastoreName()), file.getDir())){ + s_logger.info("Search file " + file.getFileName() + " on " + dirFile.getPath()); + HostDatastoreBrowserSearchResults results = browserMo.searchDatastore(dirFile.getPath(), file.getFileName(), true); + if (results != null) { + List info = results.getFile(); + if (info != null && info.size() > 0) { + s_logger.info("File " + fileFullPath + " exists on datastore"); + return true; + } } } From c0e73768d7969ae81aea471d4cd0b72ae3ce938c Mon Sep 17 00:00:00 2001 From: cloudops Date: Fri, 30 Apr 2021 01:22:34 -0400 Subject: [PATCH 2/3] create fcd folder to maintain compatibility --- .../storage/resource/VmwareStorageLayoutHelper.java | 7 ++++++- .../com/cloud/hypervisor/vmware/mo/DatastoreMO.java | 11 +++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java index 6c66183240ca..f767349498e6 100644 --- a/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java +++ b/plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java @@ -168,12 +168,17 @@ public static String syncVolumeToVmDefaultFolder(DatacenterMO dcMo, String vmNam public static String syncVolumeToVmDefaultFolder(DatacenterMO dcMo, String vmName, DatastoreMO ds, String vmdkName, String excludeFolders) throws Exception { assert (ds != null); + if (!ds.folderExists(String.format("[%s]", ds.getName()), vmName)) { s_logger.info("VM folder does not exist on target datastore, we will create one. vm: " + vmName + ", datastore: " + ds.getName()); - ds.makeDirectory(String.format("[%s] %s", ds.getName(), vmName), dcMo.getMor()); } + if (!ds.folderExists(String.format("[%s]", ds.getName()), "fcd")) { + s_logger.info("fcd folder does not exist on target datastore, we will create one. vm: " + vmName + ", datastore: " + ds.getName()); + ds.makeDirectory(String.format("[%s] %s", ds.getName(), "fcd"), dcMo.getMor()); + } + String[] vmdkLinkedCloneModeLegacyPair = getVmdkFilePairDatastorePath(ds, vmName, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, true); String[] vmdkFullCloneModeLegacyPair = getVmdkFilePairDatastorePath(ds, vmName, vmdkName, VmwareStorageLayoutType.CLOUDSTACK_LEGACY, false); diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java index 2d03fd6d77fa..a19d399092d1 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java @@ -309,9 +309,12 @@ public String[] listDirContent(String path) throws Exception { public boolean fileExists(String fileFullPath) throws Exception { DatastoreFile file = new DatastoreFile(fileFullPath); DatastoreFile dirFile = new DatastoreFile(file.getDatastoreName(), file.getDir()); - - HostDatastoreBrowserMO browserMo = getHostDatastoreBrowserMO(); - if(folderExists(String.format("[%s]", file.getDatastoreName()), file.getDir())){ + Boolean folderExists = true; + if(file.getDir() != ""){ + folderExists = folderExists(String.format("[%s]", file.getDatastoreName()), file.getDir()); + } + if(folderExists){ + HostDatastoreBrowserMO browserMo = getHostDatastoreBrowserMO(); s_logger.info("Search file " + file.getFileName() + " on " + dirFile.getPath()); HostDatastoreBrowserSearchResults results = browserMo.searchDatastore(dirFile.getPath(), file.getFileName(), true); if (results != null) { @@ -360,7 +363,7 @@ public long fileDiskSize(String fileFullPath) throws Exception { public boolean folderExists(String folderParentDatastorePath, String folderName) throws Exception { HostDatastoreBrowserMO browserMo = getHostDatastoreBrowserMO(); - + s_logger.info("Search folder " + folderName + " on " + folderParentDatastorePath); HostDatastoreBrowserSearchResults results = browserMo.searchDatastore(folderParentDatastorePath, folderName, true); if (results != null) { List info = results.getFile(); From a6e9386b2d63a5d692d387487bcc03c5ff1dce15 Mon Sep 17 00:00:00 2001 From: Pierre-Luc Dion Date: Tue, 11 May 2021 15:21:06 -0400 Subject: [PATCH 3/3] Update vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java Co-authored-by: Daniel Augusto Veronezi Salvador <38945620+GutoVeronezi@users.noreply.github.com> --- .../main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java index a19d399092d1..d4be67b5879f 100644 --- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java +++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java @@ -313,7 +313,7 @@ public boolean fileExists(String fileFullPath) throws Exception { if(file.getDir() != ""){ folderExists = folderExists(String.format("[%s]", file.getDatastoreName()), file.getDir()); } - if(folderExists){ + if (folderExists){ HostDatastoreBrowserMO browserMo = getHostDatastoreBrowserMO(); s_logger.info("Search file " + file.getFileName() + " on " + dirFile.getPath()); HostDatastoreBrowserSearchResults results = browserMo.searchDatastore(dirFile.getPath(), file.getFileName(), true);