github.com/nmstate/kubernetes-nmstate@v0.82.0/test/e2e/operator/main_test.go (about) 1 /* 2 Copyright The Kubernetes NMState Authors. 3 4 5 Licensed under the Apache License, Version 2.0 (the "License"); 6 you may not use this file except in compliance with the License. 7 You may obtain a copy of the License at 8 9 http://www.apache.org/licenses/LICENSE-2.0 10 11 Unless required by applicable law or agreed to in writing, software 12 distributed under the License is distributed on an "AS IS" BASIS, 13 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 See the License for the specific language governing permissions and 15 limitations under the License. 16 */ 17 18 package operator 19 20 import ( 21 "context" 22 "os" 23 "strings" 24 "testing" 25 26 . "github.com/onsi/ginkgo/v2" 27 ginkgotypes "github.com/onsi/ginkgo/v2/types" 28 . "github.com/onsi/gomega" 29 30 corev1 "k8s.io/api/core/v1" 31 "sigs.k8s.io/controller-runtime/pkg/client" 32 logf "sigs.k8s.io/controller-runtime/pkg/log" 33 "sigs.k8s.io/controller-runtime/pkg/log/zap" 34 35 testenv "github.com/nmstate/kubernetes-nmstate/test/env" 36 knmstatereporter "github.com/nmstate/kubernetes-nmstate/test/reporter" 37 ) 38 39 const manifestsDir = "build/_output/manifests/" 40 41 var ( 42 nodes []string 43 knmstateReporter *knmstatereporter.KubernetesNMStateReporter 44 manifestFiles = []string{"namespace.yaml", "service_account.yaml", "operator.yaml", "role.yaml", "role_binding.yaml"} 45 defaultOperator TestData 46 ) 47 48 func TestE2E(t *testing.T) { 49 testenv.TestMain() 50 51 RegisterFailHandler(Fail) 52 RunSpecs(t, "Operator E2E Test Suite") 53 } 54 55 var _ = BeforeSuite(func() { 56 // Change to root directory some test expect that 57 os.Chdir("../../../") 58 59 defaultOperator = NewOperatorTestData(os.Getenv("HANDLER_NAMESPACE"), manifestsDir, manifestFiles) 60 61 logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true))) 62 63 testenv.Start() 64 65 By("Getting node list from cluster") 66 nodeList := corev1.NodeList{} 67 Expect(testenv.Client.List(context.TODO(), &nodeList, &client.ListOptions{})).To(Succeed()) 68 for _, node := range nodeList.Items { 69 nodes = append(nodes, node.Name) 70 } 71 72 knmstateReporter = knmstatereporter.New("test_logs/e2e/operator", testenv.OperatorNamespace, nodes) 73 knmstateReporter.Cleanup() 74 }) 75 76 var _ = AfterSuite(func() { 77 UninstallNMStateAndWaitForDeletion(defaultOperator) 78 }) 79 80 var _ = ReportBeforeEach(func(specReport ginkgotypes.SpecReport) { 81 knmstateReporter.ReportBeforeEach(specReport) 82 }) 83 84 var _ = ReportAfterEach(func(specReport ginkgotypes.SpecReport) { 85 knmstateReporter.ReportAfterEach(specReport) 86 }) 87 88 func podsShouldBeDistributedAtNodes(selectedNodes []corev1.Node, listOptions ...client.ListOption) { 89 podList := &corev1.PodList{} 90 Expect(testenv.Client.List(context.TODO(), podList, listOptions...)).To(Succeed()) 91 nodesRunningPod := map[string]bool{} 92 for _, pod := range podList.Items { 93 Expect(pod.Spec.NodeName).To(BeElementOf(namesFromNodes(selectedNodes)), "should run on the selected nodes") 94 nodesRunningPod[pod.Spec.NodeName] = true 95 } 96 if len(selectedNodes) > 1 { 97 Expect(nodesRunningPod).To(HaveLen(len(podList.Items)), "should run pods at different nodes") 98 } else { 99 Expect(nodesRunningPod).To(HaveLen(1), "should run pods at the same node") 100 } 101 } 102 103 func isKubevirtciCluster() bool { 104 return strings.Contains(os.Getenv("KUBECONFIG"), "kubevirtci") 105 } 106 107 func controlPlaneNodes() []corev1.Node { 108 nodeList := &corev1.NodeList{} 109 Expect(testenv.Client.List(context.TODO(), nodeList, client.HasLabels{"node-role.kubernetes.io/control-plane"})).To(Succeed()) 110 if len(nodeList.Items) == 0 { 111 Expect(testenv.Client.List(context.TODO(), nodeList, client.HasLabels{"node-role.kubernetes.io/master"})).To(Succeed()) 112 } 113 return nodeList.Items 114 } 115 116 func namesFromNodes(nodes []corev1.Node) []string { 117 names := []string{} 118 for _, node := range nodes { 119 names = append(names, node.Name) 120 } 121 return names 122 }