github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/cli/cmd/clusterversion/set_default_test.go (about)

     1  /*
     2  Copyright (C) 2022-2023 ApeCloud Co., Ltd
     3  
     4  This file is part of KubeBlocks project
     5  
     6  This program is free software: you can redistribute it and/or modify
     7  it under the terms of the GNU Affero General Public License as published by
     8  the Free Software Foundation, either version 3 of the License, or
     9  (at your option) any later version.
    10  
    11  This program is distributed in the hope that it will be useful
    12  but WITHOUT ANY WARRANTY; without even the implied warranty of
    13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    14  GNU Affero General Public License for more details.
    15  
    16  You should have received a copy of the GNU Affero General Public License
    17  along with this program.  If not, see <http://www.gnu.org/licenses/>.
    18  */
    19  
    20  package clusterversion
    21  
    22  import (
    23  	"context"
    24  
    25  	. "github.com/onsi/ginkgo/v2"
    26  	. "github.com/onsi/gomega"
    27  
    28  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    29  	"k8s.io/apimachinery/pkg/runtime"
    30  	"k8s.io/cli-runtime/pkg/genericiooptions"
    31  	"k8s.io/client-go/dynamic"
    32  	"k8s.io/client-go/kubernetes/scheme"
    33  	clientfake "k8s.io/client-go/rest/fake"
    34  	cmdtesting "k8s.io/kubectl/pkg/cmd/testing"
    35  
    36  	appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1"
    37  	"github.com/1aal/kubeblocks/pkg/cli/testing"
    38  	"github.com/1aal/kubeblocks/pkg/constant"
    39  )
    40  
    41  var _ = Describe("set-default", func() {
    42  	var streams genericiooptions.IOStreams
    43  	var tf *cmdtesting.TestFactory
    44  
    45  	const (
    46  		clusterVersion         = testing.ClusterVersionName
    47  		clusterversionInSameCD = testing.ClusterVersionName + "-sameCD"
    48  		ClusterversionOtherCD  = testing.ClusterVersionName + "-other"
    49  		errorClusterversion    = "08jfa2"
    50  	)
    51  
    52  	beginWithMultipleClusterversion := func() {
    53  		tf.FakeDynamicClient = testing.FakeDynamicClient([]runtime.Object{
    54  			&appsv1alpha1.ClusterVersion{
    55  				ObjectMeta: metav1.ObjectMeta{
    56  					Name: clusterVersion,
    57  					Labels: map[string]string{
    58  						constant.ClusterDefLabelKey: testing.ClusterDefName,
    59  					},
    60  				},
    61  			},
    62  			&appsv1alpha1.ClusterVersion{
    63  				ObjectMeta: metav1.ObjectMeta{
    64  					Name: clusterversionInSameCD,
    65  					Labels: map[string]string{
    66  						constant.ClusterDefLabelKey: testing.ClusterDefName,
    67  					},
    68  				},
    69  			},
    70  			&appsv1alpha1.ClusterVersion{
    71  				ObjectMeta: metav1.ObjectMeta{
    72  					Name: ClusterversionOtherCD,
    73  					Labels: map[string]string{
    74  						constant.ClusterDefLabelKey: testing.ClusterDefName + "-other",
    75  					},
    76  				},
    77  			},
    78  		}...)
    79  	}
    80  
    81  	getFakeClusterVersion := func(dynamic dynamic.Interface, clusterVersionName string) (*appsv1alpha1.ClusterVersion, error) {
    82  		var cv appsv1alpha1.ClusterVersion
    83  		u, err := dynamic.Resource(clusterVersionGVR).Get(context.Background(), clusterVersionName, metav1.GetOptions{})
    84  		if err != nil {
    85  			return nil, err
    86  		}
    87  		err = runtime.DefaultUnstructuredConverter.FromUnstructured(u.Object, &cv)
    88  		if err != nil {
    89  			return nil, err
    90  		}
    91  		return &cv, nil
    92  	}
    93  
    94  	var validateSetOrUnsetResult func(needToChecks []string, value []string)
    95  	validateSetOrUnsetResult = func(needToChecks []string, value []string) {
    96  		if len(needToChecks) == 0 {
    97  			return
    98  		}
    99  		cv, err := getFakeClusterVersion(tf.FakeDynamicClient, needToChecks[0])
   100  		Expect(err).Should(Succeed())
   101  		Expect(isDefault(cv)).Should(Equal(value[0]))
   102  		validateSetOrUnsetResult(needToChecks[1:], value[1:])
   103  	}
   104  
   105  	BeforeEach(func() {
   106  		_ = appsv1alpha1.AddToScheme(scheme.Scheme)
   107  		_ = metav1.AddMetaToScheme(scheme.Scheme)
   108  		streams, _, _, _ = genericiooptions.NewTestIOStreams()
   109  		tf = testing.NewTestFactory(testing.Namespace)
   110  		tf.Client = &clientfake.RESTClient{}
   111  		beginWithMultipleClusterversion()
   112  	})
   113  
   114  	It("test isDefault Func", func() {
   115  		cv := testing.FakeClusterVersion()
   116  		Expect(isDefault(cv)).Should(Equal(annotationFalseValue))
   117  		cv.SetAnnotations(map[string]string{
   118  			constant.DefaultClusterVersionAnnotationKey: annotationFalseValue,
   119  		})
   120  		Expect(isDefault(cv)).Should(Equal(annotationFalseValue))
   121  		cv.Annotations[constant.DefaultClusterVersionAnnotationKey] = annotationTrueValue
   122  		Expect(isDefault(cv)).Should(Equal(annotationTrueValue))
   123  	})
   124  
   125  	It("set-default cmd", func() {
   126  		cmd := newSetDefaultCMD(tf, streams)
   127  		Expect(cmd).ShouldNot(BeNil())
   128  	})
   129  
   130  	It("unset-default cmd", func() {
   131  		cmd := newUnSetDefaultCMD(tf, streams)
   132  		Expect(cmd).ShouldNot(BeNil())
   133  	})
   134  
   135  	It("set-default empty args", func() {
   136  		o := newSetOrUnsetDefaultOptions(tf, streams, true)
   137  		Expect(o.validate([]string{})).Should(HaveOccurred())
   138  	})
   139  
   140  	It("set-default error args", func() {
   141  		o := newSetOrUnsetDefaultOptions(tf, streams, true)
   142  		Expect(o.run([]string{errorClusterversion})).Should(HaveOccurred())
   143  	})
   144  
   145  	It("unset-default empty args", func() {
   146  		o := newSetOrUnsetDefaultOptions(tf, streams, false)
   147  		Expect(o.validate([]string{})).Should(HaveOccurred())
   148  	})
   149  
   150  	It("unset-default error args", func() {
   151  		o := newSetOrUnsetDefaultOptions(tf, streams, false)
   152  		Expect(o.run([]string{errorClusterversion})).Should(HaveOccurred())
   153  	})
   154  
   155  	It("set-default and unset-default", func() {
   156  		// before set-default
   157  		validateSetOrUnsetResult([]string{clusterVersion}, []string{annotationFalseValue})
   158  		// set-default
   159  		cmd := newSetDefaultCMD(tf, streams)
   160  		cmd.Run(cmd, []string{clusterVersion})
   161  		validateSetOrUnsetResult([]string{clusterVersion}, []string{annotationTrueValue})
   162  		// unset-default
   163  		cmd = newUnSetDefaultCMD(tf, streams)
   164  		cmd.Run(cmd, []string{clusterVersion})
   165  		validateSetOrUnsetResult([]string{clusterVersion}, []string{annotationFalseValue})
   166  	})
   167  
   168  	It("the clusterDef already has a default cv when set-default", func() {
   169  		cmd := newSetDefaultCMD(tf, streams)
   170  		cmd.Run(cmd, []string{clusterVersion})
   171  		validateSetOrUnsetResult([]string{clusterVersion, clusterversionInSameCD}, []string{annotationTrueValue, annotationFalseValue})
   172  		o := newSetOrUnsetDefaultOptions(tf, streams, true)
   173  		err := o.run([]string{clusterversionInSameCD})
   174  		Expect(err).Should(HaveOccurred())
   175  	})
   176  
   177  	It("set-default args belonging to the same cd", func() {
   178  		o := newSetOrUnsetDefaultOptions(tf, streams, true)
   179  		err := o.run([]string{clusterVersion, clusterVersion})
   180  		Expect(err).Should(HaveOccurred())
   181  	})
   182  
   183  	It("set-default and unset-default multiple args", func() {
   184  		cmd := newSetDefaultCMD(tf, streams)
   185  		validateSetOrUnsetResult([]string{clusterVersion, ClusterversionOtherCD}, []string{annotationFalseValue, annotationFalseValue})
   186  		// set-default
   187  		cmd.Run(cmd, []string{clusterVersion, ClusterversionOtherCD})
   188  		validateSetOrUnsetResult([]string{clusterVersion, ClusterversionOtherCD}, []string{annotationTrueValue, annotationTrueValue})
   189  		// unset-default
   190  		cmd = newUnSetDefaultCMD(tf, streams)
   191  		cmd.Run(cmd, []string{clusterVersion, ClusterversionOtherCD})
   192  		validateSetOrUnsetResult([]string{clusterVersion, ClusterversionOtherCD}, []string{annotationFalseValue, annotationFalseValue})
   193  	})
   194  })