From 0040ea6911af00bea2cca6dbb14e86829826ad8e Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 11 Jan 2023 15:43:02 -0500 Subject: [PATCH 1/4] iam: Improve policy diff handling --- internal/service/iam/group_policy.go | 14 +- internal/service/iam/group_policy_test.go | 4 +- internal/service/iam/policy.go | 15 +- internal/service/iam/policy_test.go | 158 ++++++++++++ internal/service/iam/role.go | 26 +- internal/service/iam/role_policy.go | 14 +- internal/service/iam/role_test.go | 288 +++++++++++++++++++++- internal/service/iam/user_policy.go | 15 +- internal/service/iam/user_policy_test.go | 16 +- internal/verify/json.go | 41 ++- internal/verify/json_test.go | 175 +++++++++++++ 11 files changed, 716 insertions(+), 50 deletions(-) diff --git a/internal/service/iam/group_policy.go b/internal/service/iam/group_policy.go index 261b70a6ebd..bd1490a4ff0 100644 --- a/internal/service/iam/group_policy.go +++ b/internal/service/iam/group_policy.go @@ -36,6 +36,10 @@ func ResourceGroupPolicy() *schema.Resource { ValidateFunc: verify.ValidIAMPolicyJSON, DiffSuppressFunc: verify.SuppressEquivalentPolicyDiffs, DiffSuppressOnRefresh: true, + StateFunc: func(v interface{}) string { + json, _ := verify.LegacyPolicyNormalize(v) + return json + }, }, "name": { Type: schema.TypeString, @@ -62,9 +66,14 @@ func ResourceGroupPolicy() *schema.Resource { func resourceGroupPolicyPut(d *schema.ResourceData, meta interface{}) error { conn := meta.(*conns.AWSClient).IAMConn() + policyDoc, err := verify.LegacyPolicyNormalize(d.Get("policy").(string)) + if err != nil { + return fmt.Errorf("policy (%s) is invalid JSON: %w", policyDoc, err) + } + request := &iam.PutGroupPolicyInput{ GroupName: aws.String(d.Get("group").(string)), - PolicyDocument: aws.String(d.Get("policy").(string)), + PolicyDocument: aws.String(policyDoc), } var policyName string @@ -139,8 +148,7 @@ func resourceGroupPolicyRead(d *schema.ResourceData, meta interface{}) error { return err } - policyToSet, err := verify.SecondJSONUnlessEquivalent(d.Get("policy").(string), policy) - + policyToSet, err := verify.LegacyPolicyToSet(d.Get("policy").(string), policy) if err != nil { return fmt.Errorf("while setting policy (%s), encountered: %w", policyToSet, err) } diff --git a/internal/service/iam/group_policy_test.go b/internal/service/iam/group_policy_test.go index 817f447548c..41a226c8262 100644 --- a/internal/service/iam/group_policy_test.go +++ b/internal/service/iam/group_policy_test.go @@ -339,12 +339,12 @@ resource "aws_iam_group_policy" "test" { policy = < Date: Wed, 11 Jan 2023 15:54:06 -0500 Subject: [PATCH 2/4] Add changelog --- .changelog/28836.txt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .changelog/28836.txt diff --git a/.changelog/28836.txt b/.changelog/28836.txt new file mode 100644 index 00000000000..0a76e23d839 --- /dev/null +++ b/.changelog/28836.txt @@ -0,0 +1,19 @@ +```release-note:bug +resource/aws_iam_group_policy: Improve refresh to avoid unnecessary diffs in `policy` +``` + +```release-note:bug +resource/aws_iam_policy: Improve refresh to avoid unnecessary diffs in `policy`, `tags` +``` + +```release-note:bug +resource/aws_iam_role: Improve refresh to avoid unnecessary diffs in `inline_policy.*.policy`, `tags` +``` + +```release-note:bug +resource/aws_iam_role_policy: Improve refresh to avoid unnecessary diffs in `policy` +``` + +```release-note:bug +resource/aws_iam_user_policy: Improve refresh to avoid unnecessary diffs in `policy` +``` \ No newline at end of file From 38683d06bce08b8a392ece53aeb64a0c8520889e Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 11 Jan 2023 15:54:21 -0500 Subject: [PATCH 3/4] Fixes and cleanup --- internal/service/iam/policy_test.go | 2 +- internal/service/iam/role.go | 2 +- internal/verify/json.go | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/internal/service/iam/policy_test.go b/internal/service/iam/policy_test.go index f87ad997cc0..a3f97c560fd 100644 --- a/internal/service/iam/policy_test.go +++ b/internal/service/iam/policy_test.go @@ -239,7 +239,7 @@ func TestAccIAMPolicy_policy(t *testing.T) { }) } -// https://github.com/hashicorp/terraform-provider-aws/issues/23288#issuecomment-1175361016 +// https://github.com/hashicorp/terraform-provider-aws/issues/28833 func TestAccIAMPolicy_diffs(t *testing.T) { var out iam.GetPolicyOutput rName := sdkacctest.RandomWithPrefix(acctest.ResourcePrefix) diff --git a/internal/service/iam/role.go b/internal/service/iam/role.go index d2b603591d8..1a6794beb5c 100644 --- a/internal/service/iam/role.go +++ b/internal/service/iam/role.go @@ -859,7 +859,7 @@ func readRoleInlinePolicies(roleName string, meta interface{}) ([]*iam.PutRolePo return nil, err } - p, err := structure.NormalizeJsonString(policy) + p, err := verify.LegacyPolicyNormalize(policy) if err != nil { return nil, fmt.Errorf("policy (%s) is invalid JSON: %w", p, err) } diff --git a/internal/verify/json.go b/internal/verify/json.go index 1b6cdf4d06b..38edca68e5d 100644 --- a/internal/verify/json.go +++ b/internal/verify/json.go @@ -168,8 +168,8 @@ func LegacyPolicyNormalize(policy interface{}) (string, error) { return n, nil } -// PolicyToSet returns the existing policy if the new policy is equivalent. -// Otherwise, it returns the new policy. Either policy is normalized. +// LegacyPolicyToSet returns the existing policy if the new policy is equivalent. +// Otherwise, it returns the new policy. Either policy is legacy normalized. func LegacyPolicyToSet(exist, new string) (string, error) { policyToSet, err := SecondJSONUnlessEquivalent(exist, new) if err != nil { From 69f5eede5dd53b133086868f7de78f46d162df51 Mon Sep 17 00:00:00 2001 From: Dirk Avery Date: Wed, 11 Jan 2023 16:00:16 -0500 Subject: [PATCH 4/4] Lint --- internal/service/iam/policy_test.go | 4 ++-- internal/service/iam/role_test.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/internal/service/iam/policy_test.go b/internal/service/iam/policy_test.go index a3f97c560fd..7122ad9dd30 100644 --- a/internal/service/iam/policy_test.go +++ b/internal/service/iam/policy_test.go @@ -543,10 +543,10 @@ resource "aws_iam_policy" "test" { name = %[1]q policy = jsonencode({ - Id = %[1]q + Id = %[1]q Version = "2012-10-17" Statement = [{ - Sid = "60c9d11f" + Sid = "60c9d11f" Effect = "Allow" Action = [ "kms:Describe*", diff --git a/internal/service/iam/role_test.go b/internal/service/iam/role_test.go index 804bf243288..aad05bad305 100644 --- a/internal/service/iam/role_test.go +++ b/internal/service/iam/role_test.go @@ -1307,7 +1307,7 @@ resource "aws_iam_role" "test" { path = "/" assume_role_policy = jsonencode({ - Id = %[1]q + Id = %[1]q Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole"