Skip to content

Commit a72782f

Browse files
Fix root folder issue on datastore
1 parent f05b567 commit a72782f

File tree

6 files changed

+33
-3
lines changed

6 files changed

+33
-3
lines changed

deps/install-non-oss.sh

+1
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ mvn install:install-file -Dfile=vim25_65.jar -DgroupId=com.cloud.com.vmwa
4040
# From https://my.vmware.com/group/vmware/details?downloadGroup=WEBCLIENTSDK67U2&productId=742
4141
mvn install:install-file -Dfile=vim25_67.jar -DgroupId=com.cloud.com.vmware -DartifactId=vmware-vim25 -Dversion=6.7 -Dpackaging=jar
4242

43+
# From https://my.vmware.com/group/vmware/get-download?downloadGroup=VS-MGMT-SDK65
4344
mvn install:install-file -Dfile=pbm_65.jar -DgroupId=com.cloud.com.vmware -DartifactId=pbm -Dversion=6.5 -Dpackaging=jar

plugins/hypervisors/vmware/src/main/java/com/cloud/hypervisor/vmware/resource/VmwareResource.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -4913,8 +4913,10 @@ protected Answer execute(ModifyStoragePoolCommand cmd) {
49134913

49144914
assert (morDatastore != null);
49154915

4916-
DatastoreSummary summary = new DatastoreMO(getServiceContext(), morDatastore).getSummary();
4916+
DatastoreMO dsMo = new DatastoreMO(getServiceContext(), morDatastore);
4917+
HypervisorHostHelper.createBaseFolderInDatastore(dsMo, hyperHost);
49174918

4919+
DatastoreSummary summary = dsMo.getSummary();
49184920
long capacity = summary.getCapacity();
49194921
long available = summary.getFreeSpace();
49204922

plugins/hypervisors/vmware/src/main/java/com/cloud/storage/resource/VmwareStorageLayoutHelper.java

+6
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
2424
import com.cloud.hypervisor.vmware.mo.DatastoreFile;
2525
import com.cloud.hypervisor.vmware.mo.DatastoreMO;
26+
import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
27+
2628
import com.cloud.utils.Pair;
2729

2830
/**
@@ -309,6 +311,10 @@ public static void deleteVolumeVmdkFiles(DatastoreMO dsMo, String volumeName, Da
309311
}
310312

311313
public static String getLegacyDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
314+
return String.format("[%s] %s/%s", dsMo.getName(), HypervisorHostHelper.VSPHERE_DATASTORE_BASE_FOLDER, vmdkFileName);
315+
}
316+
317+
public static String getDeprecatedLegacyDatastorePathFromVmdkFileName(DatastoreMO dsMo, String vmdkFileName) throws Exception {
312318
return String.format("[%s] %s", dsMo.getName(), vmdkFileName);
313319
}
314320

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/DatastoreMO.java

+7-1
Original file line numberDiff line numberDiff line change
@@ -260,14 +260,20 @@ public boolean moveDatastoreFile(String srcFilePath, ManagedObjectReference morS
260260
if (!DatastoreFile.isFullDatastorePath(destFullPath))
261261
destFullPath = String.format("[%s] %s", destDsName, destFilePath);
262262

263+
DatastoreMO srcDsMo = new DatastoreMO(_context, morDestDs);
264+
if (!srcDsMo.fileExists(srcFullPath)) {
265+
s_logger.error(String.format("Cannot move file to destination datastore due to file %s does not exists", srcFullPath));
266+
return false;
267+
}
268+
263269
ManagedObjectReference morTask = _context.getService().moveDatastoreFileTask(morFileManager, srcFullPath, morSrcDc, destFullPath, morDestDc, forceOverwrite);
264270

265271
boolean result = _context.getVimClient().waitForTask(morTask);
266272
if (result) {
267273
_context.waitForTaskProgressDone(morTask);
268274
return true;
269275
} else {
270-
s_logger.error("VMware moveDatgastoreFile_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
276+
s_logger.error("VMware moveDatastoreFile_Task failed due to " + TaskMO.getTaskFailureInfo(_context, morTask));
271277
}
272278
return false;
273279
}

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HostMO.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -842,6 +842,7 @@ public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolH
842842
s_logger.trace("vCenter API trace - mountDatastore(). target MOR: " + _mor.getValue() + ", vmfs: " + vmfsDatastore + ", poolHost: " + poolHostAddress +
843843
", poolHostPort: " + poolHostPort + ", poolPath: " + poolPath + ", poolUuid: " + poolUuid);
844844

845+
DatastoreMO dsMo = null;
845846
HostDatastoreSystemMO hostDatastoreSystemMo = getHostDatastoreSystemMO();
846847
ManagedObjectReference morDatastore = hostDatastoreSystemMo.findDatastore(poolUuid);
847848
if (morDatastore == null) {
@@ -868,6 +869,7 @@ public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolH
868869
s_logger.trace("vCenter API trace - mountDatastore() done(failed)");
869870
throw new Exception(msg);
870871
}
872+
dsMo = new DatastoreMO(_context, morDatastore);
871873
} else {
872874
morDatastore = _context.getDatastoreMorByPath(poolPath);
873875
if (morDatastore == null) {
@@ -879,11 +881,13 @@ public ManagedObjectReference mountDatastore(boolean vmfsDatastore, String poolH
879881
throw new Exception(msg);
880882
}
881883

882-
DatastoreMO dsMo = new DatastoreMO(_context, morDatastore);
884+
dsMo = new DatastoreMO(_context, morDatastore);
883885
dsMo.setCustomFieldValue(CustomFieldConstants.CLOUD_UUID, poolUuid);
884886
}
885887
}
886888

889+
HypervisorHostHelper.createBaseFolderInDatastore(dsMo, this);
890+
887891
if (s_logger.isTraceEnabled())
888892
s_logger.trace("vCenter API trace - mountDatastore() done(successfully)");
889893

vmware-base/src/main/java/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java

+11
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,7 @@ public class HypervisorHostHelper {
138138
private static final String UNTAGGED_VLAN_NAME = "untagged";
139139
private static final String VMDK_PACK_DIR = "ova";
140140
private static final String OVA_OPTION_KEY_BOOTDISK = "cloud.ova.bootdisk";
141+
public static final String VSPHERE_DATASTORE_BASE_FOLDER = ".cloudstack.base.folder";
141142

142143
public static VirtualMachineMO findVmFromObjectContent(VmwareContext context, ObjectContent[] ocs, String name, String instanceNameCustomField) {
143144

@@ -171,6 +172,7 @@ public static ManagedObjectReference findDatastoreWithBackwardsCompatibility(Vmw
171172
if (morDs == null)
172173
morDs = hyperHost.findDatastore(uuidName);
173174

175+
DatastoreMO dsMo = new DatastoreMO(hyperHost.getContext(), morDs);
174176
return morDs;
175177
}
176178

@@ -2084,4 +2086,13 @@ public static boolean isIdeController(String controller) {
20842086
return DiskControllerType.getType(controller) == DiskControllerType.ide;
20852087
}
20862088

2089+
public static void createBaseFolderInDatastore(DatastoreMO dsMo, VmwareHypervisorHost hyperHost) throws Exception {
2090+
String dsPath = String.format("[%s]", dsMo.getName());
2091+
String folderPath = String.format("[%s] %s", dsMo.getName(), VSPHERE_DATASTORE_BASE_FOLDER);
2092+
2093+
if (!dsMo.folderExists(dsPath, VSPHERE_DATASTORE_BASE_FOLDER)) {
2094+
s_logger.info(String.format("vSphere datastore base folder: %s does not exist, now creating on datastore: %s", VSPHERE_DATASTORE_BASE_FOLDER, dsMo.getName()));
2095+
dsMo.makeDirectory(folderPath, hyperHost.getHyperHostDatacenter());
2096+
}
2097+
}
20872098
}

0 commit comments

Comments
 (0)