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/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/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..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 @@ -309,16 +309,20 @@ 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(); - - 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; + 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) { + List info = results.getFile(); + if (info != null && info.size() > 0) { + s_logger.info("File " + fileFullPath + " exists on datastore"); + return true; + } } } @@ -359,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();