diff --git a/pagerduty/resource_pagerduty_team_membership.go b/pagerduty/resource_pagerduty_team_membership.go index 4e8cd4937..f9707d788 100644 --- a/pagerduty/resource_pagerduty_team_membership.go +++ b/pagerduty/resource_pagerduty_team_membership.go @@ -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 { @@ -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 { @@ -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 {