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`).
|
* `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.
|
||||||
|
@ -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 {
|
||||||
|
@ -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)...)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user