Adding vSphere storage policy to disk on start command and attach volume command

This commit is contained in:
Harikrishna Patnala 2020-10-11 22:47:47 +05:30
parent 1e4e5cf4c0
commit 46b5322d9b
7 changed files with 97 additions and 5 deletions

View File

@ -64,6 +64,7 @@ public class VolumeObjectTO implements DataTO {
private boolean directDownload;
private boolean deployAsIs;
private String updatedDataStoreUUID;
private String vSphereStoragePolicyId;
public VolumeObjectTO() {
@ -105,6 +106,7 @@ public class VolumeObjectTO implements DataTO {
this.migrationOptions = volume.getMigrationOptions();
this.directDownload = volume.isDirectDownload();
this.deployAsIs = volume.isDeployAsIs();
this.vSphereStoragePolicyId = volume.getvSphereStoragePolicyId();
}
public String getUuid() {
@ -329,4 +331,11 @@ public class VolumeObjectTO implements DataTO {
this.updatedDataStoreUUID = updatedDataStoreUUID;
}
public String getvSphereStoragePolicyId() {
return vSphereStoragePolicyId;
}
public void setvSphereStoragePolicyId(String vSphereStoragePolicyId) {
this.vSphereStoragePolicyId = vSphereStoragePolicyId;
}
}

View File

@ -87,4 +87,6 @@ public interface VolumeInfo extends DataObject, Volume {
boolean isDeployAsIs();
String getDeployAsIsConfiguration();
public String getvSphereStoragePolicyId();
}

View File

@ -20,12 +20,18 @@ import java.util.Date;
import javax.inject.Inject;
import com.cloud.dc.VsphereStoragePolicyVO;
import com.cloud.dc.dao.VsphereStoragePolicyDao;
import com.cloud.service.dao.ServiceOfferingDetailsDao;
import com.cloud.storage.MigrationOptions;
import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeDetailVO;
import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDetailsDao;
import com.cloud.vm.VmDetailConstants;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.resourcedetail.dao.DiskOfferingDetailsDao;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
@ -81,9 +87,17 @@ public class VolumeObject implements VolumeInfo {
VMTemplateDao templateDao;
@Inject
VolumeDetailsDao volumeDetailsDao;
@Inject
ServiceOfferingDetailsDao serviceOfferingDetailsDao;
@Inject
DiskOfferingDetailsDao diskOfferingDetailsDao;
@Inject
VsphereStoragePolicyDao vsphereStoragePolicyDao;
private Object payload;
private MigrationOptions migrationOptions;
private boolean directDownload;
private String vSphereStoragePolicyId;
public VolumeObject() {
_volStateMachine = Volume.State.getStateMachine();
@ -780,6 +794,29 @@ public class VolumeObject implements VolumeInfo {
}
public String getvSphereStoragePolicyId() {
if (StringUtils.isEmpty(vSphereStoragePolicyId)) {
if (Volume.Type.ROOT == getVolumeType()) {
Long vmId = volumeVO.getInstanceId();
if (vmId != null) {
VMInstanceVO vm = vmInstanceDao.findByIdIncludingRemoved(vmId);
String storagePolicyVOid = serviceOfferingDetailsDao.getDetail(vm.getServiceOfferingId(),
ApiConstants.STORAGE_POLICY);
VsphereStoragePolicyVO vsphereStoragePolicyVO = vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyVOid));
vSphereStoragePolicyId = vsphereStoragePolicyVO.getPolicyId();
}
} else {
String storagePolicyVOid = diskOfferingDetailsDao.getDetail(volumeVO.getDiskOfferingId(),
ApiConstants.STORAGE_POLICY);
VsphereStoragePolicyVO vsphereStoragePolicyVO = vsphereStoragePolicyDao.findById(Long.parseLong(storagePolicyVOid));
vSphereStoragePolicyId = vsphereStoragePolicyVO.getPolicyId();
}
}
return vSphereStoragePolicyId;
}
@Override
public ImageFormat getFormat() {
return volumeVO.getFormat();

View File

@ -219,6 +219,7 @@ import com.cloud.hypervisor.vmware.mo.HostMO;
import com.cloud.hypervisor.vmware.mo.HostStorageSystemMO;
import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
import com.cloud.hypervisor.vmware.mo.NetworkDetails;
import com.cloud.hypervisor.vmware.mo.PbmProfileManagerMO;
import com.cloud.hypervisor.vmware.mo.TaskMO;
import com.cloud.hypervisor.vmware.mo.StoragepodMO;
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
@ -289,6 +290,7 @@ import com.vmware.vim25.HostInternetScsiHba;
import com.vmware.vim25.HostPortGroupSpec;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.NasDatastoreInfo;
import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
import com.vmware.vim25.ObjectContent;
import com.vmware.vim25.OptionValue;
import com.vmware.vim25.PerfCounterInfo;
@ -1798,6 +1800,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
VirtualMachineFileInfo existingVmFileInfo = null;
VirtualMachineFileLayoutEx existingVmFileLayout = null;
List<DatastoreMO> existingDatastores = new ArrayList<DatastoreMO>();
String diskStoragePolicyId = null;
String vmStoragePolicyId = null;
VirtualMachineDefinedProfileSpec diskProfileSpec = null;
VirtualMachineDefinedProfileSpec vmProfileSpec = null;
DeployAsIsInfoTO deployAsIsInfo = vmSpec.getDeployAsIsInfo();
boolean deployAsIs = deployAsIsInfo != null;
@ -2218,8 +2225,20 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
VirtualDevice device = VmwareHelper.prepareDiskDevice(vmMo, null, controllerKey, diskChain, volumeDsDetails.first(), deviceNumber, i + 1);
if (vol.getType() == Volume.Type.ROOT)
diskStoragePolicyId = volumeTO.getvSphereStoragePolicyId();
if (!StringUtils.isEmpty(diskStoragePolicyId)) {
PbmProfileManagerMO profMgrMo = new PbmProfileManagerMO(context);
diskProfileSpec = profMgrMo.getProfileSpec(diskStoragePolicyId);
deviceConfigSpecArray[i].getProfile().add(diskProfileSpec);
if (s_logger.isDebugEnabled()) {
s_logger.debug(String.format("Adding vSphere storage profile: %s to virtual disk [%s]", diskStoragePolicyId, _gson.toJson(device)));
}
}
if (vol.getType() == Volume.Type.ROOT) {
rootDiskTO = vol;
vmStoragePolicyId = diskStoragePolicyId;
vmProfileSpec = diskProfileSpec;
}
deviceConfigSpecArray[i].setDevice(device);
deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.ADD);
@ -2393,6 +2412,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
setBootOptions(vmSpec, bootMode, vmConfigSpec);
}
if (!StringUtils.isEmpty(vmStoragePolicyId)) {
vmConfigSpec.getVmProfile().add(vmProfileSpec);
if (s_logger.isTraceEnabled()) {
s_logger.trace(String.format("Configuring the VM %s with storage policy: %s", vmInternalCSName, vmStoragePolicyId));
}
}
//
// Configure VM
//

View File

@ -2052,6 +2052,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
VolumeObjectTO volumeTO = (VolumeObjectTO)disk.getData();
DataStoreTO primaryStore = volumeTO.getDataStore();
String volumePath = volumeTO.getPath();
String storagePolicyId = volumeTO.getvSphereStoragePolicyId();
String vmdkPath = isManaged ? resource.getVmdkPath(volumePath) : null;
@ -2193,7 +2194,7 @@ public class VmwareStorageProcessor implements StorageProcessor {
diskController = vmMo.getRecommendedDiskController(null);
}
vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs, diskController);
vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs, diskController, storagePolicyId);
VirtualMachineDiskInfoBuilder diskInfoBuilder = vmMo.getDiskInfoBuilder();
VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(volumePath, dsMo.getName());
chainInfo = _gson.toJson(diskInfo);

