github.com/oam-dev/kubevela@v1.9.11/pkg/rollout/rollout_test.go (about) 1 /* 2 Copyright 2021 The KubeVela Authors. 3 4 Licensed under the Apache License, Version 2.0 (the "License"); 5 you may not use this file except in compliance with the License. 6 You may obtain a copy of the License at 7 8 http://www.apache.org/licenses/LICENSE-2.0 9 10 Unless required by applicable law or agreed to in writing, software 11 distributed under the License is distributed on an "AS IS" BASIS, 12 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 See the License for the specific language governing permissions and 14 limitations under the License. 15 */ 16 17 package rollout 18 19 import ( 20 "context" 21 22 . "github.com/onsi/ginkgo/v2" 23 . "github.com/onsi/gomega" 24 kruisev1alpha1 "github.com/openkruise/rollouts/api/v1alpha1" 25 v1 "k8s.io/api/core/v1" 26 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 27 "k8s.io/apimachinery/pkg/types" 28 "k8s.io/utils/pointer" 29 30 "github.com/oam-dev/kubevela/apis/core.oam.dev/common" 31 "github.com/oam-dev/kubevela/apis/core.oam.dev/v1beta1" 32 "github.com/oam-dev/kubevela/pkg/oam" 33 "github.com/oam-dev/kubevela/pkg/oam/util" 34 ) 35 36 var _ = Describe("Kruise rollout test", func() { 37 ctx := context.Background() 38 BeforeEach(func() { 39 Expect(k8sClient.Create(ctx, rollout.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{})) 40 Expect(k8sClient.Create(ctx, rt.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{})) 41 Expect(k8sClient.Create(ctx, app.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{})) 42 Expect(k8sClient.Create(ctx, rollingReleaseRollout.DeepCopy())).Should(SatisfyAny(BeNil(), util.AlreadyExistMatcher{})) 43 }) 44 45 It("test get associated rollout func", func() { 46 rollouts, err := getAssociatedRollouts(ctx, k8sClient, &app, false) 47 Expect(err).Should(BeNil()) 48 // test will only fetch one rollout in result 49 Expect(len(rollouts)).Should(BeEquivalentTo(1)) 50 }) 51 52 It("Suspend rollout", func() { 53 r := kruisev1alpha1.Rollout{} 54 Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "my-rollout"}, &r)).Should(BeNil()) 55 r.Status.Phase = kruisev1alpha1.RolloutPhaseProgressing 56 Expect(k8sClient.Status().Update(ctx, &r)).Should(BeNil()) 57 Expect(SuspendRollout(ctx, k8sClient, &app, nil)) 58 Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "my-rollout"}, &r)) 59 Expect(r.Spec.Strategy.Paused).Should(BeEquivalentTo(true)) 60 }) 61 62 It("Resume rollout", func() { 63 r := kruisev1alpha1.Rollout{} 64 Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "my-rollout"}, &r)).Should(BeNil()) 65 Expect(r.Spec.Strategy.Paused).Should(BeEquivalentTo(true)) 66 Expect(ResumeRollout(ctx, k8sClient, &app, nil)) 67 Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "my-rollout"}, &r)) 68 Expect(r.Spec.Strategy.Paused).Should(BeEquivalentTo(false)) 69 }) 70 71 It("Rollback rollout", func() { 72 r := kruisev1alpha1.Rollout{} 73 Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "my-rollout"}, &r)).Should(BeNil()) 74 r.Spec.Strategy.Paused = true 75 Expect(k8sClient.Update(ctx, &r)).Should(BeNil()) 76 Expect(RollbackRollout(ctx, k8sClient, &app, nil)) 77 Expect(k8sClient.Get(ctx, types.NamespacedName{Namespace: "default", Name: "my-rollout"}, &r)) 78 Expect(r.Spec.Strategy.Paused).Should(BeEquivalentTo(false)) 79 }) 80 }) 81 82 var app = v1beta1.Application{ 83 TypeMeta: metav1.TypeMeta{ 84 APIVersion: "core.oam.dev/v1beta1", 85 Kind: "Application", 86 }, 87 ObjectMeta: metav1.ObjectMeta{ 88 Name: "rollout-app", 89 Namespace: "default", 90 Generation: 1, 91 }, 92 Spec: v1beta1.ApplicationSpec{ 93 Components: []common.ApplicationComponent{}, 94 }, 95 } 96 97 var rt = v1beta1.ResourceTracker{ 98 TypeMeta: metav1.TypeMeta{ 99 APIVersion: "core.oam.dev/v1beta1", 100 Kind: "ResourceTracker", 101 }, 102 ObjectMeta: metav1.ObjectMeta{ 103 Name: "rollout-app", 104 Labels: map[string]string{ 105 "app.oam.dev/appRevision": "rollout-app-v1", 106 "app.oam.dev/name": "rollout-app", 107 "app.oam.dev/namespace": "default", 108 }, 109 }, 110 Spec: v1beta1.ResourceTrackerSpec{ 111 ApplicationGeneration: 1, 112 Type: v1beta1.ResourceTrackerTypeVersioned, 113 ManagedResources: []v1beta1.ManagedResource{ 114 { 115 ClusterObjectReference: common.ClusterObjectReference{ 116 ObjectReference: v1.ObjectReference{ 117 APIVersion: "rollouts.kruise.io/v1alpha1", 118 Kind: "Rollout", 119 Name: "my-rollout", 120 Namespace: "default", 121 }, 122 }, 123 OAMObjectReference: common.OAMObjectReference{ 124 Component: "my-rollout", 125 }, 126 }, 127 { 128 ClusterObjectReference: common.ClusterObjectReference{ 129 ObjectReference: v1.ObjectReference{ 130 APIVersion: "rollouts.kruise.io/v1alpha1", 131 Kind: "Rollout", 132 Name: "rolling-release-rollout", 133 Namespace: "default", 134 }, 135 }, 136 OAMObjectReference: common.OAMObjectReference{ 137 Component: "my-rollout", 138 }, 139 }, 140 }, 141 }, 142 } 143 144 var rollout = kruisev1alpha1.Rollout{ 145 TypeMeta: metav1.TypeMeta{ 146 APIVersion: "rollouts.kruise.io/v1alpha1", 147 Kind: "Rollout", 148 }, 149 ObjectMeta: metav1.ObjectMeta{ 150 Name: "my-rollout", 151 Namespace: "default", 152 }, 153 Spec: kruisev1alpha1.RolloutSpec{ 154 ObjectRef: kruisev1alpha1.ObjectRef{ 155 WorkloadRef: &kruisev1alpha1.WorkloadRef{ 156 APIVersion: "appsv1", 157 Kind: "Deployment", 158 Name: "canary-demo", 159 }, 160 }, 161 Strategy: kruisev1alpha1.RolloutStrategy{ 162 Canary: &kruisev1alpha1.CanaryStrategy{ 163 Steps: []kruisev1alpha1.CanaryStep{ 164 { 165 Weight: pointer.Int32(30), 166 }, 167 }, 168 }, 169 Paused: false, 170 }, 171 }, 172 } 173 174 var rollingReleaseRollout = kruisev1alpha1.Rollout{ 175 TypeMeta: metav1.TypeMeta{ 176 APIVersion: "rollouts.kruise.io/v1alpha1", 177 Kind: "Rollout", 178 }, 179 ObjectMeta: metav1.ObjectMeta{ 180 Name: "rolling-release-rollout", 181 Namespace: "default", 182 Annotations: map[string]string{ 183 oam.AnnotationSkipResume: "true", 184 }, 185 }, 186 Spec: kruisev1alpha1.RolloutSpec{ 187 ObjectRef: kruisev1alpha1.ObjectRef{ 188 WorkloadRef: &kruisev1alpha1.WorkloadRef{ 189 APIVersion: "appsv1", 190 Kind: "Deployment", 191 Name: "canary-demo", 192 }, 193 }, 194 Strategy: kruisev1alpha1.RolloutStrategy{ 195 Canary: &kruisev1alpha1.CanaryStrategy{ 196 Steps: []kruisev1alpha1.CanaryStep{ 197 { 198 Weight: pointer.Int32(30), 199 }, 200 }, 201 }, 202 Paused: false, 203 }, 204 }, 205 }