mirror of
https://github.com/ahmetb/kubectx.git
synced 2025-06-25 15:02:21 +00:00
Merge 33dd56a0d5
into 013b6bc252
This commit is contained in:
commit
857521673c
@ -15,11 +15,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -30,7 +29,7 @@ func (_op CurrentOp) Run(stdout, _ io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
v := kc.GetCurrentContext()
|
v := kc.GetCurrentContext()
|
||||||
@ -38,5 +37,8 @@ func (_op CurrentOp) Run(stdout, _ io.Writer) error {
|
|||||||
return errors.New("current-context is not set")
|
return errors.New("current-context is not set")
|
||||||
}
|
}
|
||||||
_, err := fmt.Fprintln(stdout, v)
|
_, err := fmt.Fprintln(stdout, v)
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
)
|
)
|
||||||
@ -34,7 +34,7 @@ func (op DeleteOp) Run(_, stderr io.Writer) error {
|
|||||||
// TODO inefficiency here. we open/write/close the same file many times.
|
// TODO inefficiency here. we open/write/close the same file many times.
|
||||||
deletedName, wasActiveContext, err := deleteContext(ctx)
|
deletedName, wasActiveContext, err := deleteContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error deleting context \"%s\"", deletedName)
|
return fmt.Errorf("error deleting context \"%s\": %w", deletedName, err)
|
||||||
}
|
}
|
||||||
if wasActiveContext {
|
if wasActiveContext {
|
||||||
printer.Warning(stderr, "You deleted the current context. Use \"%s\" to select a new context.",
|
printer.Warning(stderr, "You deleted the current context. Use \"%s\" to select a new context.",
|
||||||
@ -52,7 +52,7 @@ func deleteContext(name string) (deleteName string, wasActiveContext bool, err e
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return deleteName, false, errors.Wrap(err, "kubeconfig error")
|
return deleteName, false, fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cur := kc.GetCurrentContext()
|
cur := kc.GetCurrentContext()
|
||||||
@ -70,7 +70,7 @@ func deleteContext(name string) (deleteName string, wasActiveContext bool, err e
|
|||||||
}
|
}
|
||||||
|
|
||||||
if err := kc.DeleteContextEntry(name); err != nil {
|
if err := kc.DeleteContextEntry(name); err != nil {
|
||||||
return name, false, errors.Wrap(err, "failed to modify yaml doc")
|
return name, false, fmt.Errorf("failed to modify yaml doc: %w", err)
|
||||||
}
|
}
|
||||||
return name, wasActiveContext, errors.Wrap(kc.Save(), "failed to save modified kubeconfig file")
|
return name, wasActiveContext, fmt.Errorf("failed to save modified kubeconfig file: %w", kc.Save())
|
||||||
}
|
}
|
||||||
|
@ -16,15 +16,14 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/cmdutil"
|
|
||||||
"github.com/ahmetb/kubectx/internal/env"
|
"github.com/ahmetb/kubectx/internal/env"
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
@ -42,11 +41,11 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error {
|
|||||||
// parse kubeconfig just to see if it can be loaded
|
// parse kubeconfig just to see if it can be loaded
|
||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
if cmdutil.IsNotFoundErr(err) {
|
if errors.Is(err, fs.ErrNotExist) {
|
||||||
printer.Warning(stderr, "kubeconfig file not found")
|
printer.Warning(stderr, "kubeconfig file not found")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
kc.Close()
|
kc.Close()
|
||||||
|
|
||||||
@ -70,7 +69,7 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error {
|
|||||||
}
|
}
|
||||||
name, err := switchContext(choice)
|
name, err := switchContext(choice)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to switch context")
|
return fmt.Errorf("failed to switch context: %w", err)
|
||||||
}
|
}
|
||||||
printer.Success(stderr, "Switched to context \"%s\".", printer.SuccessColor.Sprint(name))
|
printer.Success(stderr, "Switched to context \"%s\".", printer.SuccessColor.Sprint(name))
|
||||||
return nil
|
return nil
|
||||||
@ -80,11 +79,11 @@ func (op InteractiveDeleteOp) Run(_, stderr io.Writer) error {
|
|||||||
// parse kubeconfig just to see if it can be loaded
|
// parse kubeconfig just to see if it can be loaded
|
||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
if cmdutil.IsNotFoundErr(err) {
|
if errors.Is(err, fs.ErrNotExist) {
|
||||||
printer.Warning(stderr, "kubeconfig file not found")
|
printer.Warning(stderr, "kubeconfig file not found")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
kc.Close()
|
kc.Close()
|
||||||
|
|
||||||
@ -114,7 +113,7 @@ func (op InteractiveDeleteOp) Run(_, stderr io.Writer) error {
|
|||||||
|
|
||||||
name, wasActiveContext, err := deleteContext(choice)
|
name, wasActiveContext, err := deleteContext(choice)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to delete context")
|
return fmt.Errorf("failed to delete context: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if wasActiveContext {
|
if wasActiveContext {
|
||||||
|
@ -20,8 +20,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// HelpOp describes printing help.
|
// HelpOp describes printing help.
|
||||||
@ -49,7 +47,10 @@ func printUsage(out io.Writer) error {
|
|||||||
help = strings.ReplaceAll(help, "%SPAC%", strings.Repeat(" ", len(selfName())))
|
help = strings.ReplaceAll(help, "%SPAC%", strings.Repeat(" ", len(selfName())))
|
||||||
|
|
||||||
_, err := fmt.Fprintf(out, "%s\n", help)
|
_, err := fmt.Fprintf(out, "%s\n", help)
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// selfName guesses how the user invoked the program.
|
// selfName guesses how the user invoked the program.
|
||||||
|
@ -15,13 +15,13 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/fs"
|
||||||
|
|
||||||
"facette.io/natsort"
|
"facette.io/natsort"
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/cmdutil"
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
)
|
)
|
||||||
@ -33,11 +33,11 @@ func (_ ListOp) Run(stdout, stderr io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
if cmdutil.IsNotFoundErr(err) {
|
if errors.Is(err, fs.ErrNotExist) {
|
||||||
printer.Warning(stderr, "kubeconfig file not found")
|
printer.Warning(stderr, "kubeconfig file not found")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctxs := kc.ContextNames()
|
ctxs := kc.ContextNames()
|
||||||
|
@ -15,11 +15,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
)
|
)
|
||||||
@ -51,7 +50,7 @@ func (op RenameOp) Run(_, stderr io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
cur := kc.GetCurrentContext()
|
cur := kc.GetCurrentContext()
|
||||||
@ -60,26 +59,26 @@ func (op RenameOp) Run(_, stderr io.Writer) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !kc.ContextExists(op.Old) {
|
if !kc.ContextExists(op.Old) {
|
||||||
return errors.Errorf("context \"%s\" not found, can't rename it", op.Old)
|
return fmt.Errorf("context \"%s\" not found, can't rename it", op.Old)
|
||||||
}
|
}
|
||||||
|
|
||||||
if kc.ContextExists(op.New) {
|
if kc.ContextExists(op.New) {
|
||||||
printer.Warning(stderr, "context \"%s\" exists, overwriting it.", op.New)
|
printer.Warning(stderr, "context \"%s\" exists, overwriting it.", op.New)
|
||||||
if err := kc.DeleteContextEntry(op.New); err != nil {
|
if err := kc.DeleteContextEntry(op.New); err != nil {
|
||||||
return errors.Wrap(err, "failed to delete new context to overwrite it")
|
return fmt.Errorf("failed to delete new context to overwrite it: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := kc.ModifyContextName(op.Old, op.New); err != nil {
|
if err := kc.ModifyContextName(op.Old, op.New); err != nil {
|
||||||
return errors.Wrap(err, "failed to change context name")
|
return fmt.Errorf("failed to change context name: %w", err)
|
||||||
}
|
}
|
||||||
if op.Old == cur {
|
if op.Old == cur {
|
||||||
if err := kc.ModifyCurrentContext(op.New); err != nil {
|
if err := kc.ModifyCurrentContext(op.New); err != nil {
|
||||||
return errors.Wrap(err, "failed to set current-context to new name")
|
return fmt.Errorf("failed to set current-context to new name: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := kc.Save(); err != nil {
|
if err := kc.Save(); err != nil {
|
||||||
return errors.Wrap(err, "failed to save modified kubeconfig")
|
return fmt.Errorf("failed to save modified kubeconfig: %w", err)
|
||||||
}
|
}
|
||||||
printer.Success(stderr, "Context %s renamed to %s.",
|
printer.Success(stderr, "Context %s renamed to %s.",
|
||||||
printer.SuccessColor.Sprint(op.Old),
|
printer.SuccessColor.Sprint(op.Old),
|
||||||
|
@ -15,12 +15,11 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/cmdutil"
|
"github.com/ahmetb/kubectx/internal/cmdutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -35,7 +34,7 @@ func kubectxPrevCtxFile() (string, error) {
|
|||||||
// readLastContext returns the saved previous context
|
// readLastContext returns the saved previous context
|
||||||
// if the state file exists, otherwise returns "".
|
// if the state file exists, otherwise returns "".
|
||||||
func readLastContext(path string) (string, error) {
|
func readLastContext(path string) (string, error) {
|
||||||
b, err := ioutil.ReadFile(path)
|
b, err := os.ReadFile(path)
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return "", nil
|
return "", nil
|
||||||
}
|
}
|
||||||
@ -47,7 +46,7 @@ func readLastContext(path string) (string, error) {
|
|||||||
func writeLastContext(path, value string) error {
|
func writeLastContext(path, value string) error {
|
||||||
dir := filepath.Dir(path)
|
dir := filepath.Dir(path)
|
||||||
if err := os.MkdirAll(dir, 0755); err != nil {
|
if err := os.MkdirAll(dir, 0755); err != nil {
|
||||||
return errors.Wrap(err, "failed to create parent directories")
|
return fmt.Errorf("failed to create parent directories: %w", err)
|
||||||
}
|
}
|
||||||
return ioutil.WriteFile(path, []byte(value), 0644)
|
return os.WriteFile(path, []byte(value), 0644)
|
||||||
}
|
}
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
)
|
)
|
||||||
@ -37,39 +37,42 @@ func (op SwitchOp) Run(_, stderr io.Writer) error {
|
|||||||
newCtx, err = switchContext(op.Target)
|
newCtx, err = switchContext(op.Target)
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to switch context")
|
return fmt.Errorf("failed to switch context: %w", err)
|
||||||
}
|
}
|
||||||
err = printer.Success(stderr, "Switched to context \"%s\".", printer.SuccessColor.Sprint(newCtx))
|
err = printer.Success(stderr, "Switched to context \"%s\".", printer.SuccessColor.Sprint(newCtx))
|
||||||
return errors.Wrap(err, "print error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("print error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// switchContext switches to specified context name.
|
// switchContext switches to specified context name.
|
||||||
func switchContext(name string) (string, error) {
|
func switchContext(name string) (string, error) {
|
||||||
prevCtxFile, err := kubectxPrevCtxFile()
|
prevCtxFile, err := kubectxPrevCtxFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "failed to determine state file")
|
return "", fmt.Errorf("failed to determine state file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return "", errors.Wrap(err, "kubeconfig error")
|
return "", fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
prev := kc.GetCurrentContext()
|
prev := kc.GetCurrentContext()
|
||||||
if !kc.ContextExists(name) {
|
if !kc.ContextExists(name) {
|
||||||
return "", errors.Errorf("no context exists with the name: \"%s\"", name)
|
return "", fmt.Errorf("no context exists with the name: \"%s\"", name)
|
||||||
}
|
}
|
||||||
if err := kc.ModifyCurrentContext(name); err != nil {
|
if err := kc.ModifyCurrentContext(name); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
if err := kc.Save(); err != nil {
|
if err := kc.Save(); err != nil {
|
||||||
return "", errors.Wrap(err, "failed to save kubeconfig")
|
return "", fmt.Errorf("failed to save kubeconfig: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if prev != name {
|
if prev != name {
|
||||||
if err := writeLastContext(prevCtxFile, prev); err != nil {
|
if err := writeLastContext(prevCtxFile, prev); err != nil {
|
||||||
return "", errors.Wrap(err, "failed to save previous context name")
|
return "", fmt.Errorf("failed to save previous context name: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return name, nil
|
return name, nil
|
||||||
@ -79,11 +82,11 @@ func switchContext(name string) (string, error) {
|
|||||||
func swapContext() (string, error) {
|
func swapContext() (string, error) {
|
||||||
prevCtxFile, err := kubectxPrevCtxFile()
|
prevCtxFile, err := kubectxPrevCtxFile()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "failed to determine state file")
|
return "", fmt.Errorf("failed to determine state file: %w", err)
|
||||||
}
|
}
|
||||||
prev, err := readLastContext(prevCtxFile)
|
prev, err := readLastContext(prevCtxFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "failed to read previous context file")
|
return "", fmt.Errorf("failed to read previous context file: %w", err)
|
||||||
}
|
}
|
||||||
if prev == "" {
|
if prev == "" {
|
||||||
return "", errors.New("no previous context found")
|
return "", errors.New("no previous context found")
|
||||||
|
@ -15,10 +15,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
)
|
)
|
||||||
@ -30,16 +29,19 @@ func (_ UnsetOp) Run(_, stderr io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := kc.UnsetCurrentContext(); err != nil {
|
if err := kc.UnsetCurrentContext(); err != nil {
|
||||||
return errors.Wrap(err, "error while modifying current-context")
|
return fmt.Errorf("error while modifying current-context: %w", err)
|
||||||
}
|
}
|
||||||
if err := kc.Save(); err != nil {
|
if err := kc.Save(); err != nil {
|
||||||
return errors.Wrap(err, "failed to save kubeconfig file after modification")
|
return fmt.Errorf("failed to save kubeconfig file after modification: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
err := printer.Success(stderr, "Active context unset for kubectl.")
|
err := printer.Success(stderr, "Active context unset for kubectl.")
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -16,5 +14,8 @@ type VersionOp struct{}
|
|||||||
|
|
||||||
func (_ VersionOp) Run(stdout, _ io.Writer) error {
|
func (_ VersionOp) Run(stdout, _ io.Writer) error {
|
||||||
_, err := fmt.Fprintf(stdout, "%s\n", version)
|
_, err := fmt.Fprintf(stdout, "%s\n", version)
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,10 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -29,7 +28,7 @@ func (c CurrentOp) Run(stdout, _ io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := kc.GetCurrentContext()
|
ctx := kc.GetCurrentContext()
|
||||||
@ -38,8 +37,11 @@ func (c CurrentOp) Run(stdout, _ io.Writer) error {
|
|||||||
}
|
}
|
||||||
ns, err := kc.NamespaceOfContext(ctx)
|
ns, err := kc.NamespaceOfContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "failed to read namespace of \"%s\"", ctx)
|
return fmt.Errorf("failed to read namespace of \"%s\", %w", ctx, err)
|
||||||
}
|
}
|
||||||
_, err = fmt.Fprintln(stdout, ns)
|
_, err = fmt.Fprintln(stdout, ns)
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -16,15 +16,14 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
|
|
||||||
"github.com/ahmetb/kubectx/internal/cmdutil"
|
|
||||||
"github.com/ahmetb/kubectx/internal/env"
|
"github.com/ahmetb/kubectx/internal/env"
|
||||||
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
"github.com/ahmetb/kubectx/internal/kubeconfig"
|
||||||
"github.com/ahmetb/kubectx/internal/printer"
|
"github.com/ahmetb/kubectx/internal/printer"
|
||||||
@ -39,11 +38,11 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error {
|
|||||||
// parse kubeconfig just to see if it can be loaded
|
// parse kubeconfig just to see if it can be loaded
|
||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
if cmdutil.IsNotFoundErr(err) {
|
if errors.Is(err, fs.ErrNotExist) {
|
||||||
printer.Warning(stderr, "kubeconfig file not found")
|
printer.Warning(stderr, "kubeconfig file not found")
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
|
|
||||||
@ -67,7 +66,7 @@ func (op InteractiveSwitchOp) Run(_, stderr io.Writer) error {
|
|||||||
}
|
}
|
||||||
name, err := switchNamespace(kc, choice, false)
|
name, err := switchNamespace(kc, choice, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to switch namespace")
|
return fmt.Errorf("failed to switch namespace: %w", err)
|
||||||
}
|
}
|
||||||
printer.Success(stderr, "Active namespace is \"%s\".", printer.SuccessColor.Sprint(name))
|
printer.Success(stderr, "Active namespace is \"%s\".", printer.SuccessColor.Sprint(name))
|
||||||
return nil
|
return nil
|
||||||
|
@ -20,8 +20,6 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// HelpOp describes printing help.
|
// HelpOp describes printing help.
|
||||||
@ -45,7 +43,10 @@ func printUsage(out io.Writer) error {
|
|||||||
help = strings.ReplaceAll(help, "%PROG%", selfName())
|
help = strings.ReplaceAll(help, "%PROG%", selfName())
|
||||||
|
|
||||||
_, err := fmt.Fprintf(out, "%s\n", help)
|
_, err := fmt.Fprintf(out, "%s\n", help)
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// selfName guesses how the user invoked the program.
|
// selfName guesses how the user invoked the program.
|
||||||
|
@ -16,11 +16,11 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
_ "k8s.io/client-go/plugin/pkg/client/auth"
|
_ "k8s.io/client-go/plugin/pkg/client/auth"
|
||||||
@ -36,7 +36,7 @@ func (op ListOp) Run(stdout, stderr io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx := kc.GetCurrentContext()
|
ctx := kc.GetCurrentContext()
|
||||||
@ -45,12 +45,12 @@ func (op ListOp) Run(stdout, stderr io.Writer) error {
|
|||||||
}
|
}
|
||||||
curNs, err := kc.NamespaceOfContext(ctx)
|
curNs, err := kc.NamespaceOfContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "cannot read current namespace")
|
return fmt.Errorf("cannot read current namespace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
ns, err := queryNamespaces(kc)
|
ns, err := queryNamespaces(kc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "could not list namespaces (is the cluster accessible?)")
|
return fmt.Errorf("could not list namespaces (is the cluster accessible?): %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, c := range ns {
|
for _, c := range ns {
|
||||||
@ -70,7 +70,7 @@ func queryNamespaces(kc *kubeconfig.Kubeconfig) ([]string, error) {
|
|||||||
|
|
||||||
clientset, err := newKubernetesClientSet(kc)
|
clientset, err := newKubernetesClientSet(kc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to initialize k8s REST client")
|
return nil, fmt.Errorf("failed to initialize k8s REST client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var out []string
|
var out []string
|
||||||
@ -83,7 +83,7 @@ func queryNamespaces(kc *kubeconfig.Kubeconfig) ([]string, error) {
|
|||||||
Continue: next,
|
Continue: next,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to list namespaces from k8s API")
|
return nil, fmt.Errorf("failed to list namespaces from k8s API: %w", err)
|
||||||
}
|
}
|
||||||
next = list.Continue
|
next = list.Continue
|
||||||
for _, it := range list.Items {
|
for _, it := range list.Items {
|
||||||
@ -99,11 +99,11 @@ func queryNamespaces(kc *kubeconfig.Kubeconfig) ([]string, error) {
|
|||||||
func newKubernetesClientSet(kc *kubeconfig.Kubeconfig) (*kubernetes.Clientset, error) {
|
func newKubernetesClientSet(kc *kubeconfig.Kubeconfig) (*kubernetes.Clientset, error) {
|
||||||
b, err := kc.Bytes()
|
b, err := kc.Bytes()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to convert in-memory kubeconfig to yaml")
|
return nil, fmt.Errorf("failed to convert in-memory kubeconfig to yaml: %w", err)
|
||||||
}
|
}
|
||||||
cfg, err := clientcmd.RESTConfigFromKubeConfig(b)
|
cfg, err := clientcmd.RESTConfigFromKubeConfig(b)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "failed to initialize config")
|
return nil, fmt.Errorf("failed to initialize config: %w", err)
|
||||||
}
|
}
|
||||||
return kubernetes.NewForConfig(cfg)
|
return kubernetes.NewForConfig(cfg)
|
||||||
}
|
}
|
||||||
|
@ -16,10 +16,11 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
errors2 "k8s.io/apimachinery/pkg/api/errors"
|
errors2 "k8s.io/apimachinery/pkg/api/errors"
|
||||||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
|
||||||
@ -36,7 +37,7 @@ func (s SwitchOp) Run(_, stderr io.Writer) error {
|
|||||||
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
kc := new(kubeconfig.Kubeconfig).WithLoader(kubeconfig.DefaultLoader)
|
||||||
defer kc.Close()
|
defer kc.Close()
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
return errors.Wrap(err, "kubeconfig error")
|
return fmt.Errorf("kubeconfig error: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
toNS, err := switchNamespace(kc, s.Target, s.Force)
|
toNS, err := switchNamespace(kc, s.Target, s.Force)
|
||||||
@ -54,18 +55,18 @@ func switchNamespace(kc *kubeconfig.Kubeconfig, ns string, force bool) (string,
|
|||||||
}
|
}
|
||||||
curNS, err := kc.NamespaceOfContext(ctx)
|
curNS, err := kc.NamespaceOfContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "failed to get current namespace")
|
return "", fmt.Errorf("failed to get current namespace: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f := NewNSFile(ctx)
|
f := NewNSFile(ctx)
|
||||||
prev, err := f.Load()
|
prev, err := f.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "failed to load previous namespace from file")
|
return "", fmt.Errorf("failed to load previous namespace from file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if ns == "-" {
|
if ns == "-" {
|
||||||
if prev == "" {
|
if prev == "" {
|
||||||
return "", errors.Errorf("No previous namespace found for current context (%s)", ctx)
|
return "", fmt.Errorf("no previous namespace found for current context (%s)", ctx)
|
||||||
}
|
}
|
||||||
ns = prev
|
ns = prev
|
||||||
}
|
}
|
||||||
@ -73,22 +74,22 @@ func switchNamespace(kc *kubeconfig.Kubeconfig, ns string, force bool) (string,
|
|||||||
if !force {
|
if !force {
|
||||||
ok, err := namespaceExists(kc, ns)
|
ok, err := namespaceExists(kc, ns)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", errors.Wrap(err, "failed to query if namespace exists (is cluster accessible?)")
|
return "", fmt.Errorf("failed to query if namespace exists (is cluster accessible?): %w", err)
|
||||||
}
|
}
|
||||||
if !ok {
|
if !ok {
|
||||||
return "", errors.Errorf("no namespace exists with name \"%s\"", ns)
|
return "", fmt.Errorf("no namespace exists with name \"%s\"", ns)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := kc.SetNamespace(ctx, ns); err != nil {
|
if err := kc.SetNamespace(ctx, ns); err != nil {
|
||||||
return "", errors.Wrapf(err, "failed to change to namespace \"%s\"", ns)
|
return "", fmt.Errorf("failed to change to namespace \"%s\": %w", ns, err)
|
||||||
}
|
}
|
||||||
if err := kc.Save(); err != nil {
|
if err := kc.Save(); err != nil {
|
||||||
return "", errors.Wrap(err, "failed to save kubeconfig file")
|
return "", fmt.Errorf("failed to save kubeconfig file: %w", err)
|
||||||
}
|
}
|
||||||
if curNS != ns {
|
if curNS != ns {
|
||||||
if err := f.Save(curNS); err != nil {
|
if err := f.Save(curNS); err != nil {
|
||||||
return "", errors.Wrap(err, "failed to save the previous namespace to file")
|
return "", fmt.Errorf("failed to save the previous namespace to file: %w", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ns, nil
|
return ns, nil
|
||||||
@ -102,13 +103,17 @@ func namespaceExists(kc *kubeconfig.Kubeconfig, ns string) (bool, error) {
|
|||||||
|
|
||||||
clientset, err := newKubernetesClientSet(kc)
|
clientset, err := newKubernetesClientSet(kc)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, errors.Wrap(err, "failed to initialize k8s REST client")
|
return false, fmt.Errorf("failed to initialize k8s REST client: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace, err := clientset.CoreV1().Namespaces().Get(context.Background(), ns, metav1.GetOptions{})
|
namespace, err := clientset.CoreV1().Namespaces().Get(context.Background(), ns, metav1.GetOptions{})
|
||||||
if errors2.IsNotFound(err) {
|
if errors2.IsNotFound(err) {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
return namespace != nil, errors.Wrapf(err, "failed to query "+
|
|
||||||
"namespace %q from k8s API", ns)
|
if err != nil {
|
||||||
|
return false, fmt.Errorf("failed to query namespace %q from k8s API: %w", ns, err)
|
||||||
|
} else {
|
||||||
|
return namespace != nil, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,6 @@ package main
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -16,5 +14,8 @@ type VersionOp struct{}
|
|||||||
|
|
||||||
func (_ VersionOp) Run(stdout, _ io.Writer) error {
|
func (_ VersionOp) Run(stdout, _ io.Writer) error {
|
||||||
_, err := fmt.Fprintf(stdout, "%s\n", version)
|
_, err := fmt.Fprintf(stdout, "%s\n", version)
|
||||||
return errors.Wrap(err, "write error")
|
if err != nil {
|
||||||
|
return fmt.Errorf("write error: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
1
go.mod
1
go.mod
@ -7,7 +7,6 @@ require (
|
|||||||
github.com/fatih/color v1.9.0
|
github.com/fatih/color v1.9.0
|
||||||
github.com/google/go-cmp v0.5.9
|
github.com/google/go-cmp v0.5.9
|
||||||
github.com/mattn/go-isatty v0.0.14
|
github.com/mattn/go-isatty v0.0.14
|
||||||
github.com/pkg/errors v0.9.1
|
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
k8s.io/apimachinery v0.27.3
|
k8s.io/apimachinery v0.27.3
|
||||||
k8s.io/client-go v0.27.3
|
k8s.io/client-go v0.27.3
|
||||||
|
2
go.sum
2
go.sum
@ -172,8 +172,6 @@ github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk=
|
|||||||
github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo=
|
github.com/onsi/ginkgo/v2 v2.9.1/go.mod h1:FEcmzVcCHl+4o9bQZVab+4dC9+j+91t2FHSzmGAPfuo=
|
||||||
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
|
github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E=
|
||||||
github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ=
|
github.com/onsi/gomega v1.27.4/go.mod h1:riYq/GJKh8hhoM01HN6Vmuy93AarCXCBGpvFDK3q3fQ=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||||
|
@ -16,8 +16,6 @@ package cmdutil
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"os"
|
"os"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func HomeDir() string {
|
func HomeDir() string {
|
||||||
@ -27,14 +25,3 @@ func HomeDir() string {
|
|||||||
}
|
}
|
||||||
return home
|
return home
|
||||||
}
|
}
|
||||||
|
|
||||||
// IsNotFoundErr determines if the underlying error is os.IsNotExist. Right now
|
|
||||||
// errors from github.com/pkg/errors doesn't work with os.IsNotExist.
|
|
||||||
func IsNotFoundErr(err error) bool {
|
|
||||||
for e := err; e != nil; e = errors.Unwrap(e) {
|
|
||||||
if os.IsNotExist(e) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
package kubeconfig
|
package kubeconfig
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/pkg/errors"
|
"errors"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ func TestKubeconfig_DeleteContextEntry(t *testing.T) {
|
|||||||
testutil.Ctx("c1"),
|
testutil.Ctx("c1"),
|
||||||
testutil.Ctx("c2"),
|
testutil.Ctx("c2"),
|
||||||
testutil.Ctx("c3")).ToYAML(t))
|
testutil.Ctx("c3")).ToYAML(t))
|
||||||
kc := new(Kubeconfig).WithLoader(test)
|
kc := new(StandardKubeconfig).WithLoader(test)
|
||||||
if err := kc.Parse(); err != nil {
|
if err := kc.Parse(); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,8 @@
|
|||||||
package kubeconfig
|
package kubeconfig
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/pkg/errors"
|
"errors"
|
||||||
|
"fmt"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -41,7 +42,7 @@ func (k *Kubeconfig) contextNode(name string) (*yaml.Node, error) {
|
|||||||
return contextNode, nil
|
return contextNode, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil, errors.Errorf("context with name \"%s\" not found", name)
|
return nil, fmt.Errorf("context with name \"%s\" not found", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (k *Kubeconfig) ContextNames() []string {
|
func (k *Kubeconfig) ContextNames() []string {
|
||||||
|
@ -15,9 +15,10 @@
|
|||||||
package kubeconfig
|
package kubeconfig
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"io"
|
"io"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
"fmt"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -54,7 +55,7 @@ func (k *Kubeconfig) Close() error {
|
|||||||
func (k *Kubeconfig) Parse() error {
|
func (k *Kubeconfig) Parse() error {
|
||||||
files, err := k.loader.Load()
|
files, err := k.loader.Load()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to load")
|
return fmt.Errorf("failed to load: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO since we don't support multiple kubeconfig files at the moment, there's just 1 file
|
// TODO since we don't support multiple kubeconfig files at the moment, there's just 1 file
|
||||||
@ -63,7 +64,7 @@ func (k *Kubeconfig) Parse() error {
|
|||||||
k.f = f
|
k.f = f
|
||||||
var v yaml.Node
|
var v yaml.Node
|
||||||
if err := yaml.NewDecoder(f).Decode(&v); err != nil {
|
if err := yaml.NewDecoder(f).Decode(&v); err != nil {
|
||||||
return errors.Wrap(err, "failed to decode")
|
return fmt.Errorf("failed to decode: %w", err)
|
||||||
}
|
}
|
||||||
k.rootNode = v.Content[0]
|
k.rootNode = v.Content[0]
|
||||||
if k.rootNode.Kind != yaml.MappingNode {
|
if k.rootNode.Kind != yaml.MappingNode {
|
||||||
@ -78,7 +79,7 @@ func (k *Kubeconfig) Bytes() ([]byte, error) {
|
|||||||
|
|
||||||
func (k *Kubeconfig) Save() error {
|
func (k *Kubeconfig) Save() error {
|
||||||
if err := k.f.Reset(); err != nil {
|
if err := k.f.Reset(); err != nil {
|
||||||
return errors.Wrap(err, "failed to reset file")
|
return fmt.Errorf("failed to reset file: %w", err)
|
||||||
}
|
}
|
||||||
enc := yaml.NewEncoder(k.f)
|
enc := yaml.NewEncoder(k.f)
|
||||||
enc.SetIndent(0)
|
enc.SetIndent(0)
|
||||||
|
@ -15,11 +15,11 @@
|
|||||||
package kubeconfig
|
package kubeconfig
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"github.com/ahmetb/kubectx/internal/cmdutil"
|
"github.com/ahmetb/kubectx/internal/cmdutil"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
@ -33,15 +33,15 @@ type kubeconfigFile struct{ *os.File }
|
|||||||
func (*StandardKubeconfigLoader) Load() ([]ReadWriteResetCloser, error) {
|
func (*StandardKubeconfigLoader) Load() ([]ReadWriteResetCloser, error) {
|
||||||
cfgPath, err := kubeconfigPath()
|
cfgPath, err := kubeconfigPath()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, errors.Wrap(err, "cannot determine kubeconfig path")
|
return nil, fmt.Errorf("cannot determine kubeconfig path: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
f, err := os.OpenFile(cfgPath, os.O_RDWR, 0)
|
f, err := os.OpenFile(cfgPath, os.O_RDWR, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsNotExist(err) {
|
if os.IsNotExist(err) {
|
||||||
return nil, errors.Wrap(err, "kubeconfig file not found")
|
return nil, fmt.Errorf("kubeconfig file not found: %w", err)
|
||||||
}
|
}
|
||||||
return nil, errors.Wrap(err, "failed to open file")
|
return nil, fmt.Errorf("failed to open file: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO we'll return all kubeconfig files when we start implementing multiple kubeconfig support
|
// TODO we'll return all kubeconfig files when we start implementing multiple kubeconfig support
|
||||||
@ -50,10 +50,13 @@ func (*StandardKubeconfigLoader) Load() ([]ReadWriteResetCloser, error) {
|
|||||||
|
|
||||||
func (kf *kubeconfigFile) Reset() error {
|
func (kf *kubeconfigFile) Reset() error {
|
||||||
if err := kf.Truncate(0); err != nil {
|
if err := kf.Truncate(0); err != nil {
|
||||||
return errors.Wrap(err, "failed to truncate file")
|
return fmt.Errorf("failed to truncate file: %w", err)
|
||||||
}
|
}
|
||||||
_, err := kf.Seek(0, 0)
|
_, err := kf.Seek(0, 0)
|
||||||
return errors.Wrap(err, "failed to seek in file")
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to seek in file: %w", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func kubeconfigPath() (string, error) {
|
func kubeconfigPath() (string, error) {
|
||||||
|
@ -15,7 +15,8 @@
|
|||||||
package kubeconfig
|
package kubeconfig
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/ahmetb/kubectx/internal/cmdutil"
|
"errors"
|
||||||
|
"io/fs"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@ -77,7 +78,7 @@ func TestStandardKubeconfigLoader_returnsNotFoundErr(t *testing.T) {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatal("expected err")
|
t.Fatal("expected err")
|
||||||
}
|
}
|
||||||
if !cmdutil.IsNotFoundErr(err) {
|
if !errors.Is(err, fs.ErrNotExist) {
|
||||||
t.Fatalf("expected ENOENT error; got=%v", err)
|
t.Fatalf("expected ENOENT error; got=%v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user