@@ -2,9 +2,11 @@ package scaleway
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"strings"
6
7
"time"
7
8
9
+ "github.com/hashicorp/terraform-plugin-log/tflog"
8
10
"github.com/hashicorp/terraform-plugin-sdk/v2/diag"
9
11
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
10
12
"github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
@@ -69,7 +71,6 @@ func resourceScalewayLb() *schema.Resource {
69
71
"release_ip" : {
70
72
Type : schema .TypeBool ,
71
73
Optional : true ,
72
- Default : false ,
73
74
Description : "Release the IPs related to this load-balancer" ,
74
75
Deprecated : "The resource ip will be destroyed by it's own resource. Please set this to `false`" ,
75
76
},
@@ -90,7 +91,6 @@ func resourceScalewayLb() *schema.Resource {
90
91
Description : "Define two IP addresses in the subnet of your private network that will be assigned for the principal and standby node of your load balancer." ,
91
92
Type : schema .TypeList ,
92
93
Optional : true ,
93
- Computed : true ,
94
94
Elem : & schema.Schema {
95
95
Type : schema .TypeString ,
96
96
ValidateFunc : validation .IsIPAddress ,
@@ -100,7 +100,6 @@ func resourceScalewayLb() *schema.Resource {
100
100
Description : "Set to true if you want to let DHCP assign IP addresses" ,
101
101
Type : schema .TypeBool ,
102
102
Optional : true ,
103
- Computed : true ,
104
103
},
105
104
// Readonly attributes
106
105
"status" : {
@@ -160,12 +159,11 @@ func resourceScalewayLbCreate(ctx context.Context, d *schema.ResourceData, meta
160
159
return diag .FromErr (err )
161
160
}
162
161
163
- for _ , config := range pnConfigs {
164
- _ , err := lbAPI .AttachPrivateNetwork (config , scw .WithContext (ctx ))
165
- if err != nil && ! is404Error (err ) {
166
- return diag .FromErr (err )
167
- }
162
+ _ , err = attachLBPrivateNetwork (ctx , lbAPI , zone , pnConfigs , d .Timeout (schema .TimeoutCreate ))
163
+ if err != nil {
164
+ return diag .FromErr (err )
168
165
}
166
+
169
167
_ , err = waitForLB (ctx , lbAPI , zone , lb .ID , d .Timeout (schema .TimeoutCreate ))
170
168
if err != nil {
171
169
return diag .FromErr (err )
@@ -208,17 +206,14 @@ func resourceScalewayLbRead(ctx context.Context, d *schema.ResourceData, meta in
208
206
_ = d .Set ("ip_address" , lb .IP [0 ].IPAddress )
209
207
210
208
// retrieve attached private networks
211
- resPN , err := lbAPI .ListLBPrivateNetworks (& lbSDK.ZonedAPIListLBPrivateNetworksRequest {
212
- Zone : zone ,
213
- LBID : ID ,
214
- }, scw .WithContext (ctx ))
209
+ privateNetworks , err := waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutRead ))
215
210
if err != nil {
216
211
if is404Error (err ) {
217
212
return nil
218
213
}
219
214
return diag .FromErr (err )
220
215
}
221
- _ = d .Set ("private_network" , flattenPrivateNetworkConfigs (resPN ))
216
+ _ = d .Set ("private_network" , flattenPrivateNetworkConfigs (privateNetworks ))
222
217
223
218
return nil
224
219
}
@@ -251,7 +246,7 @@ func resourceScalewayLbUpdate(ctx context.Context, d *schema.ResourceData, meta
251
246
////
252
247
// Attach / Detach Private Networks
253
248
////
254
- if d .HasChangesExcept ("private_network" ) {
249
+ if d .HasChange ("private_network" ) {
255
250
// check that pns are in a stable state
256
251
pns , err := waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutUpdate ))
257
252
if err != nil && ! is404Error (err ) {
@@ -269,7 +264,7 @@ func resourceScalewayLbUpdate(ctx context.Context, d *schema.ResourceData, meta
269
264
Zone : zone ,
270
265
LBID : ID ,
271
266
PrivateNetworkID : pnID ,
272
- })
267
+ }, scw . WithContext ( ctx ) )
273
268
if err != nil && ! is404Error (err ) {
274
269
return diag .FromErr (err )
275
270
}
@@ -301,10 +296,25 @@ func resourceScalewayLbUpdate(ctx context.Context, d *schema.ResourceData, meta
301
296
}
302
297
}
303
298
304
- _ , err = waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutUpdate ))
299
+ privateNetworks , err : = waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutUpdate ))
305
300
if err != nil && ! is404Error (err ) {
306
301
return diag .FromErr (err )
307
302
}
303
+
304
+ for _ , pn := range privateNetworks {
305
+ tflog .Debug (ctx , fmt .Sprintf ("PrivateNetwork ID %s state: %v" , pn .PrivateNetworkID , pn .Status ))
306
+ if pn .Status == lbSDK .PrivateNetworkStatusError {
307
+ err = lbAPI .DetachPrivateNetwork (& lbSDK.ZonedAPIDetachPrivateNetworkRequest {
308
+ Zone : zone ,
309
+ LBID : ID ,
310
+ PrivateNetworkID : pn .PrivateNetworkID ,
311
+ }, scw .WithContext (ctx ))
312
+ if err != nil && ! is404Error (err ) {
313
+ return diag .FromErr (err )
314
+ }
315
+ return diag .Errorf ("attaching private network with id: %s on error state. please check your config" , pn .PrivateNetworkID )
316
+ }
317
+ }
308
318
}
309
319
}
310
320
@@ -338,7 +348,7 @@ func resourceScalewayLbDelete(ctx context.Context, d *schema.ResourceData, meta
338
348
Zone : zone ,
339
349
LBID : ID ,
340
350
PrivateNetworkID : pn .PrivateNetworkID ,
341
- })
351
+ }, scw . WithContext ( ctx ) )
342
352
if err != nil && ! is404Error (err ) {
343
353
return diag .FromErr (err )
344
354
}
0 commit comments