Fix root folder issue on datastore

This commit is contained in:
Harikrishna Patnala 2020-05-28 16:02:35 +05:30
parent f05b567d4c
commit a72782f2e5
6 changed files with 33 additions and 3 deletions

View File

@ -40,4 +40,5 @@ mvn install:install-file -Dfile=vim25_65.jar -DgroupId=com.cloud.com.vmwa
# From https://my.vmware.com/group/vmware/details?downloadGroup=WEBCLIENTSDK67U2&productId=742
mvn install:install-file -Dfile=vim25_67.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-vim25 -Dversion=6.7 -Dpackaging=jar
# From https://my.vmware.com/group/vmware/get-download?downloadGroup=VS-MGMT-SDK65
mvn install:install-file -Dfile=pbm_65.jar -DgroupId=com.cloud.com.vmware -DartifactId=pbm -Dversion=6.5 -Dpackaging=jar

View File

@ -4913,8 +4913,10 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
assert (morDatastore != null);
DatastoreSummary summary = new DatastoreMO(getServiceContext(), morDatastore).getSummary();
DatastoreMO dsMo = new DatastoreMO(getServiceContext(), morDatastore);
HypervisorHostHelper.createBaseFolderInDatastore(dsMo, hyperHost);
DatastoreSummary summary = dsMo.getSummary();
long capacity = summary.getCapacity();
long available = summary.getFreeSpace();

View File

@ -23,6 +23,8 @@ import org.apache.log4j.Logger;
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
import com.cloud.hypervisor.vmware.mo.DatastoreFile;
import com.cloud.hypervisor.vmware.mo.DatastoreMO;
import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
import com.cloud.utils.Pair;
/**
@ -309,6 +311,10 @@ public class VmwareStorageLayoutHelper {
}
public static String getLegacyDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
return String.format("[%s] %s/%s", dsMo.getName(), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, vmdkFileName);
}
public static String getDeprecatedLegacyDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
return String.format("[%s] %s", dsMo.getName(), vmdkFileName);
}

View File

@ -260,6 +260,12 @@ public class DatastoreMO extends BaseMO {
if (!DatastoreFile.isFullDatastorePath(destFullPath))
destFullPath = String.format("[%s] %s", destDsName, destFilePath);
DatastoreMO srcDsMo = new DatastoreMO(_context, morDestDs);
if (!srcDsMo.fileExists(srcFullPath)) {
s_logger.error(String.format("Cannot move file to destination datastore due to file %s does not exists", srcFullPath));
return false;
}
ManagedObjectReference morTask = _context.getService().moveDatastoreFileTask(morFileManager, srcFullPath, morSrcDc, destFullPath, morDestDc, forceOverwrite);
boolean result = _context.getVimClient().waitForTask(morTask);
@ -267,7 +273,7 @@ public class DatastoreMO extends BaseMO {
_context.waitForTaskProgressDone(morTask);
return true;
} else {
s_logger.error("VMware moveDatgastoreFile_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
s_logger.error("VMware moveDatastoreFile_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
}
return false;
}

View File

@ -842,6 +842,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress +
", poolHostPort: " + poolHostPort + ", poolPath: " + poolPath + ", poolUuid: " + poolUuid);
DatastoreMO dsMo = null;
HostDatastoreSystemMO hostDatastoreSystemMo = getHostDatastoreSystemMO();
ManagedObjectReference morDatastore = hostDatastoreSystemMo.findDatastore(poolUuid);
if (morDatastore == null) {
@ -868,6 +869,7 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
s_logger.trace("vCenter API trace - mountDatastore() done(failed)");
throw new Exception(msg);
}
dsMo = new DatastoreMO(_context, morDatastore);
} else {
morDatastore = _context.getDatastoreMorByPath(poolPath);
if (morDatastore == null) {
@ -879,11 +881,13 @@ public class HostMO extends BaseMO implements VmwareHypervisorHost {
throw new Exception(msg);
}
DatastoreMO dsMo = new DatastoreMO(_context, morDatastore);
dsMo = new DatastoreMO(_context, morDatastore);
dsMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, poolUuid);
}
}
HypervisorHostHelper.createBaseFolderInDatastore(dsMo, this);
if (s_logger.isTraceEnabled())
s_logger.trace("vCenter API trace - mountDatastore() done(successfully)");

View File

@ -138,6 +138,7 @@ public class HypervisorHostHelper {
private static final String UNTAGGED_VLAN_NAME = "untagged";
private static final String VMDK_PACK_DIR = "ova";
private static final String OVA_OPTION_KEY_BOOTDISK = "cloud.ova.bootdisk";
public static final String VSPHERE_DATASTORE_BASE_FOLDER = ".cloudstack.base.folder";
public static VirtualMachineMO findVmFromObjectContent(VmwareContext context, ObjectContent[] ocs, String name, String instanceNameCustomField) {
@ -171,6 +172,7 @@ public class HypervisorHostHelper {
if (morDs == null)
morDs = hyperHost.findDatastore(uuidName);
DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
return morDs;
}
@ -2084,4 +2086,13 @@ public class HypervisorHostHelper {
return DiskControllerType.getType(controller) == DiskControllerType.ide;
}
public static void createBaseFolderInDatastore(DatastoreMO dsMo, VmwareHypervisorHost hyperHost) throws Exception {
String dsPath = String.format("[%s]", dsMo.getName());
String folderPath = String.format("[%s] %s", dsMo.getName(), VSPHERE_DATASTORE_BASE_FOLDER);
if (!dsMo.folderExists(dsPath, VSPHERE_DATASTORE_BASE_FOLDER)) {
s_logger.info(String.format("vSphere datastore base folder: %s does not exist, now creating on datastore: %s", VSPHERE_DATASTORE_BASE_FOLDER, dsMo.getName()));
dsMo.makeDirectory(folderPath, hyperHost.getHyperHostDatacenter());
}
}
}