Skip to content

Commit cdfcea3

Browse files
committed
Merge release branch 4.6 to master
* 4.6: [UI] bug fix: Delete added ACL lists is not available for Domain Admin and normal users CLOUDSTACK-4787: Allow users to select disk controller for VM/template CLOUDSTACK-4787 Allow selection of scsi controller type in vSphere
2 parents e703028 + 1597a4c commit cdfcea3

22 files changed

Lines changed: 1164 additions & 72 deletions

File tree

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: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,34 @@
1919

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

22+
import java.util.Map;
23+
2224
import com.cloud.agent.api.to.DiskTO;
2325

2426
public final class AttachCommand extends StorageSubSystemCommand {
2527
private DiskTO disk;
2628
private String vmName;
27-
private boolean inSeq;
29+
private boolean inSeq = false;
30+
private Map<String, String> controllerInfo;
2831

2932
public AttachCommand(final DiskTO disk, final String vmName) {
3033
super();
3134
this.disk = disk;
3235
this.vmName = vmName;
3336
}
37+
public AttachCommand(DiskTO disk, String vmName, Map<String, String> controllerInfo) {
38+
super();
39+
this.disk = disk;
40+
this.vmName = vmName;
41+
this.controllerInfo = controllerInfo;
42+
}
43+
44+
public Map<String, String> getControllerInfo() {
45+
return controllerInfo;
46+
}
47+
public void setControllerInfo(Map<String, String> controllerInfo) {
48+
this.controllerInfo = controllerInfo;
49+
}
3450

3551
@Override
3652
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/configuration/Config.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1202,7 +1202,7 @@ public enum Config {
12021202
String.class,
12031203
"vmware.root.disk.controller",
12041204
"ide",
1205-
"Specify the default disk controller for root volumes, valid values are scsi, ide",
1205+
"Specify the default disk controller for root volumes, valid values are scsi, ide, osdefault. Please check documentation for more details on each of these values.",
12061206
null),
12071207
VmwareSystemVmNicDeviceType(
12081208
"Advanced",

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: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3510,8 +3510,22 @@ 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+
// Don't override if VM already has root/data disk controller detail
3519+
if (vm.getDetail(VmDetailConstants.ROOK_DISK_CONTROLLER) == null) {
3520+
vm.setDetail(VmDetailConstants.ROOK_DISK_CONTROLLER, controllerSetting);
3521+
}
3522+
if (vm.getDetail(VmDetailConstants.DATA_DISK_CONTROLLER) == null) {
3523+
if (controllerSetting.equalsIgnoreCase("scsi")) {
3524+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "scsi");
3525+
} else {
3526+
vm.setDetail(VmDetailConstants.DATA_DISK_CONTROLLER, "osdefault");
3527+
}
3528+
}
35153529
}
35163530
}
35173531

0 commit comments

Comments
 (0)