Skip to content

Commit e31451c

Browse files
Monitobremyleone
authored andcommitted
feat(lb): add wait lb & instances attached (scaleway#983)
1 parent 3b41312 commit e31451c

14 files changed

+2982
-2907
lines changed

scaleway/helpers_lb.go

+1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import (
1717
const (
1818
LbWaitForTimeout = 10 * time.Minute
1919
defaultLbLbTimeout = 10 * time.Minute
20+
retryLbIPInterval = 5 * time.Second
2021
)
2122

2223
// lbAPIWithZone returns an lb API WITH zone for a Create request

scaleway/resource_lb.go

+6-7
Original file line numberDiff line numberDiff line change
@@ -361,12 +361,11 @@ func resourceScalewayLbDelete(ctx context.Context, d *schema.ResourceData, meta
361361
}
362362

363363
// check if current lb is on stable state
364-
retryInterval := DefaultWaitLBRetryInterval
365-
currentLB, err := lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
364+
currentLB, err := lbAPI.WaitForLbInstances(&lb.ZonedAPIWaitForLBInstancesRequest{
366365
LBID: ID,
367366
Zone: zone,
368367
Timeout: scw.TimeDurationPtr(LbWaitForTimeout),
369-
RetryInterval: &retryInterval,
368+
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
370369
}, scw.WithContext(ctx))
371370
if err != nil {
372371
return diag.FromErr(err)
@@ -393,11 +392,11 @@ func resourceScalewayLbDelete(ctx context.Context, d *schema.ResourceData, meta
393392
}
394393
}
395394

396-
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
395+
_, err = lbAPI.WaitForLbInstances(&lb.ZonedAPIWaitForLBInstancesRequest{
397396
LBID: ID,
398397
Zone: zone,
399398
Timeout: scw.TimeDurationPtr(LbWaitForTimeout),
400-
RetryInterval: &retryInterval,
399+
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
401400
}, scw.WithContext(ctx))
402401
if err != nil && !is404Error(err) {
403402
return diag.FromErr(err)
@@ -419,11 +418,11 @@ func resourceScalewayLbDelete(ctx context.Context, d *schema.ResourceData, meta
419418
return diag.FromErr(err)
420419
}
421420

422-
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
421+
_, err = lbAPI.WaitForLbInstances(&lb.ZonedAPIWaitForLBInstancesRequest{
423422
LBID: ID,
424423
Zone: zone,
425424
Timeout: scw.TimeDurationPtr(LbWaitForTimeout),
426-
RetryInterval: &retryInterval,
425+
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
427426
}, scw.WithContext(ctx))
428427
if err != nil && !is404Error(err) {
429428
return diag.FromErr(err)

scaleway/resource_lb_ip.go

+71-38
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55

66
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
7+
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/resource"
78
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
89
"github.com/scaleway/scaleway-sdk-go/api/lb/v1"
910
"github.com/scaleway/scaleway-sdk-go/scw"
@@ -79,24 +80,36 @@ func resourceScalewayLbIPRead(ctx context.Context, d *schema.ResourceData, meta
7980
return diag.FromErr(err)
8081
}
8182

82-
res, err := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
83-
Zone: zone,
84-
IPID: ID,
85-
}, scw.WithContext(ctx))
83+
var ip *lb.IP
84+
err = resource.RetryContext(ctx, retryLbIPInterval, func() *resource.RetryError {
85+
res, errGet := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
86+
Zone: zone,
87+
IPID: ID,
88+
}, scw.WithContext(ctx))
89+
if err != nil {
90+
if is403Error(errGet) {
91+
return resource.RetryableError(errGet)
92+
}
93+
return resource.NonRetryableError(errGet)
94+
}
95+
96+
ip = res
97+
return nil
98+
})
8699

