diff --git a/cmd/node/nodeDelete.go b/cmd/node/nodeDelete.go index e722ec95..d607c7e2 100644 --- a/cmd/node/nodeDelete.go +++ b/cmd/node/nodeDelete.go @@ -30,25 +30,37 @@ import ( "github.com/spf13/cobra" ) +type nodeDeleteFlags struct { + All bool + IncludeRegistries bool +} + // NewCmdNodeDelete returns a new cobra command func NewCmdNodeDelete() *cobra.Command { + flags := nodeDeleteFlags{} + // create new cobra command cmd := &cobra.Command{ Use: "delete (NAME | --all)", Short: "Delete node(s).", Long: `Delete node(s).`, - Args: cobra.MinimumNArgs(1), // at least one node has to be specified ValidArgsFunction: util.ValidArgsAvailableNodes, Run: func(cmd *cobra.Command, args []string) { - nodes := parseDeleteNodeCmd(cmd, args) + nodes := parseDeleteNodeCmd(cmd, args, &flags) + nodeDeleteOpts := k3d.NodeDeleteOpts{ + SkipRegistryCheck: true, + } + if flags.All { + nodeDeleteOpts.SkipLBUpdate = true + } if len(nodes) == 0 { log.Infoln("No nodes found") } else { for _, node := range nodes { - if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node, k3d.NodeDeleteOpts{SkipRegistryCheck: true}); err != nil { + if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node, nodeDeleteOpts); err != nil { log.Fatalln(err) } } @@ -59,30 +71,38 @@ func NewCmdNodeDelete() *cobra.Command { // add subcommands // add flags - cmd.Flags().BoolP("all", "a", false, "Delete all existing nodes") + cmd.Flags().BoolVarP(&flags.All, "all", "a", false, "Delete all existing nodes") + cmd.Flags().BoolVarP(&flags.IncludeRegistries, "registries", "r", false, "Also delete registries") // done return cmd } // parseDeleteNodeCmd parses the command input into variables required to delete nodes -func parseDeleteNodeCmd(cmd *cobra.Command, args []string) []*k3d.Node { +func parseDeleteNodeCmd(cmd *cobra.Command, args []string, flags *nodeDeleteFlags) []*k3d.Node { - // --all var nodes []*k3d.Node + var err error - if all, err := cmd.Flags().GetBool("all"); err != nil { - log.Fatalln(err) - } else if all { + // --all + if flags.All { + if !flags.IncludeRegistries { + log.Infoln("Didn't set '--registries', so won't delete registries.") + } nodes, err = client.NodeList(cmd.Context(), runtimes.SelectedRuntime) if err != nil { log.Fatalln(err) } - nodes = client.NodeFilterByRoles(nodes, k3d.ClusterInternalNodeRoles, k3d.ClusterInternalNodeRoles) + include := k3d.ClusterInternalNodeRoles + exclude := []k3d.Role{} + if flags.IncludeRegistries { + include = append(include, k3d.RegistryRole) + } + nodes = client.NodeFilterByRoles(nodes, include, exclude) return nodes } - if len(args) < 1 { + if !flags.All && len(args) < 1 { log.Fatalln("Expecting at least one node name if `--all` is not set") } diff --git a/cmd/registry/registryDelete.go b/cmd/registry/registryDelete.go index 6b259d60..1fc18fcc 100644 --- a/cmd/registry/registryDelete.go +++ b/cmd/registry/registryDelete.go @@ -30,25 +30,30 @@ import ( "github.com/spf13/cobra" ) +type registryDeleteFlags struct { + All bool +} + // NewCmdRegistryDelete returns a new cobra command func NewCmdRegistryDelete() *cobra.Command { + flags := registryDeleteFlags{} + // create new cobra command cmd := &cobra.Command{ Use: "delete (NAME | --all)", Short: "Delete registry/registries.", Long: `Delete registry/registries.`, - Args: cobra.MinimumNArgs(1), // at least one node has to be specified ValidArgsFunction: util.ValidArgsAvailableRegistries, Run: func(cmd *cobra.Command, args []string) { - nodes := parseRegistryDeleteCmd(cmd, args) + nodes := parseRegistryDeleteCmd(cmd, args, &flags) if len(nodes) == 0 { - log.Infoln("No nodes found") + log.Infoln("No registries found") } else { for _, node := range nodes { - if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node, k3d.NodeDeleteOpts{SkipLBUpdate: true}); err != nil { + if err := client.NodeDelete(cmd.Context(), runtimes.SelectedRuntime, node, k3d.NodeDeleteOpts{SkipLBUpdate: true, SkipRegistryCheck: true}); err != nil { log.Fatalln(err) } } @@ -59,29 +64,26 @@ func NewCmdRegistryDelete() *cobra.Command { // add subcommands // add flags - cmd.Flags().BoolP("all", "a", false, "Delete all existing registries") + cmd.Flags().BoolVarP(&flags.All, "all", "a", false, "Delete all existing registries") // done return cmd } // parseRegistryDeleteCmd parses the command input into variables required to delete nodes -func parseRegistryDeleteCmd(cmd *cobra.Command, args []string) []*k3d.Node { +func parseRegistryDeleteCmd(cmd *cobra.Command, args []string, flags *registryDeleteFlags) []*k3d.Node { - // --all var nodes []*k3d.Node + var err error - if all, err := cmd.Flags().GetBool("all"); err != nil { - log.Fatalln(err) - } else if all { + if flags.All { nodes, err = client.NodeList(cmd.Context(), runtimes.SelectedRuntime) if err != nil { log.Fatalln(err) } - return nodes } - if len(args) < 1 { + if !flags.All && len(args) < 1 { log.Fatalln("Expecting at least one registry name if `--all` is not set") } @@ -93,5 +95,7 @@ func parseRegistryDeleteCmd(cmd *cobra.Command, args []string) []*k3d.Node { nodes = append(nodes, node) } + nodes = client.NodeFilterByRoles(nodes, []k3d.Role{k3d.RegistryRole}, []k3d.Role{}) + return nodes } diff --git a/docs/usage/commands.md b/docs/usage/commands.md index b14b847a..0ba2c80a 100644 --- a/docs/usage/commands.md +++ b/docs/usage/commands.md @@ -77,6 +77,7 @@ k3d stop NODENAME # stop a node delete NODENAME # delete an existing node -a, --all # delete all existing nodes (default: false) + -r, --registries # also delete registries, as a special type of node (default: false) list NODENAME --no-headers # do not print headers (default: false) registry diff --git a/pkg/client/node.go b/pkg/client/node.go index ac5676b6..58f35b54 100644 --- a/pkg/client/node.go +++ b/pkg/client/node.go @@ -442,5 +442,8 @@ nodeLoop: } } } + + log.Tracef("Filteres %d nodes by roles (in: %+v | ex: %+v), got %d left", len(nodes), includeRoles, excludeRoles, len(resultList)) + return resultList }