0
0
mirror of https://github.com/bpg/terraform-provider-proxmox.git synced 2025-06-30 10:33:46 +00:00

feat(vm, lxc): add new initialization.dns.servers param to vm and container (#832)

feat(vm): add new dns servers param to vm and container, deprecated server param

Signed-off-by: rafsaf <rafal.safin12@gmail.com>
This commit is contained in:
Rafał Safin 2023-12-23 02:19:21 +01:00 committed by GitHub
parent a8b574cfa5
commit 16e571dc19
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 95 additions and 20 deletions

View File

@ -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).

View File

@ -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.

View File

@ -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]

View File

@ -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 {

View File

@ -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)

View File

@ -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(

View File

@ -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{}{

View File

@ -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(