From b308d899128e62f4df177b1f4e7d8f5eb016369b Mon Sep 17 00:00:00 2001 From: FogDong Date: Mon, 23 May 2022 20:22:21 +0800 Subject: [PATCH] Feat: add tests in application controller Signed-off-by: FogDong --- .../application_controller_test.go | 113 ++++++++++++++++++ 1 file changed, 113 insertions(+) diff --git a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go index 1e9cebc65..17bd22893 100644 --- a/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go +++ b/pkg/controller/core.oam.dev/v1alpha2/application/application_controller_test.go @@ -2047,6 +2047,119 @@ var _ = Describe("Test Application Controller", func() { Expect(checkApp.Status.Workflow.Steps[1].Phase).Should(BeEquivalentTo(common.WorkflowStepPhaseFailed)) }) + It("application with sub steps", func() { + ns := corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: "app-with-sub-steps", + }, + } + Expect(k8sClient.Create(ctx, &ns)).Should(BeNil()) + healthComponentDef := &v1beta1.ComponentDefinition{} + hCDefJson, _ := yaml.YAMLToJSON([]byte(cdDefWithHealthStatusYaml)) + Expect(json.Unmarshal(hCDefJson, healthComponentDef)).Should(BeNil()) + healthComponentDef.Name = "worker-with-health" + healthComponentDef.Namespace = "app-with-sub-steps" + Expect(k8sClient.Create(ctx, healthComponentDef)).Should(BeNil()) + app := &v1beta1.Application{ + TypeMeta: metav1.TypeMeta{ + Kind: "Application", + APIVersion: "core.oam.dev/v1beta1", + }, + ObjectMeta: metav1.ObjectMeta{ + Name: "app-with-sub-steps", + Namespace: "app-with-sub-steps", + }, + Spec: v1beta1.ApplicationSpec{ + Components: []common.ApplicationComponent{ + { + Name: "myweb1", + Type: "worker-with-health", + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + }, + { + Name: "myweb2", + Type: "worker", + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox"}`)}, + }, + { + Name: "myweb3", + Type: "worker-with-health", + Properties: &runtime.RawExtension{Raw: []byte(`{"cmd":["sleep","1000"],"image":"busybox","lives": "i am lives","enemies": "empty"}`)}, + }, + }, + Workflow: &v1beta1.Workflow{ + Steps: []v1beta1.WorkflowStep{ + { + Name: "myweb1", + Type: "apply-component", + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb1"}`)}, + }, + { + Name: "myweb2", + Type: "step-group", + SubSteps: []common.WorkflowSubStep{ + { + Name: "myweb2-sub1", + Type: "apply-component", + DependsOn: []string{"myweb3"}, + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb2"}`)}, + }, + { + Name: "myweb2-sub2", + Type: "apply-component", + Properties: &runtime.RawExtension{Raw: []byte(`{"component":"myweb3"}`)}, + }, + }, + }, + }, + }, + }, + } + + Expect(k8sClient.Create(context.Background(), app)).Should(BeNil()) + appKey := types.NamespacedName{Namespace: ns.Name, Name: app.Name} + testutil.ReconcileOnceAfterFinalizer(reconciler, reconcile.Request{NamespacedName: appKey}) + + expDeployment := &v1.Deployment{} + web2Key := types.NamespacedName{Namespace: ns.Name, Name: "myweb2"} + Expect(k8sClient.Get(ctx, web2Key, expDeployment)).Should(util.NotFoundMatcher{}) + web3Key := types.NamespacedName{Namespace: ns.Name, Name: "myweb3"} + Expect(k8sClient.Get(ctx, web3Key, expDeployment)).Should(util.NotFoundMatcher{}) + + checkApp := &v1beta1.Application{} + Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) + web1Key := types.NamespacedName{Namespace: ns.Name, Name: "myweb1"} + Expect(k8sClient.Get(ctx, web1Key, expDeployment)).Should(BeNil()) + + expDeployment.Status.Replicas = 1 + expDeployment.Status.ReadyReplicas = 1 + Expect(k8sClient.Status().Update(ctx, expDeployment)).Should(BeNil()) + + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + + Expect(k8sClient.Get(ctx, web2Key, expDeployment)).Should(util.NotFoundMatcher{}) + Expect(k8sClient.Get(ctx, web3Key, expDeployment)).Should(BeNil()) + expDeployment.Status.Replicas = 1 + expDeployment.Status.ReadyReplicas = 1 + Expect(k8sClient.Status().Update(ctx, expDeployment)).Should(BeNil()) + + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + + Expect(k8sClient.Get(ctx, web2Key, expDeployment)).Should(BeNil()) + expDeployment.Status.Replicas = 1 + expDeployment.Status.ReadyReplicas = 1 + Expect(k8sClient.Status().Update(ctx, expDeployment)).Should(BeNil()) + + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + testutil.ReconcileOnce(reconciler, reconcile.Request{NamespacedName: appKey}) + checkApp = &v1beta1.Application{} + Expect(k8sClient.Get(ctx, appKey, checkApp)).Should(BeNil()) + Expect(checkApp.Status.Phase).Should(BeEquivalentTo(common.ApplicationRunning)) + }) + It("application with input/output run as dag workflow", func() { ns := corev1.Namespace{ ObjectMeta: metav1.ObjectMeta{