diff --git a/pagerduty/provider.go b/pagerduty/provider.go index 9dc0998a7..fd6d4ccb0 100644 --- a/pagerduty/provider.go +++ b/pagerduty/provider.go @@ -183,10 +183,23 @@ func isErrCode(err error, code int) bool { func isMalformedNotFoundError(err error) bool { // There are some errors that doesn't stick to expected error interface and // fallback to a simple text error message that can be capture by this regexp. + if err == nil { + return false + } + re := regexp.MustCompile(".*: 404 Not Found$") return re.Match([]byte(err.Error())) } +func isMalformedForbiddenError(err error) bool { + if err == nil { + return false + } + + re := regexp.MustCompile(".*: 403 Forbidden$") + return re.Match([]byte(err.Error())) +} + func genError(err error, d *schema.ResourceData) error { return fmt.Errorf("Error reading: %s: %s", d.Id(), err) } diff --git a/pagerduty/resource_pagerduty_escalation_policy.go b/pagerduty/resource_pagerduty_escalation_policy.go index 936d0f924..c838d2fa5 100644 --- a/pagerduty/resource_pagerduty_escalation_policy.go +++ b/pagerduty/resource_pagerduty_escalation_policy.go @@ -175,7 +175,7 @@ func fetchEscalationPolicy(d *schema.ResourceData, meta interface{}, errCallback var escalationPolicyFirstAttempt *pagerduty.EscalationPolicy escalationPolicyFirstAttempt, _, err = client.EscalationPolicies.Get(d.Id(), o) - if err != nil && isErrCode(err, http.StatusForbidden) { + if err != nil && isErrCode(err, http.StatusForbidden) || isMalformedForbiddenError(err) { // Removing the inclusion of escalation_rule_assignment_strategies for // accounts wihtout the required entitlements. o = nil @@ -188,7 +188,7 @@ func fetchEscalationPolicy(d *schema.ResourceData, meta interface{}, errCallback return retry.Retry(5*time.Minute, func() *retry.RetryError { escalationPolicy, _, err := client.EscalationPolicies.Get(d.Id(), o) if err != nil { - if isErrCode(err, http.StatusBadRequest) || isErrCode(err, http.StatusForbidden) { + if isErrCode(err, http.StatusBadRequest) || isErrCode(err, http.StatusForbidden) || isMalformedForbiddenError(err) { return retry.NonRetryableError(err) } @@ -237,7 +237,11 @@ func resourcePagerDutyEscalationPolicyUpdate(d *schema.ResourceData, meta interf log.Printf("[INFO] Updating PagerDuty escalation policy: %s", d.Id()) _, _, err = client.EscalationPolicies.Update(d.Id(), escalationPolicy) - if err != nil && isErrCode(err, http.StatusForbidden) { + if err == nil { + return nil + } + + if isErrCode(err, http.StatusForbidden) || isMalformedForbiddenError(err) { // Removing the inclusion of escalation_rule_assignment_strategies for // accounts wihtout the required entitlements. for idx, er := range escalationPolicy.EscalationRules { @@ -250,13 +254,9 @@ func resourcePagerDutyEscalationPolicyUpdate(d *schema.ResourceData, meta interf } } - if err == nil { - return nil - } - retryErr := retry.Retry(5*time.Minute, func() *retry.RetryError { if _, _, err := client.EscalationPolicies.Update(d.Id(), escalationPolicy); err != nil { - if isErrCode(err, http.StatusBadRequest) || isErrCode(err, http.StatusForbidden) { + if isErrCode(err, http.StatusBadRequest) || isErrCode(err, http.StatusForbidden) || isMalformedForbiddenError(err) { return retry.NonRetryableError(err) }