func (vmh *VMHost) AttachRDM(vm *object.VirtualMachine, deviceNAA string) (err error) { vmScsiDiskDeviceInfo, err := vmh.getVmScsiDiskDeviceInfo(vm) if err != nil { return err } // var scsiCtlrUnitNumber int //Build new Virtual Device to add to VM from list of avilable devices found from our query for _, ScsiDisk := range vmScsiDiskDeviceInfo { if !strings.Contains(ScsiDisk.Disk.CanonicalName, deviceNAA) { continue } var rdmBacking types.VirtualDiskRawDiskMappingVer1BackingInfo rdmBacking.FileName = "" rdmBacking.DiskMode = "independent_persistent" rdmBacking.CompatibilityMode = "physicalMode" rdmBacking.DeviceName = ScsiDisk.Disk.DeviceName for _, descriptor := range ScsiDisk.Disk.Descriptor { if string([]rune(descriptor.Id)[:4]) == "vml." { rdmBacking.LunUuid = descriptor.Id break } } var rdmDisk types.VirtualDisk rdmDisk.Backing = &rdmBacking rdmDisk.CapacityInKB = 1024 controller, err := vmh.getAvailableSCSIController() if err != nil { return err } if controller == nil { controllers, err := vmh.getSCSIControllers() if err != nil { return err } if len(controllers) == 0 { return errors.New("no SCSI controllers found") } if len(controllers) == 4 { return errors.New("no more controllers can be added") } err = vmh.createController(&controllers[0]) if err != nil { return err } controller, err = vmh.getAvailableSCSIController() if err != nil { return err } } rdmDisk.ControllerKey = controller.VirtualController.Key rdmDisk.UnitNumber = -1 err = vm.AddDevice(vmh.Ctx, &rdmDisk) if err != nil { return errors.New(fmt.Sprintf("Error adding device %+v \n Logged Item: %s", rdmDisk, err)) } return nil } scsiLuns, err := vmh.GetSCSILuns() if err != nil { return goof.WithError("error getting existing LUNs", err) } for _, sl := range scsiLuns { if strings.Contains(sl.CanonicalName, deviceNAA) { return nil } } return errors.New("no device detected on VM host to add") }