0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-07-12 08:45:01 +00:00

feat(vm): add support for memory hugepages and keep_hugepages attributes (#1158)

Allow use hugepages on the VM.

Signed-off-by: Serge Logvinov <serge.logvinov@sinextra.dev>
This commit is contained in:
Serge 2024-03-28 00:13:03 +02:00 committed by GitHub
parent 016fe49cc1
commit a2f055a916
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 94 additions and 14 deletions

View File

@ -408,6 +408,15 @@ output "ubuntu_vm_public_key" {
- `floating` - (Optional) The floating memory in megabytes (defaults - `floating` - (Optional) The floating memory in megabytes (defaults
to `0`). to `0`).
- `shared` - (Optional) The shared memory in megabytes (defaults to `0`). - `shared` - (Optional) The shared memory in megabytes (defaults to `0`).
- `hugepages` - (Optional) Enable/disable hugepages memory (defaults to disable).
- `2` - 2MB hugepages.
- `1024` - 1GB hugepages.
- `any` - Any hugepages.
- `keep_hugepages` - (Optional) Keep hugepages memory after the VM is stopped (defaults
to `false`).
Settings `hugepages` and `keep_hugepages` are only allowed for `root@pam` authenticated user.
And required `cpu.numa` to be enabled.
- `migrate` - (Optional) Migrate the VM on node change instead of re-creating - `migrate` - (Optional) Migrate the VM on node change instead of re-creating
it (defaults to `false`). it (defaults to `false`).
- `name` - (Optional) The virtual machine name. - `name` - (Optional) The virtual machine name.

View File

@ -128,6 +128,7 @@ resource "proxmox_virtual_environment_vm" "example" {
memory { memory {
dedicated = 768 dedicated = 768
# hugepages = "2"
} }
connection { connection {

View File

@ -249,6 +249,7 @@ type CreateRequestBody struct {
Hotplug types.CustomCommaSeparatedList `json:"hotplug,omitempty" url:"hotplug,omitempty,comma"` Hotplug types.CustomCommaSeparatedList `json:"hotplug,omitempty" url:"hotplug,omitempty,comma"`
Hugepages *string `json:"hugepages,omitempty" url:"hugepages,omitempty"` Hugepages *string `json:"hugepages,omitempty" url:"hugepages,omitempty"`
IDEDevices CustomStorageDevices `json:"ide,omitempty" url:",omitempty"` IDEDevices CustomStorageDevices `json:"ide,omitempty" url:",omitempty"`
KeepHugepages *types.CustomBool `json:"keephugepages,omitempty" url:"keephugepages,omitempty,int"`
KeyboardLayout *string `json:"keyboard,omitempty" url:"keyboard,omitempty"` KeyboardLayout *string `json:"keyboard,omitempty" url:"keyboard,omitempty"`
KVMArguments *string `json:"args,omitempty" url:"args,omitempty,space"` KVMArguments *string `json:"args,omitempty" url:"args,omitempty,space"`
KVMEnabled *types.CustomBool `json:"kvm,omitempty" url:"kvm,omitempty,int"` KVMEnabled *types.CustomBool `json:"kvm,omitempty" url:"kvm,omitempty,int"`
@ -412,6 +413,7 @@ type GetResponseData struct {
IPConfig29 *CustomCloudInitIPConfig `json:"ipconfig29,omitempty"` IPConfig29 *CustomCloudInitIPConfig `json:"ipconfig29,omitempty"`
IPConfig30 *CustomCloudInitIPConfig `json:"ipconfig30,omitempty"` IPConfig30 *CustomCloudInitIPConfig `json:"ipconfig30,omitempty"`
IPConfig31 *CustomCloudInitIPConfig `json:"ipconfig31,omitempty"` IPConfig31 *CustomCloudInitIPConfig `json:"ipconfig31,omitempty"`
KeepHugepages *types.CustomBool `json:"keephugepages,omitempty"`
KeyboardLayout *string `json:"keyboard,omitempty"` KeyboardLayout *string `json:"keyboard,omitempty"`
KVMArguments *string `json:"args,omitempty"` KVMArguments *string `json:"args,omitempty"`
KVMEnabled *types.CustomBool `json:"kvm,omitempty"` KVMEnabled *types.CustomBool `json:"kvm,omitempty"`

View File

@ -93,6 +93,8 @@ const (
dvMemoryDedicated = 512 dvMemoryDedicated = 512
dvMemoryFloating = 0 dvMemoryFloating = 0
dvMemoryShared = 0 dvMemoryShared = 0
dvMemoryHugepages = ""
dvMemoryKeepHugepages = false
dvMigrate = false dvMigrate = false
dvName = "" dvName = ""
@ -210,15 +212,17 @@ const (
mkInitializationNetworkDataFileID = "network_data_file_id" mkInitializationNetworkDataFileID = "network_data_file_id"
mkInitializationMetaDataFileID = "meta_data_file_id" mkInitializationMetaDataFileID = "meta_data_file_id"
mkKeyboardLayout = "keyboard_layout" mkKeyboardLayout = "keyboard_layout"
mkKVMArguments = "kvm_arguments" mkKVMArguments = "kvm_arguments"
mkMachine = "machine" mkMachine = "machine"
mkMemory = "memory" mkMemory = "memory"
mkMemoryDedicated = "dedicated" mkMemoryDedicated = "dedicated"
mkMemoryFloating = "floating" mkMemoryFloating = "floating"
mkMemoryShared = "shared" mkMemoryShared = "shared"
mkMigrate = "migrate" mkMemoryHugepages = "hugepages"
mkName = "name" mkMemoryKeepHugepages = "keep_hugepages"
mkMigrate = "migrate"
mkName = "name"
mkNodeName = "node_name" mkNodeName = "node_name"
mkOperatingSystem = "operating_system" mkOperatingSystem = "operating_system"
@ -991,9 +995,11 @@ func VM() *schema.Resource {
DefaultFunc: func() (interface{}, error) { DefaultFunc: func() (interface{}, error) {
return []interface{}{ return []interface{}{
map[string]interface{}{ map[string]interface{}{
mkMemoryDedicated: dvMemoryDedicated, mkMemoryDedicated: dvMemoryDedicated,
mkMemoryFloating: dvMemoryFloating, mkMemoryFloating: dvMemoryFloating,
mkMemoryShared: dvMemoryShared, mkMemoryShared: dvMemoryShared,
mkMemoryHugepages: dvMemoryHugepages,
mkMemoryKeepHugepages: dvMemoryKeepHugepages,
}, },
}, nil }, nil
}, },
@ -1026,6 +1032,25 @@ func VM() *schema.Resource {
validation.IntBetween(0, 268435456), validation.IntBetween(0, 268435456),
), ),
}, },
mkMemoryHugepages: {
Type: schema.TypeString,
Description: "Enable/disable hugepages memory",
Optional: true,
Default: dvMemoryHugepages,
RequiredWith: []string{"cpu.0.numa"},
ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice([]string{
"1024",
"2",
"any",
}, true)),
},
mkMemoryKeepHugepages: {
Type: schema.TypeBool,
Description: "Hugepages will not be deleted after VM shutdown and can be used for subsequent starts",
Optional: true,
Default: dvMemoryKeepHugepages,
RequiredWith: []string{"cpu.0.numa", "memory.0.hugepages"},
},
}, },
}, },
MaxItems: 1, MaxItems: 1,
@ -1962,6 +1987,8 @@ func vmCreateClone(ctx context.Context, d *schema.ResourceData, m interface{}) d
memoryDedicated := memoryBlock[mkMemoryDedicated].(int) memoryDedicated := memoryBlock[mkMemoryDedicated].(int)
memoryFloating := memoryBlock[mkMemoryFloating].(int) memoryFloating := memoryBlock[mkMemoryFloating].(int)
memoryShared := memoryBlock[mkMemoryShared].(int) memoryShared := memoryBlock[mkMemoryShared].(int)
hugepages := memoryBlock[mkMemoryHugepages].(string)
keepHugepages := types.CustomBool(memoryBlock[mkMemoryKeepHugepages].(bool))
updateBody.DedicatedMemory = &memoryDedicated updateBody.DedicatedMemory = &memoryDedicated
updateBody.FloatingMemory = &memoryFloating updateBody.FloatingMemory = &memoryFloating
@ -1974,6 +2001,14 @@ func vmCreateClone(ctx context.Context, d *schema.ResourceData, m interface{}) d
Size: memoryShared, Size: memoryShared,
} }
} }
if hugepages != "" {
updateBody.Hugepages = &hugepages
}
if keepHugepages {
updateBody.KeepHugepages = &keepHugepages
}
} }
networkDevice := d.Get(network.MkNetworkDevice).([]interface{}) networkDevice := d.Get(network.MkNetworkDevice).([]interface{})
@ -2372,6 +2407,8 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{})
memoryDedicated := memoryBlock[mkMemoryDedicated].(int) memoryDedicated := memoryBlock[mkMemoryDedicated].(int)
memoryFloating := memoryBlock[mkMemoryFloating].(int) memoryFloating := memoryBlock[mkMemoryFloating].(int)
memoryShared := memoryBlock[mkMemoryShared].(int) memoryShared := memoryBlock[mkMemoryShared].(int)
memoryHugepages := memoryBlock[mkMemoryHugepages].(string)
memoryKeepHugepages := types.CustomBool(memoryBlock[mkMemoryKeepHugepages].(bool))
machine := d.Get(mkMachine).(string) machine := d.Get(mkMachine).(string)
name := d.Get(mkName).(string) name := d.Get(mkName).(string)
@ -2584,6 +2621,14 @@ func vmCreateCustom(ctx context.Context, d *schema.ResourceData, m interface{})
createBody.Machine = &machine createBody.Machine = &machine
} }
if memoryHugepages != "" {
createBody.Hugepages = &memoryHugepages
}
if memoryKeepHugepages {
createBody.KeepHugepages = &memoryKeepHugepages
}
if name != "" { if name != "" {
createBody.Name = &name createBody.Name = &name
} }
@ -3957,6 +4002,18 @@ func vmReadCustom(
memory[mkMemoryShared] = 0 memory[mkMemoryShared] = 0
} }
if vmConfig.Hugepages != nil {
memory[mkMemoryHugepages] = *vmConfig.Hugepages
} else {
memory[mkMemoryHugepages] = ""
}
if vmConfig.KeepHugepages != nil {
memory[mkMemoryKeepHugepages] = *vmConfig.KeepHugepages
} else {
memory[mkMemoryKeepHugepages] = false
}
currentMemory := d.Get(mkMemory).([]interface{}) currentMemory := d.Get(mkMemory).([]interface{})
if len(clone) > 0 { if len(clone) > 0 {
@ -3967,7 +4024,9 @@ func vmReadCustom(
} else if len(currentMemory) > 0 || } else if len(currentMemory) > 0 ||
memory[mkMemoryDedicated] != dvMemoryDedicated || memory[mkMemoryDedicated] != dvMemoryDedicated ||
memory[mkMemoryFloating] != dvMemoryFloating || memory[mkMemoryFloating] != dvMemoryFloating ||
memory[mkMemoryShared] != dvMemoryShared { memory[mkMemoryShared] != dvMemoryShared ||
memory[mkMemoryHugepages] != dvMemoryHugepages ||
memory[mkMemoryKeepHugepages] != dvMemoryKeepHugepages {
err := d.Set(mkMemory, []interface{}{memory}) err := d.Set(mkMemory, []interface{}{memory})
diags = append(diags, diag.FromErr(err)...) diags = append(diags, diag.FromErr(err)...)
} }
@ -4762,7 +4821,6 @@ func vmUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D
updateBody.CPUCores = &cpuCores updateBody.CPUCores = &cpuCores
updateBody.CPUSockets = &cpuSockets updateBody.CPUSockets = &cpuSockets
updateBody.CPUUnits = &cpuUnits updateBody.CPUUnits = &cpuUnits
updateBody.CPUAffinity = &cpuAffinity
updateBody.NUMAEnabled = &cpuNUMA updateBody.NUMAEnabled = &cpuNUMA
if cpuAffinity != "" { if cpuAffinity != "" {
@ -4935,6 +4993,8 @@ func vmUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D
memoryDedicated := memoryBlock[mkMemoryDedicated].(int) memoryDedicated := memoryBlock[mkMemoryDedicated].(int)
memoryFloating := memoryBlock[mkMemoryFloating].(int) memoryFloating := memoryBlock[mkMemoryFloating].(int)
memoryShared := memoryBlock[mkMemoryShared].(int) memoryShared := memoryBlock[mkMemoryShared].(int)
memoryHugepages := memoryBlock[mkMemoryHugepages].(string)
memoryKeepHugepages := types.CustomBool(memoryBlock[mkMemoryKeepHugepages].(bool))
updateBody.DedicatedMemory = &memoryDedicated updateBody.DedicatedMemory = &memoryDedicated
updateBody.FloatingMemory = &memoryFloating updateBody.FloatingMemory = &memoryFloating
@ -4948,6 +5008,14 @@ func vmUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.D
} }
} }
if memoryHugepages != "" {
updateBody.Hugepages = &memoryHugepages
updateBody.KeepHugepages = &memoryKeepHugepages
} else {
del = append(del, "hugepages")
del = append(del, "keephugepages")
}
rebootRequired = true rebootRequired = true
} }