87100
if err != nil {
88-
if is404Error(err) || is403Error(err) {
101+
if is404Error(err) {
89102
d.SetId("")
90103
return nil
91104
}
92105
return diag.FromErr(err)
93106
}
94107

95108
// check lb state if it is attached
96-
if res.LBID != nil {
109+
if ip.LBID != nil {
97110
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
98111
Zone: zone,
99-
LBID: *res.LBID,
112+
LBID: *ip.LBID,
100113
Timeout: scw.TimeDurationPtr(defaultInstanceServerWaitTimeout),
101114
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
102115
}, scw.WithContext(ctx))
@@ -116,12 +129,12 @@ func resourceScalewayLbIPRead(ctx context.Context, d *schema.ResourceData, meta
116129
}
117130

118131
_ = d.Set("region", string(region))
119-
_ = d.Set("zone", res.Zone.String())
120-
_ = d.Set("organization_id", res.OrganizationID)
121-
_ = d.Set("project_id", res.ProjectID)
122-
_ = d.Set("ip_address", res.IPAddress)
123-
_ = d.Set("reverse", res.Reverse)
124-
_ = d.Set("lb_id", flattenStringPtr(res.LBID))
132+
_ = d.Set("zone", ip.Zone.String())
133+
_ = d.Set("organization_id", ip.OrganizationID)
134+
_ = d.Set("project_id", ip.ProjectID)
135+
_ = d.Set("ip_address", ip.IPAddress)
136+
_ = d.Set("reverse", ip.Reverse)
137+
_ = d.Set("lb_id", flattenStringPtr(ip.LBID))
125138

126139
return nil
127140
}
@@ -132,23 +145,35 @@ func resourceScalewayLbIPUpdate(ctx context.Context, d *schema.ResourceData, met
132145
return diag.FromErr(err)
133146
}
134147

135-
res, err := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
136-
Zone: zone,
137-
IPID: ID,
138-
}, scw.WithContext(ctx))
148+
var ip *lb.IP
149+
err = resource.RetryContext(ctx, retryLbIPInterval, func() *resource.RetryError {
150+
res, errGet := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
151+
Zone: zone,
152+
IPID: ID,
153+
}, scw.WithContext(ctx))
154+
if err != nil {
155+
if is403Error(errGet) {
156+
return resource.RetryableError(errGet)
157+
}
158+
return resource.NonRetryableError(errGet)
159+
}
160+
161+
ip = res
162+
return nil
163+
})
139164

140165
if err != nil {
141-
if is404Error(err) || is403Error(err) {
166+
if is404Error(err) {
142167
d.SetId("")
143168
return nil
144169
}
145170
return diag.FromErr(err)
146171
}
147172

148-
if res.LBID != nil {
173+
if ip.LBID != nil {
149174
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
150175
Zone: zone,
151-
LBID: *res.LBID,
176+
LBID: *ip.LBID,
152177
Timeout: scw.TimeDurationPtr(defaultInstanceServerWaitTimeout),
153178
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
154179
}, scw.WithContext(ctx))
@@ -174,10 +199,10 @@ func resourceScalewayLbIPUpdate(ctx context.Context, d *schema.ResourceData, met
174199
}
175200
}
176201

177-
if res.LBID != nil {
202+
if ip.LBID != nil {
178203
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
179204
Zone: zone,
180-
LBID: *res.LBID,
205+
LBID: *ip.LBID,
181206
Timeout: scw.TimeDurationPtr(defaultInstanceServerWaitTimeout),
182207
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
183208
}, scw.WithContext(ctx))
@@ -199,25 +224,33 @@ func resourceScalewayLbIPDelete(ctx context.Context, d *schema.ResourceData, met
199224
return diag.FromErr(err)
200225
}
201226

202-
res, err := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
203-
Zone: zone,
204-
IPID: ID,
205-
}, scw.WithContext(ctx))
227+
var ip *lb.IP
228+
err = resource.RetryContext(ctx, retryLbIPInterval, func() *resource.RetryError {
229+
res, errGet := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
230+
Zone: zone,
231+
IPID: ID,
232+
}, scw.WithContext(ctx))
233+
if err != nil {
234+
if is403Error(errGet) {
235+
return resource.RetryableError(errGet)
236+
}
237+
return resource.NonRetryableError(errGet)
238+
}
239+
240+
ip = res
241+
return nil
242+
})
206243

207244
if err != nil {
208-
if is404Error(err) || is403Error(err) {
209-
d.SetId("")
210-
return nil
211-
}
212245
return diag.FromErr(err)
213246
}
214247

