public VirtualDeviceConfigSpec Controller(bool Is2012) { VirtualSCSIController scsi = new VirtualSCSIController(); if (Is2012) { scsi = new VirtualLsiLogicSASController(); } else { scsi = new VirtualLsiLogicController(); } VirtualDeviceConnectInfo ci = new VirtualDeviceConnectInfo(); ci.startConnected = false; scsi.key = 1000; scsi.controllerKey = 100; scsi.controllerKeySpecified = true; scsi.busNumber = 0; scsi.hotAddRemove = true; scsi.hotAddRemoveSpecified = true; scsi.scsiCtlrUnitNumber = 7; scsi.scsiCtlrUnitNumberSpecified = true; scsi.sharedBus = VirtualSCSISharing.noSharing; scsi.unitNumber = 2; scsi.unitNumberSpecified = true; scsi.connectable = ci; VirtualDeviceConfigSpec dcs = new VirtualDeviceConfigSpec(); dcs.device = scsi; dcs.operation = VirtualDeviceConfigSpecOperation.add; dcs.operationSpecified = true; return(dcs); }
public Tuple <int, int> GetControllerPlacement(ManagedObjectReference vm) { var obj = svcUtil.GetObjectProperties(svcConn._sic.propertyCollector, vm, new string[] { "config.hardware.device" }); VirtualDevice[] devices = (VirtualDevice[])obj[0].propSet[0].val; Dictionary <int, VirtualDevice> devMap = new Dictionary <int, VirtualDevice>(); foreach (VirtualDevice device in devices) { devMap.Add(device.key, device); } foreach (VirtualDevice device in devices) { if (device is VirtualSCSIController) { int[] slots = Enumerable.Repeat(0, 16).ToArray(); //init array with 0, has 16 places slots[7] = 1; //SCSI reserved number. VirtualSCSIController c = (VirtualSCSIController)device; foreach (var deviceKey in c.device) { var unitNumber = devMap[deviceKey].unitNumber; slots[unitNumber] = 1; } for (int i = 0; i < slots.Count(); i++) { if (slots[i] != 1) { return(new Tuple <int, int>(c.key, i)); } } } } throw new Exception("Could not find a free SCSI Controller slot in VM"); }