Add vgpu_profile support for using GRID vGPUs
It hooks directly into Configure, common for both vsphere-clone and vsphere-iso. Note that acceptance tests are still missing.
This commit is contained in:
parent
3892e0905a
commit
2a40f471b7
|
@ -43,6 +43,7 @@ type FlatConfig struct {
|
||||||
RAMReserveAll *bool `mapstructure:"RAM_reserve_all" cty:"RAM_reserve_all"`
|
RAMReserveAll *bool `mapstructure:"RAM_reserve_all" cty:"RAM_reserve_all"`
|
||||||
MemoryHotAddEnabled *bool `mapstructure:"RAM_hot_plug" cty:"RAM_hot_plug"`
|
MemoryHotAddEnabled *bool `mapstructure:"RAM_hot_plug" cty:"RAM_hot_plug"`
|
||||||
VideoRAM *int64 `mapstructure:"video_ram" cty:"video_ram"`
|
VideoRAM *int64 `mapstructure:"video_ram" cty:"video_ram"`
|
||||||
|
VGPUProfile *string `mapstructure:"vgpu_profile" cty:"vgpu_profile"`
|
||||||
NestedHV *bool `mapstructure:"NestedHV" cty:"NestedHV"`
|
NestedHV *bool `mapstructure:"NestedHV" cty:"NestedHV"`
|
||||||
ConfigParams map[string]string `mapstructure:"configuration_parameters" cty:"configuration_parameters"`
|
ConfigParams map[string]string `mapstructure:"configuration_parameters" cty:"configuration_parameters"`
|
||||||
BootOrder *string `mapstructure:"boot_order" cty:"boot_order"`
|
BootOrder *string `mapstructure:"boot_order" cty:"boot_order"`
|
||||||
|
@ -141,6 +142,7 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec {
|
||||||
"RAM_reserve_all": &hcldec.AttrSpec{Name: "RAM_reserve_all", Type: cty.Bool, Required: false},
|
"RAM_reserve_all": &hcldec.AttrSpec{Name: "RAM_reserve_all", Type: cty.Bool, Required: false},
|
||||||
"RAM_hot_plug": &hcldec.AttrSpec{Name: "RAM_hot_plug", Type: cty.Bool, Required: false},
|
"RAM_hot_plug": &hcldec.AttrSpec{Name: "RAM_hot_plug", Type: cty.Bool, Required: false},
|
||||||
"video_ram": &hcldec.AttrSpec{Name: "video_ram", Type: cty.Number, Required: false},
|
"video_ram": &hcldec.AttrSpec{Name: "video_ram", Type: cty.Number, Required: false},
|
||||||
|
"vgpu_profile": &hcldec.AttrSpec{Name: "vgpu_profile", Type: cty.String, Required: false},
|
||||||
"NestedHV": &hcldec.AttrSpec{Name: "NestedHV", Type: cty.Bool, Required: false},
|
"NestedHV": &hcldec.AttrSpec{Name: "NestedHV", Type: cty.Bool, Required: false},
|
||||||
"configuration_parameters": &hcldec.BlockAttrsSpec{TypeName: "configuration_parameters", ElementType: cty.String, Required: false},
|
"configuration_parameters": &hcldec.BlockAttrsSpec{TypeName: "configuration_parameters", ElementType: cty.String, Required: false},
|
||||||
"boot_order": &hcldec.AttrSpec{Name: "boot_order", Type: cty.String, Required: false},
|
"boot_order": &hcldec.AttrSpec{Name: "boot_order", Type: cty.String, Required: false},
|
||||||
|
|
|
@ -34,6 +34,9 @@ type HardwareConfig struct {
|
||||||
MemoryHotAddEnabled bool `mapstructure:"RAM_hot_plug"`
|
MemoryHotAddEnabled bool `mapstructure:"RAM_hot_plug"`
|
||||||
// Amount of video memory in MB.
|
// Amount of video memory in MB.
|
||||||
VideoRAM int64 `mapstructure:"video_ram"`
|
VideoRAM int64 `mapstructure:"video_ram"`
|
||||||
|
// vGPU profile for accelerated graphics. See [NVIDIA GRID vGPU documentation](https://docs.nvidia.com/grid/latest/grid-vgpu-user-guide/index.html#configure-vmware-vsphere-vm-with-vgpu)
|
||||||
|
// for examples of profile names. Defaults to none.
|
||||||
|
VGPUProfile string `mapstructure:"vgpu_profile"`
|
||||||
// Enable nested hardware virtualization for VM. Defaults to `false`.
|
// Enable nested hardware virtualization for VM. Defaults to `false`.
|
||||||
NestedHV bool `mapstructure:"NestedHV"`
|
NestedHV bool `mapstructure:"NestedHV"`
|
||||||
}
|
}
|
||||||
|
@ -71,6 +74,7 @@ func (s *StepConfigureHardware) Run(_ context.Context, state multistep.StateBag)
|
||||||
CpuHotAddEnabled: s.Config.CpuHotAddEnabled,
|
CpuHotAddEnabled: s.Config.CpuHotAddEnabled,
|
||||||
MemoryHotAddEnabled: s.Config.MemoryHotAddEnabled,
|
MemoryHotAddEnabled: s.Config.MemoryHotAddEnabled,
|
||||||
VideoRAM: s.Config.VideoRAM,
|
VideoRAM: s.Config.VideoRAM,
|
||||||
|
VGPUProfile: s.Config.VGPUProfile,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
|
|
|
@ -19,6 +19,7 @@ type FlatHardwareConfig struct {
|
||||||
RAMReserveAll *bool `mapstructure:"RAM_reserve_all" cty:"RAM_reserve_all"`
|
RAMReserveAll *bool `mapstructure:"RAM_reserve_all" cty:"RAM_reserve_all"`
|
||||||
MemoryHotAddEnabled *bool `mapstructure:"RAM_hot_plug" cty:"RAM_hot_plug"`
|
MemoryHotAddEnabled *bool `mapstructure:"RAM_hot_plug" cty:"RAM_hot_plug"`
|
||||||
VideoRAM *int64 `mapstructure:"video_ram" cty:"video_ram"`
|
VideoRAM *int64 `mapstructure:"video_ram" cty:"video_ram"`
|
||||||
|
VGPUProfile *string `mapstructure:"vgpu_profile" cty:"vgpu_profile"`
|
||||||
NestedHV *bool `mapstructure:"NestedHV" cty:"NestedHV"`
|
NestedHV *bool `mapstructure:"NestedHV" cty:"NestedHV"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ func (*FlatHardwareConfig) HCL2Spec() map[string]hcldec.Spec {
|
||||||
"RAM_reserve_all": &hcldec.AttrSpec{Name: "RAM_reserve_all", Type: cty.Bool, Required: false},
|
"RAM_reserve_all": &hcldec.AttrSpec{Name: "RAM_reserve_all", Type: cty.Bool, Required: false},
|
||||||
"RAM_hot_plug": &hcldec.AttrSpec{Name: "RAM_hot_plug", Type: cty.Bool, Required: false},
|
"RAM_hot_plug": &hcldec.AttrSpec{Name: "RAM_hot_plug", Type: cty.Bool, Required: false},
|
||||||
"video_ram": &hcldec.AttrSpec{Name: "video_ram", Type: cty.Number, Required: false},
|
"video_ram": &hcldec.AttrSpec{Name: "video_ram", Type: cty.Number, Required: false},
|
||||||
|
"vgpu_profile": &hcldec.AttrSpec{Name: "vgpu_profile", Type: cty.String, Required: false},
|
||||||
"NestedHV": &hcldec.AttrSpec{Name: "NestedHV", Type: cty.Bool, Required: false},
|
"NestedHV": &hcldec.AttrSpec{Name: "NestedHV", Type: cty.Bool, Required: false},
|
||||||
}
|
}
|
||||||
return s
|
return s
|
||||||
|
|
|
@ -47,6 +47,7 @@ type HardwareConfig struct {
|
||||||
CpuHotAddEnabled bool
|
CpuHotAddEnabled bool
|
||||||
MemoryHotAddEnabled bool
|
MemoryHotAddEnabled bool
|
||||||
VideoRAM int64
|
VideoRAM int64
|
||||||
|
VGPUProfile string
|
||||||
}
|
}
|
||||||
|
|
||||||
type NIC struct {
|
type NIC struct {
|
||||||
|
@ -349,6 +350,31 @@ func (vm *VirtualMachine) Configure(config *HardwareConfig) error {
|
||||||
}
|
}
|
||||||
confSpec.DeviceChange = append(confSpec.DeviceChange, spec)
|
confSpec.DeviceChange = append(confSpec.DeviceChange, spec)
|
||||||
}
|
}
|
||||||
|
if config.VGPUProfile != "" {
|
||||||
|
devices, err := vm.vm.Device(vm.driver.ctx)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pciDevices := devices.SelectByType((*types.VirtualPCIPassthrough)(nil))
|
||||||
|
vGPUDevices := pciDevices.SelectByBackingInfo((*types.VirtualPCIPassthroughVmiopBackingInfo)(nil))
|
||||||
|
var operation types.VirtualDeviceConfigSpecOperation
|
||||||
|
if len(vGPUDevices) > 1 {
|
||||||
|
return err
|
||||||
|
} else if len(pciDevices) == 1 {
|
||||||
|
operation = types.VirtualDeviceConfigSpecOperationEdit
|
||||||
|
} else if len(pciDevices) == 0 {
|
||||||
|
operation = types.VirtualDeviceConfigSpecOperationAdd
|
||||||
|
}
|
||||||
|
|
||||||
|
vGPUProfile := newVGPUProfile(config.VGPUProfile)
|
||||||
|
spec := &types.VirtualDeviceConfigSpec{
|
||||||
|
Device: &vGPUProfile,
|
||||||
|
Operation: operation,
|
||||||
|
}
|
||||||
|
log.Printf("Adding vGPU device with profile '%s'", config.VGPUProfile)
|
||||||
|
confSpec.DeviceChange = append(confSpec.DeviceChange, spec)
|
||||||
|
}
|
||||||
|
|
||||||
task, err := vm.vm.Reconfigure(vm.driver.ctx, confSpec)
|
task, err := vm.vm.Reconfigure(vm.driver.ctx, confSpec)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -584,6 +610,20 @@ func addNetwork(d *Driver, devices object.VirtualDeviceList, config *CreateConfi
|
||||||
return devices, nil
|
return devices, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newVGPUProfile(vGPUProfile string) types.VirtualPCIPassthrough {
|
||||||
|
return types.VirtualPCIPassthrough{
|
||||||
|
VirtualDevice: types.VirtualDevice{
|
||||||
|
DeviceInfo: &types.Description{
|
||||||
|
Summary: "",
|
||||||
|
Label: fmt.Sprintf("New vGPU %v PCI device", vGPUProfile),
|
||||||
|
},
|
||||||
|
Backing: &types.VirtualPCIPassthroughVmiopBackingInfo{
|
||||||
|
Vgpu: vGPUProfile,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (vm *VirtualMachine) AddCdrom(controllerType string, isoPath string) error {
|
func (vm *VirtualMachine) AddCdrom(controllerType string, isoPath string) error {
|
||||||
devices, err := vm.vm.Device(vm.driver.ctx)
|
devices, err := vm.vm.Device(vm.driver.ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -54,6 +54,7 @@ type FlatConfig struct {
|
||||||
RAMReserveAll *bool `mapstructure:"RAM_reserve_all" cty:"RAM_reserve_all"`
|
RAMReserveAll *bool `mapstructure:"RAM_reserve_all" cty:"RAM_reserve_all"`
|
||||||
MemoryHotAddEnabled *bool `mapstructure:"RAM_hot_plug" cty:"RAM_hot_plug"`
|
MemoryHotAddEnabled *bool `mapstructure:"RAM_hot_plug" cty:"RAM_hot_plug"`
|
||||||
VideoRAM *int64 `mapstructure:"video_ram" cty:"video_ram"`
|
VideoRAM *int64 `mapstructure:"video_ram" cty:"video_ram"`
|
||||||
|
VGPUProfile *string `mapstructure:"vgpu_profile" cty:"vgpu_profile"`
|
||||||
NestedHV *bool `mapstructure:"NestedHV" cty:"NestedHV"`
|
NestedHV *bool `mapstructure:"NestedHV" cty:"NestedHV"`
|
||||||
ConfigParams map[string]string `mapstructure:"configuration_parameters" cty:"configuration_parameters"`
|
ConfigParams map[string]string `mapstructure:"configuration_parameters" cty:"configuration_parameters"`
|
||||||
ISOChecksum *string `mapstructure:"iso_checksum" required:"true" cty:"iso_checksum"`
|
ISOChecksum *string `mapstructure:"iso_checksum" required:"true" cty:"iso_checksum"`
|
||||||
|
@ -179,6 +180,7 @@ func (*FlatConfig) HCL2Spec() map[string]hcldec.Spec {
|
||||||
"RAM_reserve_all": &hcldec.AttrSpec{Name: "RAM_reserve_all", Type: cty.Bool, Required: false},
|
"RAM_reserve_all": &hcldec.AttrSpec{Name: "RAM_reserve_all", Type: cty.Bool, Required: false},
|
||||||
"RAM_hot_plug": &hcldec.AttrSpec{Name: "RAM_hot_plug", Type: cty.Bool, Required: false},
|
"RAM_hot_plug": &hcldec.AttrSpec{Name: "RAM_hot_plug", Type: cty.Bool, Required: false},
|
||||||
"video_ram": &hcldec.AttrSpec{Name: "video_ram", Type: cty.Number, Required: false},
|
"video_ram": &hcldec.AttrSpec{Name: "video_ram", Type: cty.Number, Required: false},
|
||||||
|
"vgpu_profile": &hcldec.AttrSpec{Name: "vgpu_profile", Type: cty.String, Required: false},
|
||||||
"NestedHV": &hcldec.AttrSpec{Name: "NestedHV", Type: cty.Bool, Required: false},
|
"NestedHV": &hcldec.AttrSpec{Name: "NestedHV", Type: cty.Bool, Required: false},
|
||||||
"configuration_parameters": &hcldec.BlockAttrsSpec{TypeName: "configuration_parameters", ElementType: cty.String, Required: false},
|
"configuration_parameters": &hcldec.BlockAttrsSpec{TypeName: "configuration_parameters", ElementType: cty.String, Required: false},
|
||||||
"iso_checksum": &hcldec.AttrSpec{Name: "iso_checksum", Type: cty.String, Required: false},
|
"iso_checksum": &hcldec.AttrSpec{Name: "iso_checksum", Type: cty.String, Required: false},
|
||||||
|
|
|
@ -21,5 +21,8 @@
|
||||||
|
|
||||||
- `video_ram` (int64) - Amount of video memory in MB.
|
- `video_ram` (int64) - Amount of video memory in MB.
|
||||||
|
|
||||||
|
- `vgpu_profile` (string) - vGPU profile for accelerated graphics. See [NVIDIA GRID vGPU documentation](https://docs.nvidia.com/grid/latest/grid-vgpu-user-guide/index.html#configure-vmware-vsphere-vm-with-vgpu)
|
||||||
|
for examples of profile names. Defaults to none.
|
||||||
|
|
||||||
- `NestedHV` (bool) - Enable nested hardware virtualization for VM. Defaults to `false`.
|
- `NestedHV` (bool) - Enable nested hardware virtualization for VM. Defaults to `false`.
|
||||||
|
|
Loading…
Reference in New Issue