- internal/kube/client.go: NewClient() with in-cluster + kubeconfig fallback - internal/kube/cronjob.go: JobSpec, ApplyCronJob, DeleteCronJob, TriggerJob, GetLockStatus, SuspendCronJob, ListCronJobs, ImportFromCronJob - Makefile/Dockerfile: add ha-sync-ctl build target - rbac.yaml: add batch/cronjobs+jobs permissions and watch verb on leases Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
33 lines
843 B
Go
33 lines
843 B
Go
package kube
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
"k8s.io/client-go/kubernetes"
|
|
"k8s.io/client-go/rest"
|
|
"k8s.io/client-go/tools/clientcmd"
|
|
)
|
|
|
|
// NewClient builds a Kubernetes clientset. It tries in-cluster config first
|
|
// (running inside a pod), then falls back to ~/.kube/config for local use.
|
|
func NewClient() (*kubernetes.Clientset, error) {
|
|
cfg, err := rest.InClusterConfig()
|
|
if err != nil {
|
|
home, _ := os.UserHomeDir()
|
|
kubeconfig := filepath.Join(home, ".kube", "config")
|
|
if kc := os.Getenv("KUBECONFIG"); kc != "" {
|
|
kubeconfig = kc
|
|
}
|
|
cfg, err = clientcmd.BuildConfigFromFlags("", kubeconfig)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("kube: build config: %w", err)
|
|
}
|
|
}
|
|
client, err := kubernetes.NewForConfig(cfg)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("kube: new client: %w", err)
|
|
}
|
|
return client, nil
|
|
}
|