github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/configuration/core/configtemplate_util_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 core 21 22 import ( 23 "testing" 24 25 "github.com/stretchr/testify/require" 26 27 appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1" 28 ) 29 30 func TestMergeConfigTemplates(t *testing.T) { 31 type args struct { 32 cvTpl []appsv1alpha1.ComponentConfigSpec 33 cdTpl []appsv1alpha1.ComponentConfigSpec 34 } 35 tests := []struct { 36 name string 37 args args 38 want []appsv1alpha1.ComponentConfigSpec 39 }{{ 40 name: "merge_configtpl_test", 41 args: args{ 42 cvTpl: nil, 43 cdTpl: nil, 44 }, 45 want: nil, 46 }, { 47 name: "merge_configtpl_test", 48 args: args{ 49 cvTpl: []appsv1alpha1.ComponentConfigSpec{{ 50 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 51 Name: "test1", 52 TemplateRef: "tpl1", 53 VolumeName: "test1", 54 }}, { 55 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 56 Name: "test2", 57 TemplateRef: "tpl2", 58 VolumeName: "test2", 59 }}}, 60 cdTpl: nil, 61 }, 62 want: []appsv1alpha1.ComponentConfigSpec{{ 63 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 64 Name: "test1", 65 TemplateRef: "tpl1", 66 VolumeName: "test1", 67 }}, { 68 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 69 Name: "test2", 70 TemplateRef: "tpl2", 71 VolumeName: "test2", 72 }}}, 73 }, { 74 name: "merge_configtpl_test", 75 args: args{ 76 cvTpl: nil, 77 cdTpl: []appsv1alpha1.ComponentConfigSpec{{ 78 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 79 Name: "test1", 80 TemplateRef: "tpl1", 81 VolumeName: "test1", 82 }}, { 83 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 84 Name: "test2", 85 TemplateRef: "tpl2", 86 VolumeName: "test2", 87 }}}, 88 }, 89 want: []appsv1alpha1.ComponentConfigSpec{{ 90 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 91 Name: "test1", 92 TemplateRef: "tpl1", 93 VolumeName: "test1", 94 }}, { 95 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 96 Name: "test2", 97 TemplateRef: "tpl2", 98 VolumeName: "test2", 99 }}}, 100 }, { 101 name: "merge_configtpl_test", 102 args: args{ 103 cvTpl: []appsv1alpha1.ComponentConfigSpec{{ 104 // update volume 105 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 106 Name: "tpl1", 107 TemplateRef: "config1_new", 108 VolumeName: "volume1", 109 }}, { 110 // add volume 111 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 112 Name: "tpl2", 113 TemplateRef: "config2_new", 114 VolumeName: "volume2", 115 }}}, 116 cdTpl: []appsv1alpha1.ComponentConfigSpec{{ 117 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 118 Name: "tpl1", 119 TemplateRef: "config1", 120 VolumeName: "volume1", 121 }}, { 122 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 123 Name: "tpl3", 124 TemplateRef: "config3", 125 VolumeName: "volume3", 126 }}}, 127 }, 128 want: []appsv1alpha1.ComponentConfigSpec{ 129 { 130 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 131 Name: "tpl1", 132 TemplateRef: "config1_new", 133 VolumeName: "volume1", 134 }}, { 135 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 136 Name: "tpl2", 137 TemplateRef: "config2_new", 138 VolumeName: "volume2", 139 }}, { 140 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 141 Name: "tpl3", 142 TemplateRef: "config3", 143 VolumeName: "volume3", 144 }}}, 145 }} 146 147 for _, tt := range tests { 148 got := MergeConfigTemplates(tt.args.cvTpl, tt.args.cdTpl) 149 require.EqualValues(t, tt.want, got) 150 } 151 } 152 153 func TestGetConfigTemplatesFromComponent(t *testing.T) { 154 var ( 155 comName = "replicats_name" 156 comType = "replicats" 157 cComponents = []appsv1alpha1.ClusterComponentSpec{{ 158 Name: comName, 159 ComponentDefRef: comType, 160 }} 161 tpl1 = appsv1alpha1.ComponentConfigSpec{ 162 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 163 Name: "tpl1", 164 TemplateRef: "cm1", 165 VolumeName: "volum1", 166 }} 167 tpl2 = appsv1alpha1.ComponentConfigSpec{ 168 ComponentTemplateSpec: appsv1alpha1.ComponentTemplateSpec{ 169 Name: "tpl2", 170 TemplateRef: "cm2", 171 VolumeName: "volum2", 172 }} 173 ) 174 175 type args struct { 176 cComponents []appsv1alpha1.ClusterComponentSpec 177 dComponents []appsv1alpha1.ClusterComponentDefinition 178 aComponents []appsv1alpha1.ClusterComponentVersion 179 comName string 180 } 181 tests := []struct { 182 name string 183 args args 184 want []appsv1alpha1.ComponentConfigSpec 185 wantErr bool 186 }{{ 187 name: "normal_test", 188 args: args{ 189 comName: comName, 190 cComponents: cComponents, 191 dComponents: []appsv1alpha1.ClusterComponentDefinition{{ 192 Name: comType, 193 ConfigSpecs: []appsv1alpha1.ComponentConfigSpec{tpl1}, 194 }}, 195 aComponents: []appsv1alpha1.ClusterComponentVersion{{ 196 ComponentDefRef: comType, 197 ConfigSpecs: []appsv1alpha1.ComponentConfigSpec{tpl2}, 198 }}, 199 }, 200 want: []appsv1alpha1.ComponentConfigSpec{ 201 tpl2, 202 tpl1, 203 }, 204 wantErr: false, 205 }, { 206 name: "failed_test", 207 args: args{ 208 comName: "not exist component", 209 cComponents: cComponents, 210 dComponents: []appsv1alpha1.ClusterComponentDefinition{{ 211 Name: comType, 212 ConfigSpecs: []appsv1alpha1.ComponentConfigSpec{tpl1}, 213 }}, 214 aComponents: []appsv1alpha1.ClusterComponentVersion{{ 215 ComponentDefRef: comType, 216 ConfigSpecs: []appsv1alpha1.ComponentConfigSpec{tpl2}, 217 }}, 218 }, 219 want: nil, 220 wantErr: true, 221 }, { 222 name: "not_exist_and_not_failed", 223 args: args{ 224 comName: comName, 225 cComponents: cComponents, 226 dComponents: []appsv1alpha1.ClusterComponentDefinition{{ 227 Name: comType, 228 ConfigSpecs: []appsv1alpha1.ComponentConfigSpec{tpl1}, 229 }}, 230 aComponents: []appsv1alpha1.ClusterComponentVersion{{ 231 ComponentDefRef: "not exist", 232 ConfigSpecs: []appsv1alpha1.ComponentConfigSpec{tpl2}, 233 }, 234 }}, 235 want: []appsv1alpha1.ComponentConfigSpec{ 236 tpl1, 237 }, 238 wantErr: false, 239 }} 240 241 for _, tt := range tests { 242 got, err := GetConfigTemplatesFromComponent( 243 tt.args.cComponents, 244 tt.args.dComponents, 245 tt.args.aComponents, 246 tt.args.comName) 247 require.Equal(t, err != nil, tt.wantErr) 248 require.EqualValues(t, got, tt.want) 249 } 250 } 251 252 func TestIsSupportConfigFileReconfigure(t *testing.T) { 253 mockTemplateSpec := func() appsv1alpha1.ComponentTemplateSpec { 254 return appsv1alpha1.ComponentTemplateSpec{ 255 Name: "tpl", 256 TemplateRef: "config", 257 VolumeName: "volume", 258 } 259 } 260 261 type args struct { 262 configTemplateSpec appsv1alpha1.ComponentConfigSpec 263 configFileKey string 264 } 265 tests := []struct { 266 name string 267 args args 268 want bool 269 }{{ 270 name: "not_key_test", 271 args: args{ 272 configTemplateSpec: appsv1alpha1.ComponentConfigSpec{ 273 ConfigConstraintRef: "cc", 274 ComponentTemplateSpec: mockTemplateSpec(), 275 }, 276 configFileKey: "test_config", 277 }, 278 want: true, 279 }, { 280 name: "not_exit_key_test", 281 args: args{ 282 configTemplateSpec: appsv1alpha1.ComponentConfigSpec{ 283 ConfigConstraintRef: "cc", 284 ComponentTemplateSpec: mockTemplateSpec(), 285 Keys: []string{"config1", "config2"}, 286 }, 287 configFileKey: "test_config", 288 }, 289 want: false, 290 }, { 291 name: "exit_key_test", 292 args: args{ 293 configTemplateSpec: appsv1alpha1.ComponentConfigSpec{ 294 ConfigConstraintRef: "cc", 295 ComponentTemplateSpec: mockTemplateSpec(), 296 Keys: []string{"test_config", "config2"}, 297 }, 298 configFileKey: "test_config", 299 }, 300 want: true, 301 }} 302 for _, tt := range tests { 303 t.Run(tt.name, func(t *testing.T) { 304 if got := IsSupportConfigFileReconfigure(tt.args.configTemplateSpec, tt.args.configFileKey); got != tt.want { 305 t.Errorf("IsSupportConfigFileReconfigure() = %v, want %v", got, tt.want) 306 } 307 }) 308 } 309 }