CLOUDSTACK-4790: Skip reserved VMware scsi device number for SCSI disks

This commit is contained in:
Kelven Yang 2013-10-02 17:52:39 -07:00
parent 219c64eef3
commit 4533d2d88f
3 changed files with 45 additions and 17 deletions

View File

@ -2857,7 +2857,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa
String[] diskChain = syncDiskChain(dcMo, vmMo, vmSpec,
vol, matchingExistingDisk,
dataStoresDetails);
if(controllerKey == scsiControllerKey && VmwareHelper.isReservedScsiDeviceNumber(scsiUnitNumber))
scsiUnitNumber++;
device = VmwareHelper.prepareDiskDevice(vmMo, null, controllerKey,
diskChain,
volumeDsDetails.first(),

View File

@ -908,8 +908,9 @@ public class VirtualMachineMO extends BaseMO {
assert(vmdkDatastorePath != null);
assert(morDs != null);
int ideControllerKey = getIDEDeviceControllerKey();
if(controllerKey < 0) {
controllerKey = getIDEDeviceControllerKey();
controllerKey = ideControllerKey;
}
VirtualDisk newDisk = new VirtualDisk();
@ -952,6 +953,8 @@ public class VirtualMachineMO extends BaseMO {
}
int deviceNumber = getNextDeviceNumber(controllerKey);
if(controllerKey != ideControllerKey && VmwareHelper.isReservedScsiDeviceNumber(deviceNumber))
deviceNumber++;
newDisk.setControllerKey(controllerKey);
newDisk.setKey(-deviceNumber);
@ -1714,9 +1717,13 @@ public class VirtualMachineMO extends BaseMO {
public int getNextScsiDiskDeviceNumber() throws Exception {
int scsiControllerKey = getScsiDeviceControllerKey();
return getNextDeviceNumber(scsiControllerKey);
int deviceNumber = getNextDeviceNumber(scsiControllerKey);
if(VmwareHelper.isReservedScsiDeviceNumber(deviceNumber))
deviceNumber++;
return deviceNumber;
}
public int getScsiDeviceControllerKey() throws Exception {
List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().
getDynamicProperty(_mor, "config.hardware.device");
@ -1732,7 +1739,7 @@ public class VirtualMachineMO extends BaseMO {
assert(false);
throw new Exception("SCSI Controller Not Found");
}
public int getScsiDeviceControllerKeyNoException() throws Exception {
List<VirtualDevice> devices = (List<VirtualDevice>)_context.getVimClient().
getDynamicProperty(_mor, "config.hardware.device");

View File

@ -72,6 +72,10 @@ import com.cloud.utils.exception.ExceptionUtil;
public class VmwareHelper {
private static final Logger s_logger = Logger.getLogger(VmwareHelper.class);
public static boolean isReservedScsiDeviceNumber(int deviceNumber) {
return deviceNumber == 7;
}
public static VirtualDevice prepareNicDevice(VirtualMachineMO vmMo, ManagedObjectReference morNetwork, VirtualEthernetCardType deviceType,
String portGroupName, String macAddress, int deviceNumber, int contextNumber, boolean conntected, boolean connectOnStart) throws Exception {
@ -178,11 +182,15 @@ public class VmwareHelper {
backingInfo.setFileName(vmdkDatastorePath);
disk.setBacking(backingInfo);
int ideControllerKey = vmMo.getIDEDeviceControllerKey();
if(controllerKey < 0)
controllerKey = vmMo.getIDEDeviceControllerKey();
if(deviceNumber < 0)
controllerKey = ideControllerKey;
if(deviceNumber < 0) {
deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
disk.setControllerKey(controllerKey);
if(controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber))
deviceNumber++;
}
disk.setControllerKey(controllerKey);
disk.setKey(-contextNumber);
disk.setUnitNumber(deviceNumber);
@ -246,12 +254,16 @@ public class VmwareHelper {
throw new Exception("Unsupported disk backing: " + parentBacking.getClass().getCanonicalName());
}
int ideControllerKey = vmMo.getIDEDeviceControllerKey();
if(controllerKey < 0)
controllerKey = vmMo.getIDEDeviceControllerKey();
controllerKey = ideControllerKey;
disk.setControllerKey(controllerKey);
if(deviceNumber < 0)
if(deviceNumber < 0) {
deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
if(controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber))
deviceNumber++;
}
disk.setKey(-contextNumber);
disk.setUnitNumber(deviceNumber);
disk.setCapacityInKB(sizeInMb*1024);
@ -282,11 +294,15 @@ public class VmwareHelper {
backingInfo.setDiskMode(VirtualDiskMode.PERSISTENT.value());
disk.setBacking(backingInfo);
int ideControllerKey = vmMo.getIDEDeviceControllerKey();
if(controllerKey < 0)
controllerKey = vmMo.getIDEDeviceControllerKey();
if(deviceNumber < 0)
controllerKey = ideControllerKey;
if(deviceNumber < 0) {
deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
if(controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber))
deviceNumber++;
}
disk.setControllerKey(controllerKey);
disk.setKey(-contextNumber);
disk.setUnitNumber(deviceNumber);
@ -332,11 +348,15 @@ public class VmwareHelper {
disk.setBacking(backingInfo);
int ideControllerKey = vmMo.getIDEDeviceControllerKey();
if(controllerKey < 0)
controllerKey = vmMo.getIDEDeviceControllerKey();
if(deviceNumber < 0)
controllerKey = ideControllerKey;
if(deviceNumber < 0) {
deviceNumber = vmMo.getNextDeviceNumber(controllerKey);
if(controllerKey != ideControllerKey && isReservedScsiDeviceNumber(deviceNumber))
deviceNumber++;
}
disk.setControllerKey(controllerKey);
disk.setKey(-contextNumber);
disk.setUnitNumber(deviceNumber);