Updated Branches:
  refs/heads/master 765f56a02 -> a3babdd61

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


Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo
Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/a3babdd6
Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/a3babdd6
Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/a3babdd6

Branch: refs/heads/master
Commit: a3babdd61ca8cae668a1b13c2724a0a6dd13fa05
Parents: 765f56a
Author: Kelven Yang <kelv...@gmail.com>
Authored: Wed Oct 2 17:52:39 2013 -0700
Committer: Kelven Yang <kelv...@gmail.com>
Committed: Wed Oct 2 17:53:56 2013 -0700

----------------------------------------------------------------------
 .../vmware/resource/VmwareResource.java         |  3 +-
 .../hypervisor/vmware/mo/VirtualMachineMO.java  | 15 +++++--
 .../hypervisor/vmware/util/VmwareHelper.java    | 44 ++++++++++++++------
 3 files changed, 45 insertions(+), 17 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a3babdd6/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
----------------------------------------------------------------------
diff --git 
a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
 
b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
index fd56cc1..83dcc58 100755
--- 
a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
+++ 
b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java
@@ -2827,7 +2827,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(),

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a3babdd6/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
----------------------------------------------------------------------
diff --git 
a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java 
b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
index 3cd4463..56f2f38 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/VirtualMachineMO.java
@@ -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");

http://git-wip-us.apache.org/repos/asf/cloudstack/blob/a3babdd6/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
----------------------------------------------------------------------
diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java 
b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
index bcf9f14..1927b9f 100644
--- a/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
+++ b/vmware-base/src/com/cloud/hypervisor/vmware/util/VmwareHelper.java
@@ -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);

Reply via email to