Skip to content

Commit 8110d5a

Browse files
Sateesh Chodapuneedirohityadavcloud
authored andcommitted
CLOUDSTACK-4787 Allow selection of scsi controller type in vSphere
commit #7 So far only 1 controller (scsi or ide) is supported in Cloudstack for ide or scsi, this is existing limitation. Added support for 2nd IDE controller. Support adding IDE virtual disk to VM. Also added check if VM is running as IDE virtual disk cannot be attached to VM if VM is runnning.If user detaches a virtual disk on lower unit number of controller, then subsequent attach operation should find free unit number on the controller and attach the virtual disk there. commit #6 Let the controllers of existing VMs continue without flip, current busInfo retrieved from chain_info field of volume record from database would be preferred over controller settings from all configuration settings. commit #5 Editing global configuration param vmware.root.disk.controller osdefault value results in loss of previous root disk controller type. Hence root disk's controller type for legacy VMs is unknow post that modificaiton by user. If VM is stop/start then we could get this infromation from bus info of existing volume. But if user resets VM and then try to start VM. The existing bus info would be lost. Hence existing disk info is not available to depend on. Using lsilogic or generic scsi controller for ROOT disk of legacy VMs if reset. commit #4 Avoid adding additional (>1) scsi controllers to system vms. While attaching volume to legacy VM don't use osdefault optoin which applicable only for VM created with the option enabled, use legacy data disk controller type (lsilogic) commit #3 If root disk's controller type is scsi and data disk controller type condenses to any of scsi sub-types then data disk controller type would fall back to root disk controller itself. This ensures data volumes would be accessible in all cases as controller of root volume would be reliable and it means VM has the supported controller. It also avoids mix of scsi controller sub-types in a user instance. Also translating disk controller type scsi to lsilogic. commit #2 Support auto detection of recommended virtual disk controller type for specific guest OS. commit #1 Support granual controller types. Add support for controller types in template registration as well. Fix white spaces. Removed stale HEAD merge lines Removed tail of merge lines Fixed VmwareResource, removing storage commands that moved to VmwareStorageProcessor. removed stale code of controller that is present in processor Fixed check style errors. Fixed injection. Tested with Linux and windows templates. Unable to run iso based tests due to few bugs in register iso area. Signed-off-by: Sateesh Chodapuneedi <[email protected]> (cherry picked from commit a4cc987) Signed-off-by: Rohit Yadav <[email protected]> (cherry picked from commit 6a9956e) Signed-off-by: Rohit Yadav <[email protected]> Conflicts: vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
1 parent 7043958 commit 8110d5a

File tree

19 files changed

+1124
-65
lines changed

19 files changed

+1124
-65
lines changed

api/src/com/cloud/vm/VmDetailConstants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,5 @@ public interface VmDetailConstants {
2222
public static final String ROOK_DISK_CONTROLLER = "rootDiskController";
2323
public static final String NESTED_VIRTUALIZATION_FLAG = "nestedVirtualizationFlag";
2424
public static final String HYPERVISOR_TOOLS_VERSION = "hypervisortoolsversion";
25+
public static final String DATA_DISK_CONTROLLER = "dataDiskController";
2526
}

core/src/org/apache/cloudstack/storage/command/AttachCommand.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,35 @@
1919

2020
package org.apache.cloudstack.storage.command;
2121

22+
import java.util.Map;
23+
24+
import com.cloud.agent.api.Command;
2225
import com.cloud.agent.api.to.DiskTO;
2326

