Skip to content

Commit

Permalink
add retries until team membership update get consistent
Browse files Browse the repository at this point in the history
  • Loading branch information
imjaroiswebdev committed Jan 25, 2023
1 parent dfaba05 commit ecece70
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 1 deletion.
31 changes: 30 additions & 1 deletion pagerduty/resource_pagerduty_team_membership.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package pagerduty
import (
"fmt"
"log"
"strings"
"time"

"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
Expand Down Expand Up @@ -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 {
Expand All @@ -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 {
Expand All @@ -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
}
Expand Down Expand Up @@ -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 {
Expand Down
31 changes: 31 additions & 0 deletions pagerduty/resource_pagerduty_team_membership_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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))
Expand Down

0 comments on commit ecece70

Please sign in to comment.