Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DXE-2430 Sort property traffic targets by DC id asc and sort liveness tests by… #401

Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ require (
github.com/spf13/cast v1.3.1
github.com/stretchr/testify v1.7.2
github.com/tj/assert v0.0.3
golang.org/x/exp v0.0.0-20230307190834-24139beb5833
google.golang.org/grpc v1.50.1
)

Expand Down Expand Up @@ -63,7 +64,7 @@ require (
github.com/zclconf/go-cty v1.12.1 // indirect
golang.org/x/crypto v0.0.0-20220517005047-85d78b3ac167 // indirect
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 // indirect
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f // indirect
golang.org/x/sys v0.1.0 // indirect
golang.org/x/text v0.3.8 // indirect
google.golang.org/appengine v1.6.7 // indirect
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c // indirect
Expand Down
4 changes: 4 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20220517005047-85d78b3ac167 h1:O8uGbHCqlTp2P6QJSLmCojM4mN6UemYv8K+dCnmHmu0=
golang.org/x/crypto v0.0.0-20220517005047-85d78b3ac167/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20230307190834-24139beb5833 h1:SChBja7BCQewoTAU7IgvucQKMIXrEpFxNMs0spT3/5s=
golang.org/x/exp v0.0.0-20230307190834-24139beb5833/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
Expand Down Expand Up @@ -318,6 +320,8 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
Expand Down
98 changes: 84 additions & 14 deletions pkg/providers/gtm/resource_akamai_gtm_property.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import (
"github.com/hashicorp/go-cty/cty"
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"

"golang.org/x/exp/slices"
)

func resourceGTMv1Property() *schema.Resource {
Expand Down Expand Up @@ -915,8 +917,19 @@ func populateTrafficTargetObject(ctx context.Context, d *schema.ResourceData, pr
// pull apart List
traffTargList, err := tools.GetInterfaceArrayValue("traffic_target", d)
if err == nil {
dcIds := make([]int, len(traffTargList))
for k, v := range traffTargList {
ttMap, ok := v.(map[string]interface{})
if !ok {
logger.Warnf("populateTrafficTargetObject failed, bad trafficTarget format: %s", v)
continue
}
dcIds[k] = ttMap["datacenter_id"].(int)
}
sort.Sort(sort.IntSlice(dcIds))

trafficObjList := make([]*gtm.TrafficTarget, len(traffTargList)) // create new object list
for i, v := range traffTargList {
for _, v := range traffTargList {
ttMap := v.(map[string]interface{})
trafficTarget := inst.Client(meta).NewTrafficTarget(ctx) // create new object
trafficTarget.DatacenterId = ttMap["datacenter_id"].(int)
Expand All @@ -927,11 +940,12 @@ func populateTrafficTargetObject(ctx context.Context, d *schema.ResourceData, pr
for i, sl := range ttMap["servers"].(*schema.Set).List() {
ls[i] = sl.(string)
}
sort.Sort(sort.StringSlice(ls))
trafficTarget.Servers = ls
}
trafficTarget.Name = ttMap["name"].(string)
trafficTarget.HandoutCName = ttMap["handout_cname"].(string)
trafficObjList[i] = trafficTarget
trafficObjList[slices.Index(dcIds, trafficTarget.DatacenterId)] = trafficTarget
}
prop.TrafficTargets = trafficObjList
} else {
Expand Down Expand Up @@ -964,14 +978,16 @@ func populateTerraformTrafficTargetState(d *schema.ResourceData, prop *gtm.Prope
tt["enabled"] = ttObject.Enabled
tt["weight"] = ttObject.Weight
tt["handout_cname"] = ttObject.HandoutCName
sort.Sort(sort.StringSlice(ttObject.Servers))
tt["servers"] = ttObject.Servers
// remove object
delete(objectInventory, objIndex)
}
if len(objectInventory) > 0 {
// Objects not in the state yet. Add. Unfortunately, they not align with instance indices in the config
// Objects not in the state yet. Add.
for _, mttObj := range objectInventory {
logger.Debugf("Property TrafficObject NEW State Object: %d", mttObj.DatacenterId)
sort.Sort(sort.StringSlice(mttObj.Servers))
ttNew := map[string]interface{}{
"datacenter_id": mttObj.DatacenterId,
"enabled": mttObj.Enabled,
Expand All @@ -983,7 +999,20 @@ func populateTerraformTrafficTargetState(d *schema.ResourceData, prop *gtm.Prope
ttStateList = append(ttStateList, ttNew)
}
}
_ = d.Set("traffic_target", ttStateList)

dcIds := make([]int, len(ttStateList))
for k, st := range ttStateList {
elt, _ := st.(map[string]interface{})
dcIds[k] = elt["datacenter_id"].(int)
}
sort.Sort(sort.IntSlice(dcIds))
ttStateSortedList := make([]interface{}, len(ttStateList))
for _, st := range ttStateList {
elt, _ := st.(map[string]interface{})
ttStateSortedList[slices.Index(dcIds, elt["datacenter_id"].(int))] = st
}

_ = d.Set("traffic_target", ttStateSortedList)
}

// Populate existing static_rr_sets object from resource data
Expand Down Expand Up @@ -1055,11 +1084,23 @@ func populateTerraformStaticRRSetState(d *schema.ResourceData, prop *gtm.Propert

// Populate existing Liveness test object from resource data
func populateLivenessTestObject(ctx context.Context, meta akamai.OperationMeta, d *schema.ResourceData, prop *gtm.Property) {
logger := meta.Log("Akamai GTM", "populateLivenessTestObject")

liveTestList, err := tools.GetInterfaceArrayValue("liveness_test", d)
if err == nil {
ltNames := make([]string, len(liveTestList))
for k, lt := range liveTestList {
livenessTest, ok := lt.(map[string]interface{})
if !ok {
logger.Warnf("populateLivenessTestObject failed, bad livenessTest format: %s", lt)
continue
}
ltNames[k] = livenessTest["name"].(string)
}
sort.Sort(sort.StringSlice(ltNames))

liveTestObjList := make([]*gtm.LivenessTest, len(liveTestList)) // create new object list
for i, l := range liveTestList {
for _, l := range liveTestList {
v := l.(map[string]interface{})
lt := inst.Client(meta).NewLivenessTest(ctx, v["name"].(string),
v["test_object_protocol"].(string),
Expand Down Expand Up @@ -1087,16 +1128,22 @@ func populateLivenessTestObject(ctx context.Context, meta akamai.OperationMeta,
httpHeaderList := v["http_header"].([]interface{})
if httpHeaderList != nil {
headerObjList := make([]*gtm.HttpHeader, len(httpHeaderList)) // create new object list
for i, h := range httpHeaderList {
headerNames := make([]string, len(httpHeaderList))
for k, h := range httpHeaderList {
headerNames[k] = h.(map[string]interface{})["name"].(string)
}
sort.Sort(sort.StringSlice(headerNames))

for _, h := range httpHeaderList {
recMap := h.(map[string]interface{})
record := lt.NewHttpHeader() // create new object
record.Name = recMap["name"].(string)
record.Value = recMap["value"].(string)
headerObjList[i] = record
headerObjList[slices.Index(headerNames, record.Name)] = record
}
lt.HttpHeaders = headerObjList
}
liveTestObjList[i] = lt
liveTestObjList[slices.Index(ltNames, lt.Name)] = lt
}
prop.LivenessTests = liveTestObjList
}
Expand Down Expand Up @@ -1146,20 +1193,25 @@ func populateTerraformLivenessTestState(d *schema.ResourceData, prop *gtm.Proper
lt["resource_type"] = ltObject.ResourceType
lt["recursion_requested"] = ltObject.RecursionRequested
httpHeaderListNew := make([]interface{}, len(ltObject.HttpHeaders))
for i, r := range ltObject.HttpHeaders {
headerNames := make([]string, len(ltObject.HttpHeaders))
for k, r := range ltObject.HttpHeaders {
headerNames[k] = r.Name
}
sort.Sort(sort.StringSlice(headerNames))
for _, r := range ltObject.HttpHeaders {
httpHeaderNew := map[string]interface{}{
"name": r.Name,
"value": r.Value,
}
httpHeaderListNew[i] = httpHeaderNew
httpHeaderListNew[slices.Index(headerNames, r.Name)] = httpHeaderNew
}
lt["http_header"] = httpHeaderListNew
// remove object
delete(objectInventory, objIndex)
}
if len(objectInventory) > 0 {
logger.Debugf("Property LivenessTest objects left...")
// Objects not in the state yet. Add. Unfortunately, they not align with instance indices in the config
// Objects not in the state yet. Add.
for _, l := range objectInventory {
ltNew := map[string]interface{}{
"name": l.Name,
Expand Down Expand Up @@ -1187,18 +1239,36 @@ func populateTerraformLivenessTestState(d *schema.ResourceData, prop *gtm.Proper
"recursion_requested": l.RecursionRequested,
}
httpHeaderListNew := make([]interface{}, len(l.HttpHeaders))
for i, r := range l.HttpHeaders {
headerNames := make([]string, len(l.HttpHeaders))
for k, r := range l.HttpHeaders {
headerNames[k] = r.Name
}
sort.Sort(sort.StringSlice(headerNames))
for _, r := range l.HttpHeaders {
httpHeaderNew := map[string]interface{}{
"name": r.Name,
"value": r.Value,
}
httpHeaderListNew[i] = httpHeaderNew
httpHeaderListNew[slices.Index(headerNames, r.Name)] = httpHeaderNew
}
ltNew["http_header"] = httpHeaderListNew
ltStateList = append(ltStateList, ltNew)
}
}
_ = d.Set("liveness_test", ltStateList)

ltNames := make([]string, len(ltStateList))
for k, lt := range ltStateList {
elt, _ := lt.(map[string]interface{})
ltNames[k] = elt["name"].(string)
}
sort.Sort(sort.StringSlice(ltNames))
ltStateSortedList := make([]interface{}, len(ltStateList))
for _, lt := range ltStateList {
elt, _ := lt.(map[string]interface{})
ltStateSortedList[slices.Index(ltNames, elt["name"].(string))] = lt
}

_ = d.Set("liveness_test", ltStateSortedList)

}

Expand Down