From 8c84784d69852c6c0db2ca26bc484d37be5a1527 Mon Sep 17 00:00:00 2001 From: Dan Petersen Date: Sat, 14 Mar 2020 21:20:05 +0100 Subject: [PATCH] Add agent.timeout argument --- CHANGELOG.md | 1 + .../proxmox_virtual_environment_vm.md | 1 + proxmoxtf/resource_virtual_environment_vm.go | 41 ++++++++++++++++++- .../resource_virtual_environment_vm_test.go | 1 + proxmoxtf/utils.go | 21 ++++++++++ 5 files changed, 63 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9ea2bc8b..f134e009 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ENHANCEMENTS: * resource/virtual_environment_container: Add `clone` argument * resource/virtual_environment_container: Add `disk` argument * resource/virtual_environment_container: Add `template` argument +* resource/virtual_environment_vm: Add `agent.timeout` argument * resource/virtual_environment_vm: Add `audio_device` argument * resource/virtual_environment_vm: Add `clone` argument * resource/virtual_environment_vm: Add `initialization.datastore_id` argument diff --git a/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md b/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md index 40ba1ccd..c907650d 100644 --- a/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md +++ b/docs/resources/virtual_environment/proxmox_virtual_environment_vm.md @@ -96,6 +96,7 @@ output "ubuntu_vm_public_key" { * `acpi` - (Optional) Whether to enable ACPI (defaults to `true`). * `agent` - (Optional) The QEMU agent configuration. * `enabled` - (Optional) Whether to enable the QEMU agent (defaults to `false`). + * `timeout` - (Optional) The maximum amount of time to wait for data from the QEMU agent to become available (defaults to `15m`). * `trim` - (Optional) Whether to enable the FSTRIM feature in the QEMU agent (defaults to `false`). * `type` - (Optional) The QEMU agent interface type (defaults to `virtio`). * `isa` - ISA Serial Port. diff --git a/proxmoxtf/resource_virtual_environment_vm.go b/proxmoxtf/resource_virtual_environment_vm.go index 50946320..da6a6a68 100644 --- a/proxmoxtf/resource_virtual_environment_vm.go +++ b/proxmoxtf/resource_virtual_environment_vm.go @@ -9,6 +9,7 @@ import ( "math" "strconv" "strings" + "time" "github.com/danitso/terraform-provider-proxmox/proxmox" "github.com/hashicorp/terraform/helper/schema" @@ -18,6 +19,7 @@ import ( const ( dvResourceVirtualEnvironmentVMACPI = true dvResourceVirtualEnvironmentVMAgentEnabled = false + dvResourceVirtualEnvironmentVMAgentTimeout = "15m" dvResourceVirtualEnvironmentVMAgentTrim = false dvResourceVirtualEnvironmentVMAgentType = "virtio" dvResourceVirtualEnvironmentVMAudioDeviceDevice = "intel-hda" @@ -81,6 +83,7 @@ const ( mkResourceVirtualEnvironmentVMACPI = "acpi" mkResourceVirtualEnvironmentVMAgent = "agent" mkResourceVirtualEnvironmentVMAgentEnabled = "enabled" + mkResourceVirtualEnvironmentVMAgentTimeout = "timeout" mkResourceVirtualEnvironmentVMAgentTrim = "trim" mkResourceVirtualEnvironmentVMAgentType = "type" mkResourceVirtualEnvironmentVMAudioDevice = "audio_device" @@ -181,6 +184,7 @@ func resourceVirtualEnvironmentVM() *schema.Resource { return []interface{}{ map[string]interface{}{ mkResourceVirtualEnvironmentVMAgentEnabled: dvResourceVirtualEnvironmentVMAgentEnabled, + mkResourceVirtualEnvironmentVMAgentTimeout: dvResourceVirtualEnvironmentVMAgentTimeout, mkResourceVirtualEnvironmentVMAgentTrim: dvResourceVirtualEnvironmentVMAgentEnabled, mkResourceVirtualEnvironmentVMAgentType: dvResourceVirtualEnvironmentVMAgentType, }, @@ -194,6 +198,13 @@ func resourceVirtualEnvironmentVM() *schema.Resource { Optional: true, Default: dvResourceVirtualEnvironmentVMAgentEnabled, }, + mkResourceVirtualEnvironmentVMAgentTimeout: &schema.Schema{ + Type: schema.TypeString, + Description: "The maximum amount of time to wait for data from the QEMU agent to become available", + Optional: true, + Default: dvResourceVirtualEnvironmentVMAgentTimeout, + ValidateFunc: getTimeoutValidator(), + }, mkResourceVirtualEnvironmentVMAgentTrim: { Type: schema.TypeBool, Description: "Whether to enable the FSTRIM feature in the QEMU agent", @@ -2053,6 +2064,19 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{ agent[mkResourceVirtualEnvironmentVMAgentTrim] = false } + if len(currentAgent) > 0 { + currentAgentBlock := currentAgent[0].(map[string]interface{}) + currentAgentTimeout := currentAgentBlock[mkResourceVirtualEnvironmentVMAgentTimeout].(string) + + if currentAgentTimeout != "" { + agent[mkResourceVirtualEnvironmentVMAgentTimeout] = currentAgentTimeout + } else { + agent[mkResourceVirtualEnvironmentVMAgentTimeout] = dvResourceVirtualEnvironmentVMAgentTimeout + } + } else { + agent[mkResourceVirtualEnvironmentVMAgentTimeout] = dvResourceVirtualEnvironmentVMAgentTimeout + } + if vmConfig.Agent.Type != nil { agent[mkResourceVirtualEnvironmentVMAgentType] = *vmConfig.Agent.Type } else { @@ -2065,6 +2089,7 @@ func resourceVirtualEnvironmentVMReadCustom(d *schema.ResourceData, m interface{ } } else if len(currentAgent) > 0 || agent[mkResourceVirtualEnvironmentVMAgentEnabled] != dvResourceVirtualEnvironmentVMAgentEnabled || + agent[mkResourceVirtualEnvironmentVMAgentTimeout] != dvResourceVirtualEnvironmentVMAgentTimeout || agent[mkResourceVirtualEnvironmentVMAgentTrim] != dvResourceVirtualEnvironmentVMAgentTrim || agent[mkResourceVirtualEnvironmentVMAgentType] != dvResourceVirtualEnvironmentVMAgentType { d.Set(mkResourceVirtualEnvironmentVMAgent, []interface{}{agent}) @@ -2720,9 +2745,21 @@ func resourceVirtualEnvironmentVMReadNetworkValues(d *schema.ResourceData, m int if started { if vmConfig.Agent != nil && vmConfig.Agent.Enabled != nil && *vmConfig.Agent.Enabled { - macAddresses := []interface{}{} + resource := resourceVirtualEnvironmentVM() + agentBlock, err := getSchemaBlock(resource, d, m, []string{mkResourceVirtualEnvironmentVMAgent}, 0, true) - networkInterfaces, err := veClient.WaitForNetworkInterfacesFromVMAgent(nodeName, vmID, 900, 5, true) + if err != nil { + return err + } + + agentTimeout, err := time.ParseDuration(agentBlock[mkResourceVirtualEnvironmentVMAgentTimeout].(string)) + + if err != nil { + return err + } + + macAddresses := []interface{}{} + networkInterfaces, err := veClient.WaitForNetworkInterfacesFromVMAgent(nodeName, vmID, int(agentTimeout.Seconds()), 5, true) if err == nil && networkInterfaces.Result != nil { ipv4Addresses = make([]interface{}, len(*networkInterfaces.Result)) diff --git a/proxmoxtf/resource_virtual_environment_vm_test.go b/proxmoxtf/resource_virtual_environment_vm_test.go index 46308059..db0fa213 100644 --- a/proxmoxtf/resource_virtual_environment_vm_test.go +++ b/proxmoxtf/resource_virtual_environment_vm_test.go @@ -89,6 +89,7 @@ func TestResourceVirtualEnvironmentVMSchema(t *testing.T) { testOptionalArguments(t, agentSchema, []string{ mkResourceVirtualEnvironmentVMAgentEnabled, + mkResourceVirtualEnvironmentVMAgentTimeout, mkResourceVirtualEnvironmentVMAgentTrim, mkResourceVirtualEnvironmentVMAgentType, }) diff --git a/proxmoxtf/utils.go b/proxmoxtf/utils.go index c2001e31..3cc197cd 100644 --- a/proxmoxtf/utils.go +++ b/proxmoxtf/utils.go @@ -8,6 +8,7 @@ import ( "fmt" "regexp" "testing" + "time" "github.com/hashicorp/terraform/helper/schema" "github.com/hashicorp/terraform/helper/validation" @@ -273,6 +274,26 @@ func getSchemaBlock(r *schema.Resource, d *schema.ResourceData, m interface{}, k return resourceBlock, nil } +func getTimeoutValidator() schema.SchemaValidateFunc { + return func(i interface{}, k string) (ws []string, es []error) { + v, ok := i.(string) + + if !ok { + es = append(es, fmt.Errorf("expected type of %s to be string", k)) + return + } + + _, err := time.ParseDuration(v) + + if err != nil { + es = append(es, fmt.Errorf("expected value of %s to be a duration - got: %s", k, v)) + return + } + + return + } +} + func getVGAMemoryValidator() schema.SchemaValidateFunc { return validation.IntBetween(4, 512) }