soteria/internal/k8s/client_test.go

120 lines
3.1 KiB
Go

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
}
}