Skip to content

Commit

Permalink
kubernetes: support passing associated resource names for selective c…
Browse files Browse the repository at this point in the history
…luster deletion
  • Loading branch information
varshavaradarajan committed Jan 19, 2021
1 parent 0492aea commit 0ff3cb6
Show file tree
Hide file tree
Showing 2 changed files with 113 additions and 44 deletions.
155 changes: 112 additions & 43 deletions commands/kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -73,11 +73,11 @@ func defaultGetCurrentAuthContextFn() string {
}

func errNoClusterByName(name string) error {
return fmt.Errorf("No cluster goes by the name %q", name)
return fmt.Errorf("no cluster goes by the name %q", name)
}

func errAmbigousClusterName(name string, ids []string) error {
return fmt.Errorf("Many clusters go by the name %q, they have the following IDs: %v", name, ids)
return fmt.Errorf("many clusters go by the name %q, they have the following IDs: %v", name, ids)
}

func errNoPoolByName(name string) error {
Expand Down Expand Up @@ -346,25 +346,25 @@ This command deletes the specified Kubernetes clusters and the Droplets associat
"Boolean indicating whether to delete the cluster's associated resources like load balancers, volumes and volume snapshots")

cmdKubeClusterDeleteSelective := CmdBuilder(cmd, k8sCmdService.RunKubernetesClusterDeleteSelective,
"delete-selective <id|name>", "Delete Kubernetes clusters ", `
This command deletes the specified Kubernetes clusters and the Droplets associated with them. To delete all other DigitalOcean resources created during the operation of the clusters, such as load balancers, volumes or volume snapshots, use the --dangerous flag.
"delete-selective <id|name>", "Delete a Kubernetes cluster and selectively delete resources associated with it", `
This command deletes the specified Kubernetes cluster and it's droplets. Along with that, this command deletes the specified associated resources. The associated resources supported for selective deletion are load balancers, volumes and volume snapshots.
`, Writer, aliasOpt("ds"))
AddBoolFlag(cmdKubeClusterDeleteSelective, doctl.ArgForce, doctl.ArgShortForce, false,
"Boolean indicating whether to delete the cluster without a confirmation prompt")
AddBoolFlag(cmdKubeClusterDeleteSelective, doctl.ArgClusterUpdateKubeconfig, "", true,
"Boolean indicating whether to remove the deleted cluster from your kubeconfig")
AddStringSliceFlag(cmdKubeClusterDeleteSelective, doctl.ArgVolumeList, "", nil,
"list of volume ids for deletion")
"Comma-separated list of volume ids or names for deletion")
AddStringSliceFlag(cmdKubeClusterDeleteSelective, doctl.ArgVolumeSnapshotList, "", nil,
"list of volume snapshot ids for deletion")
"Comma-separated list of volume snapshot ids or names for deletion")
AddStringSliceFlag(cmdKubeClusterDeleteSelective, doctl.ArgLoadBalancerList, "", nil,
"list of load balancer ids for deletion")
"Comma-separated list of load balancer ids or names for deletion")

CmdBuilder(cmd, k8sCmdService.RunKubernetesClusterListAssociatedResources, "list_associated_resources <id|name>", "Retrieve DigitalOcean resources associated with a Kubernetes cluster", `
CmdBuilder(cmd, k8sCmdService.RunKubernetesClusterListAssociatedResources, "list-associated-resources <id|name>", "Retrieve DigitalOcean resources associated with a Kubernetes cluster", `
This command retrieves the following details :
- Volume ids for volumes created by the DigitalOcean CSI driver
- Volume snapshot ids for volume snapshots created by the DigitalOcean CSI driver.
- Load balancer ids for load balancers managed by the KubernetesCluster.`,
- Load balancer ids for load balancers managed by the Kubernetes cluster.`,
Writer, aliasOpt("ar"), displayerType(&displayers.KubernetesAssociatedResources{}))

return cmd
Expand Down Expand Up @@ -630,7 +630,7 @@ func (s *KubernetesCommandService) RunKubernetesClusterGetUpgrades(c *CmdConfig)
return err
}
clusterIDorName := c.Args[0]
clusterID, err := clusterIDize(c.Kubernetes(), clusterIDorName)
clusterID, err := clusterIDize(c, clusterIDorName)
if err != nil {
return err
}
Expand Down Expand Up @@ -723,7 +723,7 @@ func (s *KubernetesCommandService) RunKubernetesClusterUpdate(c *CmdConfig) erro
return err
}
clusterIDorName := c.Args[0]
clusterID, err := clusterIDize(c.Kubernetes(), clusterIDorName)
clusterID, err := clusterIDize(c, clusterIDorName)
if err != nil {
return err
}
Expand Down Expand Up @@ -777,7 +777,7 @@ func (s *KubernetesCommandService) RunKubernetesClusterUpgrade(c *CmdConfig) err
if len(c.Args) == 0 {
return doctl.NewMissingArgsErr(c.NS)
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand Down Expand Up @@ -892,7 +892,7 @@ func (s *KubernetesCommandService) RunKubernetesClusterDelete(c *CmdConfig) erro
kube := c.Kubernetes()

for _, cluster := range c.Args {
clusterID, err := clusterIDize(c.Kubernetes(), cluster)
clusterID, err := clusterIDize(c, cluster)
if err != nil {
return err
}
Expand Down Expand Up @@ -940,7 +940,7 @@ func (s *KubernetesCommandService) RunKubernetesClusterDeleteSelective(c *CmdCon
}
clusterIDorName := c.Args[0]

clusterID, err := clusterIDize(c.Kubernetes(), clusterIDorName)
clusterID, err := clusterIDize(c, clusterIDorName)
if err != nil {
return err
}
Expand Down Expand Up @@ -989,10 +989,33 @@ func (s *KubernetesCommandService) RunKubernetesClusterDeleteSelective(c *CmdCon
}
}

var volIDs, snapshotIDs, lbIDs []string
for _, v := range volumes {
volumeID, err := iDize(c, v, "volume")
if err != nil {
return err
}
volIDs = append(volIDs, volumeID)
}
for _, s := range volSnapshots {
snapID, err := iDize(c, s, "volume_snapshot")
if err != nil {
return err
}
snapshotIDs = append(snapshotIDs, snapID)
}
for _, l := range loadBalancers {
lbID, err := iDize(c, l, "load_balancer")
if err != nil {
return err
}
lbIDs = append(lbIDs, lbID)
}

r := new(godo.KubernetesClusterDeleteSelectiveRequest)
r.Volumes = volumes
r.VolumeSnapshots = volSnapshots
r.LoadBalancers = loadBalancers
r.Volumes = volIDs
r.VolumeSnapshots = snapshotIDs
r.LoadBalancers = lbIDs


err = kube.DeleteSelective(clusterID, r)
Expand All @@ -1017,7 +1040,7 @@ func (s *KubernetesCommandService) RunKubernetesClusterListAssociatedResources(c
}
clusterIDorName := c.Args[0]

clusterID, err := clusterIDize(c.Kubernetes(), clusterIDorName)
clusterID, err := clusterIDize(c, clusterIDorName)
if err != nil {
return err
}
Expand Down Expand Up @@ -1045,7 +1068,7 @@ func (s *KubernetesCommandService) RunKubernetesKubeconfigShow(c *CmdConfig) err
}

kube := c.Kubernetes()
clusterID, err := clusterIDize(kube, c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand Down Expand Up @@ -1196,7 +1219,7 @@ func (s *KubernetesCommandService) RunKubernetesKubeconfigSave(c *CmdConfig) err
}

kube := c.Kubernetes()
clusterID, err := clusterIDize(kube, c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand Down Expand Up @@ -1227,7 +1250,7 @@ func (s *KubernetesCommandService) RunKubernetesKubeconfigRemove(c *CmdConfig) e
return err
}
kube := c.Kubernetes()
clusterID, err := clusterIDize(kube, c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand All @@ -1246,7 +1269,7 @@ func (s *KubernetesCommandService) RunKubernetesNodePoolGet(c *CmdConfig) error
if len(c.Args) != 2 {
return doctl.NewMissingArgsErr(c.NS)
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand All @@ -1263,7 +1286,7 @@ func (s *KubernetesCommandService) RunKubernetesNodePoolList(c *CmdConfig) error
if err != nil {
return err
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand All @@ -1282,7 +1305,7 @@ func (s *KubernetesCommandService) RunKubernetesNodePoolCreate(c *CmdConfig) err
if err != nil {
return err
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand All @@ -1306,7 +1329,7 @@ func (s *KubernetesCommandService) RunKubernetesNodePoolUpdate(c *CmdConfig) err
if len(c.Args) != 2 {
return doctl.NewMissingArgsErr(c.NS)
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand Down Expand Up @@ -1334,7 +1357,7 @@ func (s *KubernetesCommandService) RunKubernetesNodePoolRecycle(c *CmdConfig) er
if len(c.Args) != 2 {
return doctl.NewMissingArgsErr(c.NS)
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand All @@ -1357,7 +1380,7 @@ func (s *KubernetesCommandService) RunKubernetesNodePoolDelete(c *CmdConfig) err
if len(c.Args) != 2 {
return doctl.NewMissingArgsErr(c.NS)
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand Down Expand Up @@ -1395,7 +1418,7 @@ func kubernetesNodeDelete(replace bool, c *CmdConfig) error {
if len(c.Args) != 3 {
return doctl.NewMissingArgsErr(c.NS)
}
clusterID, err := clusterIDize(c.Kubernetes(), c.Args[0])
clusterID, err := clusterIDize(c, c.Args[0])
if err != nil {
return err
}
Expand Down Expand Up @@ -1470,7 +1493,7 @@ func (s *KubernetesCommandService) RunKubernetesRegistryAdd(c *CmdConfig) error
}
var clusterUUIDs []string
for _, arg := range c.Args {
clusterID, err := clusterIDize(c.Kubernetes(), arg)
clusterID, err := clusterIDize(c, arg)
if err != nil {
return err
}
Expand All @@ -1489,7 +1512,7 @@ func (s *KubernetesCommandService) RunKubernetesRegistryRemove(c *CmdConfig) err
}
var clusterUUIDs []string
for _, arg := range c.Args {
clusterID, err := clusterIDize(c.Kubernetes(), arg)
clusterID, err := clusterIDize(c, arg)
if err != nil {
return err
}
Expand Down Expand Up @@ -2058,26 +2081,72 @@ func clusterByIDorName(kube do.KubernetesService, idOrName string) (*do.Kubernet
// clusterIDize attempts to make a cluster ID/name string be a cluster ID.
// use this as opposed to `clusterByIDorName` if you just care about getting
// a cluster ID and don't need the cluster object itself
func clusterIDize(kube do.KubernetesService, idOrName string) (string, error) {
if looksLikeUUID(idOrName) {
return idOrName, nil
}
clusters, err := kube.List()
if err != nil {
return "", err
func clusterIDize(c *CmdConfig, idOrName string) (string, error) {
return iDize(c, idOrName, "cluster")
}

// iDize attempts to make a resource ID/name string be a resource ID.
// use this if you just care about getting a resource ID and don't need the object itself
func iDize(c *CmdConfig, resourceIDOrName string, resType string) (string, error) {
if looksLikeUUID(resourceIDOrName) {
return resourceIDOrName, nil
}
var ids []string
for _, c := range clusters {
if c.Name == idOrName {
id := c.ID
ids = append(ids, id)

switch resType {
case "volume":
volumes, err := c.Volumes().List()
if err != nil {
return "", err
}

for _, v := range volumes {
if v.Name == resourceIDOrName {
id := v.ID
ids = append(ids, id)
}
}
case "volume_snapshot":
volSnapshots, err := c.Snapshots().ListVolume()
if err != nil {
return "", err
}

for _, v := range volSnapshots {
if v.Name == resourceIDOrName {
id := v.ID
ids = append(ids, id)
}
}
case "load_balancer":
loadBalancers, err := c.LoadBalancers().List()
if err != nil {
return "", err
}
for _, l := range loadBalancers {
if l.Name == resourceIDOrName {
id := l.ID
ids = append(ids, id)
}
}
case "cluster":
clusters, err := c.Kubernetes().List()
if err != nil {
return "", err
}
for _, c := range clusters {
if c.Name == resourceIDOrName {
id := c.ID
ids = append(ids, id)
}
}
}

switch {
case len(ids) == 0:
return "", errNoClusterByName(idOrName)
return "", fmt.Errorf("no %s goes by the name %q", resType, resourceIDOrName)
case len(ids) > 1:
return "", errAmbigousClusterName(idOrName, ids)
return "", fmt.Errorf("many %ss go by the name %q, they have the following IDs: %v", resType, resourceIDOrName, ids)
default:
if len(ids) != 1 {
panic("The default case should always have len(ids) == 1.")
Expand Down
2 changes: 1 addition & 1 deletion commands/kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ func TestKubernetesClusterCommand(t *testing.T) {
"node-pool",
"registry",
"delete-selective",
"list_associated_resources",
"list-associated-resources",
)
}

Expand Down

0 comments on commit 0ff3cb6

Please sign in to comment.