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 })