Skip to content

Commit 34767ab

Browse files
committed
updated logic for vni ips name update
1 parent 8d297e9 commit 34767ab

File tree

1 file changed

+69
-19
lines changed

1 file changed

+69
-19
lines changed

ibm/service/vpc/resource_ibm_is_virtual_network_interface.go

Lines changed: 69 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"encoding/json"
1010
"fmt"
1111
"log"
12+
"strings"
1213
"time"
1314

1415
"github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
@@ -79,7 +80,7 @@ func ResourceIBMIsVirtualNetworkInterface() *schema.Resource {
7980
"auto_delete": &schema.Schema{
8081
Type: schema.TypeBool,
8182
Optional: true,
82-
Computed: true,
83+
Default: true,
8384
Description: "Indicates whether this reserved IP member will be automatically deleted when either target is deleted, or the reserved IP is unbound.",
8485
},
8586
"href": &schema.Schema{
@@ -576,29 +577,56 @@ func resourceIBMIsVirtualNetworkInterfaceUpdate(context context.Context, d *sche
576577
log.Printf("[INFO] vnip2 ipsoldmap old map %s", output(oldips))
577578
log.Printf("[INFO] vnip2 ipsnewmap new map %s", output(newIPs))
578579

579-
ov := oldips.(*schema.Set)
580-
nv := newIPs.(*schema.Set)
581-
remove := (ov.Difference(nv).List())
582-
add := (nv.Difference(ov).List())
583-
log.Printf("[INFO] vnip2 add map %s", output(add))
584-
log.Printf("[INFO] vnip2 remove map %s", output(remove))
580+
os := oldips.(*schema.Set)
581+
ns := newIPs.(*schema.Set)
585582

586-
if add != nil && len(add) > 0 {
587-
for _, ipItem := range add {
588-
value := ipItem.(map[string]interface{})
589-
if value["reserved_ip"] != nil && value["reserved_ip"].(string) != "" {
590-
reservedipid := value["reserved_ip"].(string)
591-
addVirtualNetworkInterfaceIPOptions := &vpcv1.AddVirtualNetworkInterfaceIPOptions{}
592-
addVirtualNetworkInterfaceIPOptions.SetVirtualNetworkInterfaceID(id)
593-
addVirtualNetworkInterfaceIPOptions.SetID(reservedipid)
594-
_, response, err := sess.AddVirtualNetworkInterfaceIPWithContext(context, addVirtualNetworkInterfaceIPOptions)
595-
if err != nil {
596-
log.Printf("[DEBUG] AddVirtualNetworkInterfaceIPWithContext failed in VirtualNetworkInterface patch %s\n%s", err, response)
597-
return diag.FromErr(fmt.Errorf("AddVirtualNetworkInterfaceIPWithContext failed in VirtualNetworkInterface patch %s\n%s", err, response))
583+
for _, nA := range ns.List() {
584+
newPack := nA.(map[string]interface{})
585+
for _, oA := range os.List() {
586+
oldPack := oA.(map[string]interface{})
587+
if strings.Compare(newPack["address"].(string), oldPack["address"].(string)) == 0 {
588+
reserved_ip := oldPack["reserved_ip"].(string)
589+
subnetId := d.Get("subnet").(string)
590+
newName := newPack["name"].(string)
591+
newAutoDelete := newPack["auto_delete"].(bool)
592+
593+
oldName := oldPack["name"].(string)
594+
oldAutoDelete := oldPack["auto_delete"].(bool)
595+
596+
if newName != oldName || newAutoDelete != oldAutoDelete {
597+
598+
updatereservedipoptions := &vpcv1.UpdateSubnetReservedIPOptions{
599+
SubnetID: &subnetId,
600+
ID: &reserved_ip,
601+
}
602+
603+
reservedIpPatchModel := &vpcv1.ReservedIPPatch{}
604+
if strings.Compare(newName, oldName) != 0 {
605+
reservedIpPatchModel.Name = &newName
606+
}
607+
608+
if newAutoDelete != oldAutoDelete {
609+
reservedIpPatchModel.AutoDelete = &newAutoDelete
610+
}
611+
612+
reservedIpPatch, err := reservedIpPatchModel.AsPatch()
613+
if err != nil {
614+
return diag.FromErr(fmt.Errorf("[ERROR] Error calling asPatch for ReservedIPPatch: %s", err))
615+
}
616+
updatereservedipoptions.ReservedIPPatch = reservedIpPatch
617+
log.Printf("[INFO] vnip2 updatereservedipoptions %s", output(updatereservedipoptions))
618+
_, response, err := sess.UpdateSubnetReservedIP(updatereservedipoptions)
619+
if err != nil {
620+
return diag.FromErr(fmt.Errorf("[ERROR] Error while updating reserved ip(%s) of vni(%s) \n%s: %q", reserved_ip, d.Id(), err, response))
621+
}
622+
ns.Remove(nA)
623+
os.Remove(oA)
598624
}
599625
}
600626
}
601627
}
628+
remove := os.Difference(ns).List()
629+
log.Printf("[INFO] vnip2 remove map %s", output(remove))
602630
if remove != nil && len(remove) > 0 {
603631
subnetId := d.Get("subnet").(string)
604632
for _, ipItem := range remove {
@@ -627,6 +655,26 @@ func resourceIBMIsVirtualNetworkInterfaceUpdate(context context.Context, d *sche
627655
}
628656
}
629657
}
658+
add := ns.Difference(os).List()
659+
log.Printf("[INFO] vnip2 add map %s", output(add))
660+
661+
if add != nil && len(add) > 0 {
662+
for _, ipItem := range add {
663+
value := ipItem.(map[string]interface{})
664+
if value["reserved_ip"] != nil && value["reserved_ip"].(string) != "" {
665+
reservedipid := value["reserved_ip"].(string)
666+
addVirtualNetworkInterfaceIPOptions := &vpcv1.AddVirtualNetworkInterfaceIPOptions{}
667+
addVirtualNetworkInterfaceIPOptions.SetVirtualNetworkInterfaceID(id)
668+
addVirtualNetworkInterfaceIPOptions.SetID(reservedipid)
669+
_, response, err := sess.AddVirtualNetworkInterfaceIPWithContext(context, addVirtualNetworkInterfaceIPOptions)
670+
if err != nil {
671+
log.Printf("[DEBUG] AddVirtualNetworkInterfaceIPWithContext failed in VirtualNetworkInterface patch %s\n%s", err, response)
672+
return diag.FromErr(fmt.Errorf("AddVirtualNetworkInterfaceIPWithContext failed in VirtualNetworkInterface patch %s\n%s", err, response))
673+
}
674+
}
675+
}
676+
}
677+
630678
}
631679
if !d.IsNewResource() && d.HasChange("primary_ip") {
632680
subnetId := d.Get("subnet").(string)
@@ -981,6 +1029,8 @@ func hashIpsList(v interface{}) int {
9811029
var buf bytes.Buffer
9821030
a := v.(map[string]interface{})
9831031
buf.WriteString(fmt.Sprintf("%s-", a["address"].(string)))
1032+
buf.WriteString(fmt.Sprintf("%s-", a["name"].(string)))
1033+
buf.WriteString(fmt.Sprintf("%s-", a["reserved_ip"].(string)))
9841034
return conns.String(buf.String())
9851035
}
9861036
func output(vnimap interface{}) string {

0 commit comments

Comments
 (0)