From b22ee71258dc877dc6f2fa2aaff28cb36753ca37 Mon Sep 17 00:00:00 2001 From: Morteza Date: Sat, 2 May 2020 05:14:14 +0430 Subject: [PATCH] kubens: add force option for ns switch --- cmd/kubens/flags.go | 19 +++++++++++++++---- cmd/kubens/flags_test.go | 10 ++++++++-- cmd/kubens/fzf.go | 2 +- cmd/kubens/switch.go | 21 ++++++++++++--------- 4 files changed, 36 insertions(+), 16 deletions(-) diff --git a/cmd/kubens/flags.go b/cmd/kubens/flags.go index 8e0ad3dc..d796a1e0 100644 --- a/cmd/kubens/flags.go +++ b/cmd/kubens/flags.go @@ -25,8 +25,10 @@ func parseArgs(argv []string) Op { } return ListOp{} } - - if len(argv) == 1 { + var isForceSwitch bool + isForceSwitch = false + ArgsLen := len(argv) + if ArgsLen == 1 || ArgsLen == 2 { v := argv[0] if v == "--help" || v == "-h" { return HelpOp{} @@ -34,10 +36,19 @@ func parseArgs(argv []string) Op { if v == "--current" || v == "-c" { return CurrentOp{} } - if strings.HasPrefix(v, "-") && v != "-" { + if v == "--force" || v == "-f" { + isForceSwitch = true + } + if strings.HasPrefix(v, "-") && v != "-" && !isForceSwitch { return UnsupportedOp{Err: fmt.Errorf("unsupported option '%s'", v)} } - return SwitchOp{Target: argv[0]} + if isForceSwitch { + if ArgsLen == 1 { + return UnsupportedOp{Err: fmt.Errorf("force option needs namespace name")} + } + return SwitchOp{Target: argv[1], IsForce: isForceSwitch} + } + return SwitchOp{Target: argv[0], IsForce: isForceSwitch} } return UnsupportedOp{Err: fmt.Errorf("too many arguments")} } diff --git a/cmd/kubens/flags_test.go b/cmd/kubens/flags_test.go index 5b75d55c..13c4dc0d 100644 --- a/cmd/kubens/flags_test.go +++ b/cmd/kubens/flags_test.go @@ -33,10 +33,16 @@ func Test_parseArgs_new(t *testing.T) { want: CurrentOp{}}, {name: "switch by name", args: []string{"foo"}, - want: SwitchOp{Target: "foo"}}, + want: SwitchOp{Target: "foo", IsForce: false}}, {name: "switch by swap", args: []string{"-"}, - want: SwitchOp{Target: "-"}}, + want: SwitchOp{Target: "-", IsForce: false}}, + {name: "switch by name force", + args: []string{"-f", "foo"}, + want: SwitchOp{Target: "foo", IsForce: true}}, + {name: "switch by name force long form", + args: []string{"--force", "foo"}, + want: SwitchOp{Target: "foo", IsForce: true}}, {name: "unrecognized flag", args: []string{"-x"}, want: UnsupportedOp{Err: fmt.Errorf("unsupported option '-x'")}}, diff --git a/cmd/kubens/fzf.go b/cmd/kubens/fzf.go index 8446c627..7c051181 100644 --- a/cmd/kubens/fzf.go +++ b/cmd/kubens/fzf.go @@ -51,7 +51,7 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error { if choice == "" { return errors.New("you did not choose any of the options") } - name, err := switchNamespace(kc, choice) + name, err := switchNamespace(kc, choice, false) if err != nil { return errors.Wrap(err, "failed to switch namespace") } diff --git a/cmd/kubens/switch.go b/cmd/kubens/switch.go index 71bf729d..23dba3b5 100644 --- a/cmd/kubens/switch.go +++ b/cmd/kubens/switch.go @@ -11,7 +11,8 @@ import ( ) type SwitchOp struct { - Target string // '-' for back and forth, or NAME + Target string // '-' for back and forth, or NAME + IsForce bool } func (s SwitchOp) Run(_, stderr io.Writer) error { @@ -21,7 +22,7 @@ func (s SwitchOp) Run(_, stderr io.Writer) error { return errors.Wrap(err, "kubeconfig error") } - toNS, err := switchNamespace(kc, s.Target) + toNS, err := switchNamespace(kc, s.Target, s.IsForce) if err != nil { return err } @@ -29,7 +30,7 @@ func (s SwitchOp) Run(_, stderr io.Writer) error { return err } -func switchNamespace(kc *kubeconfig.Kubeconfig, ns string) (string, error) { +func switchNamespace(kc *kubeconfig.Kubeconfig, ns string, isForce bool) (string, error) { ctx := kc.GetCurrentContext() if ctx == "" { return "", errors.New("current-context is not set") @@ -52,12 +53,14 @@ func switchNamespace(kc *kubeconfig.Kubeconfig, ns string) (string, error) { ns = prev } - ok, err := namespaceExists(kc, ns) - if err != nil { - return "", errors.Wrap(err, "failed to query if namespace exists (is cluster accessible?)") - } - if !ok { - return "", errors.Errorf("no namespace exists with name %q", ns) + if !isForce { + ok, err := namespaceExists(kc, ns) + if err != nil { + return "", errors.Wrap(err, "failed to query if namespace exists (is cluster accessible?)") + } + if !ok { + return "", errors.Errorf("no namespace exists with name %q", ns) + } } if err := kc.SetNamespace(ctx, ns); err != nil {