@@ -2,9 +2,11 @@ package scaleway
22
33import (
44 "context"
5+ "fmt"
56 "strings"
67 "time"
78
9+ "github.com/hashicorp/terraform-plugin-log/tflog"
810 "github.com/hashicorp/terraform-plugin-sdk/v2/diag"
911 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/schema"
1012 "github.com/hashicorp/terraform-plugin-sdk/v2/helper/validation"
@@ -69,7 +71,6 @@ func resourceScalewayLb() *schema.Resource {
6971 "release_ip" : {
7072 Type : schema .TypeBool ,
7173 Optional : true ,
72- Default : false ,
7374 Description : "Release the IPs related to this load-balancer" ,
7475 Deprecated : "The resource ip will be destroyed by it's own resource. Please set this to `false`" ,
7576 },
@@ -90,7 +91,6 @@ func resourceScalewayLb() *schema.Resource {
9091 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." ,
9192 Type : schema .TypeList ,
9293 Optional : true ,
93- Computed : true ,
9494 Elem : & schema.Schema {
9595 Type : schema .TypeString ,
9696 ValidateFunc : validation .IsIPAddress ,
@@ -100,7 +100,6 @@ func resourceScalewayLb() *schema.Resource {
100100 Description : "Set to true if you want to let DHCP assign IP addresses" ,
101101 Type : schema .TypeBool ,
102102 Optional : true ,
103- Computed : true ,
104103 },
105104 // Readonly attributes
106105 "status" : {
@@ -160,12 +159,11 @@ func resourceScalewayLbCreate(ctx context.Context, d *schema.ResourceData, meta
160159 return diag .FromErr (err )
161160 }
162161
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 )
168165 }
166+
169167 _ , err = waitForLB (ctx , lbAPI , zone , lb .ID , d .Timeout (schema .TimeoutCreate ))
170168 if err != nil {
171169 return diag .FromErr (err )
@@ -208,17 +206,14 @@ func resourceScalewayLbRead(ctx context.Context, d *schema.ResourceData, meta in
208206 _ = d .Set ("ip_address" , lb .IP [0 ].IPAddress )
209207
210208 // 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 ))
215210 if err != nil {
216211 if is404Error (err ) {
217212 return nil
218213 }
219214 return diag .FromErr (err )
220215 }
221- _ = d .Set ("private_network" , flattenPrivateNetworkConfigs (resPN ))
216+ _ = d .Set ("private_network" , flattenPrivateNetworkConfigs (privateNetworks ))
222217
223218 return nil
224219}
@@ -251,7 +246,7 @@ func resourceScalewayLbUpdate(ctx context.Context, d *schema.ResourceData, meta
251246 ////
252247 // Attach / Detach Private Networks
253248 ////
254- if d .HasChangesExcept ("private_network" ) {
249+ if d .HasChange ("private_network" ) {
255250 // check that pns are in a stable state
256251 pns , err := waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutUpdate ))
257252 if err != nil && ! is404Error (err ) {
@@ -269,7 +264,7 @@ func resourceScalewayLbUpdate(ctx context.Context, d *schema.ResourceData, meta
269264 Zone : zone ,
270265 LBID : ID ,
271266 PrivateNetworkID : pnID ,
272- })
267+ }, scw . WithContext ( ctx ) )
273268 if err != nil && ! is404Error (err ) {
274269 return diag .FromErr (err )
275270 }
@@ -301,10 +296,25 @@ func resourceScalewayLbUpdate(ctx context.Context, d *schema.ResourceData, meta
301296 }
302297 }
303298
304- _ , err = waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutUpdate ))
299+ privateNetworks , err : = waitForLBPN (ctx , lbAPI , zone , ID , d .Timeout (schema .TimeoutUpdate ))
305300 if err != nil && ! is404Error (err ) {
306301 return diag .FromErr (err )
307302 }
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+ }
308318 }
309319 }
310320
@@ -338,7 +348,7 @@ func resourceScalewayLbDelete(ctx context.Context, d *schema.ResourceData, meta
338348 Zone : zone ,
339349 LBID : ID ,
340350 PrivateNetworkID : pn .PrivateNetworkID ,
341- })
351+ }, scw . WithContext ( ctx ) )
342352 if err != nil && ! is404Error (err ) {
343353 return diag .FromErr (err )
344354 }
0 commit comments