github.com/1aal/kubeblocks@v0.0.0-20231107070852-e1c03e598921/pkg/configuration/core/configtemplate_util.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 appsv1alpha1 "github.com/1aal/kubeblocks/apis/apps/v1alpha1" 24 ) 25 26 type ComponentsType interface { 27 appsv1alpha1.ClusterComponentVersion | appsv1alpha1.ClusterComponentDefinition | appsv1alpha1.ClusterComponentSpec 28 } 29 30 type filterFn[T ComponentsType] func(o T) bool 31 32 func filter[T ComponentsType](components []T, f filterFn[T]) *T { 33 for _, c := range components { 34 if f(c) { 35 return &c 36 } 37 } 38 return nil 39 } 40 41 // GetConfigTemplatesFromComponent returns ConfigTemplate list used by the component 42 func GetConfigTemplatesFromComponent( 43 cComponents []appsv1alpha1.ClusterComponentSpec, 44 dComponents []appsv1alpha1.ClusterComponentDefinition, 45 aComponents []appsv1alpha1.ClusterComponentVersion, 46 componentName string) ([]appsv1alpha1.ComponentConfigSpec, error) { 47 findCompTypeByName := func(comName string) *appsv1alpha1.ClusterComponentSpec { 48 return filter(cComponents, func(o appsv1alpha1.ClusterComponentSpec) bool { 49 return o.Name == comName 50 }) 51 } 52 53 cCom := findCompTypeByName(componentName) 54 if cCom == nil { 55 return nil, MakeError("failed to find component[%s]", componentName) 56 } 57 aCom := filter(aComponents, func(o appsv1alpha1.ClusterComponentVersion) bool { 58 return o.ComponentDefRef == cCom.ComponentDefRef 59 }) 60 dCom := filter(dComponents, func(o appsv1alpha1.ClusterComponentDefinition) bool { 61 return o.Name == cCom.ComponentDefRef 62 }) 63 64 var ( 65 cvConfigSpecs []appsv1alpha1.ComponentConfigSpec 66 cdConfigSpecs []appsv1alpha1.ComponentConfigSpec 67 ) 68 69 if aCom != nil { 70 cvConfigSpecs = aCom.ConfigSpecs 71 } 72 if dCom != nil { 73 cdConfigSpecs = dCom.ConfigSpecs 74 } 75 76 return MergeConfigTemplates(cvConfigSpecs, cdConfigSpecs), nil 77 } 78 79 // MergeConfigTemplates merges ClusterVersion.ComponentDefs[*].ConfigTemplateRefs and ClusterDefinition.ComponentDefs[*].ConfigTemplateRefs 80 func MergeConfigTemplates(cvConfigSpecs []appsv1alpha1.ComponentConfigSpec, 81 cdConfigSpecs []appsv1alpha1.ComponentConfigSpec) []appsv1alpha1.ComponentConfigSpec { 82 if len(cvConfigSpecs) == 0 { 83 return cdConfigSpecs 84 } 85 86 if len(cdConfigSpecs) == 0 { 87 return cvConfigSpecs 88 } 89 90 mergedCfgTpl := make([]appsv1alpha1.ComponentConfigSpec, 0, len(cvConfigSpecs)+len(cdConfigSpecs)) 91 mergedTplMap := make(map[string]struct{}, cap(mergedCfgTpl)) 92 93 for _, configSpec := range cvConfigSpecs { 94 tplName := configSpec.Name 95 if _, ok := (mergedTplMap)[tplName]; ok { 96 // It's been checked in validation webhook 97 continue 98 } 99 mergedCfgTpl = append(mergedCfgTpl, configSpec) 100 mergedTplMap[tplName] = struct{}{} 101 } 102 103 for _, configSpec := range cdConfigSpecs { 104 // ClusterVersion replaces clusterDefinition 105 tplName := configSpec.Name 106 if _, ok := (mergedTplMap)[tplName]; ok { 107 continue 108 } 109 mergedCfgTpl = append(mergedCfgTpl, configSpec) 110 mergedTplMap[tplName] = struct{}{} 111 } 112 113 return mergedCfgTpl 114 } 115 116 func IsSupportConfigFileReconfigure(configTemplateSpec appsv1alpha1.ComponentConfigSpec, configFileKey string) bool { 117 if len(configTemplateSpec.Keys) == 0 { 118 return true 119 } 120 for _, keySelector := range configTemplateSpec.Keys { 121 if keySelector == configFileKey { 122 return true 123 } 124 } 125 return false 126 }