From cfe0831b1c7e2f29a560a2f928432a9008839687 Mon Sep 17 00:00:00 2001 From: Dan Petersen Date: Sat, 14 Mar 2020 17:40:59 +0100 Subject: [PATCH] Additional logic while waiting for QEMU agent to publish the network interfaces --- proxmox/virtual_environment_vm.go | 19 ++++++++++++++++--- proxmoxtf/resource_virtual_environment_vm.go | 2 +- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/proxmox/virtual_environment_vm.go b/proxmox/virtual_environment_vm.go index e7606059..c552f27d 100644 --- a/proxmox/virtual_environment_vm.go +++ b/proxmox/virtual_environment_vm.go @@ -139,7 +139,7 @@ func (c *VirtualEnvironmentClient) UpdateVMAsync(nodeName string, vmID int, d *V } // WaitForNetworkInterfacesFromVMAgent waits for a virtual machine's QEMU agent to publish the network interfaces. -func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(nodeName string, vmID int, timeout int, delay int) (*VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData, error) { +func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(nodeName string, vmID int, timeout int, delay int, waitForIP bool) (*VirtualEnvironmentVMGetQEMUNetworkInterfacesResponseData, error) { timeDelay := int64(delay) timeMax := float64(timeout) timeStart := time.Now() @@ -149,8 +149,21 @@ func (c *VirtualEnvironmentClient) WaitForNetworkInterfacesFromVMAgent(nodeName if int64(timeElapsed.Seconds())%timeDelay == 0 { data, err := c.GetVMNetworkInterfacesFromAgent(nodeName, vmID) - if err == nil && data != nil { - return data, err + if err == nil && data != nil && data.Result != nil { + missingIP := false + + if waitForIP { + for _, nic := range *data.Result { + if nic.IPAddresses == nil { + missingIP = true + break + } + } + } + + if !missingIP { + return data, err + } } time.Sleep(1 * time.Second) diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index b5e49b03..50946320 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -2722,7 +2722,7 @@ func resourceVirtualEnvironmentVMReadNetworkValues(d *schema.ResourceData, m int if vmConfig.Agent != nil && vmConfig.Agent.Enabled != nil && *vmConfig.Agent.Enabled { macAddresses := []interface{}{} - networkInterfaces, err := veClient.WaitForNetworkInterfacesFromVMAgent(nodeName, vmID, 1800, 5) + networkInterfaces, err := veClient.WaitForNetworkInterfacesFromVMAgent(nodeName, vmID, 900, 5, true) if err == nil && networkInterfaces.Result != nil { ipv4Addresses = make([]interface{}, len(*networkInterfaces.Result))