Skip to content

Commit dcfae11

Browse files
committed
review feedback
1 parent 000b932 commit dcfae11

2 files changed

Lines changed: 81 additions & 148 deletions

File tree

services/iaas/v2alpha1api/wait/wait.go

Lines changed: 46 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -20,17 +20,9 @@ const (
2020
func CreateVPCRegionWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region string) *wait.AsyncActionHandler[iaas.RegionalVPC] {
2121
waitConfig := wait.WaiterHelper[iaas.RegionalVPC, string]{
2222
FetchInstance: a.GetVPCRegion(ctx, projectId, vpcId, region).Execute,
23-
GetState: func(i *iaas.RegionalVPC) (string, error) {
24-
if i == nil {
25-
return "", errors.New("empty response")
26-
}
27-
if i.Status == nil {
28-
return "", errors.New("status is missing in response")
29-
}
30-
return *i.Status, nil
31-
},
32-
ActiveState: []string{CreateSuccess},
33-
ErrorState: []string{FailedStatus},
23+
GetState: getStateVPCRegion,
24+
ActiveState: []string{CreateSuccess},
25+
ErrorState: []string{FailedStatus},
3426
}
3527

3628
handler := wait.New(waitConfig.Wait())
@@ -43,17 +35,9 @@ func CreateVPCRegionWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectI
4335
func DeleteVPCRegionWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region string) *wait.AsyncActionHandler[iaas.RegionalVPC] {
4436
waitConfig := wait.WaiterHelper[iaas.RegionalVPC, string]{
4537
FetchInstance: a.GetVPCRegion(ctx, projectId, vpcId, region).Execute,
46-
GetState: func(i *iaas.RegionalVPC) (string, error) {
47-
if i == nil {
48-
return "", errors.New("empty response")
49-
}
50-
if i.Status == nil {
51-
return "", errors.New("status is missing in response")
52-
}
53-
return *i.Status, nil
54-
},
55-
ActiveState: []string{},
56-
ErrorState: []string{FailedStatus},
38+
GetState: getStateVPCRegion,
39+
ActiveState: []string{},
40+
ErrorState: []string{FailedStatus},
5741

5842
// The IaaS API response with a 400 if the regional network area configuration doesn't exist because of some compatible
5943
// issues to v1. When v1 is deprecated, they probably will respond with 404
@@ -66,27 +50,10 @@ func DeleteVPCRegionWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectI
6650
return handler
6751
}
6852

69-
func createOrUpdateNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] {
53+
func createOrUpdateVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] {
7054
waitConfig := wait.WaiterHelper[iaas.VPCNetworkRange, string]{
7155
FetchInstance: a.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute,
72-
GetState: func(i *iaas.VPCNetworkRange) (string, error) {
73-
if i == nil {
74-
return "", errors.New("empty response")
75-
}
76-
if i.VPCNetworkRangeIPv4 != nil {
77-
if i.VPCNetworkRangeIPv4.Status == nil {
78-
return "", errors.New("status is missing in response")
79-
}
80-
return *i.VPCNetworkRangeIPv4.Status, nil
81-
}
82-
if i.VPCNetworkRangeIPv6 != nil {
83-
if i.VPCNetworkRangeIPv6.Status == nil {
84-
return "", errors.New("status is missing in response")
85-
}
86-
return *i.VPCNetworkRangeIPv6.Status, nil
87-
}
88-
return "", errors.New("unknown status in response")
89-
},
56+
GetState: getStateVPCNetworkRange,
9057
// Usually "CREATED" should be enough as active state. The IaaS API uses "CREATED" always as active state, even after an update.
9158
// To prevent potential issues in the future, we set "UPDATED" also as active state.
9259
ActiveState: []string{CreateSuccess, UpdateSuccess},
@@ -99,35 +66,21 @@ func createOrUpdateNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAP
9966
return handler
10067
}
10168

69+
// CreateVPCNetworkRangeWaitHandler will wait for VPC Network range creation
10270
func CreateVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] {
103-
return createOrUpdateNetworkRangeWaitHandler(ctx, a, projectId, vpcId, region, networkRangeId)
71+
return createOrUpdateVPCNetworkRangeWaitHandler(ctx, a, projectId, vpcId, region, networkRangeId)
10472
}
10573

74+
// UpdateVPCNetworkRangeWaitHandler will wait for VPC Network range update
10675
func UpdateVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] {
107-
return createOrUpdateNetworkRangeWaitHandler(ctx, a, projectId, vpcId, region, networkRangeId)
76+
return createOrUpdateVPCNetworkRangeWaitHandler(ctx, a, projectId, vpcId, region, networkRangeId)
10877
}
10978

