vsphere/internal/virtualdevice/virtual_machine_disk_subresource.go
func (r *DiskSubresource) assignDisk(l object.VirtualDeviceList, disk *types.VirtualDisk) (types.BaseVirtualController, error) {
	number := r.Get("unit_number").(int)
	// Figure out the bus number, and look up the SCSI controller that matches
	// that. You can attach 15 disks to a SCSI controller, and we allow a maximum
	// of 30 devices.
	bus := number / 15
	// Also determine the unit number on that controller.
	unit := int32(math.Mod(float64(number), 15))

	// Find the controller.
	ctlr, err := r.ControllerForCreateUpdate(l, SubresourceControllerTypeSCSI, bus)
	if err != nil {
		return nil, err
	}

	// Build the unit list.
	units := make([]bool, 16)
	// Reserve the SCSI unit number
	scsiUnit := ctlr.(types.BaseVirtualSCSIController).GetVirtualSCSIController().ScsiCtlrUnitNumber
	units[scsiUnit] = true

	ckey := ctlr.GetVirtualController().Key

	for _, device := range l {
		d := device.GetVirtualDevice()
		if d.ControllerKey != ckey || d.UnitNumber == nil {
			continue
		}
		units[*d.UnitNumber] = true
	}

	// We now have a valid list of units. If we need to, shift up the desired
	// unit number so it's not taking the unit of the controller itself.
	if unit >= scsiUnit {
		unit++
	}

	if units[unit] {
		return nil, fmt.Errorf("unit number %d on SCSI bus %d is in use", unit, bus)
	}

	// If we made it this far, we are good to go!
	disk.ControllerKey = ctlr.GetVirtualController().Key
	disk.UnitNumber = &unit
	return ctlr, nil
}
func (r *DiskSubresource) assignDisk(l object.VirtualDeviceList, disk *types.VirtualDisk) (types.BaseVirtualController, error) {
	number := r.Get("unit_number").(int)
	// Figure out the bus number, and look up the SCSI controller that matches
	// that. You can attach 15 disks to a SCSI controller, and we allow a maximum
	// of 30 devices.
	bus := number / 15
	// Also determine the unit number on that controller.
	unit := int32(math.Mod(float64(number), 15))

	// Find the controller.
	ctlr, err := r.ControllerForCreateUpdate(l, SubresourceControllerTypeSCSI, bus)
	if err != nil {
		return nil, err
	}

	// Build the unit list.
	units := make([]bool, 16)
	// Reserve the SCSI unit number
	scsiUnit := ctlr.(types.BaseVirtualSCSIController).GetVirtualSCSIController().ScsiCtlrUnitNumber
	units[scsiUnit] = true

	ckey := ctlr.GetVirtualController().Key

	for _, device := range l {
		d := device.GetVirtualDevice()
		if d.ControllerKey != ckey || d.UnitNumber == nil {
			continue
		}
		units[*d.UnitNumber] = true
	}

	// We now have a valid list of units. If we need to, shift up the desired
	// unit number so it's not taking the unit of the controller itself.
	if unit >= scsiUnit {
		unit++
	}

	if units[unit] {
		return nil, fmt.Errorf("unit number %d on SCSI bus %d is in use", unit, bus)
	}

	// If we made it this far, we are good to go!
	disk.ControllerKey = ctlr.GetVirtualController().Key
	disk.UnitNumber = &unit
	return ctlr, nil
}
func ( r * DiskSubresource ) assignDisk ( l object . VirtualDeviceList , disk * types . VirtualDisk ) ( types . BaseVirtualController , error ) { number := r . Get ( " " ) . ( int ) // Figure out the bus number, and look up the SCSI controller that matches // that. You can attach 15 disks to a SCSI controller, and we allow a maximum // of 30 devices. bus := number / 15 // Also determine the unit number on that controller. unit := int32 ( math . Mod ( float64 ( number ) , 15 ) ) // Find the controller. ctlr , err := r . ControllerForCreateUpdate ( l , SubresourceControllerTypeSCSI , bus ) if err != nil { return nil , err } // Build the unit list. units := make ( [ ] bool , 16 ) // Reserve the SCSI unit number scsiUnit := ctlr . ( types . BaseVirtualSCSIController ) . GetVirtualSCSIController ( ) . ScsiCtlrUnitNumber units [ scsiUnit ] = true ckey := ctlr . GetVirtualController ( ) . Key for _ , device := range l { d := device . GetVirtualDevice ( ) if d . ControllerKey != ckey || d . UnitNumber == nil { continue } units [ * d . UnitNumber ] = true } // We now have a valid list of units. If we need to, shift up the desired // unit number so it's not taking the unit of the controller itself. if unit >= scsiUnit { unit ++ } if units [ unit ] { return nil , fmt . Errorf ( " " , unit , bus ) } // If we made it this far, we are good to go! disk . ControllerKey = ctlr . GetVirtualController ( ) . Key disk . UnitNumber = & unit return ctlr , nil }
// assignDisk takes a unit number and assigns it correctly to a controller on
// the SCSI bus. An error is returned if the assigned unit number is taken.
assignDisk takes a unit number and assigns it correctly to a controller on the SCSI bus . An error is returned if the assigned unit number is taken .