Skip to content

Commit fae4494

Browse files
committed
fix(loadbalancer) reset legacy waiter to origin/main
1 parent 4d39ef0 commit fae4494

1 file changed

Lines changed: 47 additions & 31 deletions

File tree

services/loadbalancer/wait/wait.go

Lines changed: 47 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,12 @@ package wait
22

33
import (
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
3839
func 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
6678
func 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

Comments
 (0)