79+
// DeleteVPCNetworkRangeWaitHandler will wait for VPC Network range deletion
11080
func DeleteVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, projectId, vpcId, region, networkRangeId string) *wait.AsyncActionHandler[iaas.VPCNetworkRange] {
11181
waitConfig := wait.WaiterHelper[iaas.VPCNetworkRange, string]{
112-
FetchInstance: a.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute,
113-
GetState: func(i *iaas.VPCNetworkRange) (string, error) {
114-
if i == nil {
115-
return "", errors.New("empty response")
116-
}
117-
if i.VPCNetworkRangeIPv4 != nil {
118-
if i.VPCNetworkRangeIPv4.Status == nil {
119-
return "", errors.New("status is missing in response")
120-
}
121-
return *i.VPCNetworkRangeIPv4.Status, nil
122-
}
123-
if i.VPCNetworkRangeIPv6 != nil {
124-
if i.VPCNetworkRangeIPv6.Status == nil {
125-
return "", errors.New("status is missing in response")
126-
}
127-
return *i.VPCNetworkRangeIPv6.Status, nil
128-
}
129-
return "", errors.New("unknown status in response")
130-
},
82+
FetchInstance: a.GetVPCNetworkRange(ctx, projectId, vpcId, region, networkRangeId).Execute,
83+
GetState: getStateVPCNetworkRange,
13184
ErrorState: []string{FailedStatus},
13285
DeleteHttpErrorStatusCodes: nil, // Use defaults
13386
}
@@ -137,3 +90,34 @@ func DeleteVPCNetworkRangeWaitHandler(ctx context.Context, a iaas.DefaultAPI, pr
13790
handler.SetTimeout(30 * time.Minute)
13891
return handler
13992
}
93+
94+
// getStateVPCRegion returns the state of an iaas.RegionalVPC
95+
func getStateVPCRegion(i *iaas.RegionalVPC) (string, error) {
96+
if i == nil {
97+
return "", errors.New("empty response")
98+
}
99+
if i.Status == nil {
100+
return "", errors.New("status is missing in response")
101+
}
102+
return *i.Status, nil
103+
}
104+
105+
// getStateVPCNetworkRange returns the state of an iaas.VPCNetworkRange
106+
func getStateVPCNetworkRange(i *iaas.VPCNetworkRange) (string, error) {
107+
if i == nil {
108+
return "", errors.New("empty response")
109+
}
110+
if i.VPCNetworkRangeIPv4 != nil {
111+
if i.VPCNetworkRangeIPv4.Status == nil {
112+
return "", errors.New("ipv4 is missing in response")
113+
}
114+
return *i.VPCNetworkRangeIPv4.Status, nil
115+
}
116+
if i.VPCNetworkRangeIPv6 != nil {
117+
if i.VPCNetworkRangeIPv6.Status == nil {
118+
return "", errors.New("ipv6 is missing in response")
119+
}
120+
return *i.VPCNetworkRangeIPv6.Status, nil
121+
}
122+
return "", errors.New("unknown status in response")
123+
}

services/iaas/v2alpha1api/wait/wait_test.go

Lines changed: 35 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,13 @@ package wait
22

33
import (
44
"context"
5+
"fmt"
56
"testing"
67
"testing/synctest"
78
"time"
89

910
"github.com/google/go-cmp/cmp"
11+
"github.com/stackitcloud/stackit-sdk-go/core/wait"
1012

1113
"github.com/stackitcloud/stackit-sdk-go/core/oapierror"
1214
"github.com/stackitcloud/stackit-sdk-go/core/utils"
@@ -183,69 +185,7 @@ func TestDeleteNetworkAreaRegionWaitHandler(t *testing.T) {
183185
}
184186
}
185187

186-
func TestCreateVPCNetworkRangeWaitHandler(t *testing.T) {
187-
tests := []struct {
188-
desc string
189-
getFails bool
190-
resourceState string
191-
wantErr bool
192-
wantResp bool
193-
}{
194-
{
195-
desc: "create_succeeded",
196-
getFails: false,
197-
resourceState: CreateSuccess,
198-
wantErr: false,
199-
wantResp: true,
200-
},
201-
{
202-
desc: "get_fails",
203-
getFails: true,
204-
resourceState: "",
205-
wantErr: true,
206-
wantResp: false,
207-
},
208-
{
209-
desc: "timeout",
210-
getFails: false,
211-
resourceState: "ANOTHER STATE",
212-
wantErr: true,
213-
wantResp: true,
214-
},
215-
}
216-
for _, tt := range tests {
217-
t.Run(tt.desc, func(t *testing.T) {
218-
synctest.Test(t, func(t *testing.T) {
219-
apiClient := newIaaSAPIMock(&iaasMockSettings{
220-
getVPCNetworkRangeFails: tt.getFails,
221-
resourceState: tt.resourceState,
222-
})
223-
224-
var wantRes *iaas.VPCNetworkRange
225-
if tt.wantResp {
226-
wantRes = &iaas.VPCNetworkRange{
227-
VPCNetworkRangeIPv4: &iaas.VPCNetworkRangeIPv4{
228-
Status: utils.Ptr(tt.resourceState),
229-
},
230-
}
231-
}
232-
233-
handler := CreateVPCNetworkRangeWaitHandler(context.Background(), apiClient, "pid", "vpcId", "region", "nid")
234-
235-
gotRes, err := handler.WaitWithContext(context.Background())
236-
237-
if (err != nil) != tt.wantErr {
238-
t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr)
239-
}
240-
if !tt.wantErr && !cmp.Equal(gotRes, wantRes) {
241-
t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes)
242-
}
243-
})
244-
})
245-
}
246-
}
247-
248-
func TestUpdateVPCNetworkRangeWaitHandler(t *testing.T) {
188+
func TestCreateOrUpdateVPCNetworkRangeWaitHandler(t *testing.T) {
249189
tests := []struct {
250190
desc string
251191
getFails bool
@@ -282,35 +222,44 @@ func TestUpdateVPCNetworkRangeWaitHandler(t *testing.T) {
282222
wantResp: true,
283223
},
284224
}
285-
for _, tt := range tests {
286-
t.Run(tt.desc, func(t *testing.T) {
287-
synctest.Test(t, func(t *testing.T) {
288-
apiClient := newIaaSAPIMock(&iaasMockSettings{
289-
getVPCNetworkRangeFails: tt.getFails,
290-
resourceState: tt.resourceState,
291-
})
292225

293-
var wantRes *iaas.VPCNetworkRange
294-
if tt.wantResp {
295-
wantRes = &iaas.VPCNetworkRange{
296-
VPCNetworkRangeIPv4: &iaas.VPCNetworkRangeIPv4{
297-
Status: utils.Ptr(tt.resourceState),
298-
},
226+
handlers := map[string]func(context.Context, iaas.DefaultAPI, string, string, string, string) *wait.AsyncActionHandler[iaas.VPCNetworkRange]{
227+
"common logic": createOrUpdateVPCNetworkRangeWaitHandler,
228+
"create": CreateVPCNetworkRangeWaitHandler,
229+
"update": UpdateVPCNetworkRangeWaitHandler,
230+
}
231+
232+
for handlerDesc, handlerFn := range handlers {
233+
for _, tt := range tests {
234+
t.Run(fmt.Sprintf("%s - %s", handlerDesc, tt.desc), func(t *testing.T) {
235+
synctest.Test(t, func(t *testing.T) {
236+
apiClient := newIaaSAPIMock(&iaasMockSettings{
237+
getVPCNetworkRangeFails: tt.getFails,
238+
resourceState: tt.resourceState,
239+
})
240+
241+
var wantRes *iaas.VPCNetworkRange
242+
if tt.wantResp {
243+
wantRes = &iaas.VPCNetworkRange{
244+
VPCNetworkRangeIPv4: &iaas.VPCNetworkRangeIPv4{
245+
Status: utils.Ptr(tt.resourceState),
246+
},
247+
}
299248
}
300-
}
301249

302-
handler := UpdateVPCNetworkRangeWaitHandler(context.Background(), apiClient, "pid", "vpcId", "region", "nid")
250+
handler := handlerFn(context.Background(), apiClient, "pid", "vpcId", "region", "nid")
303251

304-
gotRes, err := handler.WaitWithContext(context.Background())
252+
gotRes, err := handler.WaitWithContext(context.Background())
305253

306-
if (err != nil) != tt.wantErr {
307-
t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr)
308-
}
309-
if !tt.wantErr && !cmp.Equal(gotRes, wantRes) {
310-
t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes)
311-
}
254+
if (err != nil) != tt.wantErr {
255+
t.Fatalf("handler error = %v, wantErr %v", err, tt.wantErr)
256+
}
257+
if !tt.wantErr && !cmp.Equal(gotRes, wantRes) {
258+
t.Fatalf("handler gotRes = %v, want %v", gotRes, wantRes)
259+
}
260+
})
312261
})
313-
})
262+
}
314263
}
315264
}
316265

0 commit comments

Comments
 (0)