From ce920decde15f810581a141dc6b0266718c0f8f3 Mon Sep 17 00:00:00 2001 From: alexissavin Date: Thu, 17 Jun 2021 14:31:34 +0200 Subject: [PATCH] Workaround regarding issue https://github.com/hashicorp/terraform-plugin-sdk/issues/477 For handling Application GSLB members --- solidserver/resource_application.go | 43 ++++------------------------- solidserver/solidserver-helper.go | 40 +++++++++++++++++++++++++++ 2 files changed, 45 insertions(+), 38 deletions(-) diff --git a/solidserver/resource_application.go b/solidserver/resource_application.go index 175337b..95d800d 100644 --- a/solidserver/resource_application.go +++ b/solidserver/resource_application.go @@ -5,7 +5,6 @@ import ( "fmt" "github.com/hashicorp/terraform/helper/schema" "log" - "sort" "net/url" "strings" ) @@ -286,47 +285,15 @@ func resourceapplicationRead(d *schema.ResourceData, meta interface{}) error { d.Set("class", buf[0]["appapplication_class_name"].(string)) // Updating gslb_members information - // Suspended because of issue https://github.com/hashicorp/terraform-plugin-sdk/issues/477 + // Removed because of issue https://github.com/hashicorp/terraform-plugin-sdk/issues/477 // Doesn't make sense to read this information until this issue is fixed //if buf[0]["appapplication_gslbserver_list"].(string) != "" { // d.Set("gslb_members", toStringArrayInterface(strings.Split(strings.TrimSuffix(buf[0]["appapplication_gslbserver_list"].(string), ","), ","))) //} - - if buf[0]["appapplication_gslbserver_list"].(string) != "" { - // Retrieve the list of the remotely configured members - remote_members := toStringArrayInterface(strings.Split(strings.TrimSuffix(buf[0]["appapplication_gslbserver_list"].(string), ","), ",")) - - // Build local list of member indexed by their offset - local_members := toStringArray(d.Get("gslb_members").([]interface{})) - local_members_offsets := make(map[int]string, len(local_members)) - diff := make([]string, 0, len(remote_members)) - res := make([]interface{}, 0, len(remote_members)) - - for _, remote_member := range remote_members { - offset := stringOffsetInSlice(remote_member.(string), local_members) - - if offset != -1 { - local_members_offsets[offset] = remote_member.(string) - } else { - diff = append(diff, remote_member.(string)) - } - } - - // Concat sorted members from by their offset and the diff into d.Set("gslb_members") - keys := make([]int, 0, len(local_members)) - for k := range local_members_offsets { - keys = append(keys, k) - } - sort.Ints(keys) - for _, k := range keys { - res = append(res, local_members_offsets[k]) - } - for _, v := range diff { - res = append(res, v) - } - - d.Set("gslb_members", res) - } + // Workaround + remote_members := strings.Split(strings.TrimSuffix(buf[0]["appapplication_gslbserver_list"].(string), ","), ",") + local_members := toStringArray(d.Get("gslb_members").([]interface{})) + d.Set("gslb_members", typeListConsistentMerge(local_members, remote_members)) // Updating local class_parameters currentClassParameters := d.Get("class_parameters").(map[string]interface{}) diff --git a/solidserver/solidserver-helper.go b/solidserver/solidserver-helper.go index c8caf53..bb52efe 100644 --- a/solidserver/solidserver-helper.go +++ b/solidserver/solidserver-helper.go @@ -7,6 +7,7 @@ import ( "log" "math/big" "net/url" + "sort" "strconv" "strings" ) @@ -56,6 +57,45 @@ func toStringArrayInterface(in []string) []interface{} { return out } +// Consistent merge of TypeList elements, maintaining entries position within the list +// Workaround to TF Plugin SDK issue https://github.com/hashicorp/terraform-plugin-sdk/issues/477 +func typeListConsistentMerge(old []string, new []string) []interface{} { + // Step 1 Build local list of member indexed by their offset + old_offsets := make(map[int]string, len(old)) + diff := make([]string, 0, len(new)) + res := make([]interface{}, 0, len(new)) + + for _, n := range new { + if n != "" { + offset := stringOffsetInSlice(n, old) + + if offset != -1 { + old_offsets[offset] = n + } else { + diff = append(diff, n) + } + } + } + + // Merge sorted entries ordered by their offset with the diff array that contain the new ones + // Step 2 Sort the index + keys := make([]int, 0, len(old)) + for k := range old_offsets { + keys = append(keys, k) + } + sort.Ints(keys) + + // Step 3 build the result + for _, k := range keys { + res = append(res, old_offsets[k]) + } + for _, v := range diff { + res = append(res, v) + } + + return res +} + // BigIntToHexStr convert a Big Integer into an Hexa String func BigIntToHexStr(bigInt *big.Int) string { return fmt.Sprintf("%x", bigInt)