@@ -17,8 +17,10 @@ const timeoutMinutes time.Duration = 10
1717var (
1818 ErrInstanceNotFound = errors .New ("instance not found" )
1919 ErrInstanceStatusUndefined = errors .New ("instance status undefined" )
20- ErrInstanceCreationFailed = errors .New ("instance creation failed" )
21- ErrInstanceIsBeingDeleted = errors .New ("instance is being deleted" )
20+ // Deprecated: ErrInstanceCreationFailed is no longer used and will be removed after 2026-11-07
21+ ErrInstanceCreationFailed = errors .New ("instance creation failed" )
22+ // Deprecated: ErrInstanceIsBeingDeleted is no longer used and will be removed after 2026-11-07
23+ ErrInstanceIsBeingDeleted = errors .New ("instance is being deleted" )
2224)
2325
2426// EdgeCloudApiClient is the interface for Edge Cloud API calls which require a waiter.
@@ -33,33 +35,20 @@ type EdgeCloudApiClient interface {
3335
3436// createOrUpdateInstanceWaitHandler contains the shared logic for waiting on instance creation or updates.
3537func createOrUpdateInstanceWaitHandler (ctx context.Context , getInstance func (ctx context.Context ) (* edge.Instance , error )) * wait.AsyncActionHandler [edge.Instance ] {
36- handler := wait .New (func () (waitFinished bool , response * edge.Instance , err error ) {
37- instance , err := getInstance (ctx )
38- if err != nil {
39- return false , nil , err
40- }
41-
42- if instance == nil || instance .Status == nil {
43- return false , nil , ErrInstanceNotFound
44- }
45- if instance == nil || instance .Status == nil {
46- return false , nil , ErrInstanceStatusUndefined
47- }
48-
49- status := * instance .Status
50- switch status {
51- case edge .INSTANCESTATUS_ACTIVE :
52- return true , instance , nil
53- case edge .INSTANCESTATUS_ERROR :
54- return true , instance , ErrInstanceCreationFailed
55- case edge .INSTANCESTATUS_RECONCILING :
56- return false , nil , nil
57- case edge .INSTANCESTATUS_DELETING :
58- return true , instance , ErrInstanceIsBeingDeleted
59- default :
60- return false , nil , nil
61- }
62- })
38+ waitConfig := wait.WaiterHelper [edge.Instance , edge.InstanceStatus ]{
39+ FetchInstance : func () (* edge.Instance , error ) {
40+ return getInstance (ctx )
41+ },
42+ GetState : func (instance * edge.Instance ) (edge.InstanceStatus , error ) {
43+ if instance == nil || instance .Status == nil {
44+ return "" , ErrInstanceNotFound
45+ }
46+ return * instance .Status , nil
47+ },
48+ ActiveState : []edge.InstanceStatus {edge .INSTANCESTATUS_ACTIVE },
49+ ErrorState : []edge.InstanceStatus {edge .INSTANCESTATUS_ERROR , edge .INSTANCESTATUS_DELETING },
50+ }
51+ handler := wait .New (waitConfig .Wait ())
6352 handler .SetTimeout (timeoutMinutes * time .Minute )
6453 return handler
6554}
@@ -80,17 +69,15 @@ func CreateOrUpdateInstanceByNameWaitHandler(ctx context.Context, a EdgeCloudApi
8069
8170// deleteInstanceWaitHandler contains the shared logic for waiting on instance deletion.
8271func deleteInstanceWaitHandler (ctx context.Context , getInstance func (ctx context.Context ) (* edge.Instance , error )) * wait.AsyncActionHandler [edge.Instance ] {
83- handler := wait .New (func () (waitFinished bool , response * edge.Instance , err error ) {
84- _ , err = getInstance (ctx )
85- if err == nil {
86- return false , nil , nil
87- }
88- var oapiErr * oapierror.GenericOpenAPIError
89- if errors .As (err , & oapiErr ) && oapiErr .StatusCode == http .StatusNotFound {
90- return true , nil , nil
91- }
92- return false , nil , err
93- })
72+ waitConfig := wait.WaiterHelper [edge.Instance , edge.InstanceStatus ]{
73+ FetchInstance : func () (* edge.Instance , error ) {
74+ return getInstance (ctx )
75+ },
76+ GetState : func (_ * edge.Instance ) (edge.InstanceStatus , error ) {
77+ return "" , nil
78+ },
79+ }
80+ handler := wait .New (waitConfig .Wait ())
9481 handler .SetTimeout (timeoutMinutes * time .Minute )
9582 return handler
9683}
@@ -111,21 +98,30 @@ func DeleteInstanceByNameWaitHandler(ctx context.Context, a EdgeCloudApiClient,
11198
11299// kubeconfigWaitHandlerHelper contains the shared logic for waiting for the instance to become ready before retrieving the kubeconfig.
113100func kubeconfigWaitHandlerHelper (ctx context.Context , checkInstance func (ctx context.Context ) error , getKubeconfig func (ctx context.Context ) (* edge.Kubeconfig , error )) * wait.AsyncActionHandler [edge.Kubeconfig ] {
114- handler := wait .New (func () (waitFinished bool , response * edge.Kubeconfig , err error ) {
115- err = checkInstance (ctx )
116- if err != nil {
117- return false , nil , err
118- }
119- kubeconfig , err := getKubeconfig (ctx )
120- var oapiErr * oapierror.GenericOpenAPIError
121- if err != nil {
122- if errors .As (err , & oapiErr ) && oapiErr .StatusCode == http .StatusNotFound {
123- return false , nil , nil
101+ waitConfig := wait.WaiterHelper [edge.Kubeconfig , string ]{
102+ FetchInstance : func () (* edge.Kubeconfig , error ) {
103+ err := checkInstance (ctx )
104+ if err != nil {
105+ return nil , err
124106 }
125- return false , nil , err
126- }
127- return true , kubeconfig , nil
128- })
107+ config , err := getKubeconfig (ctx )
108+ if err != nil {
109+ var apiErr * oapierror.GenericOpenAPIError
110+ if ok := errors .As (err , & apiErr ); ok && apiErr .StatusCode == http .StatusNotFound {
111+ return nil , nil
112+ }
113+ }
114+ return config , err
115+ },
116+ GetState : func (k * edge.Kubeconfig ) (string , error ) {
117+ if k == nil {
118+ return "NOT_READY" , nil
119+ }
120+ return "READY" , nil
121+ },
122+ ActiveState : []string {"READY" },
123+ }
124+ handler := wait .New (waitConfig .Wait ())
129125 handler .SetTimeout (timeoutMinutes * time .Minute )
130126 return handler
131127}
@@ -164,21 +160,30 @@ func KubeconfigByInstanceNameWaitHandler(ctx context.Context, a EdgeCloudApiClie
164160
165161// tokenWaitHandlerHelper contains the shared logic for waiting for the instance to become ready before retrieving the service token.
166162func tokenWaitHandlerHelper (ctx context.Context , checkInstance func (ctx context.Context ) error , getToken func (ctx context.Context ) (* edge.Token , error )) * wait.AsyncActionHandler [edge.Token ] {
167- handler := wait .New (func () (waitFinished bool , response * edge.Token , err error ) {
168- err = checkInstance (ctx )
169- if err != nil {
170- return false , nil , err
171- }
172- token , err := getToken (ctx )
173- var oapiErr * oapierror.GenericOpenAPIError
174- if err != nil {
175- if errors .As (err , & oapiErr ) && oapiErr .StatusCode == http .StatusNotFound {
176- return false , nil , nil
163+ waitConfig := wait.WaiterHelper [edge.Token , string ]{
164+ FetchInstance : func () (* edge.Token , error ) {
165+ err := checkInstance (ctx )
166+ if err != nil {
167+ return nil , err
177168 }
178- return false , nil , err
179- }
180- return true , token , nil
181- })
169+ token , err := getToken (ctx )
170+ if err != nil {
171+ var apiErr * oapierror.GenericOpenAPIError
172+ if ok := errors .As (err , & apiErr ); ok && apiErr .StatusCode == http .StatusNotFound {
173+ return nil , nil
174+ }
175+ }
176+ return token , err
177+ },
178+ GetState : func (t * edge.Token ) (string , error ) {
179+ if t == nil {
180+ return "NOT_READY" , nil
181+ }
182+ return "READY" , nil
183+ },
184+ ActiveState : []string {"READY" },
185+ }
186+ handler := wait .New (waitConfig .Wait ())
182187 handler .SetTimeout (timeoutMinutes * time .Minute )
183188 return handler
184189}
0 commit comments