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:
parent
8bd3fd7b1d
commit
dd9ffe190c
@ -103,8 +103,9 @@ output "ubuntu_container_public_key" {
|
||||
* `cores` - (Optional) The number of CPU cores (defaults to `1`).
|
||||
* `units` - (Optional) The CPU units (defaults to `1024`).
|
||||
* `description` - (Optional) The description.
|
||||
* `disk` - (Optional) A disk.
|
||||
* `datastore_id` - (Optional) The identifier for the datastore to create the disk in (defaults to `local-lvm`).
|
||||
* `disk` - (Optional) The disk configuration.
|
||||
* `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.
|
||||
* `dns` - (Optional) The DNS configuration.
|
||||
* `domain` - (Optional) The DNS search domain.
|
||||
|
@ -3,6 +3,7 @@ resource "proxmox_virtual_environment_container" "example_template" {
|
||||
|
||||
disk {
|
||||
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 {
|
||||
|
@ -12,9 +12,10 @@ import (
|
||||
|
||||
"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/validation"
|
||||
|
||||
"github.com/bpg/terraform-provider-proxmox/proxmox"
|
||||
)
|
||||
|
||||
const (
|
||||
@ -35,7 +36,8 @@ const (
|
||||
dvResourceVirtualEnvironmentContainerCPUCores = 1
|
||||
dvResourceVirtualEnvironmentContainerCPUUnits = 1024
|
||||
dvResourceVirtualEnvironmentContainerDescription = ""
|
||||
dvResourceVirtualEnvironmentContainerDiskDatastoreID = "local-lvm"
|
||||
dvResourceVirtualEnvironmentContainerDiskDatastoreID = "local"
|
||||
dvResourceVirtualEnvironmentContainerDiskSize = 4
|
||||
dvResourceVirtualEnvironmentContainerMemoryDedicated = 512
|
||||
dvResourceVirtualEnvironmentContainerMemorySwap = 0
|
||||
dvResourceVirtualEnvironmentContainerNetworkInterfaceBridge = "vmbr0"
|
||||
@ -67,6 +69,7 @@ const (
|
||||
mkResourceVirtualEnvironmentContainerDescription = "description"
|
||||
mkResourceVirtualEnvironmentContainerDisk = "disk"
|
||||
mkResourceVirtualEnvironmentContainerDiskDatastoreID = "datastore_id"
|
||||
mkResourceVirtualEnvironmentContainerDiskSize = "size"
|
||||
mkResourceVirtualEnvironmentContainerInitialization = "initialization"
|
||||
mkResourceVirtualEnvironmentContainerInitializationDNS = "dns"
|
||||
mkResourceVirtualEnvironmentContainerInitializationDNSDomain = "domain"
|
||||
@ -237,7 +240,8 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
|
||||
DefaultFunc: func() (interface{}, error) {
|
||||
return []interface{}{
|
||||
map[string]interface{}{
|
||||
mkResourceVirtualEnvironmentVMDiskDatastoreID: dvResourceVirtualEnvironmentContainerDiskDatastoreID,
|
||||
mkResourceVirtualEnvironmentContainerDiskDatastoreID: dvResourceVirtualEnvironmentContainerDiskDatastoreID,
|
||||
mkResourceVirtualEnvironmentContainerDiskSize: dvResourceVirtualEnvironmentContainerDiskSize,
|
||||
},
|
||||
}, nil
|
||||
},
|
||||
@ -250,6 +254,14 @@ func resourceVirtualEnvironmentContainer() *schema.Resource {
|
||||
ForceNew: true,
|
||||
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,
|
||||
@ -929,6 +941,16 @@ func resourceVirtualEnvironmentContainerCreateCustom(ctx context.Context, d *sch
|
||||
|
||||
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{})
|
||||
initializationDNSDomain := dvResourceVirtualEnvironmentContainerInitializationDNSDomain
|
||||
initializationDNSServer := dvResourceVirtualEnvironmentContainerInitializationDNSServer
|
||||
@ -1099,6 +1121,7 @@ func resourceVirtualEnvironmentContainerCreateCustom(ctx context.Context, d *sch
|
||||
NetworkInterfaces: networkInterfaceArray,
|
||||
OSTemplateFileVolume: &operatingSystemTemplateFileID,
|
||||
OSType: &operatingSystemType,
|
||||
RootFS: rootFS,
|
||||
StartOnBoot: &started,
|
||||
Swap: &memorySwap,
|
||||
Template: &template,
|
||||
@ -1309,7 +1332,7 @@ func resourceVirtualEnvironmentContainerRead(ctx context.Context, d *schema.Reso
|
||||
return diag.FromErr(err)
|
||||
}
|
||||
|
||||
clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{})
|
||||
clone := d.Get(mkResourceVirtualEnvironmentContainerClone).([]interface{})
|
||||
|
||||
// Compare the primitive values to those stored in the state.
|
||||
currentDescription := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string)
|
||||
@ -1406,22 +1429,33 @@ func resourceVirtualEnvironmentContainerRead(ctx context.Context, d *schema.Reso
|
||||
|
||||
if containerConfig.RootFS != nil {
|
||||
volumeParts := strings.Split(containerConfig.RootFS.Volume, ":")
|
||||
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = volumeParts[0]
|
||||
|
||||
diskSize, err := parseDiskSize(containerConfig.RootFS.DiskSize)
|
||||
if err != nil {
|
||||
return diag.FromErr(err)
|
||||
}
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskSize] = diskSize
|
||||
} else {
|
||||
// Default value of "storage" is "local" according to the API documentation.
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = "local"
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskSize] = dvResourceVirtualEnvironmentContainerDiskSize
|
||||
}
|
||||
|
||||
currentDisk := d.Get(mkResourceVirtualEnvironmentContainerDisk).([]interface{})
|
||||
|
||||
if len(clone) > 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})
|
||||
diags = append(diags, diag.FromErr(err)...)
|
||||
}
|
||||
} else if len(currentDisk) > 0 ||
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] != dvResourceVirtualEnvironmentContainerDiskDatastoreID {
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] != dvResourceVirtualEnvironmentContainerDiskDatastoreID ||
|
||||
disk[mkResourceVirtualEnvironmentContainerDiskSize] != dvResourceVirtualEnvironmentContainerDiskSize {
|
||||
err := d.Set(mkResourceVirtualEnvironmentContainerDisk, []interface{}{disk})
|
||||
diags = append(diags, diag.FromErr(err)...)
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user