From ecece7001c36473af25462b5ace646de3c7f7b2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Antonio=20Reyes?= Date: Wed, 25 Jan 2023 14:41:50 -0300 Subject: [PATCH] add retries until team membership update get consistent --- .../resource_pagerduty_team_membership.go | 31 ++++++++++++++++++- ...resource_pagerduty_team_membership_test.go | 31 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/pagerduty/resource_pagerduty_team_membership.go b/pagerduty/resource_pagerduty_team_membership.go index 21683130e..4e8cd4937 100644 --- a/pagerduty/resource_pagerduty_team_membership.go +++ b/pagerduty/resource_pagerduty_team_membership.go @@ -3,6 +3,7 @@ package pagerduty import ( "fmt" "log" + "strings" "time" "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource" @@ -44,6 +45,31 @@ func resourcePagerDutyTeamMembership() *schema.Resource { } } +func fetchPagerDutyTeamMembershipWithRetries(d *schema.ResourceData, meta interface{}, errCallback func(error, *schema.ResourceData) error, retryFn func(d *schema.ResourceData, meta interface{}, errCallback func(error, *schema.ResourceData) error) error) error { + var retryCount int + retryLimit := 4 + for retryCount <= retryLimit { + log.Printf("[MYDEBUG] retryCount %d", retryCount) + prevRole := d.Get("role").(string) + log.Printf("[MYDEBUG] prevRole %s", prevRole) + err := retryFn(d, meta, errCallback) + if err != nil { + return err + } + newRole := d.Get("role").(string) + log.Printf("[MYDEBUG] newRole %s", newRole) + isSameRole := strings.Compare(prevRole, newRole) == 0 + log.Printf("[MYDEBUG] isSameRole %v", isSameRole) + if !isSameRole { + retryCount++ + time.Sleep(time.Duration(retryCount * 500 * int(time.Millisecond))) + } else { + return nil + } + } + return nil +} + func fetchPagerDutyTeamMembership(d *schema.ResourceData, meta interface{}, errCallback func(error, *schema.ResourceData) error) error { client, err := meta.(*Config).Client() if err != nil { @@ -52,6 +78,7 @@ func fetchPagerDutyTeamMembership(d *schema.ResourceData, meta interface{}, errC userID, teamID := resourcePagerDutyParseColonCompoundID(d.Id()) log.Printf("[DEBUG] Reading user: %s from team: %s", userID, teamID) + // log.Printf("[MYDEBUG] prevRole: %s", d.Get("role")) return resource.Retry(2*time.Minute, func() *resource.RetryError { resp, _, err := client.Teams.GetMembers(teamID, &pagerduty.GetMembersOptions{}) if err != nil { @@ -69,6 +96,8 @@ func fetchPagerDutyTeamMembership(d *schema.ResourceData, meta interface{}, errC d.Set("user_id", userID) d.Set("team_id", teamID) d.Set("role", member.Role) + // log.Printf("[MYDEBUG] NewRole: %s", d.Get("role")) + // log.Printf("[MYDEBUG] member.Role %s", member.Role) return nil } @@ -109,7 +138,7 @@ func resourcePagerDutyTeamMembershipCreate(d *schema.ResourceData, meta interfac d.SetId(fmt.Sprintf("%s:%s", userID, teamID)) - return fetchPagerDutyTeamMembership(d, meta, genError) + return fetchPagerDutyTeamMembershipWithRetries(d, meta, genError, fetchPagerDutyTeamMembership) } func resourcePagerDutyTeamMembershipRead(d *schema.ResourceData, meta interface{}) error { diff --git a/pagerduty/resource_pagerduty_team_membership_test.go b/pagerduty/resource_pagerduty_team_membership_test.go index c4b2a0561..3aaab2812 100644 --- a/pagerduty/resource_pagerduty_team_membership_test.go +++ b/pagerduty/resource_pagerduty_team_membership_test.go @@ -49,6 +49,37 @@ func TestAccPagerDutyTeamMembership_WithRole(t *testing.T) { }) } +func TestAccPagerDutyTeamMembership_WithRoleConsistentlyAssigned(t *testing.T) { + user := fmt.Sprintf("tf-%s", acctest.RandString(5)) + team := fmt.Sprintf("tf-%s", acctest.RandString(5)) + firstRole := "observer" + secondRole := "responder" + + resource.Test(t, resource.TestCase{ + PreCheck: func() { testAccPreCheck(t) }, + Providers: testAccProviders, + CheckDestroy: testAccCheckPagerDutyTeamMembershipDestroy, + Steps: []resource.TestStep{ + { + Config: testAccCheckPagerDutyTeamMembershipWithRoleConfig(user, team, firstRole), + Check: resource.ComposeTestCheckFunc( + testAccCheckPagerDutyTeamMembershipExists("pagerduty_team_membership.foo"), + resource.TestCheckResourceAttr( + "pagerduty_team_membership.foo", "role", firstRole), + ), + }, + { + Config: testAccCheckPagerDutyTeamMembershipWithRoleConfig(user, team, secondRole), + Check: resource.ComposeTestCheckFunc( + testAccCheckPagerDutyTeamMembershipExists("pagerduty_team_membership.foo"), + resource.TestCheckResourceAttr( + "pagerduty_team_membership.foo", "role", secondRole), + ), + }, + }, + }) +} + func TestAccPagerDutyTeamMembership_DestroyWithEscalationPolicyDependant(t *testing.T) { user := fmt.Sprintf("tf-%s", acctest.RandString(5)) team := fmt.Sprintf("tf-%s", acctest.RandString(5))