@@ -5,13 +5,16 @@ package power
55
66import (
77 "context"
8+ "errors"
89 "fmt"
910 "log"
1011 "net"
1112 "strconv"
13+ "strings"
1214 "time"
1315
1416 "github.com/IBM-Cloud/power-go-client/clients/instance"
17+ "github.com/IBM-Cloud/power-go-client/power/client/p_cloud_networks"
1518 "github.com/IBM-Cloud/power-go-client/power/models"
1619 "github.com/IBM-Cloud/terraform-provider-ibm/ibm/conns"
1720 "github.com/IBM-Cloud/terraform-provider-ibm/ibm/flex"
@@ -297,7 +300,7 @@ func resourceIBMPINetworkCreate(ctx context.Context, d *schema.ResourceData, met
297300 }
298301 }
299302
300- networkResponse , err := client . Create ( body )
303+ networkResponse , err := createNetworkWithRetry ( ctx , client , body )
301304 if err != nil {
302305 return diag .FromErr (err )
303306 }
@@ -448,7 +451,7 @@ func resourceIBMPINetworkDelete(ctx context.Context, d *schema.ResourceData, met
448451 }
449452
450453 client := instance .NewIBMPINetworkClient (ctx , sess , cloudInstanceID )
451- err = client . Delete ( networkID )
454+ err = deleteNetworkWithRetry ( ctx , client , networkID )
452455 if err != nil {
453456 return diag .FromErr (err )
454457 }
@@ -640,3 +643,82 @@ func networkAddressTranslationToMap(nat *models.NetworkAddressTranslation) map[s
640643 }
641644 return natMap
642645}
646+
647+ func createNetworkWithRetry (ctx context.Context , client * instance.IBMPINetworkClient , body * models.NetworkCreate ) (* models.Network , error ) {
648+ lastErr := ""
649+
650+ stateConf := & retry.StateChangeConf {
651+ Pending : []string {State_Retry },
652+ Target : []string {State_Active , State_Failed },
653+ Refresh : retryNetworkCreationFunc (client , body , & lastErr ),
654+ MinTimeout : Retry_Delay ,
655+ NotFoundChecks : Retries ,
656+ Timeout : 10 * time .Minute ,
657+ }
658+
659+ network , err := stateConf .WaitForStateContext (ctx )
660+ if err != nil {
661+ return nil , fmt .Errorf (lastErr )
662+ }
663+
664+ networkResponse := network .(* models.Network )
665+ return networkResponse , nil
666+ }
667+
668+ func retryNetworkCreationFunc (client * instance.IBMPINetworkClient , body * models.NetworkCreate , errPointer * string ) retry.StateRefreshFunc {
669+ return func () (interface {}, string , error ) {
670+ network , err := client .Create (body )
671+ uErr := errors .Unwrap (err )
672+
673+ if err != nil {
674+ * errPointer = err .Error ()
675+ switch uErr .(type ) {
676+ case * p_cloud_networks.PcloudNetworksPostBadRequest :
677+ log .Printf ("[DEBUG] err %s on network create" , err )
678+ return nil , State_Failed , err
679+ case * p_cloud_networks.PcloudNetworksPostUnprocessableEntity :
680+ log .Printf ("[DEBUG] err %s on network create" , err )
681+ return nil , State_Failed , err
682+ }
683+
684+ log .Printf ("[DEBUG] err %s on network create, retrying..." , err )
685+ return nil , State_Retry , nil
686+ }
687+
688+ return network , State_Active , nil
689+ }
690+ }
691+
692+ func deleteNetworkWithRetry (ctx context.Context , client * instance.IBMPINetworkClient , id string ) error {
693+ lastErr := ""
694+
695+ stateConf := & retry.StateChangeConf {
696+ Pending : []string {State_Retry },
697+ Target : []string {State_NotFound },
698+ Refresh : retryNetworkDeleteFunc (client , id , & lastErr ),
699+ MinTimeout : Retry_Delay ,
700+ NotFoundChecks : Retries ,
701+ Timeout : 10 * time .Minute ,
702+ }
703+
704+ _ , err := stateConf .WaitForStateContext (ctx )
705+ if err != nil {
706+ return fmt .Errorf (lastErr )
707+ }
708+
709+ return nil
710+ }
711+
712+ func retryNetworkDeleteFunc (client * instance.IBMPINetworkClient , id string , errPointer * string ) retry.StateRefreshFunc {
713+ return func () (interface {}, string , error ) {
714+ err := client .Delete (id )
715+
716+ if err != nil && ! strings .Contains (strings .ToLower (err .Error ()), NotFound ) {
717+ * errPointer = err .Error ()
718+ log .Printf ("[DEBUG] err %s on network delete, retrying..." , err )
719+ return nil , State_Retry , nil
720+ }
721+
722+ return "" , State_NotFound , nil
723+ }
724+ }
0 commit comments