Skip to content

Commit ae71595

Browse files
refac(loadbalancer): use new WaiterHelper for waiters (#7237)
* refac(loadbalancer): use new WaiterHelper for waiters * fix(loadbalancer) linting errors * fix(loadbalancer) reset legacy waiter to origin/main * breaking(loadbalancer) refactor DeleteLoadBalancerWaitHandler signature
1 parent 2803b40 commit ae71595

4 files changed

Lines changed: 39 additions & 49 deletions

File tree

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,9 @@
178178
- **Dependencies:** Bump STACKIT SDK core module from `v0.24.1` to `v0.25.0`
179179
- [v1.12.2](services/loadbalancer/CHANGELOG.md#v1122)
180180
- **Dependencies:** Bump STACKIT SDK core module to `v0.26.0`
181+
- [v1.13.0](services/loadbalancer/CHANGELOG.md#v1130)
182+
- **Improvement:** Use new WaiterHelper for LoadBalancer waiters
183+
- **Breaking Change:** `v2api/wait/DeleteLoadBalancerWaitHandler` now returns a `LoadBalancer` instead of `struct{}`
181184
- `logme`:
182185
- [v0.27.3](services/logme/CHANGELOG.md#v0273)
183186
- **Dependencies:** Bump STACKIT SDK core module from `v0.24.0` to `v0.24.1`

services/loadbalancer/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
## v1.13.0
2+
- **Improvement:** Use new WaiterHelper for LoadBalancer waiters
3+
- **Breaking Change:** `v2api/wait/DeleteLoadBalancerWaitHandler` now returns a `LoadBalancer` instead of `struct{}`
4+
15
## v1.12.2
26
- **Dependencies:** Bump STACKIT SDK core module to `v0.26.0`
37

services/loadbalancer/VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v1.12.2
1+
v1.13.0

services/loadbalancer/v2api/wait/wait.go

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

33
import (
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
loadbalancer "github.com/stackitcloud/stackit-sdk-go/services/loadbalancer/v2api"
1312
)
@@ -23,58 +22,42 @@ const (
2322

2423
// CreateLoadBalancerWaitHandler will wait for load balancer creation
2524
func CreateLoadBalancerWaitHandler(ctx context.Context, a loadbalancer.DefaultAPI, projectId, region, instanceName string) *wait.AsyncActionHandler[loadbalancer.LoadBalancer] {
26-
handler := wait.New(func() (waitFinished bool, response *loadbalancer.LoadBalancer, err error) {
27-
s, err := a.GetLoadBalancer(ctx, projectId, region, instanceName).Execute()
28-
if err != nil {
29-
return false, nil, err
30-
}
31-
if s == nil || s.Name == nil || *s.Name != instanceName || s.Status == nil {
32-
return false, nil, nil
33-
}
34-
35-
var errors []string
36-
if len(s.Errors) > 0 {
37-
for _, err := range s.Errors {
38-
errors = append(errors, fmt.Sprintf("%s: %s", *err.Type, *err.Description))
25+
waitConfig := wait.WaiterHelper[loadbalancer.LoadBalancer, string]{
26+
FetchInstance: a.GetLoadBalancer(ctx, projectId, region, instanceName).Execute,
27+
GetState: func(r *loadbalancer.LoadBalancer) (string, error) {
28+
if r == nil || r.Status == nil {
29+
return "", errors.New("response or status is nil")
3930
}
40-
return true, s, fmt.Errorf("create failed for instance with name %s, got status %s and errors: %s", instanceName, *s.Status, strings.Join(errors, ";"))
41-
}
42-
43-
switch *s.Status {
44-
case LOADBALANCERSTATUS_READY:
45-
return true, s, nil
46-
case LOADBALANCERSTATUS_UNSPECIFIED:
47-
return false, nil, nil
48-
case LOADBALANCERSTATUS_PENDING:
49-
return false, nil, nil
50-
case LOADBALANCERSTATUS_TERMINATING:
51-
return true, s, fmt.Errorf("create failed for instance with name %s, got status %s", instanceName, LOADBALANCERSTATUS_TERMINATING)
52-
case LOADBALANCERSTATUS_ERROR:
53-
return true, s, fmt.Errorf("create failed for instance with name %s, got status %s", instanceName, LOADBALANCERSTATUS_ERROR)
54-
default:
55-
return true, s, fmt.Errorf("instance with name %s has unexpected status %s", instanceName, *s.Status)
56-
}
57-
})
31+
var sb strings.Builder
32+
if r.Errors != nil {
33+
for _, err := range r.Errors {
34+
sb.WriteString(fmt.Sprintf("%s: %s; ", *err.Type, *err.Description))
35+
}
36+
return "", fmt.Errorf("create failed for instance with name %s, got status %s and errors: %s", instanceName, *r.Status, sb.String())
37+
}
38+
return *r.Status, nil
39+
},
40+
ActiveState: []string{LOADBALANCERSTATUS_READY},
41+
ErrorState: []string{LOADBALANCERSTATUS_TERMINATING, LOADBALANCERSTATUS_ERROR},
42+
}
43+
handler := wait.New(waitConfig.Wait())
5844
handler.SetTimeout(45 * time.Minute)
5945
return handler
6046
}
6147

6248
// DeleteLoadBalancerWaitHandler will wait for load balancer deletion
63-
func DeleteLoadBalancerWaitHandler(ctx context.Context, a loadbalancer.DefaultAPI, projectId, region, instanceId string) *wait.AsyncActionHandler[struct{}] {
64-
handler := wait.New(func() (waitFinished bool, response *struct{}, err error) {
65-
_, err = a.GetLoadBalancer(ctx, projectId, region, instanceId).Execute()
66-
if err == nil {
67-
return false, nil, nil
68-
}
69-
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
70-
if !ok {
71-
return false, nil, fmt.Errorf("could not convert error to oapierror.GenericOpenAPIError")
72-
}
73-
if oapiErr.StatusCode != http.StatusNotFound {
74-
return false, nil, err
75-
}
76-
return true, nil, nil
77-
})
49+
func DeleteLoadBalancerWaitHandler(ctx context.Context, a loadbalancer.DefaultAPI, projectId, region, instanceId string) *wait.AsyncActionHandler[loadbalancer.LoadBalancer] {
50+
waitConfig := wait.WaiterHelper[loadbalancer.LoadBalancer, string]{
51+
FetchInstance: a.GetLoadBalancer(ctx, projectId, region, instanceId).Execute,
52+
GetState: func(l *loadbalancer.LoadBalancer) (string, error) {
53+
if l == nil || l.Status == nil {
54+
return "", errors.New("response or status is nil")
55+
}
56+
return *l.Status, nil
57+
},
58+
ErrorState: []string{LOADBALANCERSTATUS_ERROR},
59+
}
60+
handler := wait.New(waitConfig.Wait())
7861
handler.SetTimeout(15 * time.Minute)
7962
return handler
8063
}

0 commit comments

Comments
 (0)