// newUnitNumber returns the unit number to use for attaching a new device to the given controller. func (l VirtualDeviceList) newUnitNumber(c types.BaseVirtualController) int32 { units := make([]bool, 30) switch sc := c.(type) { case types.BaseVirtualSCSIController: // The SCSI controller sits on its own bus units[sc.GetVirtualSCSIController().ScsiCtlrUnitNumber] = true } key := c.GetVirtualController().Key for _, device := range l { d := device.GetVirtualDevice() if d.ControllerKey == key && d.UnitNumber != nil { units[int(*d.UnitNumber)] = true } } for unit, used := range units { if !used { return int32(unit) } } return -1 }
// AssignController assigns a device to a controller. func (l VirtualDeviceList) AssignController(device types.BaseVirtualDevice, c types.BaseVirtualController) { d := device.GetVirtualDevice() d.ControllerKey = c.GetVirtualController().Key d.UnitNumber = new(int32) *d.UnitNumber = l.newUnitNumber(c) if d.Key == 0 { d.Key = -1 } }
// NewVirtualDisk returns a new disk attached to the controller func NewVirtualDisk(controller types.BaseVirtualController) *types.VirtualDisk { defer trace.End(trace.Begin("")) return &types.VirtualDisk{ VirtualDevice: types.VirtualDevice{ ControllerKey: controller.GetVirtualController().Key, UnitNumber: new(int32), }, } }
// AssignController assigns a device to a controller. func (l VirtualDeviceList) AssignController(device types.BaseVirtualDevice, c types.BaseVirtualController) { d := device.GetVirtualDevice() d.ControllerKey = c.GetVirtualController().Key d.UnitNumber = l.newUnitNumber(c) if d.UnitNumber == 0 { d.UnitNumber = -1 // TODO: this field is annotated as omitempty } if d.Key == 0 { d.Key = -1 } }
// newUnitNumber returns the unit number to use for attaching a new device to the given controller. func (l VirtualDeviceList) newUnitNumber(c types.BaseVirtualController) int32 { key := c.GetVirtualController().Key var max int32 = -1 for _, device := range l { d := device.GetVirtualDevice() if d.ControllerKey == key { if d.UnitNumber != nil && *d.UnitNumber > max { max = *d.UnitNumber } } } return max + 1 }
func getNextUnitNumber(devices object.VirtualDeviceList, c types.BaseVirtualController) (int32, error) { // get next available SCSI controller unit number var takenUnitNumbers [SCSIDeviceSlots]bool takenUnitNumbers[SCSIReservedSlot] = true key := c.GetVirtualController().Key for _, device := range devices { d := device.GetVirtualDevice() if d.ControllerKey == key { if d.UnitNumber != nil { takenUnitNumbers[*d.UnitNumber] = true } } } for unitNumber, takenUnitNumber := range takenUnitNumbers { if !takenUnitNumber { return int32(unitNumber), nil } } return -1, fmt.Errorf("SCSI Controller with key=%d does not have any available slots (LUN).", key) }