mirror of https://github.com/kubevela/kubevela.git
				
				
				
			
		
			
				
	
	
		
			216 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.3 KiB
		
	
	
	
		
			Go
		
	
	
	
| /*
 | |
| Copyright 2021 The KubeVela Authors.
 | |
| 
 | |
| Licensed under the Apache License, Version 2.0 (the "License");
 | |
| you may not use this file except in compliance with the License.
 | |
| You may obtain a copy of the License at
 | |
| 
 | |
|     http://www.apache.org/licenses/LICENSE-2.0
 | |
| 
 | |
| Unless required by applicable law or agreed to in writing, software
 | |
| distributed under the License is distributed on an "AS IS" BASIS,
 | |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | |
| See the License for the specific language governing permissions and
 | |
| limitations under the License.
 | |
| */
 | |
| 
 | |
| package operation
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 
 | |
| 	. "github.com/onsi/ginkgo"
 | |
| 	. "github.com/onsi/gomega"
 | |
| 	kruisev1alpha1 "github.com/openkruise/rollouts/api/v1alpha1"
 | |
| 	v1 "k8s.io/api/core/v1"
 | |
| 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 | |
| 	"k8s.io/apimachinery/pkg/types"
 | |
| 
 | |
| 	"github.com/oam-dev/kubevela/apis/core.oam.dev/common"
 | |
| 	"github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1"
 | |
| 	"github.com/oam-dev/kubevela/pkg/oam"
 | |
| 	"github.com/oam-dev/kubevela/pkg/oam/util"
 | |
| )
 | |
| 
 | |
| var _ = Describe("Kruise rollout test", func() {
 | |
| 	ctx := context.Background()
 | |
| 	BeforeEach(func() {
 | |
| 		Expect(k8sClient.Create(ctx, myRollout.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{}))
 | |
| 		Expect(k8sClient.Create(ctx, rt.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{}))
 | |
| 		Expect(k8sClient.Create(ctx, app.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{}))
 | |
| 	})
 | |
| 
 | |
| 	It("Suspend workflow", func() {
 | |
| 		checkApp := v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		checkApp.Status.Workflow = &common.WorkflowStatus{Suspend: false, StartTime: metav1.Now()}
 | |
| 		Expect(k8sClient.Status().Update(ctx, &checkApp)).Should(BeNil())
 | |
| 		operator := NewWorkflowOperator(k8sClient, nil)
 | |
| 		checkApp = v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		Expect(operator.Suspend(ctx, checkApp.DeepCopy())).Should(BeNil())
 | |
| 		checkApp = v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		Expect(checkApp.Status.Workflow.Suspend).Should(BeEquivalentTo(true))
 | |
| 	})
 | |
| 
 | |
| 	It("Resume workflow", func() {
 | |
| 		checkApp := v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		operator := NewWorkflowOperator(k8sClient, nil)
 | |
| 		Expect(operator.Resume(ctx, &checkApp)).Should(BeNil())
 | |
| 		checkApp = v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		Expect(checkApp.Status.Workflow.Suspend).Should(BeEquivalentTo(false))
 | |
| 	})
 | |
| 
 | |
| 	It("Terminate workflow", func() {
 | |
| 		checkApp := v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		operator := NewWorkflowOperator(k8sClient, nil)
 | |
| 		Expect(operator.Terminate(ctx, &checkApp)).Should(BeNil())
 | |
| 		checkApp = v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		Expect(checkApp.Status.Workflow.Terminated).Should(BeEquivalentTo(true))
 | |
| 	})
 | |
| 
 | |
| 	It("Restart workflow", func() {
 | |
| 		checkApp := v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		operator := NewWorkflowOperator(k8sClient, nil)
 | |
| 		Expect(operator.Restart(ctx, &checkApp)).Should(BeNil())
 | |
| 		checkApp = v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		Expect(checkApp.Status.Workflow).Should(BeNil())
 | |
| 	})
 | |
| 
 | |
| 	It("Rollback workflow", func() {
 | |
| 		Expect(k8sClient.Create(ctx, &appRev)).Should(BeNil())
 | |
| 		checkAppRev := v1beta1.ApplicationRevision{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app-v1"}, &checkAppRev)).Should(BeNil())
 | |
| 		checkAppRev.Status.Succeeded = true
 | |
| 		Expect(k8sClient.Status().Update(ctx, checkAppRev.DeepCopy())).Should(BeNil())
 | |
| 
 | |
| 		checkApp := v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		checkApp.Annotations = map[string]string{
 | |
| 			oam.AnnotationPublishVersion: "v2",
 | |
| 		}
 | |
| 		operator := NewWorkflowOperator(k8sClient, nil)
 | |
| 		Expect(operator.Rollback(ctx, checkApp.DeepCopy())).Should(BeNil())
 | |
| 
 | |
| 		checkApp = v1beta1.Application{}
 | |
| 		Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "opt-app"}, &checkApp)).Should(BeNil())
 | |
| 		// must rollback to v1
 | |
| 		Expect(oam.GetPublishVersion(&checkApp)).Should(BeEquivalentTo("v1"))
 | |
| 		Expect(checkApp.Status.LatestRevision.Name).Should(BeEquivalentTo("opt-app-v1"))
 | |
| 		Expect(checkApp.Status.LatestRevision.Revision).Should(BeEquivalentTo(1))
 | |
| 	})
 | |