2427
public final class AttachCommand extends StorageSubSystemCommand {
2528
private DiskTO disk;
2629
private String vmName;
27-
private boolean inSeq;
30+
private boolean inSeq = false;
31+
private Map<String, String> controllerInfo;
2832

2933
public AttachCommand(final DiskTO disk, final String vmName) {
3034
super();
3135
this.disk = disk;
3236
this.vmName = vmName;
3337
}
38+
public AttachCommand(DiskTO disk, String vmName, Map<String, String> controllerInfo) {
39+
super();
40+
this.disk = disk;
41+
this.vmName = vmName;
42+
this.controllerInfo = controllerInfo;
43+
}
44+
45+
public Map<String, String> getControllerInfo() {
46+
return controllerInfo;
47+
}
48+
public void setControllerInfo(Map<String, String> controllerInfo) {
49+
this.controllerInfo = controllerInfo;
50+
}
3451

3552
@Override
3653
public boolean executeInSequence() {

plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@
6767
import com.cloud.hypervisor.HypervisorGuru;
6868
import com.cloud.hypervisor.HypervisorGuruBase;
6969
import com.cloud.hypervisor.vmware.manager.VmwareManager;
70+
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
7071
import com.cloud.hypervisor.vmware.mo.VirtualEthernetCardType;
7172
import com.cloud.network.Network.Provider;
7273
import com.cloud.network.Network.Service;
@@ -205,6 +206,12 @@ public VirtualMachineTO implement(VirtualMachineProfile vm) {
205206
details.put(VmDetailConstants.ROOK_DISK_CONTROLLER, _vmwareMgr.getRootDiskController());
206207
}
207208
}
209+
String diskController = details.get(VmDetailConstants.DATA_DISK_CONTROLLER);
210+
if (userVm) {
211+
if (diskController == null) {
212+
details.put(VmDetailConstants.DATA_DISK_CONTROLLER, DiskControllerType.lsilogic.toString());
213+
}
214+
}
208215

209216
List<NicProfile> nicProfiles = vm.getNics();
210217

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManager.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,6 @@ public interface VmwareManager {
7878

7979
boolean isLegacyZone(long dcId);
8080

81+
public String getDataDiskController();
8182
boolean hasNexusVSM(Long clusterId);
8283
}

plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,8 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw
186186

187187
private String _rootDiskController = DiskControllerType.ide.toString();
188188

189+
private String _dataDiskController = DiskControllerType.osdefault.toString();
190+
189191
private final Map<String, String> _storageMounts = new HashMap<String, String>();
190192

191193
private final Random _rand = new Random(System.currentTimeMillis());
@@ -484,6 +486,7 @@ public void setupResourceStartupParams(Map<String, Object> params) {
484486
params.put("service.console.name", _serviceConsoleName);
485487
params.put("management.portgroup.name", _managemetPortGroupName);
486488
params.put("vmware.root.disk.controller", _rootDiskController);
489+
params.put("vmware.data.disk.controller", _dataDiskController);
487490
params.put("vmware.recycle.hung.wokervm", _recycleHungWorker);
488491
params.put("ports.per.dvportgroup", _portsPerDvPortGroup);
489492
}
@@ -936,6 +939,11 @@ public String getRootDiskController() {
936939
return _rootDiskController;
937940
}
938941

942+
@Override
943+
public String getDataDiskController() {
944+
return _dataDiskController;
945+
}
946+
939947
@Override
940948
public int getVcenterSessionTimeout() {
941949
return _vCenterSessionTimeout;

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

Lines changed: 193 additions & 12 deletions
Large diffs are not rendered by default.

plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,12 +75,14 @@
7575
import com.cloud.agent.api.to.DiskTO;
7676
import com.cloud.agent.api.to.NfsTO;
7777
import com.cloud.hypervisor.vmware.manager.VmwareHostService;
78+
import com.cloud.hypervisor.vmware.manager.VmwareManager;
7879
import com.cloud.hypervisor.vmware.manager.VmwareStorageMount;
7980
import com.cloud.hypervisor.vmware.mo.ClusterMO;
8081
import com.cloud.hypervisor.vmware.mo.CustomFieldConstants;
8182
import com.cloud.hypervisor.vmware.mo.DatacenterMO;
8283
import com.cloud.hypervisor.vmware.mo.DatastoreFile;
8384
import com.cloud.hypervisor.vmware.mo.DatastoreMO;
85+
import com.cloud.hypervisor.vmware.mo.DiskControllerType;
8486
import com.cloud.hypervisor.vmware.mo.HostDatastoreSystemMO;
8587
import com.cloud.hypervisor.vmware.mo.HostMO;
8688
import com.cloud.hypervisor.vmware.mo.HostStorageSystemMO;
@@ -104,6 +106,7 @@
104106
import com.cloud.utils.exception.CloudRuntimeException;
105107
import com.cloud.utils.script.Script;
106108
import com.cloud.vm.VirtualMachine.PowerState;
109+
import com.cloud.vm.VmDetailConstants;
107110

108111
public class VmwareStorageProcessor implements StorageProcessor {
109112
private static final Logger s_logger = Logger.getLogger(VmwareStorageProcessor.class);
@@ -1292,10 +1295,10 @@ public Answer attachVolume(AttachCommand cmd) {
12921295
String storageHost = details.get(DiskTO.STORAGE_HOST);
12931296
int storagePort = Integer.parseInt(details.get(DiskTO.STORAGE_PORT));
12941297

1295-
return this.attachVolume(cmd, cmd.getDisk(), true, isManaged, cmd.getVmName(), iScsiName, storageHost, storagePort);
1298+
return this.attachVolume(cmd, cmd.getDisk(), true, isManaged, cmd.getVmName(), iScsiName, storageHost, storagePort, cmd.getControllerInfo());
12961299
}
12971300

1298-
private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort) {
1301+
private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean isManaged, String vmName, String iScsiName, String storageHost, int storagePort, Map<String, String> controllerInfo) {
12991302
VolumeObjectTO volumeTO = (VolumeObjectTO)disk.getData();
13001303
DataStoreTO primaryStore = volumeTO.getDataStore();
13011304
try {
@@ -1360,7 +1363,24 @@ private Answer attachVolume(Command cmd, DiskTO disk, boolean isAttach, boolean
13601363
AttachAnswer answer = new AttachAnswer(disk);
13611364

13621365
if (isAttach) {
1363-
vmMo.attachDisk(new String[] { datastoreVolumePath }, morDs);
1366+
String dataDiskController = controllerInfo.get(VmDetailConstants.DATA_DISK_CONTROLLER);
1367+
String rootDiskController = controllerInfo.get(VmDetailConstants.ROOK_DISK_CONTROLLER);
1368+
DiskControllerType rootDiskControllerType = DiskControllerType.getType(rootDiskController);
1369+
1370+
if (dataDiskController == null) {
1371+
dataDiskController = getLegacyVmDataDiskController();
1372+
} else if ((rootDiskControllerType == DiskControllerType.lsilogic) ||
1373+
(rootDiskControllerType == DiskControllerType.lsisas1068) ||
1374+
(rootDiskControllerType == DiskControllerType.pvscsi) ||
1375+
(rootDiskControllerType == DiskControllerType.buslogic)) {
1376+
//TODO: Support mix of SCSI controller types for single VM. If root disk is already over
1377+
//a SCSI controller then use the same for data volume as well. This limitation will go once mix
1378+
//of SCSI controller types for single VM.
1379+
dataDiskController = rootDiskController;
1380+
} else if (DiskControllerType.getType(dataDiskController) == DiskControllerType.osdefault) {
1381+
dataDiskController = vmMo.getRecommendedDiskController(null);
1382+
}
1383+
vmMo.attachDisk(new String[] {datastoreVolumePath}, morDs, dataDiskController);
13641384
} else {
13651385
vmMo.removeAllSnapshots();
13661386
vmMo.detachDisk(datastoreVolumePath, false);
@@ -1504,7 +1524,7 @@ public Answer dettachIso(DettachCommand cmd) {
15041524

15051525
@Override
15061526
public Answer dettachVolume(DettachCommand cmd) {
1507-
return this.attachVolume(cmd, cmd.getDisk(), false, cmd.isManaged(), cmd.getVmName(), cmd.get_iScsiName(), cmd.getStorageHost(), cmd.getStoragePort());
1527+
return this.attachVolume(cmd, cmd.getDisk(), false, cmd.isManaged(), cmd.getVmName(), cmd.get_iScsiName(), cmd.getStorageHost(), cmd.getStoragePort(), null);
15081528
}
15091529

15101530
@Override
@@ -2277,4 +2297,28 @@ private static String deriveTemplateUuidOnHost(VmwareHypervisorHost hyperHost, S
22772297
templateUuid = templateUuid.replaceAll("-", "");
22782298
return templateUuid;
22792299
}
2300+
2301+
private String getControllerFromConfigurationSetting() throws Exception {
2302+
String diskController = null;
2303+
VmwareContext context = null;
2304+
try {
2305+
context = hostService.getServiceContext(null);
2306+
VmwareManager mgr = context.getStockObject(VmwareManager.CONTEXT_STOCK_NAME);
2307+
diskController = mgr.getDataDiskController();
2308+
} catch (Throwable e) {
2309+
if (e instanceof RemoteException) {
2310+
s_logger.warn("Encounter remote exception to vCenter, invalidate VMware session context");
2311+
hostService.invalidateServiceContext(context);
2312+
}
2313+
2314+
String details = "Failed to connect to vCenter due to " + VmwareHelper.getExceptionMessage(e);
2315+
s_logger.error(details, e);
2316+
}
2317+
2318+
return diskController;
2319+
}
2320+
2321+
private String getLegacyVmDataDiskController() throws Exception {
2322+
return DiskControllerType.lsilogic.toString();
2323+
}
22802324
}

server/src/com/cloud/storage/VolumeApiServiceImpl.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@
150150
import com.cloud.vm.VMInstanceVO;
151151
import com.cloud.vm.VirtualMachine;
152152
import com.cloud.vm.VirtualMachine.State;
153+
import com.cloud.vm.VmDetailConstants;
153154
import com.cloud.vm.VmWork;
154155
import com.cloud.vm.VmWorkAttachVolume;
155156
import com.cloud.vm.VmWorkConstants;
@@ -2453,6 +2454,11 @@ private VolumeVO sendAttachVolumeCommand(UserVmVO vm, VolumeVO volumeToAttach, L
24532454
details.put(DiskTO.CHAP_TARGET_USERNAME, chapInfo.getTargetUsername());
24542455
details.put(DiskTO.CHAP_TARGET_SECRET, chapInfo.getTargetSecret());
24552456
}
2457+
_userVmDao.loadDetails(vm);
2458+
Map<String, String> controllerInfo = new HashMap<String, String>();
2459+
controllerInfo.put(VmDetailConstants.ROOK_DISK_CONTROLLER, vm.getDetail(VmDetailConstants.ROOK_DISK_CONTROLLER));
2460+
controllerInfo.put(VmDetailConstants.DATA_DISK_CONTROLLER, vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER));
2461+
cmd.setControllerInfo(controllerInfo);
24562462

24572463
try {
24582464
answer = (AttachAnswer)_agentMgr.send(hostId, cmd);

server/src/com/cloud/vm/UserVmManagerImpl.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3510,8 +3510,17 @@ public UserVmVO doInTransaction(TransactionStatus status) throws InsufficientCap
35103510
if (guestOS.getDisplayName().toLowerCase().contains("apple mac os")) {
35113511
vm.setDetail("smc.present", "TRUE");
35123512
vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, "scsi");
3513+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
35133514
vm.setDetail("firmware", "efi");
35143515
s_logger.info("guestOS is OSX : overwrite root disk controller to scsi, use smc and efi");
3516+
} else {
3517+
String controllerSetting = _configDao.getValue("vmware.root.disk.controller");
3518+
vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, controllerSetting);
3519+
if (controllerSetting.equalsIgnoreCase("scsi")) {
3520+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
3521+
} else {
3522+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "osdefault");
3523+
}
35153524
}
35163525
}
35173526

vmware-base/src/com/cloud/hypervisor/vmware/mo/ClusterMO.java

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import com.vmware.vim25.CustomFieldStringValue;
3535
import com.vmware.vim25.DatastoreInfo;
3636
import com.vmware.vim25.DynamicProperty;
37+
import com.vmware.vim25.GuestOsDescriptor;
3738
import com.vmware.vim25.HostHardwareSummary;
3839
import com.vmware.vim25.HostIpRouteEntry;
3940
import com.vmware.vim25.HostRuntimeInfo;
@@ -46,9 +47,11 @@
4647
import com.vmware.vim25.PropertyFilterSpec;
4748
import com.vmware.vim25.PropertySpec;
4849
import com.vmware.vim25.TraversalSpec;
50+
import com.vmware.vim25.VirtualMachineConfigOption;
4951
import com.vmware.vim25.VirtualMachineConfigSpec;
5052

5153
import com.cloud.hypervisor.vmware.util.VmwareContext;
54+
import com.cloud.hypervisor.vmware.util.VmwareHelper;
5255
import com.cloud.utils.Pair;
5356
import com.cloud.utils.exception.CloudRuntimeException;
5457

@@ -271,7 +274,7 @@ public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo,
271274

272275
@Override
273276
public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB,
274-
int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
277+
int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent, Pair<String, String> controllerInfo, Boolean systemVm) throws Exception {
275278

276279
if (s_logger.isTraceEnabled())
277280
s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getValue() + ", vmName: " + vmName + ", cpuCount: " + cpuCount + ", cpuSpeedMhz: " +
@@ -280,7 +283,7 @@ public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCoun
280283

281284
boolean result =
282285
HypervisorHostHelper.createBlankVm(this, vmName, vmInternalCSName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse, memoryMB, memoryReserveMB,
283-
guestOsIdentifier, morDs, snapshotDirToParent);
286+
guestOsIdentifier, morDs, snapshotDirToParent, controllerInfo, systemVm);
284287

285288
if (s_logger.isTraceEnabled())
286289
s_logger.trace("vCenter API trace - createBlankVm() done");
@@ -582,4 +585,32 @@ public LicenseAssignmentManagerMO getLicenseAssignmentManager() throws Exception
582585
// LicenseAssignmentManager deals with only host/vcenter licenses only. Has nothing todo with cluster
583586
throw new CloudRuntimeException("Unable to get LicenseAssignmentManager at cluster level");
584587
}
588+
private ManagedObjectReference getEnvironmentBrowser() throws Exception {
589+
if (_environmentBrowser == null) {
590+
_environmentBrowser = _context.getVimClient().getMoRefProp(_mor, "environmentBrowser");
591+
}
592+
return _environmentBrowser;
593+
}
594+
@Override
595+
public String getRecommendedDiskController(String guestOsId) throws Exception {
596+
VirtualMachineConfigOption vmConfigOption = _context.getService().queryConfigOption(getEnvironmentBrowser(), null, null);
597+
GuestOsDescriptor guestOsDescriptor = null;
598+
String diskController = null;
599+
List<GuestOsDescriptor> guestDescriptors = vmConfigOption.getGuestOSDescriptor();
600+
for (GuestOsDescriptor descriptor : guestDescriptors) {
601+
if (guestOsId != null && guestOsId.equalsIgnoreCase(descriptor.getId())) {
602+
guestOsDescriptor = descriptor;
603+
break;
604+
}
605+
}
606+
if (guestOsDescriptor != null) {
607+
diskController = VmwareHelper.getRecommendedDiskControllerFromDescriptor(guestOsDescriptor);
608+
s_logger.debug("Retrieved recommended disk controller for guest OS : " + guestOsId + " in cluster " + getHyperHostName() + " : " + diskController);
609+
return diskController;
610+
} else {
611+
String msg = "Unable to retrieve recommended disk controller for guest OS : " + guestOsId + " in cluster " + getHyperHostName();
612+
s_logger.error(msg);
613+
throw new CloudRuntimeException(msg);
614+
}
615+
}
585616
}

