diff --git a/internal/namespaces/vpc/v2/custom.go b/internal/namespaces/vpc/v2/custom.go index 6102defb5f..00939492c0 100644 --- a/internal/namespaces/vpc/v2/custom.go +++ b/internal/namespaces/vpc/v2/custom.go @@ -13,6 +13,7 @@ func GetCommands() *core.Commands { cmds.Remove("vpc", "post") cmds.MustFind("vpc", "private-network", "get").Override(privateNetworkGetBuilder) + cmds.MustFind("vpc", "private-network", "delete").Override(privateNetworkDeleteBuilder) human.RegisterMarshalerFunc(vpc.PrivateNetwork{}, privateNetworkMarshalerFunc) cmds.Merge(core.NewCommands( diff --git a/internal/namespaces/vpc/v2/custom_private_network.go b/internal/namespaces/vpc/v2/custom_private_network.go index 8bc4828fdc..2ec4965842 100644 --- a/internal/namespaces/vpc/v2/custom_private_network.go +++ b/internal/namespaces/vpc/v2/custom_private_network.go @@ -2,6 +2,9 @@ package vpc import ( "context" + "errors" + "net/http" + "time" "github.com/scaleway/scaleway-cli/v2/core" "github.com/scaleway/scaleway-cli/v2/core/human" @@ -715,3 +718,39 @@ func intersectZones(regionZones, apiZones []scw.Zone) []scw.Zone { return intersect } + +func privateNetworkDeleteBuilder(c *core.Command) *core.Command { + c.Run = func(ctx context.Context, args any) (i any, e error) { + request := args.(*vpc.DeletePrivateNetworkRequest) + + client := core.ExtractClient(ctx) + api := vpc.NewAPI(client) + + return tryDeletingPrivateNetwork(ctx, api, request.Region, request.PrivateNetworkID, 5) + } + + return c +} + +func tryDeletingPrivateNetwork( + ctx context.Context, + api *vpc.API, + region scw.Region, + pnID string, + retriesLeft int, +) (*vpc.PrivateNetwork, error) { + err := api.DeletePrivateNetwork(&vpc.DeletePrivateNetworkRequest{ + PrivateNetworkID: pnID, + Region: region, + }, scw.WithContext(ctx)) + + var respErr *scw.ResponseError + if errors.As(err, &respErr) && respErr.StatusCode == http.StatusInternalServerError { + time.Sleep(time.Second * 5) + if retriesLeft > 0 { + return tryDeletingPrivateNetwork(ctx, api, region, pnID, retriesLeft-1) + } + } + + return nil, err +}