package k8s import ( "fmt" "os" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) // Client wraps the Kubernetes interface used by Soteria. type Client struct { Clientset kubernetes.Interface } var ( inClusterConfigFn = rest.InClusterConfig buildConfigFromFlagsFn = clientcmd.BuildConfigFromFlags newForConfigFn = func(cfg *rest.Config) (kubernetes.Interface, error) { return kubernetes.NewForConfig(cfg) } ) // New returns a Kubernetes client, preferring in-cluster config and falling back to KUBECONFIG. func New() (*Client, error) { cfg, err := inClusterConfigFn() if err != nil { kubeconfig := os.Getenv("KUBECONFIG") if kubeconfig == "" { return nil, fmt.Errorf("load in-cluster config: %w", err) } cfg, err = buildConfigFromFlagsFn("", kubeconfig) if err != nil { return nil, fmt.Errorf("load kubeconfig: %w", err) } } clientset, err := newForConfigFn(cfg) if err != nil { return nil, fmt.Errorf("build clientset: %w", err) } return &Client{Clientset: clientset}, nil }