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"
|
|
|
|
|
)
|
|
|
|
|
|
2026-04-21 06:45:04 -03:00
|
|
|
// Client wraps the Kubernetes interface used by Soteria.
|
2026-01-31 03:34:34 -03:00
|
|
|
type Client struct {
|
2026-04-20 18:38:12 -03:00
|
|
|
Clientset kubernetes.Interface
|
2026-01-31 03:34:34 -03:00
|
|
|
}
|
|
|
|
|
|
2026-04-20 19:46:11 -03:00
|
|
|
var (
|
|
|
|
|
inClusterConfigFn = rest.InClusterConfig
|
|
|
|
|
buildConfigFromFlagsFn = clientcmd.BuildConfigFromFlags
|
|
|
|
|
newForConfigFn = func(cfg *rest.Config) (kubernetes.Interface, error) {
|
|
|
|
|
return kubernetes.NewForConfig(cfg)
|
|
|
|
|
}
|
|
|
|
|
)
|
|
|
|
|
|
2026-04-21 06:45:04 -03:00
|
|
|
// 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) {
|
2026-04-20 19:46:11 -03:00
|
|
|
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)
|
|
|
|
|
}
|
2026-04-20 19:46:11 -03:00
|
|
|
cfg, err = buildConfigFromFlagsFn("", kubeconfig)
|
2026-01-31 03:34:34 -03:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, fmt.Errorf("load kubeconfig: %w", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-20 19:46:11 -03:00
|
|
|
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
|
|
|
|
|
}
|