@@ -3,11 +3,14 @@ package location
3
3
import (
4
4
"encoding/base64"
5
5
"net/http"
6
+ "time"
6
7
7
8
"github.com/ovotech/cloud-key-rotator/pkg/cred"
8
9
9
10
"github.com/CircleCI-Public/circleci-cli/api"
10
11
"github.com/CircleCI-Public/circleci-cli/settings"
12
+
13
+ "github.com/cenkalti/backoff/v4"
11
14
)
12
15
13
16
// CircleCIContext type
@@ -78,8 +81,35 @@ func (circleContext CircleCIContext) Write(serviceAccountName string, keyWrapper
78
81
func updateCircleCIContext (contextID , envVarName , envVarValue string ,
79
82
restClient * api.ContextRestClient ) (err error ) {
80
83
81
- if err = restClient .DeleteEnvironmentVariable (contextID , envVarName ); err != nil {
84
+ maxElapsedTimeSecs := 500
85
+ backoffMultiplier := 5
86
+
87
+ deleteOp := func () error {
88
+ logger .Infof ("Deleting env var %s on contextID: %s" , envVarName , contextID )
89
+ return restClient .DeleteEnvironmentVariable (contextID , envVarName )
90
+ }
91
+ err = callCircleCIWithExpBackoff (deleteOp ,
92
+ time .Duration (maxElapsedTimeSecs )* time .Second ,
93
+ float64 (backoffMultiplier ))
94
+ if err != nil {
82
95
return
83
96
}
84
- return restClient .CreateEnvironmentVariable (contextID , envVarName , envVarValue )
97
+ createOp := func () error {
98
+ logger .Infof ("Creating env var %s on contextID: %s" , envVarName , contextID )
99
+ return restClient .CreateEnvironmentVariable (contextID , envVarName , envVarValue )
100
+ }
101
+ err = callCircleCIWithExpBackoff (createOp ,
102
+ time .Duration (maxElapsedTimeSecs )* time .Second ,
103
+ float64 (backoffMultiplier ))
104
+ return
105
+ }
106
+
107
+ // callCircleCIWithExpBackoff calls the CircleCI API with exponential backoff
108
+ func callCircleCIWithExpBackoff (operation backoff.Operation ,
109
+ maxElapsedTime time.Duration , multiplier float64 ) (err error ) {
110
+ b := backoff .NewExponentialBackOff ()
111
+ b .MaxElapsedTime = maxElapsedTime
112
+ b .Multiplier = multiplier
113
+ err = backoff .Retry (operation , b )
114
+ return
85
115
}
0 commit comments