99 "net/http"
1010 "os"
1111 "path"
12+ "strings"
1213 "testing"
1314 "time"
1415
@@ -44,7 +45,15 @@ type Test struct {
4445 t * testing.T
4546}
4647
47- const requestTimeout = 5 * time .Second
48+ const (
49+ requestTimeout = 5 * time .Second
50+ defaultRetryBackoff = 250 * time .Millisecond
51+ defaultRetryTimeout = 2 * time .Second
52+ )
53+
54+ var defaultRetryCommandOnErrors = []string {
55+ "returned an unexpected status code 502" ,
56+ }
4857
4958var runPlugin = plugins .RunCliWithPlugin (getApp ())
5059
@@ -159,12 +168,43 @@ func (it *Test) PrepareWorkerTestDir() (string, string) {
159168}
160169
161170func (it * Test ) RunCommand (args ... string ) error {
171+ return it .RetryCommand (args , defaultRetryBackoff , defaultRetryTimeout , defaultRetryCommandOnErrors )
172+ }
173+
174+ func (it * Test ) RetryCommand (args []string , backoff time.Duration , timeout time.Duration , onErrorContaining []string ) error {
162175 oldArgs := os .Args
163176 defer func () {
164177 os .Args = oldArgs
165178 }()
166179 os .Args = args
167- return runPlugin ()
180+
181+ start := time .Now ()
182+ err := runPlugin ()
183+ elapsed := time .Since (start )
184+
185+ waitDuration := max (backoff , 250 * time .Millisecond )
186+
187+ for shouldRetryCommandOnError (err , onErrorContaining ) && elapsed < timeout {
188+ time .Sleep (waitDuration )
189+ err = runPlugin ()
190+ elapsed = time .Since (start )
191+ }
192+
193+ return err
194+ }
195+
196+ func shouldRetryCommandOnError (err error , onErrorContaining []string ) bool {
197+ if err == nil || len (onErrorContaining ) == 0 {
198+ return false
199+ }
200+
201+ for _ , s := range onErrorContaining {
202+ if strings .Contains (err .Error (), s ) {
203+ return true
204+ }
205+ }
206+
207+ return false
168208}
169209
170210func (it * Test ) CapturedOutput () []byte {
@@ -185,6 +225,7 @@ func (it *Test) GetAllWorkers() []*model.WorkerDetails {
185225 it .NewHttpRequestWithContext (ctx ).
186226 WithAccessToken ().
187227 Get ("/worker/api/v1/workers" ).
228+ WithRetries (defaultRetryBackoff , defaultRetryTimeout , http .StatusBadGateway ).
188229 Do ().
189230 AsObject (& response )
190231
@@ -204,6 +245,7 @@ func (it *Test) CreateWorker(createRequest *model.WorkerDetails) {
204245 WithAccessToken ().
205246 WithJsonBytes (jsonBytes ).
206247 Post ("/worker/api/v1/workers" ).
248+ WithRetries (defaultRetryBackoff , defaultRetryTimeout , http .StatusBadGateway ).
207249 Do ().
208250 IsCreated ()
209251}
@@ -216,7 +258,8 @@ func (it *Test) DeleteWorker(workerKey string) {
216258
217259 status := it .NewHttpRequestWithContext (ctx ).
218260 WithAccessToken ().
219- Delete ("/worker/api/v1/workers/" + workerKey ).
261+ Delete ("/worker/api/v1/workers/" + workerKey ).
262+ WithRetries (defaultRetryBackoff , defaultRetryTimeout , http .StatusBadGateway ).
220263 Do ().
221264 StatusCode ()
222265
0 commit comments