Ctrl K
ComunidadGuías…

pkg/k8score/cluster_detection_test.go

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

Archivo original ↗Preguntar a KiBot
package k8score

import (
	"context"
	"testing"

	corev1 "k8s.io/api/core/v1"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/kubernetes/fake"
)

func TestDetectNodePlatform(t *testing.T) {
	tests := []struct {
		name string
		node corev1.Node
		want string
	}{
		{name: "RKE2 kubelet", node: nodeWithKubeletVersion("v1.31.7+rke2r1"), want: "rke2"},
		{name: "RKE2 before Rancher", node: nodeWithSignals("v1.31.7+rke2r1", "", map[string]string{"rke.cattle.io/machine": "worker"}), want: "rke2"},
		{name: "RKE2 before provider ID", node: nodeWithSignals("v1.31.7+rke2r1", "aws:///zone/node", nil), want: "rke2"},
		{name: "not an RKE2 suffix", node: nodeWithKubeletVersion("v1.31.7-rke2r1"), want: "unknown"},
		{name: "GCE provider", node: nodeWithProviderID("gce://project/zone/node"), want: "gke"},
		{name: "GKE provider", node: nodeWithProviderID("gke://project/zone/node"), want: "gke"},
		{name: "AWS provider", node: nodeWithProviderID("aws:///zone/node"), want: "eks"},
		{name: "Azure provider", node: nodeWithProviderID("azure:///subscriptions/node"), want: "aks"},
		{name: "kind provider", node: nodeWithProviderID("kind://docker/radar/control-plane"), want: "kind"},
		{name: "Nutanix provider", node: nodeWithProviderID("nutanix://99d71c41-e100-4474-601b-5dd604becea6"), want: "nutanix"},
		{name: "GKE label", node: nodeWithLabels(map[string]string{"cloud.google.com/gke-nodepool": "default"}), want: "gke"},
		{name: "EKS nodegroup label", node: nodeWithLabels(map[string]string{"eks.amazonaws.com/nodegroup": "workers"}), want: "eks"},
		{name: "EKS capacity label", node: nodeWithLabels(map[string]string{"eks.amazonaws.com/capacityType": "ON_DEMAND"}), want: "eks"},
		{name: "Azure label", node: nodeWithLabels(map[string]string{"kubernetes.azure.com/cluster": "prod"}), want: "aks"},
		{name: "OpenShift label", node: nodeWithLabels(map[string]string{"node.openshift.io/os_id": "rhcos"}), want: "openshift"},
		{name: "Rancher label", node: nodeWithLabels(map[string]string{"rke.cattle.io/machine": "worker"}), want: "rancher"},
		{name: "kind node name", node: corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "kind-control-plane"}}, want: "kind"},
		{name: "minikube node name", node: corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "minikube-m02"}}, want: "minikube"},
		{name: "Docker Desktop node name", node: corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "docker-desktop"}}, want: "docker-desktop"},
		{name: "unknown", node: corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "worker-1"}}, want: "unknown"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			if got := DetectNodePlatform(tt.node); got != tt.want {
				t.Fatalf("DetectNodePlatform() = %q, want %q", got, tt.want)
			}
		})
	}
}

func TestDetectPlatformFromVersion(t *testing.T) {
	tests := []struct {
		version string
		want    string
	}{
		{version: "v1.31.7+rke2r1", want: "rke2"},
		{version: "v1.31.7-rke2r1", want: "unknown"},
		{version: "v1.31.7", want: "unknown"},
	}

	for _, tt := range tests {
		if got := DetectPlatformFromVersion(tt.version); got != tt.want {
			t.Errorf("DetectPlatformFromVersion(%q) = %q, want %q", tt.version, got, tt.want)
		}
	}
}

func TestDetectClusterPlatform(t *testing.T) {
	tests := []struct {
		name   string
		client kubernetes.Interface
		want   string
	}{
		{name: "nil client", client: nil, want: "unknown"},
		{name: "no nodes", client: fake.NewSimpleClientset(), want: "unknown"},
		{name: "generic node", client: fake.NewSimpleClientset(&corev1.Node{ObjectMeta: metav1.ObjectMeta{Name: "worker-1"}}), want: "generic"},
		{name: "RKE2 node", client: fake.NewSimpleClientset(nodePtr(nodeWithKubeletVersion("v1.31.7+rke2r1"))), want: "rke2"},
		{name: "NKP on AWS infrastructure", client: fake.NewSimpleClientset(nodePtr(nodeWithProviderID("aws:///zone/node")), &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: NKPNamespace}}), want: "nkp"},
		{name: "Nutanix without NKP", client: fake.NewSimpleClientset(nodePtr(nodeWithProviderID("nutanix://uuid"))), want: "nutanix"},
		{name: "GKE Autopilot", client: fake.NewSimpleClientset(nodePtr(nodeWithSignals("", "gce://project/zone/node", map[string]string{"cloud.google.com/gke-autopilot": "true"}))), want: "gke-autopilot"},
	}

	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			got, err := DetectClusterPlatform(context.Background(), tt.client)
			if err != nil {
				t.Fatalf("DetectClusterPlatform() error = %v", err)
			}
			if got != tt.want {
				t.Fatalf("DetectClusterPlatform() = %q, want %q", got, tt.want)
			}
		})
	}
}

func nodeWithKubeletVersion(version string) corev1.Node {
	return nodeWithSignals(version, "", nil)
}

func nodeWithProviderID(providerID string) corev1.Node {
	return nodeWithSignals("", providerID, nil)
}

func nodeWithLabels(labels map[string]string) corev1.Node {
	return nodeWithSignals("", "", labels)
}

func nodeWithSignals(version, providerID string, labels map[string]string) corev1.Node {
	return corev1.Node{
		ObjectMeta: metav1.ObjectMeta{Name: "worker-1", Labels: labels},
		Spec:       corev1.NodeSpec{ProviderID: providerID},
		Status:     corev1.NodeStatus{NodeInfo: corev1.NodeSystemInfo{KubeletVersion: version}},
	}
}

func nodePtr(node corev1.Node) *corev1.Node {
	return &node
}