ZTC-446: Allow to force delete a vnet
This commit is contained in:
parent
de7ca4be30
commit
4616e9fcc2
|
@ -28,7 +28,7 @@ type IPRouteClient interface {
|
||||||
type VnetClient interface {
|
type VnetClient interface {
|
||||||
CreateVirtualNetwork(newVnet NewVirtualNetwork) (VirtualNetwork, error)
|
CreateVirtualNetwork(newVnet NewVirtualNetwork) (VirtualNetwork, error)
|
||||||
ListVirtualNetworks(filter *VnetFilter) ([]*VirtualNetwork, error)
|
ListVirtualNetworks(filter *VnetFilter) ([]*VirtualNetwork, error)
|
||||||
DeleteVirtualNetwork(id uuid.UUID) error
|
DeleteVirtualNetwork(id uuid.UUID, force bool) error
|
||||||
UpdateVirtualNetwork(id uuid.UUID, updates UpdateVirtualNetwork) error
|
UpdateVirtualNetwork(id uuid.UUID, updates UpdateVirtualNetwork) error
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,9 +80,16 @@ func (r *RESTClient) ListVirtualNetworks(filter *VnetFilter) ([]*VirtualNetwork,
|
||||||
return nil, r.statusCodeToError("list virtual networks", resp)
|
return nil, r.statusCodeToError("list virtual networks", resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RESTClient) DeleteVirtualNetwork(id uuid.UUID) error {
|
func (r *RESTClient) DeleteVirtualNetwork(id uuid.UUID, force bool) error {
|
||||||
endpoint := r.baseEndpoints.accountVnets
|
endpoint := r.baseEndpoints.accountVnets
|
||||||
endpoint.Path = path.Join(endpoint.Path, url.PathEscape(id.String()))
|
endpoint.Path = path.Join(endpoint.Path, url.PathEscape(id.String()))
|
||||||
|
|
||||||
|
queryParams := url.Values{}
|
||||||
|
if force {
|
||||||
|
queryParams.Set("force", strconv.FormatBool(force))
|
||||||
|
}
|
||||||
|
endpoint.RawQuery = queryParams.Encode()
|
||||||
|
|
||||||
resp, err := r.sendRequest("DELETE", endpoint, nil)
|
resp, err := r.sendRequest("DELETE", endpoint, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "REST request failed")
|
return errors.Wrap(err, "REST request failed")
|
||||||
|
|
|
@ -23,12 +23,12 @@ func (sc *subcommandContext) listVirtualNetworks(filter *cfapi.VnetFilter) ([]*c
|
||||||
return client.ListVirtualNetworks(filter)
|
return client.ListVirtualNetworks(filter)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *subcommandContext) deleteVirtualNetwork(vnetId uuid.UUID) error {
|
func (sc *subcommandContext) deleteVirtualNetwork(vnetId uuid.UUID, force bool) error {
|
||||||
client, err := sc.client()
|
client, err := sc.client()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, noClientMsg)
|
return errors.Wrap(err, noClientMsg)
|
||||||
}
|
}
|
||||||
return client.DeleteVirtualNetwork(vnetId)
|
return client.DeleteVirtualNetwork(vnetId, force)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sc *subcommandContext) updateVirtualNetwork(vnetId uuid.UUID, updates cfapi.UpdateVirtualNetwork) error {
|
func (sc *subcommandContext) updateVirtualNetwork(vnetId uuid.UUID, updates cfapi.UpdateVirtualNetwork) error {
|
||||||
|
|
|
@ -33,6 +33,12 @@ var (
|
||||||
Aliases: []string{"c"},
|
Aliases: []string{"c"},
|
||||||
Usage: "A new comment describing the purpose of the virtual network.",
|
Usage: "A new comment describing the purpose of the virtual network.",
|
||||||
}
|
}
|
||||||
|
vnetForceDeleteFlag = &cli.BoolFlag{
|
||||||
|
Name: "force",
|
||||||
|
Aliases: []string{"f"},
|
||||||
|
Usage: "Force the deletion of the virtual network even if it is being relied upon by other resources. Those" +
|
||||||
|
"resources will either be deleted (e.g. IP Routes) or moved to the current default virutal network.",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func buildVirtualNetworkSubcommand(hidden bool) *cli.Command {
|
func buildVirtualNetworkSubcommand(hidden bool) *cli.Command {
|
||||||
|
@ -82,6 +88,7 @@ be the current default.`,
|
||||||
UsageText: "cloudflared tunnel [--config FILEPATH] network delete VIRTUAL_NETWORK",
|
UsageText: "cloudflared tunnel [--config FILEPATH] network delete VIRTUAL_NETWORK",
|
||||||
Description: `Deletes the virtual network (given its ID or name). This is only possible if that virtual network is unused.
|
Description: `Deletes the virtual network (given its ID or name). This is only possible if that virtual network is unused.
|
||||||
A virtual network may be used by IP routes or by WARP devices.`,
|
A virtual network may be used by IP routes or by WARP devices.`,
|
||||||
|
Flags: []cli.Flag{vnetForceDeleteFlag},
|
||||||
Hidden: hidden,
|
Hidden: hidden,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -188,7 +195,7 @@ func deleteVirtualNetworkCommand(c *cli.Context) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if c.NArg() != 1 {
|
if c.NArg() < 1 {
|
||||||
return errors.New("You must supply exactly one argument, either the ID or name of the virtual network to delete")
|
return errors.New("You must supply exactly one argument, either the ID or name of the virtual network to delete")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +205,12 @@ func deleteVirtualNetworkCommand(c *cli.Context) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := sc.deleteVirtualNetwork(vnetId); err != nil {
|
forceDelete := false
|
||||||
|
if c.IsSet(vnetForceDeleteFlag.Name) {
|
||||||
|
forceDelete = c.Bool(vnetForceDeleteFlag.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := sc.deleteVirtualNetwork(vnetId, forceDelete); err != nil {
|
||||||
return errors.Wrap(err, "API error")
|
return errors.Wrap(err, "API error")
|
||||||
}
|
}
|
||||||
fmt.Printf("Successfully deleted virtual network '%s'\n", input)
|
fmt.Printf("Successfully deleted virtual network '%s'\n", input)
|
||||||
|
|
Loading…
Reference in New Issue