Skip to content

Commit

Permalink
refactor retry logic for fetch team membership
Browse files Browse the repository at this point in the history
  • Loading branch information
imjaroiswebdev committed Jan 25, 2023
1 parent ecece70 commit b24e679
Showing 1 changed file with 30 additions and 24 deletions.
54 changes: 30 additions & 24 deletions pagerduty/resource_pagerduty_team_membership.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,29 +45,35 @@ 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
}
// Should these functions be extracted out into a shared utility file or a part of developer config?
func maxRetries() int {
return 4
}

func retryDelayMs() int {
return 500
}

func calculateDelay(retryCount int) time.Duration {
return time.Duration(retryCount*retryDelayMs()) * time.Millisecond
}

func fetchPagerDutyTeamMembershipWithRetries(d *schema.ResourceData, meta interface{}, errCallback func(error, *schema.ResourceData) error, retryCount int, neededRole string) error {
if retryCount >= maxRetries() {
return nil
}
return nil
if err := fetchPagerDutyTeamMembership(d, meta, errCallback); err != nil {
return err
}
fetchedRole, userId, teamId := d.Get("role").(string), d.Get("user_id"), d.Get("team_id")
if strings.Compare(neededRole, fetchedRole) == 0 {
return nil
}
log.Printf("[DEBUG] Warning role '%s' fetched from PD is different from the role '%s' from config for user: %s from team: %s, retrying...", fetchedRole, neededRole, userId, teamId)

retryCount++
time.Sleep(calculateDelay(retryCount))
return fetchPagerDutyTeamMembershipWithRetries(d, meta, errCallback, retryCount, neededRole)
}

func fetchPagerDutyTeamMembership(d *schema.ResourceData, meta interface{}, errCallback func(error, *schema.ResourceData) error) error {
Expand Down Expand Up @@ -138,7 +144,7 @@ func resourcePagerDutyTeamMembershipCreate(d *schema.ResourceData, meta interfac

d.SetId(fmt.Sprintf("%s:%s", userID, teamID))

return fetchPagerDutyTeamMembershipWithRetries(d, meta, genError, fetchPagerDutyTeamMembership)
return fetchPagerDutyTeamMembershipWithRetries(d, meta, genError, 0, d.Get("role").(string))
}

func resourcePagerDutyTeamMembershipRead(d *schema.ResourceData, meta interface{}) error {
Expand Down Expand Up @@ -175,7 +181,7 @@ func resourcePagerDutyTeamMembershipUpdate(d *schema.ResourceData, meta interfac

d.SetId(fmt.Sprintf("%s:%s", userID, teamID))

return nil
return fetchPagerDutyTeamMembershipWithRetries(d, meta, genError, 0, d.Get("role").(string))
}

func resourcePagerDutyTeamMembershipDelete(d *schema.ResourceData, meta interface{}) error {
Expand Down

0 comments on commit b24e679

Please sign in to comment.