@@ -2,12 +2,10 @@ package wait
22
33import (
44 "context"
5- "fmt"
6- "net/http"
5+ "errors"
76 "sort"
87 "time"
98
10- "github.com/stackitcloud/stackit-sdk-go/core/oapierror"
119 "github.com/stackitcloud/stackit-sdk-go/core/wait"
1210 mongodbflex "github.com/stackitcloud/stackit-sdk-go/services/mongodbflex/v2api"
1311)
@@ -37,29 +35,15 @@ const (
3735
3836// CreateInstanceWaitHandler will wait for instance creation
3937func CreateInstanceWaitHandler (ctx context.Context , a mongodbflex.DefaultAPI , projectId , instanceId , region string ) * wait.AsyncActionHandler [mongodbflex.InstanceResponse ] {
40- handler := wait .New (func () (waitFinished bool , response * mongodbflex.InstanceResponse , err error ) {
41- s , err := a .GetInstance (ctx , projectId , instanceId , region ).Execute ()
42- if err != nil {
43- return false , nil , err
44- }
45- if s == nil || s .Item == nil || s .Item .Id == nil || * s .Item .Id != instanceId || s .Item .Status == nil {
46- return false , nil , nil
47- }
48- switch * s .Item .Status {
49- default :
50- return true , s , fmt .Errorf ("instance with id %s has unexpected status %s" , instanceId , * s .Item .Status )
51- case "" :
52- return false , nil , nil
53- case mongodbflex .INSTANCESTATUS_PROCESSING :
54- return false , nil , nil
55- case mongodbflex .INSTANCESTATUS_UNKNOWN :
56- return false , nil , nil
57- case mongodbflex .INSTANCESTATUS_READY :
58- return true , s , nil
59- case mongodbflex .INSTANCESTATUS_FAILED :
60- return true , s , fmt .Errorf ("create failed for instance with id %s" , instanceId )
61- }
62- })
38+ waitConfig := wait.WaiterHelper [mongodbflex.InstanceResponse , mongodbflex.InstanceStatus ]{
39+ FetchInstance : a .GetInstance (ctx , projectId , instanceId , region ).Execute ,
40+ GetState : getStateInstance ,
41+ ActiveState : []mongodbflex.InstanceStatus {mongodbflex .INSTANCESTATUS_READY },
42+ ErrorState : []mongodbflex.InstanceStatus {mongodbflex .INSTANCESTATUS_FAILED },
43+ }
44+
45+ handler := wait .New (waitConfig .Wait ())
46+
6347 handler .SetTimeout (45 * time .Minute )
6448 handler .SetSleepBeforeWait (5 * time .Second )
6549 return handler
@@ -71,74 +55,53 @@ func CloneInstanceWaitHandler(ctx context.Context, a mongodbflex.DefaultAPI, pro
7155}
7256
7357func RestoreInstanceWaitHandler (ctx context.Context , a mongodbflex.DefaultAPI , projectId , instanceId , backupId , region string ) * wait.AsyncActionHandler [mongodbflex.ListRestoreJobsResponse ] {
74- handler := wait .New (func () (waitFinished bool , response * mongodbflex.ListRestoreJobsResponse , err error ) {
75- s , err := a .ListRestoreJobs (ctx , projectId , instanceId , region ).Execute ()
76- if err != nil {
77- return false , nil , err
78- }
79- if s == nil || s .Items == nil {
80- return false , nil , nil
81- }
82-
83- restoreJobsSlice := s .Items
84-
85- // sort array by descending date
86- sort .Slice (restoreJobsSlice , func (i , j int ) bool {
87- // swap elements to sort by descending order
88- return * restoreJobsSlice [i ].Date > * restoreJobsSlice [j ].Date
89- })
90-
91- var status string
92- for _ , restoreJob := range restoreJobsSlice {
93- if * restoreJob .BackupID == backupId {
94- status = * restoreJob .Status
95- break
58+ waitConfig := wait.WaiterHelper [mongodbflex.ListRestoreJobsResponse , string ]{
59+ FetchInstance : a .ListRestoreJobs (ctx , projectId , instanceId , region ).Execute ,
60+ GetState : func (response * mongodbflex.ListRestoreJobsResponse ) (string , error ) {
61+ if response == nil {
62+ return "" , errors .New ("response is nil" )
9663 }
97- }
98-
99- switch status {
100- default :
101- return true , s , fmt .Errorf ("restore job for backup with id %s has unexpected status %s" , backupId , status )
102- case RestoreJobProcessing :
103- return false , nil , nil
104- case RestoreJobFinished :
105- return true , s , nil
106- case RestoreJobBroken :
107- return true , s , fmt .Errorf ("restore job for backup with id %s is broken" , backupId )
108- case RestoreJobKilled :
109- return true , s , fmt .Errorf ("restore job for backup with id %s was killed" , backupId )
110- }
111- })
64+ if len (response .Items ) == 0 {
65+ return "" , errors .New ("response items is empty" )
66+ }
67+ restoreJobsSlice := response .Items
68+ // sort array by descending date
69+ sort .Slice (restoreJobsSlice , func (i , j int ) bool {
70+ // swap elements to sort by descending order
71+ return * restoreJobsSlice [i ].Date > * restoreJobsSlice [j ].Date
72+ })
73+
74+ var status string
75+ for _ , restoreJob := range restoreJobsSlice {
76+ if * restoreJob .BackupID == backupId {
77+ status = * restoreJob .Status
78+ break
79+ }
80+ }
81+ return status , nil
82+ },
83+ ActiveState : []string {RestoreJobFinished },
84+ ErrorState : []string {RestoreJobKilled , RestoreJobBroken },
85+ }
86+
87+ handler := wait .New (waitConfig .Wait ())
88+
11289 handler .SetTimeout (45 * time .Minute )
11390 handler .SetSleepBeforeWait (5 * time .Second )
11491 return handler
11592}
11693
11794// UpdateInstanceWaitHandler will wait for instance update
11895func UpdateInstanceWaitHandler (ctx context.Context , a mongodbflex.DefaultAPI , projectId , instanceId , region string ) * wait.AsyncActionHandler [mongodbflex.InstanceResponse ] {
119- handler := wait .New (func () (waitFinished bool , response * mongodbflex.InstanceResponse , err error ) {
120- s , err := a .GetInstance (ctx , projectId , instanceId , region ).Execute ()
121- if err != nil {
122- return false , nil , err
123- }
124- if s == nil || s .Item == nil || s .Item .Id == nil || * s .Item .Id != instanceId || s .Item .Status == nil {
125- return false , nil , nil
126- }
127- switch * s .Item .Status {
128- default :
129- return true , s , fmt .Errorf ("instance with id %s has unexpected status %s" , instanceId , * s .Item .Status )
130- case "" :
131- return false , nil , nil
132- case mongodbflex .INSTANCESTATUS_PROCESSING :
133- return false , nil , nil
134- case mongodbflex .INSTANCESTATUS_UNKNOWN :
135- return false , nil , nil
136- case mongodbflex .INSTANCESTATUS_READY :
137- return true , s , nil
138- case mongodbflex .INSTANCESTATUS_FAILED :
139- return true , s , fmt .Errorf ("update failed for instance with id %s" , instanceId )
140- }
141- })
96+ waitConfig := wait.WaiterHelper [mongodbflex.InstanceResponse , mongodbflex.InstanceStatus ]{
97+ FetchInstance : a .GetInstance (ctx , projectId , instanceId , region ).Execute ,
98+ GetState : getStateInstance ,
99+ ActiveState : []mongodbflex.InstanceStatus {mongodbflex .INSTANCESTATUS_READY },
100+ ErrorState : []mongodbflex.InstanceStatus {mongodbflex .INSTANCESTATUS_FAILED },
101+ }
102+
103+ handler := wait .New (waitConfig .Wait ())
104+
142105 handler .SetTimeout (45 * time .Minute )
143106 return handler
144107}
@@ -150,20 +113,37 @@ func PartialUpdateInstanceWaitHandler(ctx context.Context, a mongodbflex.Default
150113
151114// DeleteInstanceWaitHandler will wait for instance deletion
152115func DeleteInstanceWaitHandler (ctx context.Context , a mongodbflex.DefaultAPI , projectId , instanceId , region string ) * wait.AsyncActionHandler [struct {}] {
153- handler := wait .New (func () (waitFinished bool , response * struct {}, err error ) {
154- _ , err = a .GetInstance (ctx , projectId , instanceId , region ).Execute ()
155- if err == nil {
156- return false , nil , nil
157- }
158- oapiErr , ok := err .(* oapierror.GenericOpenAPIError ) //nolint:errorlint //complaining that error.As should be used to catch wrapped errors, but this error should not be wrapped
159- if ! ok {
160- return false , nil , fmt .Errorf ("could not convert error to oapierror.GenericOpenAPIError" )
161- }
162- if oapiErr .StatusCode != http .StatusNotFound {
163- return false , nil , err
164- }
165- return true , nil , nil
166- })
116+ w := wait.WaiterHelper [mongodbflex.InstanceResponse , mongodbflex.InstanceStatus ]{
117+ FetchInstance : a .GetInstance (ctx , projectId , instanceId , region ).Execute ,
118+ GetState : getStateInstance ,
119+ ActiveState : []mongodbflex.InstanceStatus {},
120+ ErrorState : []mongodbflex.InstanceStatus {mongodbflex .INSTANCESTATUS_FAILED },
121+ }
122+
123+ // adapter for adhering to the wait helper type schema
124+ genericCheck := w .Wait ()
125+ adaptedCheck := func () (waitFinished bool , response * struct {}, err error ) {
126+ finished , _ , err := genericCheck ()
127+ return finished , nil , err
128+ }
129+
130+ handler := wait .New (adaptedCheck )
167131 handler .SetTimeout (15 * time .Minute )
168132 return handler
169133}
134+
135+ func getStateInstance (response * mongodbflex.InstanceResponse ) (mongodbflex.InstanceStatus , error ) {
136+ if response == nil {
137+ return "" , errors .New ("empty response" )
138+ }
139+ if response .Item == nil {
140+ return "" , errors .New ("empty items" )
141+ }
142+ if response .Item .Id == nil {
143+ return "" , errors .New ("empty item id" )
144+ }
145+ if response .Item .Status == nil {
146+ return "" , errors .New ("empty item status" )
147+ }
148+ return * response .Item .Status , nil
149+ }
0 commit comments