diff --git a/CHANGELOG.md b/CHANGELOG.md index c1c96c1d..88752c68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ ENHANCEMENTS: +* resource/virtual_environment_container: Add `disk` argument * resource/virtual_environment_vm: Add `audio_device` argument * resource/virtual_environment_vm: Add `serial_device` argument diff --git a/README.md b/README.md index 5d37c09e..b411a9ac 100644 --- a/README.md +++ b/README.md @@ -304,6 +304,8 @@ This data source doesn't accept arguments. * `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 ID of the datastore to create the disk in (defaults to `local-lvm`) * `initialization` - (Optional) The initialization configuration * `dns` - (Optional) The DNS configuration * `domain` - (Optional) The DNS search domain diff --git a/proxmoxtf/resource_virtual_environment_container.go b/proxmoxtf/resource_virtual_environment_container.go index 5fd51572..c4df398d 100644 --- a/proxmoxtf/resource_virtual_environment_container.go +++ b/proxmoxtf/resource_virtual_environment_container.go @@ -31,13 +31,6 @@ const ( dvResourceVirtualEnvironmentContainerCPUUnits = 1024 dvResourceVirtualEnvironmentContainerDescription = "" dvResourceVirtualEnvironmentContainerDiskDatastoreID = "local-lvm" - dvResourceVirtualEnvironmentContainerDiskFileFormat = "qcow2" - dvResourceVirtualEnvironmentContainerDiskFileID = "" - dvResourceVirtualEnvironmentContainerDiskSize = 8 - dvResourceVirtualEnvironmentContainerDiskSpeedRead = 0 - dvResourceVirtualEnvironmentContainerDiskSpeedReadBurstable = 0 - dvResourceVirtualEnvironmentContainerDiskSpeedWrite = 0 - dvResourceVirtualEnvironmentContainerDiskSpeedWriteBurstable = 0 dvResourceVirtualEnvironmentContainerMemoryDedicated = 512 dvResourceVirtualEnvironmentContainerMemorySwap = 0 dvResourceVirtualEnvironmentContainerNetworkInterfaceBridge = "vmbr0" @@ -59,6 +52,8 @@ const ( mkResourceVirtualEnvironmentContainerCPUCores = "cores" mkResourceVirtualEnvironmentContainerCPUUnits = "units" mkResourceVirtualEnvironmentContainerDescription = "description" + mkResourceVirtualEnvironmentContainerDisk = "disk" + mkResourceVirtualEnvironmentContainerDiskDatastoreID = "datastore_id" mkResourceVirtualEnvironmentContainerInitialization = "initialization" mkResourceVirtualEnvironmentContainerInitializationDNS = "dns" mkResourceVirtualEnvironmentContainerInitializationDNSDomain = "domain" @@ -184,6 +179,32 @@ func resourceVirtualEnvironmentContainer() *schema.Resource { Optional: true, Default: dvResourceVirtualEnvironmentContainerDescription, }, + mkResourceVirtualEnvironmentContainerDisk: &schema.Schema{ + Type: schema.TypeList, + Description: "The disks", + Optional: true, + ForceNew: true, + DefaultFunc: func() (interface{}, error) { + return []interface{}{ + map[string]interface{}{ + mkResourceVirtualEnvironmentVMDiskDatastoreID: dvResourceVirtualEnvironmentContainerDiskDatastoreID, + }, + }, nil + }, + Elem: &schema.Resource{ + Schema: map[string]*schema.Schema{ + mkResourceVirtualEnvironmentContainerDiskDatastoreID: { + Type: schema.TypeString, + Description: "The datastore id", + Optional: true, + ForceNew: true, + Default: dvResourceVirtualEnvironmentContainerDiskDatastoreID, + }, + }, + }, + MaxItems: 1, + MinItems: 0, + }, mkResourceVirtualEnvironmentContainerInitialization: &schema.Schema{ Type: schema.TypeList, Description: "The initialization configuration", @@ -511,6 +532,14 @@ func resourceVirtualEnvironmentContainerCreate(d *schema.ResourceData, m interfa description := d.Get(mkResourceVirtualEnvironmentContainerDescription).(string) + diskBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentContainerDisk}, 0, true) + + if err != nil { + return err + } + + diskDatastoreID := diskBlock[mkResourceVirtualEnvironmentContainerDiskDatastoreID].(string) + initialization := d.Get(mkResourceVirtualEnvironmentContainerInitialization).([]interface{}) initializationDNSDomain := dvResourceVirtualEnvironmentContainerInitializationDNSDomain initializationDNSServer := dvResourceVirtualEnvironmentContainerInitializationDNSServer @@ -666,15 +695,13 @@ func resourceVirtualEnvironmentContainerCreate(d *schema.ResourceData, m interfa } // Attempt to create the resource using the retrieved values. - datastoreID := "local-lvm" - body := proxmox.VirtualEnvironmentContainerCreateRequestBody{ ConsoleEnabled: &consoleEnabled, ConsoleMode: &consoleMode, CPUArchitecture: &cpuArchitecture, CPUCores: &cpuCores, CPUUnits: &cpuUnits, - DatastoreID: &datastoreID, + DatastoreID: &diskDatastoreID, DedicatedMemory: &memoryDedicated, NetworkInterfaces: networkInterfaceArray, OSTemplateFileVolume: &operatingSystemTemplateFileID, @@ -901,6 +928,25 @@ func resourceVirtualEnvironmentContainerRead(d *schema.ResourceData, m interface d.Set(mkResourceVirtualEnvironmentContainerCPU, []interface{}{cpu}) } + // Compare the disk configuration to the one stored in the state. + disk := map[string]interface{}{} + + if containerConfig.RootFS != nil { + volumeParts := strings.Split(containerConfig.RootFS.Volume, ":") + + disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = volumeParts[0] + } else { + // Default value of "storage" is "local" according to the API documentation. + disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] = "local" + } + + currentDisk := d.Get(mkResourceVirtualEnvironmentContainerDisk).([]interface{}) + + if len(currentDisk) > 0 || + disk[mkResourceVirtualEnvironmentContainerDiskDatastoreID] != dvResourceVirtualEnvironmentContainerDiskDatastoreID { + d.Set(mkResourceVirtualEnvironmentContainerDiskDatastoreID, []interface{}{disk}) + } + // Compare the memory configuration to the one stored in the state. memory := map[string]interface{}{} diff --git a/proxmoxtf/resource_virtual_environment_container_test.go b/proxmoxtf/resource_virtual_environment_container_test.go index 076d7a41..bec36833 100644 --- a/proxmoxtf/resource_virtual_environment_container_test.go +++ b/proxmoxtf/resource_virtual_environment_container_test.go @@ -31,6 +31,7 @@ func TestResourceVirtualEnvironmentContainerSchema(t *testing.T) { testOptionalArguments(t, s, []string{ mkResourceVirtualEnvironmentContainerCPU, mkResourceVirtualEnvironmentContainerDescription, + mkResourceVirtualEnvironmentContainerDisk, mkResourceVirtualEnvironmentContainerInitialization, mkResourceVirtualEnvironmentContainerMemory, mkResourceVirtualEnvironmentContainerPoolID, @@ -41,6 +42,7 @@ func TestResourceVirtualEnvironmentContainerSchema(t *testing.T) { testSchemaValueTypes(t, s, []string{ mkResourceVirtualEnvironmentContainerCPU, mkResourceVirtualEnvironmentContainerDescription, + mkResourceVirtualEnvironmentContainerDisk, mkResourceVirtualEnvironmentContainerInitialization, mkResourceVirtualEnvironmentContainerMemory, mkResourceVirtualEnvironmentContainerOperatingSystem, @@ -53,6 +55,7 @@ func TestResourceVirtualEnvironmentContainerSchema(t *testing.T) { schema.TypeList, schema.TypeList, schema.TypeList, + schema.TypeList, schema.TypeString, schema.TypeBool, schema.TypeInt, @@ -76,6 +79,18 @@ func TestResourceVirtualEnvironmentContainerSchema(t *testing.T) { schema.TypeInt, }) + diskSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentContainerDisk) + + testOptionalArguments(t, diskSchema, []string{ + mkResourceVirtualEnvironmentContainerDiskDatastoreID, + }) + + testSchemaValueTypes(t, diskSchema, []string{ + mkResourceVirtualEnvironmentContainerDiskDatastoreID, + }, []schema.ValueType{ + schema.TypeString, + }) + initializationSchema := testNestedSchemaExistence(t, s, mkResourceVirtualEnvironmentContainerInitialization) testOptionalArguments(t, initializationSchema, []string{