|
| 1 | +package e2e |
| 2 | + |
| 3 | +import ( |
| 4 | + "context" |
| 5 | + "fmt" |
| 6 | + |
| 7 | + . "github.com/onsi/ginkgo/v2" |
| 8 | + . "github.com/onsi/gomega" |
| 9 | + kueueoperatorv1 "github.com/openshift/kueue-operator/pkg/apis/kueueoperator/v1" |
| 10 | + "github.com/openshift/kueue-operator/test/e2e/bindata" |
| 11 | + "github.com/openshift/kueue-operator/test/e2e/testutils" |
| 12 | + corev1 "k8s.io/api/core/v1" |
| 13 | + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" |
| 14 | + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" |
| 15 | + "sigs.k8s.io/yaml" |
| 16 | +) |
| 17 | + |
| 18 | +var _ = Describe("KueueOperatorQE", Ordered, func() { |
| 19 | + var namespaceName string |
| 20 | + |
| 21 | + AfterAll(func(ctx context.Context) { |
| 22 | + deleteNamespace(ctx, &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: namespaceName}}) |
| 23 | + deleteClusterQueueAndResourceFlavor(ctx, kueueClient) |
| 24 | + testutils.CleanUpKueuInstance(ctx, clients.KueueClient, "cluster") |
| 25 | + }) |
| 26 | + |
| 27 | + When("LocalQueueDefaulting - Should label and admit Pod and Job in a managed namespace", func() { |
| 28 | + It("Should label and admit Job and Pod", func(ctx context.Context) { |
| 29 | + kueueClient = clients.UpstreamKueueClient |
| 30 | + Expect(deployOperand()).To(Succeed(), "operand deployment should not fail") |
| 31 | + kueueInstance, err := clients.KueueClient.KueueV1().Kueues().Get(ctx, "cluster", metav1.GetOptions{}) |
| 32 | + Expect(err).ToNot(HaveOccurred(), "Failed to fetch Kueue instance") |
| 33 | + kueueInstance.Spec.Config.WorkloadManagement.LabelPolicy = kueueoperatorv1.LabelPolicyNone |
| 34 | + applyKueueConfig(ctx, kueueInstance.Spec.Config, kubeClient) |
| 35 | + namespace := createResource("assets/qe/01_namespace.yaml") |
| 36 | + namespaceName = namespace.GetName() |
| 37 | + verifyResourceExists(namespace, "Namespace", namespaceName) |
| 38 | + resourceFlavor := createResource("assets/qe/10_resource_flavor.yaml") |
| 39 | + verifyResourceExists(resourceFlavor, "ResourceFlavor", "default") |
| 40 | + clusterQueue := createResource("assets/qe/09_cluster_queue.yaml") |
| 41 | + verifyResourceExists(clusterQueue, "ClusterQueue", "test-clusterqueue") |
| 42 | + localQueue := createResource("assets/qe/11_local_queue.yaml", namespaceName) |
| 43 | + verifyResourceExistsInNamespace(localQueue, "LocalQueue", "default", namespaceName) |
| 44 | + job := createResource("assets/qe/12_job.yaml", namespaceName) |
| 45 | + verifyResourceExistsInNamespace(job, "Job", "kueuejob2", namespaceName) |
| 46 | + Expect(job.GetLabels()).To(HaveKeyWithValue(testutils.QueueLabel, testutils.DefaultLocalQueueName)) |
| 47 | + verifyWorkloadCreated(kueueClient, namespaceName, string(job.GetUID())) |
| 48 | + pod := createResource("assets/qe/13_pod.yaml", namespaceName) |
| 49 | + verifyResourceExistsInNamespace(pod, "Pod", "pod1", namespaceName) |
| 50 | + Expect(pod.GetLabels()).To(HaveKeyWithValue(testutils.QueueLabel, testutils.DefaultLocalQueueName)) |
| 51 | + verifyWorkloadCreated(kueueClient, namespaceName, string(pod.GetUID())) |
| 52 | + }) |
| 53 | + }) |
| 54 | + |
| 55 | +}) |
| 56 | + |
| 57 | +func createResource(assetPath string, namespaceName ...string) *unstructured.Unstructured { |
| 58 | + yamlBytes := bindata.MustAsset(assetPath) |
| 59 | + resource := &unstructured.Unstructured{} |
| 60 | + err := yaml.Unmarshal(yamlBytes, resource) |
| 61 | + Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("Failed to unmarshal YAML from %s: %v", assetPath, err)) |
| 62 | + if resource.GetKind() == "LocalQueue" || resource.GetKind() == "Job" || resource.GetKind() == "Pod" { |
| 63 | + Expect(namespaceName).NotTo(BeEmpty(), fmt.Sprintf("%s resource must have a namespace provided", resource.GetKind())) |
| 64 | + resource.SetNamespace(namespaceName[0]) |
| 65 | + } |
| 66 | + err = clients.GenericClient.Create(context.Background(), resource) |
| 67 | + Expect(err).NotTo(HaveOccurred(), fmt.Sprintf("Failed to create %s: %v", resource.GetKind(), err)) |
| 68 | + By(fmt.Sprintf("Created %s: %s", resource.GetKind(), resource.GetName())) |
| 69 | + return resource |
| 70 | +} |
| 71 | + |
| 72 | +func verifyResourceExistsInNamespace(resource *unstructured.Unstructured, kind, name, namespace string) { |
| 73 | + Expect(resource.GetKind()).To(Equal(kind), "Resource kind mismatch") |
| 74 | + Expect(resource.GetName()).To(Equal(name), "Resource name mismatch") |
| 75 | + Expect(resource.GetNamespace()).To(Equal(namespace), "Resource namespace mismatch") |
| 76 | +} |
| 77 | + |
| 78 | +func verifyResourceExists(resource *unstructured.Unstructured, kind, name string) { |
| 79 | + Expect(resource.GetKind()).To(Equal(kind), "Resource kind mismatch") |
| 80 | + Expect(resource.GetName()).To(Equal(name), "Resource name mismatch") |
| 81 | +} |
0 commit comments