From f6386b0951ca7e6c987c3129d824c03e5ce848f3 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Tue, 11 Jan 2022 13:17:02 +0530 Subject: [PATCH] Fix ip address deletion during "terraform destory" command. All created IP addresses will be destroyed but the IP having source nat, does not have to be deassociated. --- cloudstack/resource_cloudstack_ipaddress.go | 36 +++++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/cloudstack/resource_cloudstack_ipaddress.go b/cloudstack/resource_cloudstack_ipaddress.go index 743cd10b..98ad47ec 100644 --- a/cloudstack/resource_cloudstack_ipaddress.go +++ b/cloudstack/resource_cloudstack_ipaddress.go @@ -72,6 +72,11 @@ func resourceCloudStackIPAddress() *schema.Resource { Computed: true, }, + "is_source_nat": { + Type: schema.TypeBool, + Computed: true, + }, + "tags": tagsSchema(), }, } @@ -154,6 +159,7 @@ func resourceCloudStackIPAddressRead(d *schema.ResourceData, meta interface{}) e } d.Set("is_portable", ip.Isportable) + d.Set("is_source_nat", ip.Issourcenat) // Updated the IP address d.Set("ip_address", ip.Ipaddress) @@ -182,21 +188,23 @@ func resourceCloudStackIPAddressRead(d *schema.ResourceData, meta interface{}) e } func resourceCloudStackIPAddressDelete(d *schema.ResourceData, meta interface{}) error { - cs := meta.(*cloudstack.CloudStackClient) - - // Create a new parameter struct - p := cs.Address.NewDisassociateIpAddressParams(d.Id()) - - // Disassociate the IP address - if _, err := cs.Address.DisassociateIpAddress(p); err != nil { - // This is a very poor way to be told the ID does no longer exist :( - if strings.Contains(err.Error(), fmt.Sprintf( - "Invalid parameter id value=%s due to incorrect long value format, "+ - "or entity does not exist", d.Id())) { - return nil + if !d.Get("is_source_nat").(bool) { + cs := meta.(*cloudstack.CloudStackClient) + + // Create a new parameter struct + p := cs.Address.NewDisassociateIpAddressParams(d.Id()) + + // Disassociate the IP address + if _, err := cs.Address.DisassociateIpAddress(p); err != nil { + // This is a very poor way to be told the ID does no longer exist :( + if strings.Contains(err.Error(), fmt.Sprintf( + "Invalid parameter id value=%s due to incorrect long value format, "+ + "or entity does not exist", d.Id())) { + return nil + } + + return fmt.Errorf("Error disassociating IP address %s: %s", d.Id(), err) } - - return fmt.Errorf("Error disassociating IP address %s: %s", d.Id(), err) } return nil