diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml
index c0a70af6abdc..9249c50e39e1 100644
--- a/engine/storage/datamotion/pom.xml
+++ b/engine/storage/datamotion/pom.xml
@@ -45,5 +45,11 @@
${project.version}
runtime
+
+ org.apache.maven
+ maven-artifact
+ 3.8.2
+ compile
+
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 b48ae6d22dc0..6745e9a44ef7 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
@@ -19,15 +19,18 @@
package org.apache.cloudstack.storage.motion;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
import javax.inject.Inject;
@@ -68,9 +71,11 @@
import org.apache.cloudstack.storage.datastore.db.StoragePoolVO;
import org.apache.cloudstack.storage.to.PrimaryDataStoreTO;
import org.apache.cloudstack.storage.to.VolumeObjectTO;
+import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
+import org.apache.maven.artifact.versioning.ComparableVersion;
import com.cloud.agent.AgentManager;
import com.cloud.agent.api.Answer;
@@ -133,10 +138,6 @@
import com.cloud.vm.VirtualMachineManager;
import com.cloud.vm.dao.VMInstanceDao;
import com.google.common.base.Preconditions;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.stream.Collectors;
-import org.apache.commons.collections.CollectionUtils;
public class StorageSystemDataMotionStrategy implements DataMotionStrategy {
private static final Logger LOGGER = Logger.getLogger(StorageSystemDataMotionStrategy.class);
@@ -187,6 +188,14 @@ public class StorageSystemDataMotionStrategy implements DataMotionStrategy {
@Inject
VMTemplatePoolDao templatePoolDao;
+ private boolean isVMwareHostWithVersionOrHigher(Host host, String requiredVersion) {
+ if (!HypervisorType.VMware.equals(host.getHypervisorType()) || StringUtils.isBlank(requiredVersion)) {
+ return false;
+ }
+ ComparableVersion version = new ComparableVersion(host.getHypervisorVersion());
+ return version.compareTo(new ComparableVersion(requiredVersion)) >= 0;
+ }
+
@Override
public StrategyPriority canHandle(DataObject srcData, DataObject destData) {
if (srcData instanceof SnapshotInfo) {
@@ -2133,6 +2142,9 @@ protected String connectHostToVolume(Host host, long storagePoolId, String iqn)
}
private void disconnectHostFromVolume(Host host, long storagePoolId, String iqn) {
+ if (isVMwareHostWithVersionOrHigher(host, "6.5")) {
+ return;
+ }
ModifyTargetsCommand modifyTargetsCommand = getModifyTargetsCommand(storagePoolId, iqn, false);
sendModifyTargetsCommand(modifyTargetsCommand, host.getId());
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 1cb57c37813d..455bf3a73a39 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()), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER)) {
+ s_logger.info(String.format("%s folder does not exist on target datastore, we will create one. vm: %s, datastore: %s", HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, vmName, ds.getName()));
+ ds.makeDirectory(String.format("[%s] %s", ds.getName(), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER), 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 d2f7fc88a3b9..f574c8bf6a51 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
@@ -3117,6 +3117,9 @@ private void removeVmfsDatastore(Command cmd, VmwareHypervisorHost hyperHost, St
private void removeVmfsDatastore(Command cmd, VmwareHypervisorHost hyperHost, String datastoreName, String storageIpAddress, int storagePortNumber,
String iqn, List> lstHosts) throws Exception {
+ if (HypervisorHostHelper.isHostVersionEqualOrHigher(hyperHost, "6.5")) {
+ return;
+ }
VmwareContext context = hostService.getServiceContext(cmd);
unmountVmfsDatastore(context, hyperHost, datastoreName, lstHosts);
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 a76e7d94346d..33554e098eee 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
@@ -21,6 +21,8 @@
import java.util.ArrayList;
import java.util.List;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.cloud.exception.CloudException;
@@ -314,16 +316,19 @@ 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(StringUtils.isNotBlank(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) {
+ if (CollectionUtils.isNotEmpty(results.getFile())) {
+ s_logger.info("File " + fileFullPath + " exists on datastore");
+ return true;
+ }
}
}
@@ -364,7 +369,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();
diff --git a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
index 9f950024f13f..38d3c3ce93f3 100644
--- a/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
+++ b/vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java
@@ -2339,4 +2339,20 @@ public static String getMinimumHostHardwareVersion(VmwareHypervisorHost host1, V
}
return hardwareVersion;
}
+
+ public static boolean isHostVersionEqualOrHigher(VmwareHypervisorHost host, String requiredVersion) {
+ if (StringUtils.isBlank(requiredVersion)) {
+ return false;
+ }
+ HostMO hostMo = new HostMO(host.getContext(), host.getMor());
+ String hostApiVersion = "";
+ try {
+ hostApiVersion = hostMo.getHostAboutInfo().getApiVersion();
+ } catch (Exception ignored) {}
+ if (StringUtils.isBlank(hostApiVersion)) {
+ return false;
+ }
+ ComparableVersion version = new ComparableVersion(hostApiVersion);
+ return version.compareTo(new ComparableVersion(requiredVersion)) >= 0;
+ }
}