soteria/internal/k8s/client.go

46 lines
1.1 KiB
Go
Raw Normal View History

2026-01-31 03:34:34 -03:00
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.
2026-01-31 03:34:34 -03:00
type Client struct {
Clientset kubernetes.Interface
2026-01-31 03:34:34 -03:00
}
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.
2026-01-31 03:34:34 -03:00
func New() (*Client, error) {
cfg, err := inClusterConfigFn()
2026-01-31 03:34:34 -03:00
if err != nil {
kubeconfig := os.Getenv("KUBECONFIG")
if kubeconfig == "" {
return nil, fmt.Errorf("load in-cluster config: %w", err)
}
cfg, err = buildConfigFromFlagsFn("", kubeconfig)
2026-01-31 03:34:34 -03:00
if err != nil {
return nil, fmt.Errorf("load kubeconfig: %w", err)
}
}
clientset, err := newForConfigFn(cfg)
2026-01-31 03:34:34 -03:00
if err != nil {
return nil, fmt.Errorf("build clientset: %w", err)
}
return &Client{Clientset: clientset}, nil
}