// AddVirtualDisk adds a virtual disk to a virtual machine. func (s *VirtualMachineConfigSpec) AddVirtualDisk(device *types.VirtualDisk) *VirtualMachineConfigSpec { defer trace.End(trace.Begin(s.ID())) device.GetVirtualDevice().Key = s.generateNextKey() device.CapacityInKB = defaultCapacityInKB moref := s.Datastore.Reference() device.GetVirtualDevice().Backing = &types.VirtualDiskFlatVer2BackingInfo{ DiskMode: string(types.VirtualDiskModePersistent), ThinProvisioned: types.NewBool(true), VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{ FileName: s.Datastore.Path(fmt.Sprintf("%s/%[1]s.vmdk", s.ID())), Datastore: &moref, }, } // Add the parent if we set ParentImageID backing := device.GetVirtualDevice().Backing.(*types.VirtualDiskFlatVer2BackingInfo) if s.ParentImageID() != "" { backing.Parent = &types.VirtualDiskFlatVer2BackingInfo{ VirtualDeviceFileBackingInfo: types.VirtualDeviceFileBackingInfo{ // XXX This needs to come from a storage helper in the future // and should not be computed here like this. FileName: s.Datastore.Path(fmt.Sprintf("VIC/%s/images/%s/%[2]s.vmdk", s.ImageStoreName(), s.ParentImageID())), }, } } return s.AddAndCreateVirtualDevice(device) }
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") }