Skip to content

Commit 4616e9f

Browse files
committed
ZTC-446: Allow to force delete a vnet
1 parent de7ca4b commit 4616e9f

File tree

4 files changed

+25
-6
lines changed

4 files changed

+25
-6
lines changed

cfapi/client.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type IPRouteClient interface {
2828
type VnetClient interface {
2929
CreateVirtualNetwork(newVnet NewVirtualNetwork) (VirtualNetwork, error)
3030
ListVirtualNetworks(filter *VnetFilter) ([]*VirtualNetwork, error)
31-
DeleteVirtualNetwork(id uuid.UUID) error
31+
DeleteVirtualNetwork(id uuid.UUID, force bool) error
3232
UpdateVirtualNetwork(id uuid.UUID, updates UpdateVirtualNetwork) error
3333
}
3434

cfapi/virtual_network.go

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,16 @@ func (r *RESTClient) ListVirtualNetworks(filter *VnetFilter) ([]*VirtualNetwork,
8080
return nil, r.statusCodeToError("list virtual networks", resp)
8181
}
8282

83-
func (r *RESTClient) DeleteVirtualNetwork(id uuid.UUID) error {
83+
func (r *RESTClient) DeleteVirtualNetwork(id uuid.UUID, force bool) error {
8484
endpoint := r.baseEndpoints.accountVnets
8585
endpoint.Path = path.Join(endpoint.Path, url.PathEscape(id.String()))
86+
87+
queryParams := url.Values{}
88+
if force {
89+
queryParams.Set("force", strconv.FormatBool(force))
90+
}
91+
endpoint.RawQuery = queryParams.Encode()
92+
8693
resp, err := r.sendRequest("DELETE", endpoint, nil)
8794
if err != nil {
8895
return errors.Wrap(err, "REST request failed")

cmd/cloudflared/tunnel/subcommand_context_vnets.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,12 @@ func (sc *subcommandContext) listVirtualNetworks(filter *cfapi.VnetFilter) ([]*c
2323
return client.ListVirtualNetworks(filter)
2424
}
2525

26-
func (sc *subcommandContext) deleteVirtualNetwork(vnetId uuid.UUID) error {
26+
func (sc *subcommandContext) deleteVirtualNetwork(vnetId uuid.UUID, force bool) error {
2727
client, err := sc.client()
2828
if err != nil {
2929
return errors.Wrap(err, noClientMsg)
3030
}
31-
return client.DeleteVirtualNetwork(vnetId)
31+
return client.DeleteVirtualNetwork(vnetId, force)
3232
}
3333

3434
func (sc *subcommandContext) updateVirtualNetwork(vnetId uuid.UUID, updates cfapi.UpdateVirtualNetwork) error {

cmd/cloudflared/tunnel/vnets_subcommands.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,12 @@ var (
3333
Aliases: []string{"c"},
3434
Usage: "A new comment describing the purpose of the virtual network.",
3535
}
36+
vnetForceDeleteFlag = &cli.BoolFlag{
37+
Name: "force",
38+
Aliases: []string{"f"},
39+
Usage: "Force the deletion of the virtual network even if it is being relied upon by other resources. Those" +
40+
"resources will either be deleted (e.g. IP Routes) or moved to the current default virutal network.",
41+
}
3642
)
3743

3844
func buildVirtualNetworkSubcommand(hidden bool) *cli.Command {
@@ -82,6 +88,7 @@ be the current default.`,
8288
UsageText: "cloudflared tunnel [--config FILEPATH] network delete VIRTUAL_NETWORK",
8389
Description: `Deletes the virtual network (given its ID or name). This is only possible if that virtual network is unused.
8490
A virtual network may be used by IP routes or by WARP devices.`,
91+
Flags: []cli.Flag{vnetForceDeleteFlag},
8592
Hidden: hidden,
8693
},
8794
{
@@ -188,7 +195,7 @@ func deleteVirtualNetworkCommand(c *cli.Context) error {
188195
if err != nil {
189196
return err
190197
}
191-
if c.NArg() != 1 {
198+
if c.NArg() < 1 {
192199
return errors.New("You must supply exactly one argument, either the ID or name of the virtual network to delete")
193200
}
194201

@@ -198,7 +205,12 @@ func deleteVirtualNetworkCommand(c *cli.Context) error {
198205
return err
199206
}
200207

201-
if err := sc.deleteVirtualNetwork(vnetId); err != nil {
208+
forceDelete := false
209+
if c.IsSet(vnetForceDeleteFlag.Name) {
210+
forceDelete = c.Bool(vnetForceDeleteFlag.Name)
211+
}
212+
213+
if err := sc.deleteVirtualNetwork(vnetId, forceDelete); err != nil {
202214
return errors.Wrap(err, "API error")
203215
}
204216
fmt.Printf("Successfully deleted virtual network '%s'\n", input)

0 commit comments

Comments
 (0)