diff --git a/docs/resources/virtual_environment_container.md b/docs/resources/virtual_environment_container.md index bbd5f5cc..aea8a010 100644 --- a/docs/resources/virtual_environment_container.md +++ b/docs/resources/virtual_environment_container.md @@ -129,7 +129,8 @@ output "ubuntu_container_public_key" { - `initialization` - (Optional) The initialization configuration. - `dns` - (Optional) The DNS configuration. - `domain` - (Optional) The DNS search domain. - - `server` - (Optional) The DNS server. + - `server` - (Optional) The DNS server. The `server` attribute is deprecated and will be removed in a future release. Please use the `servers` attribute instead. + - `servers` - (Optional) The list of DNS servers. - `hostname` - (Optional) The hostname. - `ip_config` - (Optional) The IP configuration (one block per network device). diff --git a/docs/resources/virtual_environment_vm.md b/docs/resources/virtual_environment_vm.md index 16c30d73..3fb0967e 100644 --- a/docs/resources/virtual_environment_vm.md +++ b/docs/resources/virtual_environment_vm.md @@ -331,7 +331,8 @@ output "ubuntu_vm_public_key" { otherwise defaults to `ide2`. - `dns` - (Optional) The DNS configuration. - `domain` - (Optional) The DNS search domain. - - `server` - (Optional) The DNS server. + - `server` - (Optional) The DNS server. The `server` attribute is deprecated and will be removed in a future release. Please use the `servers` attribute instead. + - `servers` - (Optional) The list of DNS servers. - `ip_config` - (Optional) The IP configuration (one block per network device). - `ipv4` - (Optional) The IPv4 configuration. diff --git a/example/resource_virtual_environment_container.tf b/example/resource_virtual_environment_container.tf index bc4dd9ba..b321693e 100644 --- a/example/resource_virtual_environment_container.tf +++ b/example/resource_virtual_environment_container.tf @@ -15,7 +15,7 @@ resource "proxmox_virtual_environment_container" "example_template" { initialization { dns { - server = "1.1.1.1" + servers = ["1.1.1.1", "8.8.8.8"] } hostname = "terraform-provider-proxmox-example-lxc-template" @@ -72,7 +72,7 @@ resource "proxmox_virtual_environment_container" "example" { mount_point { // bind mount, requires root@pam volume = "/mnt/bindmounts/shared" - path = "/shared" + path = "/shared" } node_name = data.proxmox_virtual_environment_nodes.example.names[0] diff --git a/example/resource_virtual_environment_vm.tf b/example/resource_virtual_environment_vm.tf index 3939b6cd..ec6d17a5 100644 --- a/example/resource_virtual_environment_vm.tf +++ b/example/resource_virtual_environment_vm.tf @@ -67,7 +67,7 @@ resource "proxmox_virtual_environment_vm" "example_template" { interface = "scsi4" dns { - server = "1.1.1.1" + servers = ["1.1.1.1", "8.8.8.8"] } ip_config { @@ -154,7 +154,7 @@ resource "proxmox_virtual_environment_vm" "example" { interface = "scsi4" dns { - server = "8.8.8.8" + servers = ["1.1.1.1"] } ip_config { ipv4 { diff --git a/proxmoxtf/resource/container.go b/proxmoxtf/resource/container.go index af41d25c..69ba8992 100644 --- a/proxmoxtf/resource/container.go +++ b/proxmoxtf/resource/container.go @@ -98,6 +98,7 @@ const ( mkResourceVirtualEnvironmentContainerInitializationDNS = "dns" mkResourceVirtualEnvironmentContainerInitializationDNSDomain = "domain" mkResourceVirtualEnvironmentContainerInitializationDNSServer = "server" + mkResourceVirtualEnvironmentContainerInitializationDNSServers = "servers" mkResourceVirtualEnvironmentContainerInitializationHostname = "hostname" mkResourceVirtualEnvironmentContainerInitializationIPConfig = "ip_config" mkResourceVirtualEnvironmentContainerInitializationIPConfigIPv4 = "ipv4" @@ -388,8 +389,17 @@ func Container() *schema.Resource { mkResourceVirtualEnvironmentContainerInitializationDNSServer: { Type: schema.TypeString, Description: "The DNS server", + Deprecated: "The `server` attribute is deprecated and will be removed in a future release. " + + "Please use the `servers` attribute instead.", + Optional: true, + Default: dvResourceVirtualEnvironmentContainerInitializationDNSServer, + }, + mkResourceVirtualEnvironmentContainerInitializationDNSServers: { + Type: schema.TypeList, + Description: "The list of DNS servers", Optional: true, - Default: dvResourceVirtualEnvironmentContainerInitializationDNSServer, + Elem: &schema.Schema{Type: schema.TypeString, ValidateFunc: validation.IsIPv4Address}, + MinItems: 0, }, }, }, @@ -950,10 +960,18 @@ func containerCreateClone(ctx context.Context, d *schema.ResourceData, m interfa if len(initializationDNS) > 0 { initializationDNSBlock := initializationDNS[0].(map[string]interface{}) initializationDNSDomain := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSDomain].(string) - initializationDNSServer := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer].(string) - updateBody.DNSDomain = &initializationDNSDomain - updateBody.DNSServer = &initializationDNSServer + + servers := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServers].([]interface{}) + deprecatedServer := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer].(string) + + if len(servers) > 0 { + nameserver := strings.Join(ConvertToStringSlice(servers), " ") + + updateBody.DNSServer = &nameserver + } else { + updateBody.DNSServer = &deprecatedServer + } } initializationHostname := initializationBlock[mkResourceVirtualEnvironmentContainerInitializationHostname].(string) @@ -1265,7 +1283,17 @@ func containerCreateCustom(ctx context.Context, d *schema.ResourceData, m interf if len(initializationDNS) > 0 { initializationDNSBlock := initializationDNS[0].(map[string]interface{}) initializationDNSDomain = initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSDomain].(string) - initializationDNSServer = initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer].(string) + + servers := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServers].([]interface{}) + deprecatedServer := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer].(string) + + if len(servers) > 0 { + nameserver := strings.Join(ConvertToStringSlice(servers), " ") + + initializationDNSServer = nameserver + } else { + initializationDNSServer = deprecatedServer + } } initializationHostname = initializationBlock[mkResourceVirtualEnvironmentContainerInitializationHostname].(string) @@ -1982,8 +2010,12 @@ func containerRead(ctx context.Context, d *schema.ResourceData, m interface{}) d if containerConfig.DNSServer != nil { initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServer] = *containerConfig.DNSServer + + dnsServer := strings.Split(*containerConfig.DNSServer, " ") + initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServers] = dnsServer } else { initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServer] = "" + initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServers] = []string{} } initialization[mkResourceVirtualEnvironmentContainerInitializationDNS] = []interface{}{ @@ -2459,7 +2491,15 @@ func containerUpdate(ctx context.Context, d *schema.ResourceData, m interface{}) if len(initializationDNS) > 0 { initializationDNSBlock := initializationDNS[0].(map[string]interface{}) initializationDNSDomain = initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSDomain].(string) - initializationDNSServer = initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer].(string) + + servers := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServers].([]interface{}) + deprecatedServer := initializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer].(string) + + if len(servers) > 0 { + initializationDNSServer = strings.Join(ConvertToStringSlice(servers), " ") + } else { + initializationDNSServer = deprecatedServer + } } initializationHostname = initializationBlock[mkResourceVirtualEnvironmentContainerInitializationHostname].(string) diff --git a/proxmoxtf/resource/container_test.go b/proxmoxtf/resource/container_test.go index e322fd54..0d30c0aa 100644 --- a/proxmoxtf/resource/container_test.go +++ b/proxmoxtf/resource/container_test.go @@ -154,11 +154,13 @@ func TestContainerSchema(t *testing.T) { test.AssertOptionalArguments(t, initializationDNSSchema, []string{ mkResourceVirtualEnvironmentContainerInitializationDNSDomain, mkResourceVirtualEnvironmentContainerInitializationDNSServer, + mkResourceVirtualEnvironmentContainerInitializationDNSServers, }) test.AssertValueTypes(t, initializationDNSSchema, map[string]schema.ValueType{ - mkResourceVirtualEnvironmentContainerInitializationDNSDomain: schema.TypeString, - mkResourceVirtualEnvironmentContainerInitializationDNSServer: schema.TypeString, + mkResourceVirtualEnvironmentContainerInitializationDNSDomain: schema.TypeString, + mkResourceVirtualEnvironmentContainerInitializationDNSServer: schema.TypeString, + mkResourceVirtualEnvironmentContainerInitializationDNSServers: schema.TypeList, }) initializationIPConfigSchema := test.AssertNestedSchemaExistence( diff --git a/proxmoxtf/resource/vm.go b/proxmoxtf/resource/vm.go index 23ff4301..03226cf2 100644 --- a/proxmoxtf/resource/vm.go +++ b/proxmoxtf/resource/vm.go @@ -221,6 +221,7 @@ const ( mkResourceVirtualEnvironmentVMInitializationDNS = "dns" mkResourceVirtualEnvironmentVMInitializationDNSDomain = "domain" mkResourceVirtualEnvironmentVMInitializationDNSServer = "server" + mkResourceVirtualEnvironmentVMInitializationDNSServers = "servers" mkResourceVirtualEnvironmentVMInitializationIPConfig = "ip_config" mkResourceVirtualEnvironmentVMInitializationIPConfigIPv4 = "ipv4" mkResourceVirtualEnvironmentVMInitializationIPConfigIPv4Address = "address" @@ -887,8 +888,17 @@ func VM() *schema.Resource { mkResourceVirtualEnvironmentVMInitializationDNSServer: { Type: schema.TypeString, Description: "The DNS server", + Deprecated: "The `server` attribute is deprecated and will be removed in a future release. " + + "Please use the `servers` attribute instead.", + Optional: true, + Default: dvResourceVirtualEnvironmentVMInitializationDNSServer, + }, + mkResourceVirtualEnvironmentVMInitializationDNSServers: { + Type: schema.TypeList, + Description: "The list of DNS servers", Optional: true, - Default: dvResourceVirtualEnvironmentVMInitializationDNSServer, + Elem: &schema.Schema{Type: schema.TypeString, ValidateFunc: validation.IsIPv4Address}, + MinItems: 0, }, }, }, @@ -1658,6 +1668,16 @@ func VM() *schema.Resource { } } +// ConvertToStringSlice helps convert interface slice to string slice. +func ConvertToStringSlice(interfaceSlice []interface{}) []string { + resultSlice := []string{} + for _, val := range interfaceSlice { + resultSlice = append(resultSlice, val.(string)) + } + + return resultSlice +} + func vmCreate(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics { clone := d.Get(mkResourceVirtualEnvironmentVMClone).([]interface{}) @@ -3090,10 +3110,15 @@ func vmGetCloudInitConfig(d *schema.ResourceData) *vms.CustomCloudInitConfig { initializationConfig.SearchDomain = &domain } - server := initializationDNSBlock[mkResourceVirtualEnvironmentVMInitializationDNSServer].(string) + servers := initializationDNSBlock[mkResourceVirtualEnvironmentVMInitializationDNSServers].([]interface{}) + deprecatedServer := initializationDNSBlock[mkResourceVirtualEnvironmentVMInitializationDNSServer].(string) - if server != "" { - initializationConfig.Nameserver = &server + if len(servers) > 0 { + nameserver := strings.Join(ConvertToStringSlice(servers), " ") + + initializationConfig.Nameserver = &nameserver + } else if deprecatedServer != "" { + initializationConfig.Nameserver = &deprecatedServer } } @@ -4458,8 +4483,12 @@ func vmReadCustom( if vmConfig.CloudInitDNSServer != nil { initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServer] = *vmConfig.CloudInitDNSServer + + dnsServer := strings.Split(*vmConfig.CloudInitDNSServer, " ") + initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServers] = dnsServer } else { initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServer] = "" + initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServers] = []string{} } initialization[mkResourceVirtualEnvironmentVMInitializationDNS] = []interface{}{ diff --git a/proxmoxtf/resource/vm_test.go b/proxmoxtf/resource/vm_test.go index 1fc7b4b5..db36cacc 100644 --- a/proxmoxtf/resource/vm_test.go +++ b/proxmoxtf/resource/vm_test.go @@ -300,11 +300,13 @@ func TestVMSchema(t *testing.T) { test.AssertOptionalArguments(t, initializationDNSSchema, []string{ mkResourceVirtualEnvironmentVMInitializationDNSDomain, mkResourceVirtualEnvironmentVMInitializationDNSServer, + mkResourceVirtualEnvironmentVMInitializationDNSServers, }) test.AssertValueTypes(t, initializationDNSSchema, map[string]schema.ValueType{ - mkResourceVirtualEnvironmentVMInitializationDNSDomain: schema.TypeString, - mkResourceVirtualEnvironmentVMInitializationDNSServer: schema.TypeString, + mkResourceVirtualEnvironmentVMInitializationDNSDomain: schema.TypeString, + mkResourceVirtualEnvironmentVMInitializationDNSServer: schema.TypeString, + mkResourceVirtualEnvironmentVMInitializationDNSServers: schema.TypeList, }) initializationIPConfigSchema := test.AssertNestedSchemaExistence(