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 }