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  }