@@ -2,11 +2,12 @@ package wait
22
33import (
44 "context"
5- "errors"
65 "fmt"
6+ "net/http"
77 "strings"
88 "time"
99
10+ "github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1011 "github.com/stackitcloud/stackit-sdk-go/core/wait"
1112 "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer"
1213)
@@ -36,44 +37,59 @@ type APIClientInterface interface {
3637// CreateLoadBalancerWaitHandler will wait for load balancer creation
3738// Deprecated: Will be removed after 2026-09-30. Move to the packages generated for each available API version instead
3839func CreateLoadBalancerWaitHandler (ctx context.Context , a APIClientInterface , projectId , region , instanceName string ) * wait.AsyncActionHandler [loadbalancer.LoadBalancer ] {
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" )
46- }
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 ())
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 ))
5353 }
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 ())
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+ })
6072 handler .SetTimeout (45 * time .Minute )
6173 return handler
6274}
6375
6476// DeleteLoadBalancerWaitHandler will wait for load balancer deletion
6577// Deprecated: Will be removed after 2026-09-30. Move to the packages generated for each available API version instead
6678func DeleteLoadBalancerWaitHandler (ctx context.Context , a APIClientInterface , projectId , region , instanceId string ) * wait.AsyncActionHandler [struct {}] {
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 (_ * struct {}) (loadbalancer.LoadBalancerStatus , error ) {
73- return "" , nil
74- },
75- }
76- handler := wait .New (waitConfig .Wait ())
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+ })
7793 handler .SetTimeout (15 * time .Minute )
7894 return handler
7995}
0 commit comments