| })
 | |
| 
 | |
| var app = v1beta1.Application{
 | |
| 	TypeMeta: metav1.TypeMeta{
 | |
| 		APIVersion: "core.oam.dev/v1beta1",
 | |
| 		Kind:       "Application",
 | |
| 	},
 | |
| 	ObjectMeta: metav1.ObjectMeta{
 | |
| 		Name:       "opt-app",
 | |
| 		Namespace:  "default",
 | |
| 		Generation: 1,
 | |
| 		Labels: map[string]string{
 | |
| 			oam.AnnotationPublishVersion: "v2",
 | |
| 		},
 | |
| 	},
 | |
| 	Spec: v1beta1.ApplicationSpec{
 | |
| 		Components: []common.ApplicationComponent{},
 | |
| 	},
 | |
| }
 | |
| 
 | |
| var rt = v1beta1.ResourceTracker{
 | |
| 	TypeMeta: metav1.TypeMeta{
 | |
| 		APIVersion: "core.oam.dev/v1beta1",
 | |
| 		Kind:       "ResourceTracker",
 | |
| 	},
 | |
| 	ObjectMeta: metav1.ObjectMeta{
 | |
| 		Name: "rollout-app",
 | |
| 		Labels: map[string]string{
 | |
| 			"app.oam.dev/appRevision": "opt-app-v1",
 | |
| 			"app.oam.dev/name":        "opt-app",
 | |
| 			"app.oam.dev/namespace":   "default",
 | |
| 		},
 | |
| 	},
 | |
| 	Spec: v1beta1.ResourceTrackerSpec{
 | |
| 		ApplicationGeneration: 1,
 | |
| 		Type:                  v1beta1.ResourceTrackerTypeVersioned,
 | |
| 		ManagedResources: []v1beta1.ManagedResource{
 | |
| 			{
 | |
| 				ClusterObjectReference: common.ClusterObjectReference{
 | |
| 					ObjectReference: v1.ObjectReference{
 | |
| 						APIVersion: "rollouts.kruise.io/v1alpha1",
 | |
| 						Kind:       "Rollout",
 | |
| 						Name:       "my-rollout",
 | |
| 						Namespace:  "default",
 | |
| 					},
 | |
| 				},
 | |
| 				OAMObjectReference: common.OAMObjectReference{
 | |
| 					Component: "my-rollout",
 | |
| 				},
 | |
| 			},
 | |
| 		},
 | |
| 	},
 | |
| }
 | |
| 
 | |
| var appRev = v1beta1.ApplicationRevision{
 | |
| 	TypeMeta: metav1.TypeMeta{
 | |
| 		APIVersion: "core.oam.dev/v1beta1",
 | |
| 		Kind:       "ApplicationRevision",
 | |
| 	},
 | |
| 	ObjectMeta: metav1.ObjectMeta{
 | |
| 		Name:      "opt-app-v1",
 | |
| 		Namespace: "default",
 | |
| 		Labels: map[string]string{
 | |
| 			"app.oam.dev/name": "opt-app",
 | |
| 		},
 | |
| 		Annotations: map[string]string{
 | |
| 			oam.AnnotationPublishVersion: "v1",
 | |
| 		},
 | |
| 	},
 | |
| 	Spec: v1beta1.ApplicationRevisionSpec{
 | |
| 		Application: v1beta1.Application{
 | |
| 			Spec: v1beta1.ApplicationSpec{
 | |
| 				Components: []common.ApplicationComponent{},
 | |
| 			},
 | |
| 		},
 | |
| 	},
 | |
| }
 | |
| 
 | |
| var myRollout = kruisev1alpha1.Rollout{
 | |
| 	TypeMeta: metav1.TypeMeta{
 | |
| 		APIVersion: "rollouts.kruise.io/v1alpha1",
 | |
| 		Kind:       "Rollout",
 | |
| 	},
 | |
| 	ObjectMeta: metav1.ObjectMeta{
 | |
| 		Name:      "my-rollout",
 | |
| 		Namespace: "default",
 | |
| 	},
 | |
| 	Spec: kruisev1alpha1.RolloutSpec{
 | |
| 		ObjectRef: kruisev1alpha1.ObjectRef{
 | |
| 			WorkloadRef: &kruisev1alpha1.WorkloadRef{
 | |
| 				APIVersion: "appsv1",
 | |
| 				Kind:       "Deployment",
 | |
| 				Name:       "canary-demo",
 | |
| 			},
 | |
| 		},
 | |
| 		Strategy: kruisev1alpha1.RolloutStrategy{
 | |
| 			Canary: &kruisev1alpha1.CanaryStrategy{
 | |
| 				Steps: []kruisev1alpha1.CanaryStep{
 | |
| 					{
 | |
| 						Weight: 30,
 | |
| 					},
 | |
| 				},
 | |
| 			},
 | |
| 			Paused: false,
 | |
| 		},
 | |
| 	},
 | |
| }
 |