From ac923cd1b42c0c64d9829beb1ab552680b21d98b Mon Sep 17 00:00:00 2001 From: Pavel Boldyrev <627562+bpg@users.noreply.github.com> Date: Thu, 28 Dec 2023 23:07:53 -0500 Subject: [PATCH] fix(vm,lxc): unexpected state drift when using `initialization.dns.servers` (#844) Signed-off-by: Pavel Boldyrev <627562+bpg@users.noreply.github.com> --- proxmoxtf/resource/container.go | 25 +++++++++++++++++++++---- proxmoxtf/resource/vm.go | 26 ++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/proxmoxtf/resource/container.go b/proxmoxtf/resource/container.go index eb01b394..6dfdb41e 100644 --- a/proxmoxtf/resource/container.go +++ b/proxmoxtf/resource/container.go @@ -2011,11 +2011,28 @@ func containerRead(ctx context.Context, d *schema.ResourceData, m interface{}) d initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSDomain] = "" } - if containerConfig.DNSServer != nil { - initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServer] = *containerConfig.DNSServer + // check what we have in the plan + currentInitializationDNSBlock := map[string]interface{}{} + currentInitialization := d.Get(mkResourceVirtualEnvironmentContainerInitialization).([]interface{}) - dnsServer := strings.Split(*containerConfig.DNSServer, " ") - initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServers] = dnsServer + if len(currentInitialization) > 0 { + currentInitializationBlock := currentInitialization[0].(map[string]interface{}) + //nolint:lll + currentInitializationDNS := currentInitializationBlock[mkResourceVirtualEnvironmentContainerInitializationDNS].([]interface{}) + if len(currentInitializationDNS) > 0 { + currentInitializationDNSBlock = currentInitializationDNS[0].(map[string]interface{}) + } + } + + //nolint:lll + currentInitializationDNSServer, ok := currentInitializationDNSBlock[mkResourceVirtualEnvironmentContainerInitializationDNSServer] + if containerConfig.DNSServer != nil { + if ok && currentInitializationDNSServer != "" { + initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServer] = *containerConfig.DNSServer + } else { + dnsServer := strings.Split(*containerConfig.DNSServer, " ") + initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServers] = dnsServer + } } else { initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServer] = "" initializationDNS[mkResourceVirtualEnvironmentContainerInitializationDNSServers] = []string{} diff --git a/proxmoxtf/resource/vm.go b/proxmoxtf/resource/vm.go index c57cbda4..203a8759 100644 --- a/proxmoxtf/resource/vm.go +++ b/proxmoxtf/resource/vm.go @@ -4481,11 +4481,29 @@ func vmReadCustom( initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSDomain] = "" } - if vmConfig.CloudInitDNSServer != nil { - initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServer] = *vmConfig.CloudInitDNSServer + // check what we have in the plan + currentInitializationDNSBlock := map[string]interface{}{} + currentInitialization := d.Get(mkResourceVirtualEnvironmentVMInitialization).([]interface{}) - dnsServer := strings.Split(*vmConfig.CloudInitDNSServer, " ") - initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServers] = dnsServer + if len(currentInitialization) > 0 { + currentInitializationBlock := currentInitialization[0].(map[string]interface{}) + //nolint:lll + currentInitializationDNS := currentInitializationBlock[mkResourceVirtualEnvironmentVMInitializationDNS].([]interface{}) + if len(currentInitializationDNS) > 0 { + currentInitializationDNSBlock = currentInitializationDNS[0].(map[string]interface{}) + } + } + + //nolint:lll + currentInitializationDNSServer, ok := currentInitializationDNSBlock[mkResourceVirtualEnvironmentVMInitializationDNSServer] + if vmConfig.CloudInitDNSServer != nil { + if ok && currentInitializationDNSServer != "" { + // the template is using deprecated attribute mkResourceVirtualEnvironmentVMInitializationDNSServer + initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServer] = *vmConfig.CloudInitDNSServer + } else { + dnsServer := strings.Split(*vmConfig.CloudInitDNSServer, " ") + initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServers] = dnsServer + } } else { initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServer] = "" initializationDNS[mkResourceVirtualEnvironmentVMInitializationDNSServers] = []string{}