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  }