|
9 | 9 | "encoding/json" |
10 | 10 | "fmt" |
11 | 11 | "log" |
| 12 | + "strings" |
12 | 13 | "time" |
13 | 14 |
|
14 | 15 | "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns" |
@@ -79,7 +80,7 @@ func ResourceIBMIsVirtualNetworkInterface() *schema.Resource { |
79 | 80 | "auto_delete": &schema.Schema{ |
80 | 81 | Type: schema.TypeBool, |
81 | 82 | Optional: true, |
82 | | - Computed: true, |
| 83 | + Default: true, |
83 | 84 | Description: "Indicates whether this reserved IP member will be automatically deleted when either target is deleted, or the reserved IP is unbound.", |
84 | 85 | }, |
85 | 86 | "href": &schema.Schema{ |
@@ -576,29 +577,56 @@ func resourceIBMIsVirtualNetworkInterfaceUpdate(context context.Context, d *sche |
576 | 577 | log.Printf("[INFO] vnip2 ipsoldmap old map %s", output(oldips)) |
577 | 578 | log.Printf("[INFO] vnip2 ipsnewmap new map %s", output(newIPs)) |
578 | 579 |
|
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) |
585 | 582 |
|
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) |
598 | 624 | } |
599 | 625 | } |
600 | 626 | } |
601 | 627 | } |
| 628 | + remove := os.Difference(ns).List() |
| 629 | + log.Printf("[INFO] vnip2 remove map %s", output(remove)) |
602 | 630 | if remove != nil && len(remove) > 0 { |
603 | 631 | subnetId := d.Get("subnet").(string) |
604 | 632 | for _, ipItem := range remove { |
@@ -627,6 +655,26 @@ func resourceIBMIsVirtualNetworkInterfaceUpdate(context context.Context, d *sche |
627 | 655 | } |
628 | 656 | } |
629 | 657 | } |
| 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 | + |
630 | 678 | } |
631 | 679 | if !d.IsNewResource() && d.HasChange("primary_ip") { |
632 | 680 | subnetId := d.Get("subnet").(string) |
@@ -981,6 +1029,8 @@ func hashIpsList(v interface{}) int { |
981 | 1029 | var buf bytes.Buffer |
982 | 1030 | a := v.(map[string]interface{}) |
983 | 1031 | 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))) |
984 | 1034 | return conns.String(buf.String()) |
985 | 1035 | } |
986 | 1036 | func output(vnimap interface{}) string { |
|
0 commit comments