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 directDownload;
private boolean deployAsIs; private boolean deployAsIs;
private String updatedDataStoreUUID; private String updatedDataStoreUUID;
private String vSphereStoragePolicyId;
public VolumeObjectTO() { public VolumeObjectTO() {
@ -105,6 +106,7 @@ public class VolumeObjectTO implements DataTO {
this.migrationOptions = volume.getMigrationOptions(); this.migrationOptions = volume.getMigrationOptions();
this.directDownload = volume.isDirectDownload(); this.directDownload = volume.isDirectDownload();
this.deployAsIs = volume.isDeployAsIs(); this.deployAsIs = volume.isDeployAsIs();
this.vSphereStoragePolicyId = volume.getvSphereStoragePolicyId();
} }
public String getUuid() { public String getUuid() {
@ -329,4 +331,11 @@ public class VolumeObjectTO implements DataTO {
this.updatedDataStoreUUID = updatedDataStoreUUID; 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(); boolean isDeployAsIs();
String getDeployAsIsConfiguration(); String getDeployAsIsConfiguration();
public String getvSphereStoragePolicyId();
} }

View File

@ -20,12 +20,18 @@ import java.util.Date;
import javax.inject.Inject; 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.MigrationOptions;
import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateVO;
import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.VolumeDetailVO;
import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateDao;
import com.cloud.storage.dao.VolumeDetailsDao; import com.cloud.storage.dao.VolumeDetailsDao;
import com.cloud.vm.VmDetailConstants; 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.log4j.Logger;
import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore;
@ -81,9 +87,17 @@ public class VolumeObject implements VolumeInfo {
VMTemplateDao templateDao; VMTemplateDao templateDao;
@Inject @Inject
VolumeDetailsDao volumeDetailsDao; VolumeDetailsDao volumeDetailsDao;
@Inject
ServiceOfferingDetailsDao serviceOfferingDetailsDao;
@Inject
DiskOfferingDetailsDao diskOfferingDetailsDao;
@Inject
VsphereStoragePolicyDao vsphereStoragePolicyDao;
private Object payload; private Object payload;
private MigrationOptions migrationOptions; private MigrationOptions migrationOptions;
private boolean directDownload; private boolean directDownload;
private String vSphereStoragePolicyId;
public VolumeObject() { public VolumeObject() {
_volStateMachine = Volume.State.getStateMachine(); _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 @Override
public ImageFormat getFormat() { public ImageFormat getFormat() {
return volumeVO.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.HostStorageSystemMO;
import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper; import com.cloud.hypervisor.vmware.mo.HypervisorHostHelper;
import com.cloud.hypervisor.vmware.mo.NetworkDetails; 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.TaskMO;
import com.cloud.hypervisor.vmware.mo.StoragepodMO; import com.cloud.hypervisor.vmware.mo.StoragepodMO;
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType; 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.HostPortGroupSpec;
import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.NasDatastoreInfo; import com.vmware.vim25.NasDatastoreInfo;
import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
import com.vmware.vim25.ObjectContent; import com.vmware.vim25.ObjectContent;
import com.vmware.vim25.OptionValue; import com.vmware.vim25.OptionValue;
import com.vmware.vim25.PerfCounterInfo; import com.vmware.vim25.PerfCounterInfo;
@ -1798,6 +1800,11 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
VirtualMachineFileInfo existingVmFileInfo = null; VirtualMachineFileInfo existingVmFileInfo = null;
VirtualMachineFileLayoutEx existingVmFileLayout = null; VirtualMachineFileLayoutEx existingVmFileLayout = null;
List<DatastoreMO> existingDatastores = new ArrayList<DatastoreMO>(); List<DatastoreMO> existingDatastores = new ArrayList<DatastoreMO>();
String diskStoragePolicyId = null;
String vmStoragePolicyId = null;
VirtualMachineDefinedProfileSpec diskProfileSpec = null;
VirtualMachineDefinedProfileSpec vmProfileSpec = null;
DeployAsIsInfoTO deployAsIsInfo = vmSpec.getDeployAsIsInfo(); DeployAsIsInfoTO deployAsIsInfo = vmSpec.getDeployAsIsInfo();
boolean deployAsIs = deployAsIsInfo != null; 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); 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; rootDiskTO = vol;
vmStoragePolicyId = diskStoragePolicyId;
vmProfileSpec = diskProfileSpec;
}
deviceConfigSpecArray[i].setDevice(device); deviceConfigSpecArray[i].setDevice(device);
deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.ADD); deviceConfigSpecArray[i].setOperation(VirtualDeviceConfigSpecOperation.ADD);
@ -2393,6 +2412,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
setBootOptions(vmSpec, bootMode, vmConfigSpec); 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 // Configure VM
// //

View File

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

View File

@ -27,6 +27,7 @@ import com.vmware.pbm.PbmProfileResourceType;
import com.vmware.pbm.PbmProfileResourceTypeEnum; import com.vmware.pbm.PbmProfileResourceTypeEnum;
import com.vmware.vim25.ManagedObjectReference; import com.vmware.vim25.ManagedObjectReference;
import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
import org.apache.log4j.Logger; import org.apache.log4j.Logger;
import java.util.Collections; import java.util.Collections;
@ -89,6 +90,15 @@ public class PbmProfileManagerMO extends BaseMO {
resourceType.setResourceType(PbmProfileResourceTypeEnum.STORAGE.value()); resourceType.setResourceType(PbmProfileResourceTypeEnum.STORAGE.value());
return resourceType; 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.VirtualMachineSnapshotTree;
import com.vmware.vim25.VirtualSCSIController; import com.vmware.vim25.VirtualSCSIController;
import com.vmware.vim25.VirtualSCSISharing; import com.vmware.vim25.VirtualSCSISharing;
import com.vmware.vim25.VirtualMachineDefinedProfileSpec;
import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo; import com.cloud.hypervisor.vmware.mo.SnapshotDescriptor.SnapshotInfo;
import com.cloud.hypervisor.vmware.util.VmwareContext; 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 { 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()) if(s_logger.isTraceEnabled())
s_logger.trace("vCenter API trace - attachDisk(). target MOR: " + _mor.getValue() + ", vmdkDatastorePath: " 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.setDevice(newDisk);
deviceConfigSpec.setOperation(VirtualDeviceConfigSpecOperation.ADD); 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); reConfigSpec.getDeviceChange().add(deviceConfigSpec);
ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec); ManagedObjectReference morTask = _context.getService().reconfigVMTask(_mor, reConfigSpec);