From 4f4a0418f9275801fe726158ebaff6be000c5d70 Mon Sep 17 00:00:00 2001 From: Joffrey Date: Fri, 28 Feb 2025 15:01:45 +0100 Subject: [PATCH 1/4] feat(kubens): add unset option --- cmd/kubens/flags.go | 2 ++ cmd/kubens/flags_test.go | 6 +++++ cmd/kubens/help.go | 3 ++- cmd/kubens/unset.go | 58 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 cmd/kubens/unset.go diff --git a/cmd/kubens/flags.go b/cmd/kubens/flags.go index 030889c..4571d2a 100644 --- a/cmd/kubens/flags.go +++ b/cmd/kubens/flags.go @@ -52,6 +52,8 @@ func parseArgs(argv []string) Op { return VersionOp{} case "--current", "-c": return CurrentOp{} + case "--unset", "-u": + return UnsetOp{} default: return getSwitchOp(v, false) } diff --git a/cmd/kubens/flags_test.go b/cmd/kubens/flags_test.go index 19102a1..fd17399 100644 --- a/cmd/kubens/flags_test.go +++ b/cmd/kubens/flags_test.go @@ -45,6 +45,12 @@ func Test_parseArgs_new(t *testing.T) { {name: "current long form", args: []string{"--current"}, want: CurrentOp{}}, + {name: "unset shorthand", + args: []string{"-u"}, + want: UnsetOp{}}, + {name: "unset long form", + args: []string{"--unset"}, + want: UnsetOp{}}, {name: "switch by name", args: []string{"foo"}, want: SwitchOp{Target: "foo"}}, diff --git a/cmd/kubens/help.go b/cmd/kubens/help.go index 027d333..2be8bd4 100644 --- a/cmd/kubens/help.go +++ b/cmd/kubens/help.go @@ -39,7 +39,8 @@ func printUsage(out io.Writer) error { %PROG% - : switch to the previous namespace in this context %PROG% -c, --current : show the current namespace %PROG% -h,--help : show this message - %PROG% -V,--version : show version` + %PROG% -V,--version : show version + %PROG% -u,--unset : unset the current context` // TODO this replace logic is duplicated between this and kubectx help = strings.ReplaceAll(help, "%PROG%", selfName()) diff --git a/cmd/kubens/unset.go b/cmd/kubens/unset.go new file mode 100644 index 0000000..4053655 --- /dev/null +++ b/cmd/kubens/unset.go @@ -0,0 +1,58 @@ +// Copyright 2021 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "io" + + "github.com/pkg/errors" + + "github.com/ahmetb/kubectx/internal/kubeconfig" + "github.com/ahmetb/kubectx/internal/printer" +) + +// UnsetOp indicates intention to remove current-context preference. +type UnsetOp struct{} + +func (_ UnsetOp) Run(_, stderr io.Writer) error { + kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader) + defer kc.Close() + if err := kc.Parse(); err != nil { + return errors.Wrap(err, "kubeconfig error") + } + + _, err := clearNamespace(kc) + if err != nil { + return err + } + err = printer.Success(stderr, "Active namespace unset for kubens.") + return err +} + +func clearNamespace(kc *kubeconfig.Kubeconfig) (string, error) { + ctx := kc.GetCurrentContext() + ns := "" + if ctx == "" { + return "", errors.New("current-context is not set") + } + + if err := kc.SetNamespace(ctx, ns); err != nil { + return "", errors.Wrapf(err, "failed to clear namespace") + } + if err := kc.Save(); err != nil { + return "", errors.Wrap(err, "failed to save kubeconfig file") + } + return ns, nil +} From d0ed9c007e38687d8f2c96e05a82b3ccd8fff9bd Mon Sep 17 00:00:00 2001 From: Joffrey Date: Fri, 28 Feb 2025 15:03:42 +0100 Subject: [PATCH 2/4] fix help line --- cmd/kubens/help.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/kubens/help.go b/cmd/kubens/help.go index 2be8bd4..d8e34e3 100644 --- a/cmd/kubens/help.go +++ b/cmd/kubens/help.go @@ -40,7 +40,7 @@ func printUsage(out io.Writer) error { %PROG% -c, --current : show the current namespace %PROG% -h,--help : show this message %PROG% -V,--version : show version - %PROG% -u,--unset : unset the current context` + %PROG% -u,--unset : unset the current context` // TODO this replace logic is duplicated between this and kubectx help = strings.ReplaceAll(help, "%PROG%", selfName()) From 66df17e94b12f01a44011c5128bbbb67cac0eed0 Mon Sep 17 00:00:00 2001 From: Joffrey Date: Fri, 28 Feb 2025 15:05:04 +0100 Subject: [PATCH 3/4] fix comment --- cmd/kubens/unset.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/kubens/unset.go b/cmd/kubens/unset.go index 4053655..9bb51f1 100644 --- a/cmd/kubens/unset.go +++ b/cmd/kubens/unset.go @@ -23,7 +23,7 @@ import ( "github.com/ahmetb/kubectx/internal/printer" ) -// UnsetOp indicates intention to remove current-context preference. +// UnsetOp indicates intention to remove current namespace preference. type UnsetOp struct{} func (_ UnsetOp) Run(_, stderr io.Writer) error { From c20ebf38a026372cc0c4ddd122ef539bbfae8ed5 Mon Sep 17 00:00:00 2001 From: Joffrey Date: Fri, 28 Feb 2025 15:16:38 +0100 Subject: [PATCH 4/4] explicit clear ns --- cmd/kubens/unset.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/kubens/unset.go b/cmd/kubens/unset.go index 9bb51f1..c2d4b16 100644 --- a/cmd/kubens/unset.go +++ b/cmd/kubens/unset.go @@ -43,7 +43,7 @@ func (_ UnsetOp) Run(_, stderr io.Writer) error { func clearNamespace(kc *kubeconfig.Kubeconfig) (string, error) { ctx := kc.GetCurrentContext() - ns := "" + ns := "default" if ctx == "" { return "", errors.New("current-context is not set") }