@@ -2,11 +2,15 @@ package github
22
33import (
44 "context"
5+ "errors"
56 "fmt"
67 "log"
78 "sort"
89 "strings"
10+ "time"
911
12+ "github.com/google/go-github/v67/github"
13+ "github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
1014 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1115)
1216
@@ -121,10 +125,19 @@ func resourceGithubEnterpriseCostCenterResourcesUpdate(d *schema.ResourceData, m
121125
122126 if len (toRemoveUsers )+ len (toRemoveOrgs )+ len (toRemoveRepos ) > 0 {
123127 log .Printf ("[INFO] Removing enterprise cost center resources: %s/%s" , enterpriseSlug , costCenterID )
124- _ , err := enterpriseCostCenterRemoveResources (ctx , client , enterpriseSlug , costCenterID , enterpriseCostCenterResourcesRequest {
125- Users : toRemoveUsers ,
126- Organizations : toRemoveOrgs ,
127- Repositories : toRemoveRepos ,
128+ err := resource .RetryContext (ctx , 30 * time .Second , func () * resource.RetryError {
129+ _ , err := enterpriseCostCenterRemoveResources (ctx , client , enterpriseSlug , costCenterID , enterpriseCostCenterResourcesRequest {
130+ Users : toRemoveUsers ,
131+ Organizations : toRemoveOrgs ,
132+ Repositories : toRemoveRepos ,
133+ })
134+ if err == nil {
135+ return nil
136+ }
137+ if isRetryableGithubResponseError (err ) {
138+ return resource .RetryableError (err )
139+ }
140+ return resource .NonRetryableError (err )
128141 })
129142 if err != nil {
130143 return err
@@ -133,10 +146,19 @@ func resourceGithubEnterpriseCostCenterResourcesUpdate(d *schema.ResourceData, m
133146
134147 if len (toAddUsers )+ len (toAddOrgs )+ len (toAddRepos ) > 0 {
135148 log .Printf ("[INFO] Assigning enterprise cost center resources: %s/%s" , enterpriseSlug , costCenterID )
136- _ , err := enterpriseCostCenterAssignResources (ctx , client , enterpriseSlug , costCenterID , enterpriseCostCenterResourcesRequest {
137- Users : toAddUsers ,
138- Organizations : toAddOrgs ,
139- Repositories : toAddRepos ,
149+ err := resource .RetryContext (ctx , 30 * time .Second , func () * resource.RetryError {
150+ _ , err := enterpriseCostCenterAssignResources (ctx , client , enterpriseSlug , costCenterID , enterpriseCostCenterResourcesRequest {
151+ Users : toAddUsers ,
152+ Organizations : toAddOrgs ,
153+ Repositories : toAddRepos ,
154+ })
155+ if err == nil {
156+ return nil
157+ }
158+ if isRetryableGithubResponseError (err ) {
159+ return resource .RetryableError (err )
160+ }
161+ return resource .NonRetryableError (err )
140162 })
141163 if err != nil {
142164 return err
@@ -221,6 +243,19 @@ func getStringSetOrEmpty(d *schema.ResourceData, key string) *schema.Set {
221243 return set
222244}
223245
246+ func isRetryableGithubResponseError (err error ) bool {
247+ var ghErr * github.ErrorResponse
248+ if errors .As (err , & ghErr ) && ghErr .Response != nil {
249+ switch ghErr .Response .StatusCode {
250+ case 404 , 409 , 500 , 502 , 503 , 504 :
251+ return true
252+ default :
253+ return false
254+ }
255+ }
256+ return false
257+ }
258+
224259func diffStringSlices (current []string , desired []string ) (toAdd []string , toRemove []string ) {
225260 cur := schema .NewSet (schema .HashString , stringSliceToAnySlice (current ))
226261 des := schema .NewSet (schema .HashString , stringSliceToAnySlice (desired ))
0 commit comments