github.com/k8snetworkplumbingwg/sriov-network-operator@v1.2.1-0.20240408194816-2d2e5a45d453/test/validation/tests/test_validation.go (about)

     1  package tests
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"os"
     7  
     8  	. "github.com/onsi/ginkgo/v2"
     9  	. "github.com/onsi/gomega"
    10  
    11  	corev1 "k8s.io/api/core/v1"
    12  	apiext "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1"
    13  	"k8s.io/apimachinery/pkg/api/errors"
    14  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    15  	goclient "sigs.k8s.io/controller-runtime/pkg/client"
    16  
    17  	sriovv1 "github.com/k8snetworkplumbingwg/sriov-network-operator/api/v1"
    18  	testclient "github.com/k8snetworkplumbingwg/sriov-network-operator/test/util/client"
    19  	"github.com/k8snetworkplumbingwg/sriov-network-operator/test/util/cluster"
    20  )
    21  
    22  var (
    23  	clients           *testclient.ClientSet
    24  	operatorNamespace string
    25  )
    26  
    27  const (
    28  	sriovOperatorDeploymentName = "sriov-network-operator"
    29  	// SriovNetworkNodePolicies contains the name of the sriov network node policies CRD
    30  	sriovNetworkNodePolicies = "sriovnetworknodepolicies.sriovnetwork.openshift.io"
    31  	// sriovNetworkNodeStates contains the name of the sriov network node state CRD
    32  	sriovNetworkNodeStates = "sriovnetworknodestates.sriovnetwork.openshift.io"
    33  	// sriovNetworks contains the name of the sriov network CRD
    34  	sriovNetworks = "sriovnetworks.sriovnetwork.openshift.io"
    35  	// sriovOperatorConfigs contains the name of the sriov Operator config CRD
    36  	sriovOperatorConfigs = "sriovoperatorconfigs.sriovnetwork.openshift.io"
    37  )
    38  
    39  var _ = BeforeSuite(func() {
    40  	operatorNamespace = os.Getenv("OPERATOR_NAMESPACE")
    41  	if operatorNamespace == "" {
    42  		operatorNamespace = "openshift-sriov-network-operator"
    43  	}
    44  
    45  	clients = testclient.New("")
    46  	Expect(clients).ToNot(BeNil())
    47  })
    48  
    49  var _ = Describe("validation", func() {
    50  
    51  	Context("sriov", func() {
    52  		It("should have the sriov namespace", func() {
    53  			_, err := clients.Namespaces().Get(context.Background(), operatorNamespace, metav1.GetOptions{})
    54  			Expect(err).ToNot(HaveOccurred())
    55  		})
    56  
    57  		It("should have the sriov operator deployment in running state", func() {
    58  			deploy, err := clients.Deployments(operatorNamespace).Get(context.Background(), sriovOperatorDeploymentName, metav1.GetOptions{})
    59  			Expect(err).ToNot(HaveOccurred())
    60  			Expect(deploy.Status.Replicas).To(Equal(deploy.Status.ReadyReplicas))
    61  
    62  			pods, err := clients.Pods(operatorNamespace).List(context.Background(), metav1.ListOptions{
    63  				LabelSelector: fmt.Sprintf("name=%s", sriovOperatorDeploymentName)})
    64  			Expect(err).ToNot(HaveOccurred())
    65  
    66  			Expect(len(pods.Items)).To(Equal(1))
    67  			Expect(pods.Items[0].Status.Phase).To(Equal(corev1.PodRunning))
    68  		})
    69  
    70  		It("Should have the sriov CRDs available in the cluster", func() {
    71  			crd := &apiext.CustomResourceDefinition{}
    72  			err := clients.Client.Get(context.TODO(), goclient.ObjectKey{Name: sriovNetworkNodePolicies}, crd)
    73  			Expect(err).ToNot(HaveOccurred())
    74  
    75  			err = clients.Client.Get(context.TODO(), goclient.ObjectKey{Name: sriovNetworkNodeStates}, crd)
    76  			Expect(err).ToNot(HaveOccurred())
    77  
    78  			err = clients.Client.Get(context.TODO(), goclient.ObjectKey{Name: sriovNetworks}, crd)
    79  			Expect(err).ToNot(HaveOccurred())
    80  
    81  			err = clients.Client.Get(context.TODO(), goclient.ObjectKey{Name: sriovOperatorConfigs}, crd)
    82  			Expect(err).ToNot(HaveOccurred())
    83  		})
    84  
    85  		It("should deploy the injector pod if requested", func() {
    86  			operatorConfig := &sriovv1.SriovOperatorConfig{}
    87  			err := clients.Client.Get(context.TODO(), goclient.ObjectKey{Name: "default", Namespace: operatorNamespace}, operatorConfig)
    88  			Expect(err).ToNot(HaveOccurred())
    89  
    90  			if operatorConfig.Spec.EnableInjector {
    91  				daemonset, err := clients.DaemonSets(operatorNamespace).Get(context.Background(), "network-resources-injector", metav1.GetOptions{})
    92  				Expect(err).ToNot(HaveOccurred())
    93  				Expect(daemonset.Status.DesiredNumberScheduled).To(Equal(daemonset.Status.NumberReady))
    94  			} else {
    95  				_, err := clients.DaemonSets(operatorNamespace).Get(context.Background(), "network-resources-injector", metav1.GetOptions{})
    96  				Expect(err).To(HaveOccurred())
    97  				Expect(errors.IsNotFound(err)).To(BeTrue())
    98  			}
    99  		})
   100  
   101  		It("should deploy the operator webhook if requested", func() {
   102  			operatorConfig := &sriovv1.SriovOperatorConfig{}
   103  			err := clients.Get(context.TODO(), goclient.ObjectKey{Name: "default", Namespace: operatorNamespace}, operatorConfig)
   104  			Expect(err).ToNot(HaveOccurred())
   105  
   106  			if operatorConfig.Spec.EnableOperatorWebhook {
   107  				daemonset, err := clients.DaemonSets(operatorNamespace).Get(context.Background(), "operator-webhook", metav1.GetOptions{})
   108  				Expect(err).ToNot(HaveOccurred())
   109  				Expect(daemonset.Status.DesiredNumberScheduled).To(Equal(daemonset.Status.NumberReady))
   110  			} else {
   111  				_, err := clients.DaemonSets(operatorNamespace).Get(context.Background(), "operator-webhook", metav1.GetOptions{})
   112  				Expect(err).To(HaveOccurred())
   113  				Expect(errors.IsNotFound(err)).To(BeTrue())
   114  			}
   115  		})
   116  
   117  		It("should have SR-IOV node statuses not in progress", func() {
   118  			CheckStable()
   119  		})
   120  	})
   121  })
   122  
   123  func CheckStable() {
   124  	res, err := cluster.SriovStable(operatorNamespace, clients)
   125  	Expect(err).ToNot(HaveOccurred())
   126  	Expect(res).To(BeTrue(), "SR-IOV status is not stable")
   127  
   128  	isClusterReady, err := cluster.IsClusterStable(clients)
   129  	Expect(err).ToNot(HaveOccurred())
   130  	Expect(isClusterReady).To(BeTrue(), "Cluster is not stable")
   131  }