vmware-base/src/com/cloud/hypervisor/vmware/mo/DiskControllerType.java

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,34 @@
1717
package com.cloud.hypervisor.vmware.mo;
1818

1919
public enum DiskControllerType {
20-
ide, scsi
20+
ide,
21+
scsi,
22+
osdefault,
23+
lsilogic,
24+
lsisas1068,
25+
buslogic,
26+
pvscsi,
27+
none;
28+
public static DiskControllerType getType(String diskController) {
29+
if (diskController == null || diskController.equalsIgnoreCase("osdefault")) {
30+
return DiskControllerType.osdefault;
31+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualLsiLogicSASController") || diskController.equalsIgnoreCase("VirtualLsiLogicSASController")
32+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.LSILOGIC_SAS)) {
33+
return DiskControllerType.lsisas1068;
34+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualLsiLogicController") || diskController.equalsIgnoreCase("VirtualLsiLogicController")
35+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.LSILOGIC_PARALLEL) || diskController.equalsIgnoreCase("scsi")) {
36+
return DiskControllerType.lsilogic;
37+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualIDEController") || diskController.equalsIgnoreCase("VirtualIDEController")
38+
|| diskController.equalsIgnoreCase("ide")) {
39+
return DiskControllerType.ide;
40+
} else if (diskController.equalsIgnoreCase("vim.vm.device.ParaVirtualSCSIController") || diskController.equalsIgnoreCase("ParaVirtualSCSIController")
41+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.VMWARE_PARAVIRTUAL)) {
42+
return DiskControllerType.pvscsi;
43+
} else if (diskController.equalsIgnoreCase("vim.vm.device.VirtualBusLogicController") || diskController.equalsIgnoreCase("VirtualBusLogicController")
44+
|| diskController.equalsIgnoreCase(ScsiDiskControllerType.BUSLOGIC)) {
45+
return DiskControllerType.buslogic;
46+
} else {
47+
return DiskControllerType.none;
48+
}
49+
}
2150
}

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

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -751,16 +751,17 @@ public void importVmFromOVF(String ovfFilePath, String vmName, DatastoreMO dsMo,
751751

752752
@Override
753753
public boolean createBlankVm(String vmName, String vmInternalCSName, int cpuCount, int cpuSpeedMHz, int cpuReservedMHz, boolean limitCpuUse, int memoryMB,
754-
int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent) throws Exception {
754+
int memoryReserveMB, String guestOsIdentifier, ManagedObjectReference morDs, boolean snapshotDirToParent, Pair<String, String> controllerInfo, Boolean systemVm) throws Exception {
755755

756756
if (s_logger.isTraceEnabled())
757757
s_logger.trace("vCenter API trace - createBlankVm(). target MOR: " + _mor.getValue() + ", vmName: " + vmName + ", cpuCount: " + cpuCount + ", cpuSpeedMhz: " +
758758
cpuSpeedMHz + ", cpuReservedMHz: " + cpuReservedMHz + ", limitCpu: " + limitCpuUse + ", memoryMB: " + memoryMB + ", guestOS: " + guestOsIdentifier +
759-
", datastore: " + morDs.getValue() + ", snapshotDirToParent: " + snapshotDirToParent);
759+
", datastore: " + morDs.getValue() + ", snapshotDirToParent: " + snapshotDirToParent +
760+
", controllerInfo:[" + controllerInfo.first() + "," + controllerInfo.second() + "], systemvm: " + systemVm);
760761

761762
boolean result =
762763
HypervisorHostHelper.createBlankVm(this, vmName, vmInternalCSName, cpuCount, cpuSpeedMHz, cpuReservedMHz, limitCpuUse, memoryMB, memoryReserveMB,
763-
guestOsIdentifier, morDs, snapshotDirToParent);
764+
guestOsIdentifier, morDs, snapshotDirToParent, controllerInfo, systemVm);
764765

765766
if (s_logger.isTraceEnabled())
766767
s_logger.trace("vCenter API trace - createBlankVm() done");
@@ -1069,6 +1070,16 @@ public void enableVncOnHostFirewall() throws Exception {
10691070
}
10701071
}
10711072

1073+
@Override
1074+
public String getRecommendedDiskController(String guestOsId) throws Exception {
1075+
ManagedObjectReference morParent = getParentMor();
1076+
if (morParent.getType().equals("ClusterComputeResource")) {
1077+
ClusterMO clusterMo = new ClusterMO(_context, morParent);
1078+
return clusterMo.getRecommendedDiskController(guestOsId);
1079+
}
1080+
return null;
1081+
}
1082+
10721083
public String getHostManagementIp(String managementPortGroup) throws Exception {
10731084
HostNetworkInfo netInfo = getHostNetworkInfo();
10741085

0 commit comments

Comments
 (0)