@@ -2,12 +2,11 @@ package wait
22
33import (
44 "context"
5+ "errors"
56 "fmt"
6- "net/http"
77 "strings"
88 "time"
99
10- "github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1110 "github.com/stackitcloud/stackit-sdk-go/core/wait"
1211 "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer"
1312)
@@ -37,59 +36,44 @@ type APIClientInterface interface {
3736// CreateLoadBalancerWaitHandler will wait for load balancer creation
3837// Deprecated: Will be removed after 2026-09-30. Move to the packages generated for each available API version instead
3938func CreateLoadBalancerWaitHandler (ctx context.Context , a APIClientInterface , projectId , region , instanceName string ) * wait.AsyncActionHandler [loadbalancer.LoadBalancer ] {
40- handler := wait .New (func () (waitFinished bool , response * loadbalancer.LoadBalancer , err error ) {
41- s , err := a .GetLoadBalancerExecute (ctx , projectId , region , instanceName )
42- if err != nil {
43- return false , nil , err
44- }
45- if s == nil || s .Name == nil || * s .Name != instanceName || s .Status == nil {
46- return false , nil , nil
47- }
48-
49- var errors []string
50- if s .Errors != nil && len (* s .Errors ) > 0 {
51- for _ , err := range * s .Errors {
52- errors = append (errors , fmt .Sprintf ("%s: %s" , * err .Type , * err .Description ))
39+ waitConfig := wait.WaiterHelper [loadbalancer.LoadBalancer , loadbalancer.LoadBalancerStatus ]{
40+ FetchInstance : func () (* loadbalancer.LoadBalancer , error ) {
41+ return a .GetLoadBalancerExecute (ctx , projectId , region , instanceName )
42+ },
43+ GetState : func (r * loadbalancer.LoadBalancer ) (loadbalancer.LoadBalancerStatus , error ) {
44+ if r == nil || r .Status == nil {
45+ return "" , errors .New ("response or status is nil" )
5346 }
54- return true , s , fmt .Errorf ("create failed for instance with name %s, got status %s and errors: %s" , instanceName , * s .Status , strings .Join (errors , ";" ))
55- }
56-
57- switch * s .Status {
58- case loadbalancer .LOADBALANCERSTATUS_READY :
59- return true , s , nil
60- case loadbalancer .LOADBALANCERSTATUS_UNSPECIFIED :
61- return false , nil , nil
62- case loadbalancer .LOADBALANCERSTATUS_PENDING :
63- return false , nil , nil
64- case loadbalancer .LOADBALANCERSTATUS_TERMINATING :
65- return true , s , fmt .Errorf ("create failed for instance with name %s, got status %s" , instanceName , InstanceStatusTerminating )
66- case loadbalancer .LOADBALANCERSTATUS_ERROR :
67- return true , s , fmt .Errorf ("create failed for instance with name %s, got status %s" , instanceName , InstanceStatusError )
68- default :
69- return true , s , fmt .Errorf ("instance with name %s has unexpected status %s" , instanceName , * s .Status )
70- }
71- })
47+ var sb strings.Builder
48+ if r .Errors != nil && len (* r .Errors ) > 0 {
49+ for _ , err := range * r .Errors {
50+ sb .WriteString (fmt .Sprintf ("%s: %s; " , * err .Type , * err .Description ))
51+ }
52+ return "" , fmt .Errorf ("create failed for instance with name %s, got status %s and errors: %s" , instanceName , * r .Status , sb .String ())
53+ }
54+ return * r .Status , nil
55+ },
56+ ActiveState : []loadbalancer.LoadBalancerStatus {loadbalancer .LOADBALANCERSTATUS_READY },
57+ ErrorState : []loadbalancer.LoadBalancerStatus {loadbalancer .LOADBALANCERSTATUS_ERROR , loadbalancer .LOADBALANCERSTATUS_TERMINATING },
58+ }
59+ handler := wait .New (waitConfig .Wait ())
7260 handler .SetTimeout (45 * time .Minute )
7361 return handler
7462}
7563
7664// DeleteLoadBalancerWaitHandler will wait for load balancer deletion
7765// Deprecated: Will be removed after 2026-09-30. Move to the packages generated for each available API version instead
7866func DeleteLoadBalancerWaitHandler (ctx context.Context , a APIClientInterface , projectId , region , instanceId string ) * wait.AsyncActionHandler [struct {}] {
79- handler := wait .New (func () (waitFinished bool , response * struct {}, err error ) {
80- _ , err = a .GetLoadBalancerExecute (ctx , projectId , region , instanceId )
81- if err == nil {
82- return false , nil , nil
83- }
84- 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
85- if ! ok {
86- return false , nil , fmt .Errorf ("could not convert error to oapierror.GenericOpenAPIError" )
87- }
88- if oapiErr .StatusCode != http .StatusNotFound {
89- return false , nil , err
90- }
91- return true , nil , nil
92- })
67+ waitConfig := wait.WaiterHelper [struct {}, loadbalancer.LoadBalancerStatus ]{
68+ FetchInstance : func () (* struct {}, error ) {
69+ _ , err := a .GetLoadBalancerExecute (ctx , projectId , region , instanceId )
70+ return & struct {}{}, err
71+ },
72+ GetState : func (r * struct {}) (loadbalancer.LoadBalancerStatus , error ) {
73+ return "" , nil
74+ },
75+ }
76+ handler := wait .New (waitConfig .Wait ())
9377 handler .SetTimeout (15 * time .Minute )
9478 return handler
9579}
0 commit comments