Skip to content

Commit

Permalink
fix: [PL-38768]: Ignore order of userEmails when userGroup is created…
Browse files Browse the repository at this point in the history
…/updated via terraform (#567)

* fix: [PL-38768]: Ignore order of userEmails when userGroup is created/updated via terraform

* fix: [PL-39768]: ignore order of users list and userEmails list in userGroups CRUD via terraform

* fix: [PL-38768]: Added change log

* fix: [PL-38768]: Remove commented line
  • Loading branch information
VikasMaddukuriHarness committed Jun 6, 2023
1 parent 9789305 commit 8521317
Show file tree
Hide file tree
Showing 3 changed files with 119 additions and 9 deletions.
3 changes: 3 additions & 0 deletions .changelog/567.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
resource/harness_platform_usergroup - ignore the order of users and user_emails when doing CRUD.
```
32 changes: 26 additions & 6 deletions internal/service/platform/usergroup/usergroup.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ import (
"context"
"fmt"
"net/http"
"reflect"
"sort"

"github.com/harness/harness-go-sdk/harness/nextgen"
"github.com/harness/terraform-provider-harness/helpers"
Expand Down Expand Up @@ -167,12 +169,11 @@ func resourceUserGroupRead(ctx context.Context, d *schema.ResourceData, meta int
return helpers.HandleReadApiError(err, d, httpResp)
}


if attr, ok := d.GetOk("user_emails"); ok {
d.Set("user_emails", attr)
}
if _, ok := d.GetOk("users"); ok {
d.Set("users", resp.Data.Users)
if attr, ok := d.GetOk("users"); ok {
d.Set("users", attr)
}
readUserGroup(d, resp.Data)

Expand Down Expand Up @@ -209,6 +210,10 @@ func resourceUserGroupCreateOrUpdate(ctx context.Context, d *schema.ResourceData

readUserGroup(d, resp.Data)

if resp.Data.Users != nil {
d.Set("users", ignoreOrderIfAllElementsMatch(ug.Users, resp.Data.Users))
}

return nil
}

Expand Down Expand Up @@ -236,7 +241,7 @@ func resourceUserGroupCreateOrUpdate(ctx context.Context, d *schema.ResourceData
return helpers.HandleApiError(err, d, httpResp)
}

readUserGroupV2(d, resp.Data)
readUserGroupV2(d, resp.Data, ug.Users)

return nil
}
Expand Down Expand Up @@ -396,15 +401,30 @@ func buildUserGroupV2(d *schema.ResourceData) nextgen.UserGroupRequestV2 {
return *userGroup
}

func readUserGroupV2(d *schema.ResourceData, env *nextgen.UserGroupResponseV2) {
func ignoreOrderIfAllElementsMatch(input []string, output []string) []string {
sorted_input := make([]string, len(input))
copy(sorted_input, input[:])
sort.Strings(sorted_input)

sorted_output := make([]string, len(output))
copy(sorted_output, output[:])
sort.Strings(sorted_output)

if reflect.DeepEqual(sorted_input, sorted_output) {
return input
}
return output
}

func readUserGroupV2(d *schema.ResourceData, env *nextgen.UserGroupResponseV2, user_emails []string) {
d.SetId(env.Identifier)
d.Set("identifier", env.Identifier)
d.Set("org_id", env.OrgIdentifier)
d.Set("project_id", env.ProjectIdentifier)
d.Set("name", env.Name)
d.Set("description", env.Description)
d.Set("tags", helpers.FlattenTags(env.Tags))
d.Set("user_emails", flattenUserInfo(env.Users))
d.Set("user_emails", ignoreOrderIfAllElementsMatch(user_emails, flattenUserInfo(env.Users)))
d.Set("notification_configs", flattenNotificationConfig(env.NotificationConfigs))
d.Set("linked_sso_id", env.LinkedSsoId)
d.Set("linked_sso_display_name", env.LinkedSsoDisplayName)
Expand Down
93 changes: 90 additions & 3 deletions internal/service/platform/usergroup/usergroup_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,17 +142,23 @@ func TestAccResourceUserGroup_emails(t *testing.T) {
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "id", id),
resource.TestCheckResourceAttr(resourceName, "name", name),
resource.TestCheckResourceAttr(resourceName, "user_emails.#", "1"),
resource.TestCheckResourceAttr(resourceName, "user_emails.#", "4"),
resource.TestCheckResourceAttr(resourceName, "user_emails.0", "rathod.meetsatish@harness.io"),
resource.TestCheckResourceAttr(resourceName, "user_emails.1", "vikas.maddukuri@harness.io"),
resource.TestCheckResourceAttr(resourceName, "user_emails.2", "arkajyoti.mukherjee@harness.io"),
resource.TestCheckResourceAttr(resourceName, "user_emails.3", "mankrit.singh@harness.io"),
),
},
{
Config: testAccResourceUserGroup_emails(id, updatedName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "id", id),
resource.TestCheckResourceAttr(resourceName, "name", updatedName),
resource.TestCheckResourceAttr(resourceName, "user_emails.#", "1"),
resource.TestCheckResourceAttr(resourceName, "user_emails.#", "4"),
resource.TestCheckResourceAttr(resourceName, "user_emails.0", "rathod.meetsatish@harness.io"),
resource.TestCheckResourceAttr(resourceName, "user_emails.1", "vikas.maddukuri@harness.io"),
resource.TestCheckResourceAttr(resourceName, "user_emails.2", "arkajyoti.mukherjee@harness.io"),
resource.TestCheckResourceAttr(resourceName, "user_emails.3", "mankrit.singh@harness.io"),
),
},
{
Expand All @@ -166,6 +172,53 @@ func TestAccResourceUserGroup_emails(t *testing.T) {
})
}

func TestAccResourceUserGroup_userIds(t *testing.T) {

id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5))
name := id
updatedName := fmt.Sprintf("%s_updated", name)
resourceName := "harness_platform_usergroup.test"

resource.UnitTest(t, resource.TestCase{
PreCheck: func() { acctest.TestAccPreCheck(t) },
ProviderFactories: acctest.ProviderFactories,
CheckDestroy: testAccUserGroupDestroy(resourceName),
Steps: []resource.TestStep{
{
Config: testAccResourceUserGroup_userIds(id, name),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "id", id),
resource.TestCheckResourceAttr(resourceName, "name", name),
resource.TestCheckResourceAttr(resourceName, "users.#", "4"),
resource.TestCheckResourceAttr(resourceName, "users.0", "FZ-_NefESDmVvjrhu53MWQ"),
resource.TestCheckResourceAttr(resourceName, "users.1", "TRqwkV-jSvyPdW-4C1c3eg"),
resource.TestCheckResourceAttr(resourceName, "users.2", "0qBvYLghQqCnY9RrmuLJdg"),
resource.TestCheckResourceAttr(resourceName, "users.3", "4PuRra9dTOCbT7RnG3-PRw"),
),
},
{
Config: testAccResourceUserGroup_userIds(id, updatedName),
Check: resource.ComposeTestCheckFunc(
resource.TestCheckResourceAttr(resourceName, "id", id),
resource.TestCheckResourceAttr(resourceName, "name", updatedName),
resource.TestCheckResourceAttr(resourceName, "users.#", "4"),
resource.TestCheckResourceAttr(resourceName, "users.0", "FZ-_NefESDmVvjrhu53MWQ"),
resource.TestCheckResourceAttr(resourceName, "users.1", "TRqwkV-jSvyPdW-4C1c3eg"),
resource.TestCheckResourceAttr(resourceName, "users.2", "0qBvYLghQqCnY9RrmuLJdg"),
resource.TestCheckResourceAttr(resourceName, "users.3", "4PuRra9dTOCbT7RnG3-PRw"),
),
},
{
ResourceName: resourceName,
ImportState: true,
ImportStateVerify: true,
ImportStateIdFunc: acctest.ProjectResourceImportStateIdFunc(resourceName),
ImportStateVerifyIgnore: []string{"users"},
},
},
})
}

func TestProjectResourceUserGroup_emails(t *testing.T) {

id := fmt.Sprintf("%s_%s", t.Name(), utils.RandStringBytes(5))
Expand Down Expand Up @@ -447,7 +500,41 @@ func testAccResourceUserGroup_emails(id string, name string) string {
name = "%[2]s"
linked_sso_id = "linked_sso_id"
externally_managed = false
user_emails = ["rathod.meetsatish@harness.io"]
user_emails = ["rathod.meetsatish@harness.io", "vikas.maddukuri@harness.io", "arkajyoti.mukherjee@harness.io", "mankrit.singh@harness.io"]
notification_configs {
type = "SLACK"
slack_webhook_url = "https://google.com"
}
notification_configs {
type = "EMAIL"
group_email = "email@email.com"
send_email_to_all_users = true
}
notification_configs {
type = "MSTEAMS"
microsoft_teams_webhook_url = "https://google.com"
}
notification_configs {
type = "PAGERDUTY"
pager_duty_key = "pagerDutyKey"
}
linked_sso_display_name = "linked_sso_display_name"
sso_group_id = "sso_group_id"
sso_group_name = "sso_group_name"
linked_sso_type = "SAML"
sso_linked = true
}
`, id, name)
}

func testAccResourceUserGroup_userIds(id string, name string) string {
return fmt.Sprintf(`
resource "harness_platform_usergroup" "test" {
identifier = "%[1]s"
name = "%[2]s"
linked_sso_id = "linked_sso_id"
externally_managed = false
users = ["FZ-_NefESDmVvjrhu53MWQ", "TRqwkV-jSvyPdW-4C1c3eg", "0qBvYLghQqCnY9RrmuLJdg", "4PuRra9dTOCbT7RnG3-PRw"]
notification_configs {
type = "SLACK"
slack_webhook_url = "https://google.com"
Expand Down

0 comments on commit 8521317

Please sign in to comment.