Ctrl K
ComunidadGuías…

internal/cluster/credentials_test.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package cluster

import (
	"errors"
	"testing"

	"github.com/sophotechlabs/spinoza/internal/api"
)

func TestTheGkePluginIsNamed(t *testing.T) {
	err := errors.New(`Get "https://35.204.10.181/api?timeout=30s": getting credentials: ` +
		`exec: executable /opt/homebrew/share/google-cloud-sdk/bin/gke-gcloud-auth-plugin failed with exit code 1`)

	if got := credentialPlugin(err); got != "gke-gcloud-auth-plugin" {
		t.Fatalf("plugin = %q, want the binary that failed", got)
	}
}

func TestAPluginOnThePathIsNamedToo(t *testing.T) {
	err := errors.New("getting credentials: exec: executable aws-iam-authenticator failed with exit code 2")

	if got := credentialPlugin(err); got != "aws-iam-authenticator" {
		t.Fatalf("plugin = %q", got)
	}
}

func TestAnUnrelatedFailureNamesNoPlugin(t *testing.T) {
	err := errors.New(`Get "https://10.0.0.1/api": dial tcp 10.0.0.1:443: connect: connection refused`)

	if got := credentialPlugin(err); got != "" {
		t.Fatalf("plugin = %q, want none", got)
	}
}

func TestNoErrorNamesNoPlugin(t *testing.T) {
	if got := credentialPlugin(nil); got != "" {
		t.Fatalf("plugin = %q, want none", got)
	}
}

func TestAMarkerWithNothingAfterItNamesNoPlugin(t *testing.T) {
	err := errors.New("getting credentials: exec: executable  failed")

	if got := credentialPlugin(err); got != "" {
		t.Fatalf("plugin = %q, want none", got)
	}
}

func TestACredentialFailureIsSaidInOneLine(t *testing.T) {
	err := unreachable("gke_prod", "/home/me/.kube/config", "https://35.204.10.181", errors.New(
		"getting credentials: exec: executable /opt/homebrew/bin/gke-gcloud-auth-plugin failed with exit code 1",
	))

	want := `context "gke_prod" could not get credentials: gke-gcloud-auth-plugin failed. Check that it runs in your shell`
	if err.Error() != want {
		t.Fatalf("error = %q, want %q", err.Error(), want)
	}
}

func TestAnyOtherFailureKeepsTheWholeReason(t *testing.T) {
	err := unreachable("p-mk1", "/home/me/.kube/config", "https://10.0.0.1:6443", errors.New("the apiserver returned something nobody has classified"))

	want := `context "p-mk1" lists no resource types: the apiserver returned something nobody has classified`
	if err.Error() != want {
		t.Fatalf("error = %q, want %q", err.Error(), want)
	}
}

func TestNothingListeningIsSaidPlainlyWithTheAddress(t *testing.T) {
	err := unreachable("p-mk1", "/home/me/.kube/config", "https://10.0.0.1:6443", errors.New(
		`Get "https://10.0.0.1:6443/api?timeout=30s": dial tcp 10.0.0.1:6443: connect: connection refused`,
	))

	want := `the cluster could not be reached: context "p-mk1" found nothing listening at https://10.0.0.1:6443. Check the address in /home/me/.kube/config`
	if err.Error() != want {
		t.Fatalf("error = %q, want %q", err.Error(), want)
	}
	if !errors.Is(err, api.ErrUnreachable) {
		t.Fatalf("error = %v, want one the api reports as unreachable", err)
	}
}

func TestNoReasonAtAllStillSaysWhichContext(t *testing.T) {
	err := unreachable("p-mk1", "/home/me/.kube/config", "https://10.0.0.1:6443", nil)

	want := `context "p-mk1" lists no resource types`
	if err.Error() != want {
		t.Fatalf("error = %q, want %q", err.Error(), want)
	}
}

func TestAnUntrustedCertificateNamesTheKubeconfigThatWasRead(t *testing.T) {
	err := unreachable("niio-prod", "/Users/me/.kube/config", "https://96102852A7BB2F1369A62D1695713FC6.gr7.us-east-1.eks.amazonaws.com", errors.New(
		`Get "https://96102852A7BB2F1369A62D1695713FC6.gr7.us-east-1.eks.amazonaws.com/api?timeout=30s": `+
			`tls: failed to verify certificate: x509: certificate signed by unknown authority`,
	))

	want := `context "niio-prod" in /Users/me/.kube/config does not trust the certificate ` +
		`https://96102852A7BB2F1369A62D1695713FC6.gr7.us-east-1.eks.amazonaws.com presented ` +
		`(x509: certificate signed by unknown authority). Either this is not the kubeconfig kubectl reads, ` +
		`or a TLS-inspecting proxy on this machine re-signs the connection and spinoza needs the exemption kubectl has`
	if err.Error() != want {
		t.Fatalf("error = %q, want %q", err.Error(), want)
	}
}

func TestACertificateTheSystemDoesNotTrustIsSaidTheSameWay(t *testing.T) {
	reason := untrustedCertificate(errors.New(
		`Get "https://127.0.0.1:6443/api?timeout=30s": tls: failed to verify certificate: x509: “kube-apiserver” certificate is not trusted`,
	))

	if reason != `x509: “kube-apiserver” certificate is not trusted` {
		t.Fatalf("reason = %q", reason)
	}
}

func TestAnExpiredCertificateKeepsTheWholeReason(t *testing.T) {
	err := unreachable("old", "/home/me/.kube/config", "https://10.0.0.1", errors.New(
		`Get "https://10.0.0.1/api": tls: failed to verify certificate: x509: certificate has expired or is not yet valid`,
	))

	want := `context "old" lists no resource types: Get "https://10.0.0.1/api": tls: failed to verify certificate: x509: certificate has expired or is not yet valid`
	if err.Error() != want {
		t.Fatalf("error = %q, want %q", err.Error(), want)
	}
}

func TestAFailureWithoutATrustProblemNamesNoReason(t *testing.T) {
	if got := untrustedCertificate(errors.New("connection refused")); got != "" {
		t.Fatalf("reason = %q, want none", got)
	}
	if got := untrustedCertificate(nil); got != "" {
		t.Fatalf("reason = %q, want none", got)
	}
}