0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-08-22 19:38:35 +00:00

feat(lxc): Add option to customize RootFS size at LXC creation (#207)

* feat(lxc): Add option to customize RootFS size at LXC creation

* force container re-create if size changes
This commit is contained in:
Pavel Boldyrev 2023-01-15 23:17:45 -05:00 committed by GitHub
parent 8bd3fd7b1d
commit dd9ffe190c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 44 additions and 8 deletions

View File

@ -103,8 +103,9 @@ output "ubuntu_container_public_key" {
* `cores` - (Optional) The number of CPU cores (defaults to `1`). * `cores` - (Optional) The number of CPU cores (defaults to `1`).
* `units` - (Optional) The CPU units (defaults to `1024`). * `units` - (Optional) The CPU units (defaults to `1024`).
* `description` - (Optional) The description. * `description` - (Optional) The description.
* `disk` - (Optional) A disk. * `disk` - (Optional) The disk configuration.
* `datastore_id` - (Optional) The identifier for the datastore to create the disk in (defaults to `local-lvm`). * `datastore_id` - (Optional) The identifier for the datastore to create the disk in (defaults to `local`).
* `size` - (Optional) The size of the root filesystem in gigabytes (defaults to `4`). Requires `datastore_id` to be set.
* `initialization` - (Optional) The initialization configuration. * `initialization` - (Optional) The initialization configuration.
* `dns` - (Optional) The DNS configuration. * `dns` - (Optional) The DNS configuration.
* `domain` - (Optional) The DNS search domain. * `domain` - (Optional) The DNS search domain.

View File

@ -3,6 +3,7 @@ resource "proxmox_virtual_environment_container" "example_template" {
disk { disk {
datastore_id = element(data.proxmox_virtual_environment_datastores.example.datastore_ids, index(data.proxmox_virtual_environment_datastores.example.datastore_ids, "local-lvm")) datastore_id = element(data.proxmox_virtual_environment_datastores.example.datastore_ids, index(data.proxmox_virtual_environment_datastores.example.datastore_ids, "local-lvm"))
size = 10
} }
initialization { initialization {

View File

@ -12,9 +12,10 @@ import (
"github.com/hashicorp/terraform-plugin-sdk/v2/diag" "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/bpg/terraform-provider-proxmox/proxmox"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
"github.com/bpg/terraform-provider-proxmox/proxmox"
) )
const ( const (
@ -35,7 +36,8 @@ const (
dvResourceVirtualEnvironmentContainerCPUCores = 1 dvResourceVirtualEnvironmentContainerCPUCores = 1
dvResourceVirtualEnvironmentContainerCPUUnits = 1024 dvResourceVirtualEnvironmentContainerCPUUnits = 1024
dvResourceVirtualEnvironmentContainerDescription = "" dvResourceVirtualEnvironmentContainerDescription = ""
dvResourceVirtualEnvironmentContainerDiskDatastoreID = "local-lvm" dvResourceVirtualEnvironmentContainerDiskDatastoreID = "local"
dvResourceVirtualEnvironmentContainerDiskSize = 4
dvResourceVirtualEnvironmentContainerMemoryDedicated = 512 dvResourceVirtualEnvironmentContainerMemoryDedicated = 512
dvResourceVirtualEnvironmentContainerMemorySwap = 0 dvResourceVirtualEnvironmentContainerMemorySwap = 0
dvResourceVirtualEnvironmentContainerNetworkInterfaceBridge = "vmbr0" dvResourceVirtualEnvironmentContainerNetworkInterfaceBridge = "vmbr0"
@ -67,6 +69,7 @@ const (
mkResourceVirtualEnvironmentContainerDescription = "description" mkResourceVirtualEnvironmentContainerDescription = "description"
mkResourceVirtualEnvironmentContainerDisk = "disk" mkResourceVirtualEnvironmentContainerDisk = "disk"
mkResourceVirtualEnvironmentContainerDiskDatastoreID = "datastore_id" mkResourceVirtualEnvironmentContainerDiskDatastoreID = "datastore_id"
mkResourceVirtualEnvironmentContainerDiskSize = "size"
mkResourceVirtualEnvironmentContainerInitialization = "initialization" mkResourceVirtualEnvironmentContainerInitialization = "initialization"
mkResourceVirtualEnvironmentContainerInitializationDNS = "dns" mkResourceVirtualEnvironmentContainerInitializationDNS = "dns"
mkResourceVirtualEnvironmentContainerInitializationDNSDomain = "domain" mkResourceVirtualEnvironmentContainerInitializationDNSDomain = "domain"
@ -237,7 +240,8 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
DefaultFunc: func() (interface{}, error) { DefaultFunc: func() (interface{}, error) {
return []interface{}{ return []interface{}{
map[string]interface{}{ map[string]interface{}{
mkResourceVirtualEnvironmentVMDiskDatastoreID: dvResourceVirtualEnvironmentContainerDiskDatastoreID, mkResourceVirtualEnvironmentContainerDiskDatastoreID: dvResourceVirtualEnvironmentContainerDiskDatastoreID,
mkResourceVirtualEnvironmentContainerDiskSize: dvResourceVirtualEnvironmentContainerDiskSize,
}, },
}, nil }, nil
}, },
@ -250,6 +254,14 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
ForceNew: true, ForceNew: true,
Default: dvResourceVirtualEnvironmentContainerDiskDatastoreID, Default: dvResourceVirtualEnvironmentContainerDiskDatastoreID,
}, },
mkResourceVirtualEnvironmentContainerDiskSize: {
Type: schema.TypeInt,
Description: "The rootfs size in gigabytes",
Optional: true,
ForceNew: true,
Default: dvResourceVirtualEnvironmentContainerDiskSize,
ValidateDiagFunc: validation.ToDiagFunc(validation.IntAtLeast(1)),
},
}, },
}, },
MaxItems: 1, MaxItems: 1,
@ -929,6 +941,16 @@ func resourceVirtualEnvironmentContainerCreateCustom(ctx context.Context, d *sch
diskDatastoreID := diskBlock[mkResourceVirtualEnvironmentContainerDiskDatastoreID].(string) diskDatastoreID := diskBlock[mkResourceVirtualEnvironmentContainerDiskDatastoreID].(string)
var rootFS *proxmox.VirtualEnvironmentContainerCustomRootFS
diskSize := diskBlock[mkResourceVirtualEnvironmentContainerDiskSize].(int)
if diskSize != dvResourceVirtualEnvironmentContainerDiskSize && diskDatastoreID != "" {
// This is a special case where the rootfs size is set to a non-default value at creation time.
// see https://pve.proxmox.com/pve-docs/chapter-pct.html#_storage_backed_mount_points
rootFS = &proxmox.VirtualEnvironmentContainerCustomRootFS{
Volume: fmt.Sprintf("%s:%d", diskDatastoreID, diskSize),
}
}
initialization := d.Get(mkResourceVirtualEnvironmentContainerInitialization).([]interface{}) initialization := d.Get(mkResourceVirtualEnvironmentContainerInitialization).([]interface{})
initializationDNSDomain := dvResourceVirtualEnvironmentContainerInitializationDNSDomain initializationDNSDomain := dvResourceVirtualEnvironmentContainerInitializationDNSDomain
initializationDNSServer := dvResourceVirtualEnvironmentContainerInitializationDNSServer initializationDNSServer := dvResourceVirtualEnvironmentContainerInitializationDNSServer
@ -1099,6 +1121,7 @@ func resourceVirtualEnvironmentContainerCreateCustom(ctx context.Context, d *sch
NetworkInterfaces: networkInterfaceArray, NetworkInterfaces: networkInterfaceArray,
OSTemplateFileVolume: &operatingSystemTemplateFileID, OSTemplateFileVolume: &operatingSystemTemplateFileID,
OSType: &operatingSystemType, OSType: &operatingSystemType,
RootFS: rootFS,
StartOnBoot: &started, StartOnBoot: &started,
Swap: &memorySwap, Swap: &memorySwap,
Template: &template, Template: &template,
@ -1309,7 +1332,7 @@ func resourceVirtualEnvironmentContainerRead(ctx context.Context, d *schema.Reso
return diag.FromErr(err) return diag.FromErr(err)
} }
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{}) clone := d.Get(mkResourceVirtualEnvironmentContainerClone).([]interface{})
// Compare the primitive values to those stored in the state. // Compare the primitive values to those stored in the state.
currentDescription := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string) currentDescription := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string)
@ -1406,22 +1429,33 @@ func resourceVirtualEnvironmentContainerRead(ctx context.Context, d *schema.Reso
if containerConfig.RootFS != nil { if containerConfig.RootFS != nil {
volumeParts := strings.Split(containerConfig.RootFS.Volume, ":") volumeParts := strings.Split(containerConfig.RootFS.Volume, ":")
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = volumeParts[0] disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = volumeParts[0]
diskSize, err := parseDiskSize(containerConfig.RootFS.DiskSize)
if err != nil {
return diag.FromErr(err)
}
disk[mkResourceVirtualEnvironmentContainerDiskSize] = diskSize
} else { } else {
// Default value of "storage" is "local" according to the API documentation. // Default value of "storage" is "local" according to the API documentation.
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = "local" disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = "local"
disk[mkResourceVirtualEnvironmentContainerDiskSize] = dvResourceVirtualEnvironmentContainerDiskSize
} }
currentDisk := d.Get(mkResourceVirtualEnvironmentContainerDisk).([]interface{}) currentDisk := d.Get(mkResourceVirtualEnvironmentContainerDisk).([]interface{})
if len(clone) > 0 { if len(clone) > 0 {
if len(currentDisk) > 0 { if len(currentDisk) > 0 {
// do not override the rootfs size if it was not changed during the clone operation
if currentDisk[0].(map[string]interface{})[mkResourceVirtualEnvironmentContainerDiskSize] == dvResourceVirtualEnvironmentContainerDiskSize {
disk[mkResourceVirtualEnvironmentContainerDiskSize] = dvResourceVirtualEnvironmentContainerDiskSize
}
err := d.Set(mkResourceVirtualEnvironmentContainerDisk, []interface{}{disk}) err := d.Set(mkResourceVirtualEnvironmentContainerDisk, []interface{}{disk})
diags = append(diags, diag.FromErr(err)...) diags = append(diags, diag.FromErr(err)...)
} }
} else if len(currentDisk) > 0 || } else if len(currentDisk) > 0 ||
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] != dvResourceVirtualEnvironmentContainerDiskDatastoreID { disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] != dvResourceVirtualEnvironmentContainerDiskDatastoreID ||
disk[mkResourceVirtualEnvironmentContainerDiskSize] != dvResourceVirtualEnvironmentContainerDiskSize {
err := d.Set(mkResourceVirtualEnvironmentContainerDisk, []interface{}{disk}) err := d.Set(mkResourceVirtualEnvironmentContainerDisk, []interface{}{disk})
diags = append(diags, diag.FromErr(err)...) diags = append(diags, diag.FromErr(err)...)
} }