Skip to content

Commit 10d0c97

Browse files
accesscontextmanager - Fix permadiff for perimeter ingress / egress rule resources (#12119) (#8526)
[upstream:551f48015dbed65b65a5610cbb41b02f7f801bc6] Signed-off-by: Modular Magician <[email protected]>
1 parent db355ae commit 10d0c97

5 files changed

+287
-16
lines changed

.changelog/12119.txt

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
```release-note: bug
2+
accesscontextmanager: Fixed permadiff for perimeter ingress / egress rule resources
3+
```

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_egress_policy.go

+71-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"log"
2323
"net/http"
2424
"reflect"
25+
"slices"
26+
"sort"
2527
"time"
2628

2729
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -31,6 +33,48 @@ import (
3133
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
3234
)
3335

36+
func AccessContextManagerServicePerimeterDryRunEgressPolicyEgressToResourcesDiffSupressFunc(_, _, _ string, d *schema.ResourceData) bool {
37+
old, new := d.GetChange("egress_to.0.resources")
38+
39+
oldResources, err := tpgresource.InterfaceSliceToStringSlice(old)
40+
if err != nil {
41+
log.Printf("[ERROR] Failed to convert config value: %s", err)
42+
return false
43+
}
44+
45+
newResources, err := tpgresource.InterfaceSliceToStringSlice(new)
46+
if err != nil {
47+
log.Printf("[ERROR] Failed to convert config value: %s", err)
48+
return false
49+
}
50+
51+
sort.Strings(oldResources)
52+
sort.Strings(newResources)
53+
54+
return slices.Equal(oldResources, newResources)
55+
}
56+
57+
func AccessContextManagerServicePerimeterDryRunEgressPolicyIngressToResourcesDiffSupressFunc(_, _, _ string, d *schema.ResourceData) bool {
58+
old, new := d.GetChange("ingress_to.0.resources")
59+
60+
oldResources, err := tpgresource.InterfaceSliceToStringSlice(old)
61+
if err != nil {
62+
log.Printf("[ERROR] Failed to convert config value: %s", err)
63+
return false
64+
}
65+
66+
newResources, err := tpgresource.InterfaceSliceToStringSlice(new)
67+
if err != nil {
68+
log.Printf("[ERROR] Failed to convert config value: %s", err)
69+
return false
70+
}
71+
72+
sort.Strings(oldResources)
73+
sort.Strings(newResources)
74+
75+
return slices.Equal(oldResources, newResources)
76+
}
77+
3478
func ResourceAccessContextManagerServicePerimeterDryRunEgressPolicy() *schema.Resource {
3579
return &schema.Resource{
3680
Create: resourceAccessContextManagerServicePerimeterDryRunEgressPolicyCreate,
@@ -172,9 +216,10 @@ field set to '*' will allow all methods AND permissions for all services.`,
172216
},
173217
},
174218
"resources": {
175-
Type: schema.TypeList,
176-
Optional: true,
177-
ForceNew: true,
219+
Type: schema.TypeList,
220+
Optional: true,
221+
ForceNew: true,
222+
DiffSuppressFunc: AccessContextManagerServicePerimeterDryRunEgressPolicyEgressToResourcesDiffSupressFunc,
178223
Description: `A list of resources, currently only projects in the form
179224
'projects/<projectnumber>', that match this to stanza. A request matches
180225
if it contains a resource in this list. If * is specified for resources,
@@ -499,7 +544,29 @@ func flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyEgressTo
499544
return []interface{}{transformed}
500545
}
501546
func flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyEgressToResources(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
502-
return v
547+
rawConfigValue := d.Get("egress_to.0.resources")
548+
549+
// Convert config value to []string
550+
configValue, err := tpgresource.InterfaceSliceToStringSlice(rawConfigValue)
551+
if err != nil {
552+
log.Printf("[ERROR] Failed to convert config value: %s", err)
553+
return v
554+
}
555+
556+
// Convert v to []string
557+
apiStringValue, err := tpgresource.InterfaceSliceToStringSlice(v)
558+
if err != nil {
559+
log.Printf("[ERROR] Failed to convert API value: %s", err)
560+
return v
561+
}
562+
563+
sortedStrings, err := tpgresource.SortStringsByConfigOrder(configValue, apiStringValue)
564+
if err != nil {
565+
log.Printf("[ERROR] Could not sort API response value: %s", err)
566+
return v
567+
}
568+
569+
return sortedStrings
503570
}
504571

505572
func flattenNestedAccessContextManagerServicePerimeterDryRunEgressPolicyEgressToExternalResources(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_dry_run_ingress_policy.go

+71-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"log"
2323
"net/http"
2424
"reflect"
25+
"slices"
26+
"sort"
2527
"time"
2628

2729
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -31,6 +33,48 @@ import (
3133
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
3234
)
3335

36+
func AccessContextManagerServicePerimeterDryRunIngressPolicyEgressToResourcesDiffSupressFunc(_, _, _ string, d *schema.ResourceData) bool {
37+
old, new := d.GetChange("egress_to.0.resources")
38+
39+
oldResources, err := tpgresource.InterfaceSliceToStringSlice(old)
40+
if err != nil {
41+
log.Printf("[ERROR] Failed to convert config value: %s", err)
42+
return false
43+
}
44+
45+
newResources, err := tpgresource.InterfaceSliceToStringSlice(new)
46+
if err != nil {
47+
log.Printf("[ERROR] Failed to convert config value: %s", err)
48+
return false
49+
}
50+
51+
sort.Strings(oldResources)
52+
sort.Strings(newResources)
53+
54+
return slices.Equal(oldResources, newResources)
55+
}
56+
57+
func AccessContextManagerServicePerimeterDryRunIngressPolicyIngressToResourcesDiffSupressFunc(_, _, _ string, d *schema.ResourceData) bool {
58+
old, new := d.GetChange("ingress_to.0.resources")
59+
60+
oldResources, err := tpgresource.InterfaceSliceToStringSlice(old)
61+
if err != nil {
62+
log.Printf("[ERROR] Failed to convert config value: %s", err)
63+
return false
64+
}
65+
66+
newResources, err := tpgresource.InterfaceSliceToStringSlice(new)
67+
if err != nil {
68+
log.Printf("[ERROR] Failed to convert config value: %s", err)
69+
return false
70+
}
71+
72+
sort.Strings(oldResources)
73+
sort.Strings(newResources)
74+
75+
return slices.Equal(oldResources, newResources)
76+
}
77+
3478
func ResourceAccessContextManagerServicePerimeterDryRunIngressPolicy() *schema.Resource {
3579
return &schema.Resource{
3680
Create: resourceAccessContextManagerServicePerimeterDryRunIngressPolicyCreate,
@@ -173,9 +217,10 @@ field set to '*' will allow all methods AND permissions for all services.`,
173217
},
174218
},
175219
"resources": {
176-
Type: schema.TypeList,
177-
Optional: true,
178-
ForceNew: true,
220+
Type: schema.TypeList,
221+
Optional: true,
222+
ForceNew: true,
223+
DiffSuppressFunc: AccessContextManagerServicePerimeterDryRunIngressPolicyIngressToResourcesDiffSupressFunc,
179224
Description: `A list of resources, currently only projects in the form
180225
'projects/<projectnumber>', protected by this 'ServicePerimeter'
181226
that are allowed to be accessed by sources defined in the
@@ -500,7 +545,29 @@ func flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyIngress
500545
return []interface{}{transformed}
501546
}
502547
func flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyIngressToResources(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
503-
return v
548+
rawConfigValue := d.Get("ingress_to.0.resources")
549+
550+
// Convert config value to []string
551+
configValue, err := tpgresource.InterfaceSliceToStringSlice(rawConfigValue)
552+
if err != nil {
553+
log.Printf("[ERROR] Failed to convert config value: %s", err)
554+
return v
555+
}
556+
557+
// Convert v to []string
558+
apiStringValue, err := tpgresource.InterfaceSliceToStringSlice(v)
559+
if err != nil {
560+
log.Printf("[ERROR] Failed to convert API value: %s", err)
561+
return v
562+
}
563+
564+
sortedStrings, err := tpgresource.SortStringsByConfigOrder(configValue, apiStringValue)
565+
if err != nil {
566+
log.Printf("[ERROR] Could not sort API response value: %s", err)
567+
return v
568+
}
569+
570+
return sortedStrings
504571
}
505572

506573
func flattenNestedAccessContextManagerServicePerimeterDryRunIngressPolicyIngressToOperations(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {

google-beta/services/accesscontextmanager/resource_access_context_manager_service_perimeter_egress_policy.go

+71-4
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import (
2222
"log"
2323
"net/http"
2424
"reflect"
25+
"slices"
26+
"sort"
2527
"time"
2628

2729
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
@@ -31,6 +33,48 @@ import (
3133
"github.com/hashicorp/terraform-provider-google-beta/google-beta/verify"
3234
)
3335

36+
func AccessContextManagerServicePerimeterEgressPolicyEgressToResourcesDiffSupressFunc(_, _, _ string, d *schema.ResourceData) bool {
37+
old, new := d.GetChange("egress_to.0.resources")
38+
39+
oldResources, err := tpgresource.InterfaceSliceToStringSlice(old)
40+
if err != nil {
41+
log.Printf("[ERROR] Failed to convert config value: %s", err)
42+
return false
43+
}
44+
45+
newResources, err := tpgresource.InterfaceSliceToStringSlice(new)
46+
if err != nil {
47+
log.Printf("[ERROR] Failed to convert config value: %s", err)
48+
return false
49+
}
50+
51+
sort.Strings(oldResources)
52+
sort.Strings(newResources)
53+
54+
return slices.Equal(oldResources, newResources)
55+
}
56+
57+
func AccessContextManagerServicePerimeterEgressPolicyIngressToResourcesDiffSupressFunc(_, _, _ string, d *schema.ResourceData) bool {
58+
old, new := d.GetChange("ingress_to.0.resources")
59+
60+
oldResources, err := tpgresource.InterfaceSliceToStringSlice(old)
61+
if err != nil {
62+
log.Printf("[ERROR] Failed to convert config value: %s", err)
63+
return false
64+
}
65+
66+
newResources, err := tpgresource.InterfaceSliceToStringSlice(new)
67+
if err != nil {
68+
log.Printf("[ERROR] Failed to convert config value: %s", err)
69+
return false
70+
}
71+
72+
sort.Strings(oldResources)
73+
sort.Strings(newResources)
74+
75+
return slices.Equal(oldResources, newResources)
76+
}
77+
3478
func ResourceAccessContextManagerServicePerimeterEgressPolicy() *schema.Resource {
3579
return &schema.Resource{
3680
Create: resourceAccessContextManagerServicePerimeterEgressPolicyCreate,
@@ -172,9 +216,10 @@ field set to '*' will allow all methods AND permissions for all services.`,
172216
},
173217
},
174218
"resources": {
175-
Type: schema.TypeList,
176-
Optional: true,
177-
ForceNew: true,
219+
Type: schema.TypeList,
220+
Optional: true,
221+
ForceNew: true,
222+
DiffSuppressFunc: AccessContextManagerServicePerimeterEgressPolicyEgressToResourcesDiffSupressFunc,
178223
Description: `A list of resources, currently only projects in the form
179224
'projects/<projectnumber>', that match this to stanza. A request matches
180225
if it contains a resource in this list. If * is specified for resources,
@@ -497,7 +542,29 @@ func flattenNestedAccessContextManagerServicePerimeterEgressPolicyEgressTo(v int
497542
return []interface{}{transformed}
498543
}
499544
func flattenNestedAccessContextManagerServicePerimeterEgressPolicyEgressToResources(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {
500-
return v
545+
rawConfigValue := d.Get("egress_to.0.resources")
546+
547+
// Convert config value to []string
548+
configValue, err := tpgresource.InterfaceSliceToStringSlice(rawConfigValue)
549+
if err != nil {
550+
log.Printf("[ERROR] Failed to convert config value: %s", err)
551+
return v
552+
}
553+
554+
// Convert v to []string
555+
apiStringValue, err := tpgresource.InterfaceSliceToStringSlice(v)
556+
if err != nil {
557+
log.Printf("[ERROR] Failed to convert API value: %s", err)
558+
return v
559+
}
560+
561+
sortedStrings, err := tpgresource.SortStringsByConfigOrder(configValue, apiStringValue)
562+
if err != nil {
563+
log.Printf("[ERROR] Could not sort API response value: %s", err)
564+
return v
565+
}
566+
567+
return sortedStrings
501568
}
502569

503570
func flattenNestedAccessContextManagerServicePerimeterEgressPolicyEgressToExternalResources(v interface{}, d *schema.ResourceData, config *transport_tpg.Config) interface{} {

0 commit comments

Comments
 (0)