...
1
16
17 package kubeadm
18
19 import (
20 "context"
21
22 corev1 "k8s.io/api/core/v1"
23 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
24 "k8s.io/apimachinery/pkg/labels"
25 clientset "k8s.io/client-go/kubernetes"
26 "k8s.io/kubernetes/test/e2e/framework"
27 e2enode "k8s.io/kubernetes/test/e2e/framework/node"
28 admissionapi "k8s.io/pod-security-admission/api"
29
30 "github.com/onsi/ginkgo/v2"
31 "github.com/onsi/gomega"
32 )
33
34 const (
35 controlPlaneLabel = "node-role.kubernetes.io/control-plane"
36 )
37
38
39
40 var _ = Describe("control-plane node", func() {
41
42
43 f := framework.NewDefaultFramework("control-plane node")
44 f.NamespacePodSecurityLevel = admissionapi.LevelPrivileged
45
46
47
48 f.SkipNamespaceCreation = true
49
50
51
52 ginkgo.It("should be labelled and tainted [multi-node]", func(ctx context.Context) {
53
54 controlPlanes := getControlPlaneNodes(ctx, f.ClientSet)
55
56
57 gomega.Expect(controlPlanes.Items).NotTo(gomega.BeEmpty(), "at least one node with label %s should exist. if you are running test on a single-node cluster, you can skip this test with SKIP=multi-node", controlPlaneLabel)
58
59
60 for _, cp := range controlPlanes.Items {
61 e2enode.ExpectNodeHasTaint(ctx, f.ClientSet, cp.GetName(), &corev1.Taint{Key: controlPlaneLabel, Effect: corev1.TaintEffectNoSchedule})
62 }
63 })
64 })
65
66 func getControlPlaneNodes(ctx context.Context, c clientset.Interface) *corev1.NodeList {
67 selector := labels.Set{controlPlaneLabel: ""}.AsSelector()
68 cpNodes, err := c.CoreV1().Nodes().
69 List(ctx, metav1.ListOptions{LabelSelector: selector.String()})
70 framework.ExpectNoError(err, "error reading control-plane nodes")
71 return cpNodes
72 }
73
View as plain text