Skip to content

Commit 6c9c8df

Browse files
committed
refac(loadbalancer): use new WaiterHelper for waiters
1 parent 52b022c commit 6c9c8df

5 files changed

Lines changed: 66 additions & 95 deletions

File tree

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,8 @@
174174
- **Dependencies:** Bump STACKIT SDK core module from `v0.24.1` to `v0.25.0`
175175
- [v1.12.2](services/loadbalancer/CHANGELOG.md#v1122)
176176
- **Dependencies:** Bump STACKIT SDK core module to `v0.26.0`
177+
- [v1.13.0](services/loadbalancer/CHANGELOG.md#v1130)
178+
- **Improvement:** Use new WaiterHelper for LoadBalancer waiters
177179
- `logme`:
178180
- [v0.27.3](services/logme/CHANGELOG.md#v0273)
179181
- **Dependencies:** Bump STACKIT SDK core module from `v0.24.0` to `v0.24.1`

services/loadbalancer/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## v1.13.0
2+
- **Improvement:** Use new WaiterHelper for LoadBalancer waiters
3+
14
## v1.12.2
25
- **Dependencies:** Bump STACKIT SDK core module to `v0.26.0`
36

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: 29 additions & 47 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,41 @@ 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 && len(r.Errors) > 0 {
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
6349
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-
})
50+
waitConfig := wait.WaiterHelper[struct{}, string]{
51+
FetchInstance: func() (*struct{}, error) {
52+
_, err := a.GetLoadBalancer(ctx, projectId, region, instanceId).Execute()
53+
return &struct{}{}, err
54+
},
55+
GetState: func(r *struct{}) (string, error) {
56+
return "", nil
57+
},
58+
}
59+
handler := wait.New(waitConfig.Wait())
7860
handler.SetTimeout(15 * time.Minute)
7961
return handler
8062
}

services/loadbalancer/wait/wait.go

Lines changed: 31 additions & 47 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
"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
3938
func 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
7866
func 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

Comments
 (0)