View File

@ -27,6 +27,7 @@ import com.vmware.pbm.PbmProfileResourceType;
import com.vmware.pbm.PbmProfileResourceTypeEnum;
import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
import org.apache.log4j.Logger;
import java.util.Collections;
@ -89,6 +90,15 @@ public class PbmProfileManagerMO extends BaseMO {
resourceType.setResourceType(PbmProfileResourceTypeEnum.STORAGE.value());
return resourceType;
}
public VirtualMachineDefinedProfileSpec getProfileSpec(String profileId) throws Exception {
VirtualMachineDefinedProfileSpec profileSpec = new VirtualMachineDefinedProfileSpec();
PbmProfile profile = getStorageProfile(profileId);
profileSpec.setProfileId(profile.getProfileId().getUniqueId());
return profileSpec;
}
}

View File

@ -105,6 +105,7 @@ import com.vmware.vim25.VirtualMachineSnapshotInfo;
import com.vmware.vim25.VirtualMachineSnapshotTree;
import com.vmware.vim25.VirtualSCSIController;
import com.vmware.vim25.VirtualSCSISharing;
import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo;
import com.cloud.hypervisor.vmware.util.VmwareContext;
@ -1293,10 +1294,10 @@ public class VirtualMachineMO extends BaseMO {
}
public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs) throws Exception {
attachDisk(vmdkDatastorePathChain, morDs, null);
attachDisk(vmdkDatastorePathChain, morDs, null, null);
}
public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs, String diskController) throws Exception {
public void attachDisk(String[] vmdkDatastorePathChain, ManagedObjectReference morDs, String diskController, String storagePolicyId) throws Exception {
if(s_logger.isTraceEnabled())
s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: "
@ -1337,7 +1338,14 @@ public class VirtualMachineMO extends BaseMO {
deviceConfigSpec.setDevice(newDisk);
deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD);
if (!StringUtils.isEmpty(storagePolicyId)) {
PbmProfileManagerMO profMgrMo = new PbmProfileManagerMO(getContext());
VirtualMachineDefinedProfileSpec diskProfileSpec = profMgrMo.getProfileSpec(storagePolicyId);
deviceConfigSpec.getProfile().add(diskProfileSpec);
if (s_logger.isDebugEnabled()) {
s_logger.debug(String.format("Adding vSphere storage profile: %s to volume [%s]", storagePolicyId, vmdkDatastorePathChain[0]));
}
}
reConfigSpec.getDeviceChange().add(deviceConfigSpec);
ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec);