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  }