Skip to content

Commit 7115322

Browse files
[Resource] Add retry to pi network create and delete (IBM-Cloud#6165)
1 parent 93ad747 commit 7115322

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

ibm/service/power/ibm_pi_constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -655,6 +655,8 @@ const (
655655
Timeout_Active = 2 * time.Minute
656656
Timeout_Delay = 60 * time.Second
657657
Timeout_Warning = 60 * time.Second
658+
Retries = 3
659+
Retry_Delay = 30 * time.Second
658660
vpcRetryCount = 2
659661
vpcRetryDuration = time.Minute
660662

ibm/service/power/resource_ibm_pi_network.go

Lines changed: 84 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@ package power
55

66
import (
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

Comments
 (0)