215248
// check lb state
216-
if res.LBID != nil {
217-
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
249+
if ip != nil && ip.LBID != nil {
250+
_, err = lbAPI.WaitForLbInstances(&lb.ZonedAPIWaitForLBInstancesRequest{
251+
LBID: ID,
218252
Zone: zone,
219-
LBID: *res.LBID,
220-
Timeout: scw.TimeDurationPtr(defaultInstanceServerWaitTimeout),
253+
Timeout: scw.TimeDurationPtr(LbWaitForTimeout),
221254
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
222255
}, scw.WithContext(ctx))
223256
if err != nil {
@@ -239,11 +272,11 @@ func resourceScalewayLbIPDelete(ctx context.Context, d *schema.ResourceData, met
239272
}
240273

241274
// check lb state
242-
if res.LBID != nil {
243-
_, err = lbAPI.WaitForLb(&lb.ZonedAPIWaitForLBRequest{
275+
if ip != nil && ip.LBID != nil {
276+
_, err = lbAPI.WaitForLbInstances(&lb.ZonedAPIWaitForLBInstancesRequest{
277+
LBID: ID,
244278
Zone: zone,
245-
LBID: *res.LBID,
246-
Timeout: scw.TimeDurationPtr(defaultInstanceServerWaitTimeout),
279+
Timeout: scw.TimeDurationPtr(LbWaitForTimeout),
247280
RetryInterval: scw.TimeDurationPtr(DefaultWaitLBRetryInterval),
248281
}, scw.WithContext(ctx))
249282
if err != nil {

scaleway/resource_lb_ip_test.go

+16-7
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package scaleway
22

33
import (
4+
"context"
45
"fmt"
56
"testing"
67

@@ -18,18 +19,19 @@ func init() {
1819
}
1920

2021
func testSweepLBIP(_ string) error {
21-
return sweepZones([]scw.Zone{scw.ZoneFrPar1, scw.ZoneNlAms1, scw.ZonePlWaw1}, func(scwClient *scw.Client, region scw.Zone) error {
22+
return sweepZones([]scw.Zone{scw.ZoneFrPar1, scw.ZoneNlAms1, scw.ZonePlWaw1}, func(scwClient *scw.Client, zone scw.Zone) error {
2223
lbAPI := lb.NewZonedAPI(scwClient)
2324

24-
l.Debugf("sweeper: destroying the lb ips in (%s)", region)
25-
listIPs, err := lbAPI.ListIPs(&lb.ZonedAPIListIPsRequest{}, scw.WithAllPages())
25+
l.Debugf("sweeper: destroying the lb ips in zone (%s)", zone)
26+
listIPs, err := lbAPI.ListIPs(&lb.ZonedAPIListIPsRequest{Zone: zone}, scw.WithAllPages())
2627
if err != nil {
27-
return fmt.Errorf("error listing lb ips in (%s) in sweeper: %s", region, err)
28+
return fmt.Errorf("error listing lb ips in (%s) in sweeper: %s", zone, err)
2829
}
2930

3031
for _, ip := range listIPs.IPs {
3132
if ip.LBID == nil {
3233
err := lbAPI.ReleaseIP(&lb.ZonedAPIReleaseIPRequest{
34+
Zone: zone,
3335
IPID: ip.ID,
3436
})
3537
if err != nil {
@@ -146,9 +148,16 @@ func testAccCheckScalewayLbIPDestroy(tt *TestTools) resource.TestCheckFunc {
146148
}
147149
}
148150

149-
_, err = lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
150-
Zone: zone,
151-
IPID: ID,
151+
err = resource.RetryContext(context.Background(), retryLbIPInterval, func() *resource.RetryError {
152+
_, errGet := lbAPI.GetIP(&lb.ZonedAPIGetIPRequest{
153+
Zone: zone,
154+
IPID: ID,
155+
})
156+
if is403Error(errGet) {
157+
return resource.RetryableError(errGet)
158+
}
159+
160+
return resource.NonRetryableError(errGet)
152161
})
153162

154163
// If no error resource still exist

0 commit comments

Comments
 (0)