package k8s import ( "errors" "os" "path/filepath" "strings" "testing" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" ) func TestNewReturnsErrorWhenNoClusterConfigOrValidKubeconfigExists(t *testing.T) { restore := swapClientTestHooks() defer restore() inClusterConfigFn = func() (*rest.Config, error) { return nil, errors.New("cluster config exploded") } t.Setenv("KUBECONFIG", "/definitely/missing/kubeconfig") client, err := New() if err == nil || client != nil { t.Fatalf("expected New to fail without usable Kubernetes config, got client=%#v err=%v", client, err) } if !strings.Contains(err.Error(), "load kubeconfig") { t.Fatalf("expected kubeconfig load error, got %v", err) } } func TestNewReturnsInClusterErrorWhenNoKubeconfigIsProvided(t *testing.T) { restore := swapClientTestHooks() defer restore() inClusterConfigFn = func() (*rest.Config, error) { return nil, errors.New("cluster config exploded") } t.Setenv("KUBECONFIG", "") client, err := New() if err == nil || client != nil { t.Fatalf("expected in-cluster config error, got client=%#v err=%v", client, err) } if !strings.Contains(err.Error(), "load in-cluster config: cluster config exploded") { t.Fatalf("expected in-cluster config error, got %v", err) } } func TestNewLoadsKubeconfigAndBuildsClientset(t *testing.T) { restore := swapClientTestHooks() defer restore() inClusterConfigFn = func() (*rest.Config, error) { return nil, errors.New("not in cluster") } kubeconfigPath := filepath.Join(t.TempDir(), "config") if err := os.WriteFile(kubeconfigPath, []byte(`apiVersion: v1 kind: Config clusters: - cluster: server: https://127.0.0.1:6443 name: local contexts: - context: cluster: local user: local name: local current-context: local users: - name: local user: token: test-token `), 0o600); err != nil { t.Fatalf("write kubeconfig: %v", err) } t.Setenv("KUBECONFIG", kubeconfigPath) client, err := New() if err != nil { t.Fatalf("expected kubeconfig-backed client construction, got %v", err) } if client == nil || client.Clientset == nil { t.Fatalf("expected populated client, got %#v", client) } } func TestNewWrapsClientsetConstructionFailures(t *testing.T) { restore := swapClientTestHooks() defer restore() inClusterConfigFn = func() (*rest.Config, error) { return &rest.Config{Host: "https://127.0.0.1:6443"}, nil } newForConfigFn = func(*rest.Config) (kubernetes.Interface, error) { return nil, errors.New("clientset exploded") } client, err := New() if err == nil || client != nil { t.Fatalf("expected clientset construction error, got client=%#v err=%v", client, err) } if !strings.Contains(err.Error(), "build clientset: clientset exploded") { t.Fatalf("expected wrapped clientset error, got %v", err) } } func swapClientTestHooks() func() { originalInCluster := inClusterConfigFn originalBuildConfig := buildConfigFromFlagsFn originalNewForConfig := newForConfigFn return func() { inClusterConfigFn = originalInCluster buildConfigFromFlagsFn = originalBuildConfig newForConfigFn = originalNewForConfig } }