+
parametersSchema
@@ -2168,6 +2277,7 @@ Kubernetes api extensions v1.JSONSchemaProps
(Appears on:ConfigTemplateItemDetail)
+ Deprecated: It is retained for API compatibility with existing ComponentParameter objects.
Payload holds the payload data. This field is optional and can contain any type of data.
Not included in the JSON representation of the object.
@@ -2330,6 +2440,7 @@ This allows users to customize the configuration template according to their spe
ReloadAction defines the mechanisms available for dynamically reloading a process within K8s without requiring a restart.
+ Deprecated: It is retained for API compatibility with existing ParametersDefinition objects.
Only one of the mechanisms can be specified at a time.
@@ -2394,6 +2505,7 @@ reload.
(Appears on:ComponentConfigDescription)
+ Deprecated: It is retained for API compatibility with existing ParamConfigRenderer objects.
RerenderResourceType defines the resource requirements for a component.
diff --git a/pkg/constant/config.go b/pkg/constant/config.go
index 13b6d401512..c53c6a05e53 100644
--- a/pkg/constant/config.go
+++ b/pkg/constant/config.go
@@ -42,6 +42,7 @@ const (
LastAppliedConfigAnnotationKey = "config.kubeblocks.io/last-applied-configuration"
UpgradePolicyAnnotationKey = "config.kubeblocks.io/reconfigure-policy"
ConfigAppliedVersionAnnotationKey = "config.kubeblocks.io/config-applied-version"
+ ParametersAppliedComponentGenerationKey = "parameters.kubeblocks.io/latest-component-generation"
)
const (
diff --git a/pkg/constant/payload.go b/pkg/constant/payload.go
deleted file mode 100644
index 195108a0e09..00000000000
--- a/pkg/constant/payload.go
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-
-package constant
-
-const (
- TLSPayload = "tls"
- ComponentResourcePayload = "componentResource"
- ReplicasPayload = "replicas"
- BinaryVersionPayload = "binaryVersion"
- ShardingPayload = "sharding"
-)
diff --git a/pkg/parameters/config_metadata.go b/pkg/parameters/config_metadata.go
new file mode 100644
index 00000000000..b20f5c7f338
--- /dev/null
+++ b/pkg/parameters/config_metadata.go
@@ -0,0 +1,47 @@
+/*
+Copyright (C) 2022-2025 ApeCloud Co., Ltd
+
+This file is part of KubeBlocks project
+
+This program is free software: you can redistribute it and/or modify
+it under the terms of the GNU Affero General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU Affero General Public License for more details.
+
+You should have received a copy of the GNU Affero General Public License
+along with this program. If not, see .
+*/
+
+package parameters
+
+import (
+ parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
+ "github.com/apecloud/kubeblocks/pkg/generics"
+)
+
+func GetComponentConfigDescription(configs []parametersv1alpha1.ComponentConfigDescription, name string) *parametersv1alpha1.ComponentConfigDescription {
+ match := func(desc parametersv1alpha1.ComponentConfigDescription) bool {
+ return desc.Name == name
+ }
+
+ if index := generics.FindFirstFunc(configs, match); index >= 0 {
+ return &configs[index]
+ }
+ return nil
+}
+
+func GetComponentConfigDescriptions(configs []parametersv1alpha1.ComponentConfigDescription, tpl string) []parametersv1alpha1.ComponentConfigDescription {
+ match := func(desc parametersv1alpha1.ComponentConfigDescription) bool {
+ return desc.TemplateName == tpl
+ }
+ return generics.FindFunc(configs, match)
+}
+
+func HasValidParameterTemplate(configs []parametersv1alpha1.ComponentConfigDescription) bool {
+ return len(configs) != 0
+}
diff --git a/pkg/parameters/config_util.go b/pkg/parameters/config_util.go
index 364cee97f72..83cc44894ee 100644
--- a/pkg/parameters/config_util.go
+++ b/pkg/parameters/config_util.go
@@ -30,7 +30,6 @@ import (
"github.com/StudioSol/set"
corev1 "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/types"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/log"
@@ -137,11 +136,10 @@ func fromUpdatedConfig(m map[string]string, sets *set.LinkedHashSetString) map[s
}
// IsApplyUpdatedParameters checks if the configuration is changed
-func IsApplyUpdatedParameters(configMap *corev1.ConfigMap, item parametersv1alpha1.ConfigTemplateItemDetail) bool {
+func IsApplyUpdatedParameters(configMap *corev1.ConfigMap, item parametersv1alpha1.ConfigTemplateItemDetail, compGeneration int64) bool {
if configMap == nil {
return false
}
-
lastAppliedVersion, ok := configMap.Annotations[constant.ConfigAppliedVersionAnnotationKey]
if !ok {
return false
@@ -150,37 +148,28 @@ func IsApplyUpdatedParameters(configMap *corev1.ConfigMap, item parametersv1alph
if err := json.Unmarshal([]byte(lastAppliedVersion), &lastItem); err != nil {
return false
}
- return reflect.DeepEqual(lastItem, item)
-}
-
-// IsRerender checks if the configuration template is changed
-func IsRerender(configMap *corev1.ConfigMap, item parametersv1alpha1.ConfigTemplateItemDetail) bool {
- if configMap == nil {
+ if !reflect.DeepEqual(lastItem, item) {
+ return false
+ }
+ if compGeneration == 0 {
return true
}
- if len(item.Payload) == 0 && item.CustomTemplates == nil {
+ appliedGeneration, ok := configMap.Annotations[constant.ParametersAppliedComponentGenerationKey]
+ if !ok || appliedGeneration == "" {
return false
}
-
- var updatedVersion parametersv1alpha1.ConfigTemplateItemDetail
- updatedVersionStr, ok := configMap.Annotations[constant.ConfigAppliedVersionAnnotationKey]
- if ok && updatedVersionStr != "" {
- if err := json.Unmarshal([]byte(updatedVersionStr), &updatedVersion); err != nil {
- return false
- }
- }
- return !reflect.DeepEqual(updatedVersion.Payload, item.Payload) ||
- !reflect.DeepEqual(updatedVersion.CustomTemplates, item.CustomTemplates)
+ return appliedGeneration == strconv.FormatInt(compGeneration, 10)
}
// GetUpdatedParametersReconciledPhase gets the configuration phase
func GetUpdatedParametersReconciledPhase(configMap *corev1.ConfigMap,
item parametersv1alpha1.ConfigTemplateItemDetail,
- status *parametersv1alpha1.ConfigTemplateItemDetailStatus) parametersv1alpha1.ParameterPhase {
+ status *parametersv1alpha1.ConfigTemplateItemDetailStatus,
+ compGeneration int64) parametersv1alpha1.ParameterPhase {
if status == nil || status.Phase == "" {
return parametersv1alpha1.CCreatingPhase
}
- if !IsApplyUpdatedParameters(configMap, item) {
+ if !IsApplyUpdatedParameters(configMap, item, compGeneration) {
return parametersv1alpha1.CPendingPhase
}
if status.Phase == parametersv1alpha1.CFinishedPhase {
@@ -193,51 +182,6 @@ func GetUpdatedParametersReconciledPhase(configMap *corev1.ConfigMap,
return status.Phase
}
-func CheckAndPatchPayload(item *parametersv1alpha1.ConfigTemplateItemDetail, payloadID string, payload interface{}) (bool, error) {
- if item == nil {
- return false, nil
- }
- if item.Payload == nil {
- item.Payload = make(map[string]json.RawMessage)
- }
- oldPayload, ok := item.Payload[payloadID]
- if !ok && payload == nil {
- return false, nil
- }
- if payload == nil {
- delete(item.Payload, payloadID)
- return true, nil
- }
- newPayload, err := buildPayloadAsUnstructuredObject(payload)
- if err != nil {
- return false, err
- }
- if oldPayload != nil && reflect.DeepEqual(oldPayload, newPayload) {
- return false, nil
- }
- item.Payload[payloadID] = newPayload
- return true, nil
-}
-
-func buildPayloadAsUnstructuredObject(payload interface{}) (json.RawMessage, error) {
- b, err := json.Marshal(payload)
- if err != nil {
- return nil, err
- }
- return b, nil
-}
-
-func ResourcesPayloadForComponent(resources corev1.ResourceRequirements) any {
- if len(resources.Requests) == 0 && len(resources.Limits) == 0 {
- return nil
- }
-
- return map[string]any{
- "limits": resources.Limits,
- "requests": resources.Requests,
- }
-}
-
func resolveParametersDef(paramsDefs []*parametersv1alpha1.ParametersDefinition, fileName string) *parametersv1alpha1.ParametersDefinition {
pos := generics.FindFirstFunc(paramsDefs, func(paramsDef *parametersv1alpha1.ParametersDefinition) bool {
return paramsDef.Spec.FileName == fileName
@@ -264,16 +208,89 @@ func filterImmutableParameters(parameters map[string]any, fileName string, param
return validParameters
}
-func ResolveCmpdParametersDefs(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (*parametersv1alpha1.ParamConfigRenderer, []*parametersv1alpha1.ParametersDefinition, error) {
+func ResolveCmpdParametersDefs(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) ([]parametersv1alpha1.ComponentConfigDescription, []*parametersv1alpha1.ParametersDefinition, error) {
+ paramsDefList := ¶metersv1alpha1.ParametersDefinitionList{}
+ if err := reader.List(ctx, paramsDefList); err != nil {
+ return nil, nil, err
+ }
+
+ slices.SortFunc(paramsDefList.Items, func(a, b parametersv1alpha1.ParametersDefinition) int {
+ if cmp := strings.Compare(b.Spec.ComponentDef, a.Spec.ComponentDef); cmp != 0 {
+ return cmp
+ }
+ if cmp := strings.Compare(a.Spec.TemplateName, b.Spec.TemplateName); cmp != 0 {
+ return cmp
+ }
+ if cmp := strings.Compare(a.Spec.FileName, b.Spec.FileName); cmp != 0 {
+ return cmp
+ }
+ return strings.Compare(a.Name, b.Name)
+ })
+
var paramsDefs []*parametersv1alpha1.ParametersDefinition
+ configDescs := make([]parametersv1alpha1.ComponentConfigDescription, 0, len(paramsDefList.Items))
+ coveredFiles := make(map[string]string)
+ for i := range paramsDefList.Items {
+ paramsDef := ¶msDefList.Items[i]
+ matched, err := matchParametersDefinition(cmpd, paramsDef)
+ if err != nil {
+ return nil, nil, err
+ }
+ if !matched {
+ continue
+ }
+ if paramsDef.Status.Phase != parametersv1alpha1.PDAvailablePhase {
+ return nil, nil, fmt.Errorf("the referenced ParametersDefinition is unavailable: %s", paramsDef.Name)
+ }
+ if err := validateMatchedParametersDefinition(paramsDef); err != nil {
+ return nil, nil, err
+ }
+ if existing, ok := coveredFiles[paramsDef.Spec.FileName]; ok {
+ return nil, nil, fmt.Errorf("config file[%s] has been defined in other parametersdefinition[%s]", paramsDef.Spec.FileName, existing)
+ }
+ coveredFiles[paramsDef.Spec.FileName] = paramsDef.Name
+ paramsDefs = append(paramsDefs, paramsDef)
+ configDescs = append(configDescs, parametersv1alpha1.ComponentConfigDescription{
+ Name: paramsDef.Spec.FileName,
+ TemplateName: paramsDef.Spec.TemplateName,
+ FileFormatConfig: paramsDef.Spec.FileFormatConfig.DeepCopy(),
+ })
+ }
+
+ legacyConfigDescs, legacyParamsDefs, err := resolveCmpdParametersDefsByConfigRender(ctx, reader, cmpd)
+ if err != nil {
+ return nil, nil, err
+ }
+ legacyConfigFiles := make(map[string]struct{}, len(legacyConfigDescs))
+ for _, legacyConfigDesc := range legacyConfigDescs {
+ if _, ok := coveredFiles[legacyConfigDesc.Name]; ok {
+ continue
+ }
+ configDescs = append(configDescs, legacyConfigDesc)
+ legacyConfigFiles[legacyConfigDesc.Name] = struct{}{}
+ }
+ for _, legacyParamsDef := range legacyParamsDefs {
+ if _, ok := legacyConfigFiles[legacyParamsDef.Spec.FileName]; !ok {
+ continue
+ }
+ paramsDefs = append(paramsDefs, legacyParamsDef)
+ }
+ if len(paramsDefs) == 0 {
+ return nil, nil, nil
+ }
+ return configDescs, paramsDefs, nil
+}
+func resolveCmpdParametersDefsByConfigRender(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) ([]parametersv1alpha1.ComponentConfigDescription, []*parametersv1alpha1.ParametersDefinition, error) {
configRender, err := ResolveComponentConfigRender(ctx, reader, cmpd)
if err != nil {
return nil, nil, err
}
if configRender == nil || len(configRender.Spec.ParametersDefs) == 0 {
- return configRender, nil, nil
+ return nil, nil, nil
}
+
+ paramsDefs := make([]*parametersv1alpha1.ParametersDefinition, 0, len(configRender.Spec.ParametersDefs))
for _, defName := range configRender.Spec.ParametersDefs {
paramsDef := ¶metersv1alpha1.ParametersDefinition{}
if err = reader.Get(ctx, client.ObjectKey{Name: defName}, paramsDef); err != nil {
@@ -284,7 +301,49 @@ func ResolveCmpdParametersDefs(ctx context.Context, reader client.Reader, cmpd *
}
paramsDefs = append(paramsDefs, paramsDef)
}
- return configRender, paramsDefs, nil
+ return slices.Clone(configRender.Spec.Configs), paramsDefs, nil
+}
+
+func matchParametersDefinition(cmpd *appsv1.ComponentDefinition, paramsDef *parametersv1alpha1.ParametersDefinition) (bool, error) {
+ if cmpd == nil || paramsDef == nil {
+ return false, nil
+ }
+ pattern := paramsDef.Spec.ComponentDef
+ if pattern == "" {
+ return false, nil
+ }
+ if !component.PrefixOrRegexMatched(cmpd.Name, pattern) {
+ return false, nil
+ }
+ return paramsDef.Spec.ServiceVersion == "" || paramsDef.Spec.ServiceVersion == cmpd.Spec.ServiceVersion, nil
+}
+
+func validateMatchedParametersDefinition(paramsDef *parametersv1alpha1.ParametersDefinition) error {
+ if paramsDef.Spec.TemplateName == "" {
+ return fmt.Errorf("parametersdefinition[%s] misses templateName", paramsDef.Name)
+ }
+ if paramsDef.Spec.FileName == "" {
+ return fmt.Errorf("parametersdefinition[%s] misses fileName", paramsDef.Name)
+ }
+ if paramsDef.Spec.FileFormatConfig == nil {
+ return fmt.Errorf("parametersdefinition[%s] misses fileFormatConfig", paramsDef.Name)
+ }
+ return nil
+}
+
+func BuildConfigDescriptionsFromParametersDefs(paramsDefs []*parametersv1alpha1.ParametersDefinition) []parametersv1alpha1.ComponentConfigDescription {
+ if len(paramsDefs) == 0 {
+ return nil
+ }
+ configs := make([]parametersv1alpha1.ComponentConfigDescription, 0, len(paramsDefs))
+ for _, paramsDef := range paramsDefs {
+ configs = append(configs, parametersv1alpha1.ComponentConfigDescription{
+ Name: paramsDef.Spec.FileName,
+ TemplateName: paramsDef.Spec.TemplateName,
+ FileFormatConfig: paramsDef.Spec.FileFormatConfig.DeepCopy(),
+ })
+ }
+ return configs
}
func ResolveComponentConfigRender(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (*parametersv1alpha1.ParamConfigRenderer, error) {
@@ -296,24 +355,91 @@ func ResolveComponentConfigRender(ctx context.Context, reader client.Reader, cmp
return strings.Compare(b.Spec.ComponentDef, a.Spec.ComponentDef)
})
- checkAvailable := func(configDef parametersv1alpha1.ParamConfigRenderer) error {
- if configDef.Status.Phase != parametersv1alpha1.PDAvailablePhase {
- return fmt.Errorf("the referenced ParamConfigRenderer is unavailable: %s", configDef.Name)
- }
- return nil
- }
-
for i, item := range configDefList.Items {
if !component.PrefixOrRegexMatched(cmpd.Name, item.Spec.ComponentDef) {
continue
}
if item.Spec.ServiceVersion == "" || item.Spec.ServiceVersion == cmpd.Spec.ServiceVersion {
- return &configDefList.Items[i], checkAvailable(item)
+ resolved := configDefList.Items[i].DeepCopy()
+ if err := hydrateLegacyConfigRender(ctx, reader, resolved, cmpd); err != nil {
+ return nil, err
+ }
+ return resolved, nil
}
}
return nil, nil
}
+func hydrateLegacyConfigRender(ctx context.Context, reader client.Reader, configRender *parametersv1alpha1.ParamConfigRenderer, cmpd *appsv1.ComponentDefinition) error {
+ if configRender == nil {
+ return nil
+ }
+ if err := fillLegacyConfigTemplateNames(ctx, reader, &configRender.Spec, cmpd); err != nil {
+ return err
+ }
+ if err := validateLegacyParametersDefs(ctx, reader, configRender.Spec.ParametersDefs); err != nil {
+ return err
+ }
+ return validateLegacyParametersConfigs(configRender.Spec.Configs, cmpd.Spec.Configs)
+}
+
+func fillLegacyConfigTemplateNames(ctx context.Context, reader client.Reader, template *parametersv1alpha1.ParamConfigRendererSpec, cmpd *appsv1.ComponentDefinition) error {
+ match := func(spec parametersv1alpha1.ComponentConfigDescription) bool {
+ return spec.TemplateName == ""
+ }
+ if generics.CountFunc(template.Configs, match) == 0 {
+ return nil
+ }
+ tpls, err := ResolveComponentTemplate(ctx, reader, cmpd)
+ if err != nil {
+ return err
+ }
+ resolveConfigTemplate := func(config string) string {
+ for name, configTemplate := range tpls {
+ if _, ok := configTemplate.Data[config]; ok {
+ return name
+ }
+ }
+ return ""
+ }
+ for i, config := range template.Configs {
+ if tplName := resolveConfigTemplate(config.Name); tplName != "" {
+ template.Configs[i].TemplateName = tplName
+ }
+ }
+ return nil
+}
+
+func validateLegacyParametersConfigs(configs []parametersv1alpha1.ComponentConfigDescription, templates []appsv1.ComponentFileTemplate) error {
+ for _, config := range configs {
+ match := func(spec appsv1.ComponentFileTemplate) bool {
+ return config.TemplateName == spec.Name
+ }
+ if len(generics.FindFunc(templates, match)) == 0 {
+ return fmt.Errorf("config template[%s] not found in component definition", config.TemplateName)
+ }
+ }
+ return nil
+}
+
+func validateLegacyParametersDefs(ctx context.Context, reader client.Reader, paramsDefs []string) error {
+ paramsDefObjs := make(map[string]*parametersv1alpha1.ParametersDefinition, len(paramsDefs))
+ for _, paramsDef := range paramsDefs {
+ obj := ¶metersv1alpha1.ParametersDefinition{}
+ if err := reader.Get(ctx, client.ObjectKey{Name: paramsDef}, obj); err != nil {
+ return err
+ }
+ if obj.Status.Phase != parametersv1alpha1.PDAvailablePhase {
+ return fmt.Errorf("the referenced ParametersDefinition is unavailable: %s", obj.Name)
+ }
+ if def, ok := paramsDefObjs[obj.Spec.FileName]; ok {
+ return fmt.Errorf("config file[%s] has been defined in other parametersdefinition[%s]", obj.Spec.FileName, def.Name)
+ }
+ paramsDefObjs[obj.Spec.FileName] = obj
+ }
+ return nil
+}
+
func NeedDynamicReloadAction(pd *parametersv1alpha1.ParametersDefinitionSpec) bool {
if pd.MergeReloadAndRestart != nil {
return !*pd.MergeReloadAndRestart
@@ -386,79 +512,6 @@ func LegacyConfigManagerRequiredForCluster(cluster *appsv1.Cluster) (bool, error
return state == LegacyConfigManagerRequirementKeep, nil
}
-// UpdateConfigPayload updates the configuration payload
-func UpdateConfigPayload(config *parametersv1alpha1.ComponentParameterSpec, component *appsv1.ComponentSpec, configRender *parametersv1alpha1.ParamConfigRendererSpec, sharding *appsv1.ClusterSharding) error {
- if len(configRender.Configs) == 0 {
- return nil
- }
-
- for i, item := range config.ConfigItemDetails {
- configDescs := GetComponentConfigDescriptions(configRender, item.Name)
- configSpec := &config.ConfigItemDetails[i]
- // check v-scale operation
- if enableVScaleTrigger(configDescs) {
- resourcePayload := ResourcesPayloadForComponent(component.Resources)
- if _, err := CheckAndPatchPayload(configSpec, constant.ComponentResourcePayload, resourcePayload); err != nil {
- return err
- }
- }
- // check h-scale operation
- if enableHScaleTrigger(configDescs) {
- if _, err := CheckAndPatchPayload(configSpec, constant.ReplicasPayload, component.Replicas); err != nil {
- return err
- }
- }
- // check tls
- if enableTLSTrigger(configDescs) {
- if component.TLSConfig == nil {
- continue
- }
- if _, err := CheckAndPatchPayload(configSpec, constant.TLSPayload, component.TLSConfig); err != nil {
- return err
- }
- }
- // check sharding h-scale operation
- if sharding != nil && enableShardingHVScaleTrigger(configDescs) {
- if _, err := CheckAndPatchPayload(configSpec, constant.ShardingPayload, resolveShardingResource(sharding)); err != nil {
- return err
- }
- }
- }
- return nil
-}
-
-func rerenderConfigEnabled(configDescs []parametersv1alpha1.ComponentConfigDescription, rerenderType parametersv1alpha1.RerenderResourceType) bool {
- for _, desc := range configDescs {
- if slices.Contains(desc.ReRenderResourceTypes, rerenderType) {
- return true
- }
- }
- return false
-}
-
-func resolveShardingResource(sharding *appsv1.ClusterSharding) map[string]string {
- return map[string]string{
- "shards": strconv.Itoa(int(sharding.Shards)),
- "replicas": strconv.Itoa(int(sharding.Template.Replicas)),
- }
-}
-
-func enableHScaleTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
- return rerenderConfigEnabled(configDescs, parametersv1alpha1.ComponentHScaleType)
-}
-
-func enableVScaleTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
- return rerenderConfigEnabled(configDescs, parametersv1alpha1.ComponentVScaleType)
-}
-
-func enableTLSTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
- return rerenderConfigEnabled(configDescs, parametersv1alpha1.ComponentTLSType)
-}
-
-func enableShardingHVScaleTrigger(configDescs []parametersv1alpha1.ComponentConfigDescription) bool {
- return rerenderConfigEnabled(configDescs, parametersv1alpha1.ShardingComponentHScaleType)
-}
-
func ResolveComponentTemplate(ctx context.Context, reader client.Reader, cmpd *appsv1.ComponentDefinition) (map[string]*corev1.ConfigMap, error) {
tpls := make(map[string]*corev1.ConfigMap, len(cmpd.Spec.Configs))
for _, config := range cmpd.Spec.Configs {
@@ -470,33 +523,3 @@ func ResolveComponentTemplate(ctx context.Context, reader client.Reader, cmpd *a
}
return tpls, nil
}
-
-func ResolveShardingReference(ctx context.Context, reader client.Reader, comp *appsv1.Component) (*appsv1.ClusterSharding, error) {
- resolveShardingName := func(comp *appsv1.Component) string {
- if len(comp.Labels) == 0 {
- return ""
- }
- return comp.Labels[constant.KBAppShardingNameLabelKey]
- }
-
- shardingName := resolveShardingName(comp)
- if shardingName == "" {
- return nil, nil
- }
-
- cluster := appsv1.Cluster{}
- clusterName, _ := component.GetClusterName(comp)
- clusterKey := types.NamespacedName{
- Name: clusterName,
- Namespace: comp.Namespace,
- }
- if err := reader.Get(ctx, clusterKey, &cluster); err != nil {
- return nil, err
- }
- for i, sharding := range cluster.Spec.Shardings {
- if sharding.Name == shardingName {
- return &cluster.Spec.Shardings[i], nil
- }
- }
- return nil, nil
-}
diff --git a/pkg/parameters/config_util_test.go b/pkg/parameters/config_util_test.go
index 4e6d42b0071..e344b9b8d4e 100644
--- a/pkg/parameters/config_util_test.go
+++ b/pkg/parameters/config_util_test.go
@@ -20,6 +20,7 @@ along with this program. If not, see .
package parameters
import (
+ "context"
"encoding/json"
"reflect"
"testing"
@@ -29,7 +30,9 @@ import (
"github.com/StudioSol/set"
corev1 "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/api/resource"
+ metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+ "k8s.io/apimachinery/pkg/runtime"
+ "sigs.k8s.io/controller-runtime/pkg/client/fake"
appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
@@ -85,110 +88,6 @@ func TestFromUpdatedConfig(t *testing.T) {
}
}
-func TestIsRerender(t *testing.T) {
- type args struct {
- cm *corev1.ConfigMap
- item parametersv1alpha1.ConfigTemplateItemDetail
- }
- tests := []struct {
- name string
- args args
- want bool
- }{{
-
- name: "test",
- args: args{
- cm: nil,
- item: parametersv1alpha1.ConfigTemplateItemDetail{
- Name: "test",
- },
- },
- want: true,
- }, {
- name: "test",
- args: args{
- cm: builder.NewConfigMapBuilder("default", "test").GetObject(),
- item: parametersv1alpha1.ConfigTemplateItemDetail{
- Name: "test",
- },
- },
- want: false,
- }, {
- name: "import-template-test",
- args: args{
- cm: builder.NewConfigMapBuilder("default", "test").
- AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, "").
- GetObject(),
- item: parametersv1alpha1.ConfigTemplateItemDetail{
- Name: "test",
- CustomTemplates: ¶metersv1alpha1.ConfigTemplateExtension{
- TemplateRef: "contig-test-template",
- Namespace: "default",
- Policy: parametersv1alpha1.PatchPolicy,
- },
- },
- },
- want: true,
- }, {
- name: "import-template-test",
- args: args{
- cm: builder.NewConfigMapBuilder("default", "test").
- AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, `
-{
- "userConfigTemplates": {
- "templateRef": "contig-test-template",
- "namespace": "default",
- "policy": "patch"
- }
-}
-`).
- GetObject(),
- item: parametersv1alpha1.ConfigTemplateItemDetail{
- Name: "test",
- CustomTemplates: ¶metersv1alpha1.ConfigTemplateExtension{
- TemplateRef: "contig-test-template",
- Namespace: "default",
- Policy: parametersv1alpha1.PatchPolicy,
- },
- },
- },
- want: false,
- }, {
- name: "payload-test",
- args: args{
- cm: builder.NewConfigMapBuilder("default", "test").
- AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, "").
- GetObject(),
- item: parametersv1alpha1.ConfigTemplateItemDetail{
- Name: "test",
- Payload: parametersv1alpha1.Payload{},
- },
- },
- want: false,
- }, {
- name: "payload-test",
- args: args{
- cm: builder.NewConfigMapBuilder("default", "test").
- AddAnnotations(constant.ConfigAppliedVersionAnnotationKey, ` {"payload":{"key":"value"}} `).
- GetObject(),
- item: parametersv1alpha1.ConfigTemplateItemDetail{
- Name: "test",
- Payload: parametersv1alpha1.Payload{
- "key": transformPayload("value"),
- },
- },
- },
- want: false,
- }}
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- if got := IsRerender(tt.args.cm, tt.args.item); got != tt.want {
- t.Errorf("IsRerender() = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
func TestGetConfigSpecReconcilePhase(t *testing.T) {
type args struct {
cm *corev1.ConfigMap
@@ -237,7 +136,7 @@ func TestGetConfigSpecReconcilePhase(t *testing.T) {
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
- if got := GetUpdatedParametersReconciledPhase(tt.args.cm, tt.args.item, tt.args.status); got != tt.want {
+ if got := GetUpdatedParametersReconciledPhase(tt.args.cm, tt.args.item, tt.args.status, 0); got != tt.want {
t.Errorf("GetUpdatedParametersReconciledPhase() = %v, want %v", got, tt.want)
}
})
@@ -400,6 +299,352 @@ func TestLegacyConfigManagerRequirementStateForCluster(t *testing.T) {
}
}
+func TestResolveCmpdParametersDefs(t *testing.T) {
+ scheme := runtime.NewScheme()
+ _ = appsv1.AddToScheme(scheme)
+ _ = parametersv1alpha1.AddToScheme(scheme)
+
+ cmpd := &appsv1.ComponentDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-8.0.30"},
+ Spec: appsv1.ComponentDefinitionSpec{
+ ServiceVersion: "8.0.30",
+ Configs: []appsv1.ComponentFileTemplate{{
+ Name: "mysql-config",
+ Template: "mysql-config",
+ }},
+ },
+ Status: appsv1.ComponentDefinitionStatus{Phase: appsv1.AvailablePhase},
+ }
+ pd := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ ComponentDef: "mysql-8",
+ TemplateName: "mysql-config",
+ FileName: "my.cnf",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ },
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+
+ cli := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cmpd, pd).Build()
+ configDescs, paramsDefs, err := ResolveCmpdParametersDefs(context.Background(), cli, cmpd)
+ if err != nil {
+ t.Fatalf("ResolveCmpdParametersDefs() error = %v", err)
+ }
+ if len(paramsDefs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() paramsDefs len = %d, want 1", len(paramsDefs))
+ }
+ if configDescs == nil {
+ t.Fatalf("ResolveCmpdParametersDefs() configDescs = nil")
+ }
+ if len(configDescs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() configs len = %d, want 1", len(configDescs))
+ }
+ if configDescs[0].TemplateName != "mysql-config" {
+ t.Fatalf("ResolveCmpdParametersDefs() templateName = %q, want %q", configDescs[0].TemplateName, "mysql-config")
+ }
+}
+
+func TestResolveCmpdParametersDefsRejectsDuplicateFiles(t *testing.T) {
+ scheme := runtime.NewScheme()
+ _ = appsv1.AddToScheme(scheme)
+ _ = parametersv1alpha1.AddToScheme(scheme)
+
+ cmpd := &appsv1.ComponentDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-8.0.30"},
+ Spec: appsv1.ComponentDefinitionSpec{
+ ServiceVersion: "8.0.30",
+ Configs: []appsv1.ComponentFileTemplate{{
+ Name: "mysql-config",
+ Template: "mysql-config",
+ }},
+ },
+ Status: appsv1.ComponentDefinitionStatus{Phase: appsv1.AvailablePhase},
+ }
+ newPD := func(name string) *parametersv1alpha1.ParametersDefinition {
+ return ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: name},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ ComponentDef: "mysql-8",
+ TemplateName: "mysql-config",
+ FileName: "my.cnf",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ },
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ }
+
+ cli := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cmpd, newPD("pd-1"), newPD("pd-2")).Build()
+ _, _, err := ResolveCmpdParametersDefs(context.Background(), cli, cmpd)
+ if err == nil {
+ t.Fatalf("ResolveCmpdParametersDefs() error = nil, want duplicate-file error")
+ }
+}
+
+func TestResolveCmpdParametersDefsFallbacksToParamConfigRenderer(t *testing.T) {
+ scheme := runtime.NewScheme()
+ _ = appsv1.AddToScheme(scheme)
+ _ = parametersv1alpha1.AddToScheme(scheme)
+
+ cmpd := &appsv1.ComponentDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-8.0.30"},
+ Spec: appsv1.ComponentDefinitionSpec{
+ ServiceVersion: "8.0.30",
+ Configs: []appsv1.ComponentFileTemplate{{
+ Name: "mysql-config",
+ Template: "mysql-config",
+ }},
+ },
+ Status: appsv1.ComponentDefinitionStatus{Phase: appsv1.AvailablePhase},
+ }
+ pd := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ FileName: "my.cnf",
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ pcr := ¶metersv1alpha1.ParamConfigRenderer{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-pcr"},
+ Spec: parametersv1alpha1.ParamConfigRendererSpec{
+ ComponentDef: "mysql-8",
+ ServiceVersion: "8.0.30",
+ ParametersDefs: []string{pd.Name},
+ Configs: []parametersv1alpha1.ComponentConfigDescription{{
+ Name: "my.cnf",
+ TemplateName: "mysql-config",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ },
+ }},
+ },
+ }
+
+ cli := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cmpd, pd, pcr).Build()
+ configDescs, paramsDefs, err := ResolveCmpdParametersDefs(context.Background(), cli, cmpd)
+ if err != nil {
+ t.Fatalf("ResolveCmpdParametersDefs() error = %v", err)
+ }
+ if len(paramsDefs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() paramsDefs len = %d, want 1", len(paramsDefs))
+ }
+ if len(configDescs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() configs len = %d, want 1", len(configDescs))
+ }
+ if configDescs[0].TemplateName != "mysql-config" {
+ t.Fatalf("ResolveCmpdParametersDefs() templateName = %q, want %q", configDescs[0].TemplateName, "mysql-config")
+ }
+}
+
+func TestResolveCmpdParametersDefsMergesNewParametersDefinitionsWithLegacyParamConfigRenderer(t *testing.T) {
+ scheme := runtime.NewScheme()
+ _ = appsv1.AddToScheme(scheme)
+ _ = parametersv1alpha1.AddToScheme(scheme)
+
+ cmpd := &appsv1.ComponentDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-8.0.30"},
+ Spec: appsv1.ComponentDefinitionSpec{
+ ServiceVersion: "8.0.30",
+ Configs: []appsv1.ComponentFileTemplate{
+ {Name: "mysql-config", Template: "mysql-config"},
+ {Name: "log-config", Template: "log-config"},
+ },
+ },
+ Status: appsv1.ComponentDefinitionStatus{Phase: appsv1.AvailablePhase},
+ }
+ newPD := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ ComponentDef: "mysql-8",
+ TemplateName: "mysql-config",
+ FileName: "my.cnf",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ },
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ legacyPD := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-log-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ FileName: "log.conf",
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ pcr := ¶metersv1alpha1.ParamConfigRenderer{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-pcr"},
+ Spec: parametersv1alpha1.ParamConfigRendererSpec{
+ ComponentDef: "mysql-8",
+ ServiceVersion: "8.0.30",
+ ParametersDefs: []string{legacyPD.Name},
+ Configs: []parametersv1alpha1.ComponentConfigDescription{{
+ Name: "log.conf",
+ TemplateName: "log-config",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Properties,
+ },
+ }},
+ },
+ }
+
+ cli := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cmpd, newPD, legacyPD, pcr).Build()
+ configDescs, paramsDefs, err := ResolveCmpdParametersDefs(context.Background(), cli, cmpd)
+ if err != nil {
+ t.Fatalf("ResolveCmpdParametersDefs() error = %v", err)
+ }
+ if len(paramsDefs) != 2 {
+ t.Fatalf("ResolveCmpdParametersDefs() paramsDefs len = %d, want 2", len(paramsDefs))
+ }
+ if len(configDescs) != 2 {
+ t.Fatalf("ResolveCmpdParametersDefs() configs len = %d, want 2", len(configDescs))
+ }
+ gotTemplates := map[string]string{}
+ for _, configDesc := range configDescs {
+ gotTemplates[configDesc.Name] = configDesc.TemplateName
+ }
+ if gotTemplates["my.cnf"] != "mysql-config" {
+ t.Fatalf("ResolveCmpdParametersDefs() templateName for my.cnf = %q, want %q", gotTemplates["my.cnf"], "mysql-config")
+ }
+ if gotTemplates["log.conf"] != "log-config" {
+ t.Fatalf("ResolveCmpdParametersDefs() templateName for log.conf = %q, want %q", gotTemplates["log.conf"], "log-config")
+ }
+}
+
+func TestResolveCmpdParametersDefsIgnoresMalformedUnrelatedLegacyParamConfigRenderer(t *testing.T) {
+ scheme := runtime.NewScheme()
+ _ = appsv1.AddToScheme(scheme)
+ _ = parametersv1alpha1.AddToScheme(scheme)
+
+ cmpd := &appsv1.ComponentDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-8.0.30"},
+ Spec: appsv1.ComponentDefinitionSpec{
+ ServiceVersion: "8.0.30",
+ Configs: []appsv1.ComponentFileTemplate{{
+ Name: "mysql-config",
+ Template: "mysql-config",
+ }},
+ },
+ Status: appsv1.ComponentDefinitionStatus{Phase: appsv1.AvailablePhase},
+ }
+ pd := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ FileName: "my.cnf",
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ validPCR := ¶metersv1alpha1.ParamConfigRenderer{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-pcr"},
+ Spec: parametersv1alpha1.ParamConfigRendererSpec{
+ ComponentDef: "mysql-8",
+ ServiceVersion: "8.0.30",
+ ParametersDefs: []string{pd.Name},
+ Configs: []parametersv1alpha1.ComponentConfigDescription{{
+ Name: "my.cnf",
+ TemplateName: "mysql-config",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ },
+ }},
+ },
+ }
+ invalidPCR := ¶metersv1alpha1.ParamConfigRenderer{
+ ObjectMeta: metav1.ObjectMeta{Name: "broken-pcr"},
+ Spec: parametersv1alpha1.ParamConfigRendererSpec{
+ ComponentDef: "[broken",
+ },
+ }
+
+ cli := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cmpd, pd, validPCR, invalidPCR).Build()
+ configDescs, paramsDefs, err := ResolveCmpdParametersDefs(context.Background(), cli, cmpd)
+ if err != nil {
+ t.Fatalf("ResolveCmpdParametersDefs() error = %v", err)
+ }
+ if len(paramsDefs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() paramsDefs len = %d, want 1", len(paramsDefs))
+ }
+ if len(configDescs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() configs len = %d, want 1", len(configDescs))
+ }
+ if configDescs[0].TemplateName != "mysql-config" {
+ t.Fatalf("ResolveCmpdParametersDefs() templateName = %q, want %q", configDescs[0].TemplateName, "mysql-config")
+ }
+}
+
+func TestResolveCmpdParametersDefsPrefersNewParametersDefinitionOverLegacyParamConfigRendererForSameFile(t *testing.T) {
+ scheme := runtime.NewScheme()
+ _ = appsv1.AddToScheme(scheme)
+ _ = parametersv1alpha1.AddToScheme(scheme)
+
+ cmpd := &appsv1.ComponentDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-8.0.30"},
+ Spec: appsv1.ComponentDefinitionSpec{
+ ServiceVersion: "8.0.30",
+ Configs: []appsv1.ComponentFileTemplate{
+ {Name: "mysql-config", Template: "mysql-config"},
+ {Name: "legacy-config", Template: "legacy-config"},
+ },
+ },
+ Status: appsv1.ComponentDefinitionStatus{Phase: appsv1.AvailablePhase},
+ }
+ newPD := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ ComponentDef: "mysql-8",
+ TemplateName: "mysql-config",
+ FileName: "my.cnf",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ },
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ legacyPD := ¶metersv1alpha1.ParametersDefinition{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-legacy-params"},
+ Spec: parametersv1alpha1.ParametersDefinitionSpec{
+ FileName: "my.cnf",
+ },
+ Status: parametersv1alpha1.ParametersDefinitionStatus{Phase: parametersv1alpha1.PDAvailablePhase},
+ }
+ pcr := ¶metersv1alpha1.ParamConfigRenderer{
+ ObjectMeta: metav1.ObjectMeta{Name: "mysql-pcr"},
+ Spec: parametersv1alpha1.ParamConfigRendererSpec{
+ ComponentDef: "mysql-8",
+ ServiceVersion: "8.0.30",
+ ParametersDefs: []string{legacyPD.Name},
+ Configs: []parametersv1alpha1.ComponentConfigDescription{{
+ Name: "my.cnf",
+ TemplateName: "legacy-config",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Properties,
+ },
+ }},
+ },
+ }
+
+ cli := fake.NewClientBuilder().WithScheme(scheme).WithObjects(cmpd, newPD, legacyPD, pcr).Build()
+ configDescs, paramsDefs, err := ResolveCmpdParametersDefs(context.Background(), cli, cmpd)
+ if err != nil {
+ t.Fatalf("ResolveCmpdParametersDefs() error = %v", err)
+ }
+ if len(paramsDefs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() paramsDefs len = %d, want 1", len(paramsDefs))
+ }
+ if paramsDefs[0].Name != newPD.Name {
+ t.Fatalf("ResolveCmpdParametersDefs() paramsDef = %q, want %q", paramsDefs[0].Name, newPD.Name)
+ }
+ if len(configDescs) != 1 {
+ t.Fatalf("ResolveCmpdParametersDefs() configs len = %d, want 1", len(configDescs))
+ }
+ if configDescs[0].TemplateName != "mysql-config" {
+ t.Fatalf("ResolveCmpdParametersDefs() templateName = %q, want %q", configDescs[0].TemplateName, "mysql-config")
+ }
+}
+
var _ = Describe("config_util", func() {
var k8sMockClient *testutil.K8sClientMockHelper
@@ -511,83 +756,6 @@ var _ = Describe("config_util", func() {
})
-func TestCheckAndPatchPayload(t *testing.T) {
- type args struct {
- item *parametersv1alpha1.ConfigTemplateItemDetail
- payloadID string
- payload interface{}
- }
- tests := []struct {
- name string
- args args
- want bool
- wantErr bool
- }{{
- name: "test",
- args: args{
- item: ¶metersv1alpha1.ConfigTemplateItemDetail{},
- payloadID: constant.BinaryVersionPayload,
- payload: "md5-12912uy1232o9y2",
- },
- want: true,
- }, {
- name: "invalid-item-test",
- args: args{
- payloadID: constant.BinaryVersionPayload,
- payload: "md5-12912uy1232o9y2",
- },
- want: false,
- }, {
- name: "test-delete-payload",
- args: args{
- item: ¶metersv1alpha1.ConfigTemplateItemDetail{
- Payload: parametersv1alpha1.Payload{
- constant.BinaryVersionPayload: json.RawMessage("md5-12912uy1232o9y2"),
- },
- },
- payloadID: constant.BinaryVersionPayload,
- payload: nil,
- },
- want: true,
- }, {
- name: "test-update-payload",
- args: args{
- item: ¶metersv1alpha1.ConfigTemplateItemDetail{
- Payload: parametersv1alpha1.Payload{
- constant.BinaryVersionPayload: json.RawMessage("md5-12912uy1232o9y2"),
- constant.ComponentResourcePayload: transformPayload(map[string]any{
- "limit": map[string]string{
- "cpu": "100m",
- "memory": "100Mi",
- },
- }),
- },
- },
- payloadID: constant.ComponentResourcePayload,
- payload: corev1.ResourceRequirements{
- Limits: map[corev1.ResourceName]resource.Quantity{
- corev1.ResourceCPU: resource.MustParse("200m"),
- corev1.ResourceMemory: resource.MustParse("200m"),
- },
- },
- },
- want: true,
- },
- }
- for _, tt := range tests {
- t.Run(tt.name, func(t *testing.T) {
- got, err := CheckAndPatchPayload(tt.args.item, tt.args.payloadID, tt.args.payload)
- if (err != nil) != tt.wantErr {
- t.Errorf("CheckAndPatchPayload() error = %v, wantErr %v", err, tt.wantErr)
- return
- }
- if got != tt.want {
- t.Errorf("CheckAndPatchPayload() got = %v, want %v", got, tt.want)
- }
- })
- }
-}
-
func Test_filterImmutableParameters(t *testing.T) {
type args struct {
parameters map[string]any
@@ -644,8 +812,3 @@ func Test_filterImmutableParameters(t *testing.T) {
})
}
}
-
-func transformPayload(data interface{}) json.RawMessage {
- raw, _ := buildPayloadAsUnstructuredObject(data)
- return raw
-}
diff --git a/pkg/parameters/core/config_patch.go b/pkg/parameters/core/config_patch.go
index 064a7a6e2c4..f012fb3eb50 100644
--- a/pkg/parameters/core/config_patch.go
+++ b/pkg/parameters/core/config_patch.go
@@ -90,7 +90,7 @@ func difference(base *cfgWrapper, target *cfgWrapper) (*ConfigPatchInfo, error)
return reconfigureInfo, nil
}
-func TransformConfigPatchFromData(data map[string]string, configRender parametersv1alpha1.ParamConfigRendererSpec) (*ConfigPatchInfo, error) {
+func TransformConfigPatchFromData(data map[string]string, configs []parametersv1alpha1.ComponentConfigDescription) (*ConfigPatchInfo, error) {
emptyData := func(m map[string]string) map[string]string {
r := make(map[string]string, len(m))
for key := range m {
@@ -98,6 +98,6 @@ func TransformConfigPatchFromData(data map[string]string, configRender parameter
}
return r
}
- patch, _, err := CreateConfigPatch(emptyData(data), data, configRender, false)
+ patch, _, err := CreateConfigPatch(emptyData(data), data, configs, false)
return patch, err
}
diff --git a/pkg/parameters/core/config_patch_test.go b/pkg/parameters/core/config_patch_test.go
index cbb208fd6cf..6920f6aba83 100644
--- a/pkg/parameters/core/config_patch_test.go
+++ b/pkg/parameters/core/config_patch_test.go
@@ -131,11 +131,10 @@ func TestTransformConfigPatchFromData(t *testing.T) {
testData := "[mysqld]\nmax_connections = 2000\ngeneral_log = OFF"
t.Run("testConfigPatch", func(t *testing.T) {
- got, err := TransformConfigPatchFromData(map[string]string{configFile: testData}, parametersv1alpha1.ParamConfigRendererSpec{
- Configs: []parametersv1alpha1.ComponentConfigDescription{{
- Name: "my.cnf",
- FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Ini},
- }}})
+ got, err := TransformConfigPatchFromData(map[string]string{configFile: testData}, []parametersv1alpha1.ComponentConfigDescription{{
+ Name: "my.cnf",
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Ini},
+ }})
require.Nil(t, err)
require.True(t, got.IsModify)
require.NotNil(t, got.UpdateConfig[configFile])
diff --git a/pkg/parameters/core/config_patch_util.go b/pkg/parameters/core/config_patch_util.go
index b68c5e9e412..ed13a785456 100644
--- a/pkg/parameters/core/config_patch_util.go
+++ b/pkg/parameters/core/config_patch_util.go
@@ -32,20 +32,20 @@ import (
)
// CreateConfigPatch creates a patch for configuration files with different version.
-func CreateConfigPatch(oldVersion, newVersion map[string]string, configRender parametersv1alpha1.ParamConfigRendererSpec, comparableAllFiles bool) (*ConfigPatchInfo, bool, error) {
+func CreateConfigPatch(oldVersion, newVersion map[string]string, configs []parametersv1alpha1.ComponentConfigDescription, comparableAllFiles bool) (*ConfigPatchInfo, bool, error) {
var hasFilesUpdated = false
- var keys = ResolveConfigFiles(configRender.Configs)
+ var keys = ResolveConfigFiles(configs)
if comparableAllFiles && len(keys) > 0 {
hasFilesUpdated = checkExcludeConfigDifference(oldVersion, newVersion, keys)
}
- cmKeyFilter := NewConfigFileFilter(configRender.Configs)
+ cmKeyFilter := NewConfigFileFilter(configs)
patch, err := CreateMergePatch(
FromConfigData(oldVersion, cmKeyFilter),
FromConfigData(newVersion, cmKeyFilter),
CfgOption{
- FileFormatFn: WithConfigFileFormat(configRender.Configs),
+ FileFormatFn: WithConfigFileFormat(configs),
Type: CfgTplType,
Log: log.FromContext(context.TODO()),
})
@@ -99,8 +99,8 @@ func FromConfigObject(name, config string, formatConfig *parametersv1alpha1.File
// TransformConfigFileToKeyValueMap transforms a config file in appsv1alpha1.CfgFileFormat format to a map in which the key is config name and the value is config value
// sectionName means the desired section of config file, such as [mysqld] section.
// If config file has no section structure, sectionName should be default to get all values in this config file.
-func TransformConfigFileToKeyValueMap(fileName string, configRender parametersv1alpha1.ParamConfigRendererSpec, configData []byte) (map[string]string, error) {
- formatterConfig := ResolveConfigFormat(configRender.Configs, fileName)
+func TransformConfigFileToKeyValueMap(fileName string, configs []parametersv1alpha1.ComponentConfigDescription, configData []byte) (map[string]string, error) {
+ formatterConfig := ResolveConfigFormat(configs, fileName)
if formatterConfig == nil {
return nil, fmt.Errorf("not found file formatter config: [%s]", fileName)
}
@@ -111,11 +111,11 @@ func TransformConfigFileToKeyValueMap(fileName string, configRender parametersv1
newData := map[string]string{
fileName: string(configData),
}
- patchInfo, _, err := CreateConfigPatch(oldData, newData, configRender, false)
+ patchInfo, _, err := CreateConfigPatch(oldData, newData, configs, false)
if err != nil {
return nil, err
}
- params := GenerateVisualizedParamsList(patchInfo, configRender.Configs)
+ params := GenerateVisualizedParamsList(patchInfo, configs)
result := make(map[string]string)
for _, param := range params {
if param.Key != fileName {
diff --git a/pkg/parameters/core/config_patch_util_test.go b/pkg/parameters/core/config_patch_util_test.go
index eeb49285224..62b160979dd 100644
--- a/pkg/parameters/core/config_patch_util_test.go
+++ b/pkg/parameters/core/config_patch_util_test.go
@@ -302,8 +302,7 @@ max_connections=666
})
}
}
- configRender := parametersv1alpha1.ParamConfigRendererSpec{Configs: configs}
- got, excludeDiff, err := CreateConfigPatch(tt.args.oldVersion, tt.args.newVersion, configRender, tt.args.enableExcludeDiff)
+ got, excludeDiff, err := CreateConfigPatch(tt.args.oldVersion, tt.args.newVersion, configs, tt.args.enableExcludeDiff)
if (err != nil) != tt.wantErr {
t.Errorf("CreateConfigPatch() error = %v, wantErr %v", err, tt.wantErr)
return
diff --git a/pkg/parameters/core/reconfigure_util.go b/pkg/parameters/core/reconfigure_util.go
index 229395331a7..8d5df8f9cc3 100644
--- a/pkg/parameters/core/reconfigure_util.go
+++ b/pkg/parameters/core/reconfigure_util.go
@@ -86,13 +86,13 @@ func trimNestedField(updatedParams any, trimField string) (any, error) {
return updatedParams, nil
}
-// ValidateConfigPatch Verifies if the changed parameters have been removed
-func ValidateConfigPatch(patch *ConfigPatchInfo, configRender parametersv1alpha1.ParamConfigRendererSpec) error {
+// ValidateConfigPatch verifies if the changed parameters have been removed.
+func ValidateConfigPatch(patch *ConfigPatchInfo, configs []parametersv1alpha1.ComponentConfigDescription) error {
if !patch.IsModify || len(patch.UpdateConfig) == 0 {
return nil
}
- vParams := GenerateVisualizedParamsList(patch, configRender.Configs)
+ vParams := GenerateVisualizedParamsList(patch, configs)
for _, param := range vParams {
for _, p := range param.Parameters {
if p.Value == nil {
diff --git a/pkg/parameters/parameter_schema.go b/pkg/parameters/parameter_schema.go
index ce216d57d88..6252eb27eba 100644
--- a/pkg/parameters/parameter_schema.go
+++ b/pkg/parameters/parameter_schema.go
@@ -60,10 +60,6 @@ func ParametersDefinitionTerminalPhases(status parametersv1alpha1.ParametersDefi
return status.ObservedGeneration == generation && status.Phase == parametersv1alpha1.PDAvailablePhase
}
-func ParametersDrivenConfigRenderTerminalPhases(status parametersv1alpha1.ParamConfigRendererStatus, generation int64) bool {
- return status.ObservedGeneration == generation && status.Phase == parametersv1alpha1.PDAvailablePhase
-}
-
func ParametersTerminalPhases(status parametersv1alpha1.ParameterStatus, generation int64) bool {
return status.ObservedGeneration == generation && IsParameterFinished(status.Phase)
}
@@ -139,21 +135,3 @@ func GetConfigTemplateItem(parameterSpec *parametersv1alpha1.ComponentParameterS
}
return nil
}
-
-func GetComponentConfigDescription(pdcr *parametersv1alpha1.ParamConfigRendererSpec, name string) *parametersv1alpha1.ComponentConfigDescription {
- match := func(desc parametersv1alpha1.ComponentConfigDescription) bool {
- return desc.Name == name
- }
-
- if index := generics.FindFirstFunc(pdcr.Configs, match); index >= 0 {
- return &pdcr.Configs[index]
- }
- return nil
-}
-
-func GetComponentConfigDescriptions(pdcr *parametersv1alpha1.ParamConfigRendererSpec, tpl string) []parametersv1alpha1.ComponentConfigDescription {
- match := func(desc parametersv1alpha1.ComponentConfigDescription) bool {
- return desc.TemplateName == tpl
- }
- return generics.FindFunc(pdcr.Configs, match)
-}
diff --git a/pkg/parameters/parameter_utils.go b/pkg/parameters/parameter_utils.go
index c37094d9240..2dd7b510606 100644
--- a/pkg/parameters/parameter_utils.go
+++ b/pkg/parameters/parameter_utils.go
@@ -37,26 +37,26 @@ func ClassifyParamsFromConfigTemplate(params parametersv1alpha1.ComponentParamet
cmpd *appsv1.ComponentDefinition,
paramsDefs []*parametersv1alpha1.ParametersDefinition,
tpls map[string]*corev1.ConfigMap,
- pcr *parametersv1alpha1.ParamConfigRenderer) ([]parametersv1alpha1.ConfigTemplateItemDetail, error) {
+ configs []parametersv1alpha1.ComponentConfigDescription) ([]parametersv1alpha1.ConfigTemplateItemDetail, error) {
var itemDetails []parametersv1alpha1.ConfigTemplateItemDetail
- classifyParams, err := ClassifyComponentParameters(params, paramsDefs, cmpd.Spec.Configs, tpls, pcr)
+ classifyParams, err := ClassifyComponentParameters(params, paramsDefs, cmpd.Spec.Configs, tpls, configs)
if err != nil {
return nil, err
}
- if !HasValidParameterTemplate(pcr) {
+ if !HasValidParameterTemplate(configs) {
return nil, nil
}
- for _, template := range ResolveParameterTemplate(cmpd.Spec, pcr.Spec) {
+ for _, template := range ResolveParameterTemplate(cmpd.Spec, configs) {
itemDetails = append(itemDetails, generateConfigTemplateItem(classifyParams, template))
}
return itemDetails, nil
}
-func ResolveParameterTemplate(cmpd appsv1.ComponentDefinitionSpec, pcr parametersv1alpha1.ParamConfigRendererSpec) []appsv1.ComponentFileTemplate {
+func ResolveParameterTemplate(cmpd appsv1.ComponentDefinitionSpec, configs []parametersv1alpha1.ComponentConfigDescription) []appsv1.ComponentFileTemplate {
var templates []appsv1.ComponentFileTemplate
- tpls := generics.Map(pcr.Configs, func(e parametersv1alpha1.ComponentConfigDescription) string {
+ tpls := generics.Map(configs, func(e parametersv1alpha1.ComponentConfigDescription) string {
return e.TemplateName
})
@@ -72,10 +72,6 @@ func ResolveParameterTemplate(cmpd appsv1.ComponentDefinitionSpec, pcr parameter
return templates
}
-func HasValidParameterTemplate(pcr *parametersv1alpha1.ParamConfigRenderer) bool {
- return pcr != nil && len(pcr.Spec.Configs) != 0
-}
-
func generateConfigTemplateItem(configParams map[string]map[string]*parametersv1alpha1.ParametersInFile, template appsv1.ComponentFileTemplate) parametersv1alpha1.ConfigTemplateItemDetail {
itemDetail := parametersv1alpha1.ConfigTemplateItemDetail{
Name: template.Name,
@@ -92,12 +88,12 @@ func ClassifyComponentParameters(parameters parametersv1alpha1.ComponentParamete
parametersDefs []*parametersv1alpha1.ParametersDefinition,
templates []appsv1.ComponentFileTemplate,
tpls map[string]*corev1.ConfigMap,
- pcr *parametersv1alpha1.ParamConfigRenderer) (map[string]map[string]*parametersv1alpha1.ParametersInFile, error) {
- if len(parameters) == 0 || !HasValidParameterTemplate(pcr) {
+ configs []parametersv1alpha1.ComponentConfigDescription) (map[string]map[string]*parametersv1alpha1.ParametersInFile, error) {
+ if len(parameters) == 0 || !HasValidParameterTemplate(configs) {
return nil, nil
}
if !hasValidParametersDefinition(parametersDefs) {
- return transformDefaultParameters(parameters, pcr)
+ return transformDefaultParameters(parameters, configs)
}
classifyParams := make(map[string]map[string]*parametersv1alpha1.ParametersInFile, len(templates))
@@ -190,16 +186,16 @@ func hasValidParametersDefinition(defs []*parametersv1alpha1.ParametersDefinitio
func transformDefaultParameters(
parameters parametersv1alpha1.ComponentParameters,
- pcr *parametersv1alpha1.ParamConfigRenderer) (map[string]map[string]*parametersv1alpha1.ParametersInFile, error) {
+ configs []parametersv1alpha1.ComponentConfigDescription) (map[string]map[string]*parametersv1alpha1.ParametersInFile, error) {
match := func(config parametersv1alpha1.ComponentConfigDescription) bool {
return config.TemplateName != "" && config.FileFormatConfig != nil
}
- configs := generics.FindFunc(pcr.Spec.Configs, match)
- if len(configs) == 0 {
+ filteredConfigs := generics.FindFunc(configs, match)
+ if len(filteredConfigs) == 0 {
return nil, fmt.Errorf("the component does not support parameters reconfigure")
}
- config := configs[0]
+ config := filteredConfigs[0]
return map[string]map[string]*parametersv1alpha1.ParametersInFile{
config.TemplateName: {
config.Name: ¶metersv1alpha1.ParametersInFile{
@@ -211,6 +207,13 @@ func transformDefaultParameters(
func resolveConfigSpecFromParametersDefinition(templates []appsv1.ComponentFileTemplate,
paramDef *parametersv1alpha1.ParametersDefinition,
tpls map[string]*corev1.ConfigMap) *appsv1.ComponentFileTemplate {
+ if paramDef != nil && paramDef.Spec.TemplateName != "" {
+ for i, item := range templates {
+ if item.Name == paramDef.Spec.TemplateName {
+ return &templates[i]
+ }
+ }
+ }
for i, item := range templates {
tpl, ok := tpls[item.Name]
if !ok {
diff --git a/pkg/parameters/parameter_utils_test.go b/pkg/parameters/parameter_utils_test.go
index 476588f89b8..f90b8cac8cd 100644
--- a/pkg/parameters/parameter_utils_test.go
+++ b/pkg/parameters/parameter_utils_test.go
@@ -35,7 +35,7 @@ import (
var _ = Describe("resource Fetcher", func() {
var compDefObj *appsv1.ComponentDefinition
var paramDef1, paramDef2 *configv1alpha1.ParametersDefinition
- var pcr *configv1alpha1.ParamConfigRenderer
+ var configDescs []configv1alpha1.ComponentConfigDescription
BeforeEach(func() {
paramDef1 = testparameters.NewParametersDefinitionFactory("param_def1").
@@ -57,10 +57,10 @@ var _ = Describe("resource Fetcher", func() {
param14: string
}`).GetObject()
- pcr = testparameters.NewParamConfigRendererFactory("test").
- SetConfigDescription("file1", configTemplateName, configv1alpha1.FileFormatConfig{Format: configv1alpha1.Ini}).
- SetConfigDescription("file2", configTemplateName, configv1alpha1.FileFormatConfig{Format: configv1alpha1.Ini}).
- GetObject()
+ configDescs = []configv1alpha1.ComponentConfigDescription{
+ {Name: "file1", TemplateName: configTemplateName, FileFormatConfig: &configv1alpha1.FileFormatConfig{Format: configv1alpha1.Ini}},
+ {Name: "file2", TemplateName: configTemplateName, FileFormatConfig: &configv1alpha1.FileFormatConfig{Format: configv1alpha1.Ini}},
+ }
compDefObj = allFieldsCompDefObj(false)
// clusterObj, _, _ = newAllFieldsClusterObj(compDefObj, false)
@@ -77,7 +77,7 @@ var _ = Describe("resource Fetcher", func() {
configTemplateName: {
Data: map[string]string{
"file1": "",
- }}}, pcr)
+ }}}, configDescs)
Expect(err).NotTo(HaveOccurred())
Expect(paramItems).Should(HaveLen(1))
Expect(paramItems[0].ConfigFileParams).Should(HaveLen(1))
@@ -98,7 +98,7 @@ var _ = Describe("resource Fetcher", func() {
Data: map[string]string{
"file1": "",
"file2": "",
- }}}, pcr)
+ }}}, configDescs)
Expect(err).NotTo(HaveOccurred())
Expect(paramItems).Should(HaveLen(1))
Expect(paramItems[0].ConfigFileParams).Should(HaveLen(2))
diff --git a/pkg/parameters/template_merger.go b/pkg/parameters/template_merger.go
index 1dc5172e8bb..ac529b9a9a0 100644
--- a/pkg/parameters/template_merger.go
+++ b/pkg/parameters/template_merger.go
@@ -40,10 +40,10 @@ type TemplateMerger interface {
type mergeContext struct {
render.TemplateRender
- template parametersv1alpha1.ConfigTemplateExtension
- configSpec appsv1.ComponentFileTemplate
- paramsDefs []*parametersv1alpha1.ParametersDefinition
- configRender *parametersv1alpha1.ParamConfigRenderer
+ template parametersv1alpha1.ConfigTemplateExtension
+ configSpec appsv1.ComponentFileTemplate
+ paramsDefs []*parametersv1alpha1.ParametersDefinition
+ configs []parametersv1alpha1.ComponentConfigDescription
}
func (m *mergeContext) renderTemplate() (map[string]string, error) {
@@ -56,7 +56,7 @@ func (m *mergeContext) renderTemplate() (map[string]string, error) {
if err != nil {
return nil, err
}
- if err := validateRenderedData(configs, m.paramsDefs, m.configRender); err != nil {
+ if err := validateRenderedData(configs, m.paramsDefs, m.configs); err != nil {
return nil, err
}
return configs, nil
@@ -83,10 +83,10 @@ type configOnlyAddMerger struct {
}
func (c *configPatcher) merge(baseData map[string]string, updatedData map[string]string, manager *valueManager) (map[string]string, error) {
- if c.configRender == nil || len(c.configRender.Spec.Configs) == 0 {
+ if len(c.configs) == 0 {
return nil, fmt.Errorf("not support patch merge policy")
}
- configPatch, err := core.TransformConfigPatchFromData(updatedData, c.configRender.Spec)
+ configPatch, err := core.TransformConfigPatchFromData(updatedData, c.configs)
if err != nil {
return nil, err
}
@@ -94,7 +94,7 @@ func (c *configPatcher) merge(baseData map[string]string, updatedData map[string
return baseData, nil
}
- params := core.GenerateVisualizedParamsList(configPatch, c.configRender.Spec.Configs)
+ params := core.GenerateVisualizedParamsList(configPatch, c.configs)
mergedData := copyMap(baseData)
for key, patch := range splitParameters(params) {
v, ok := baseData[key]
@@ -102,7 +102,7 @@ func (c *configPatcher) merge(baseData map[string]string, updatedData map[string
mergedData[key] = updatedData[key]
continue
}
- newConfig, err := core.ApplyConfigPatch([]byte(v), patch, core.ResolveConfigFormat(c.configRender.Spec.Configs, key), manager.BuildValueTransformer(key))
+ newConfig, err := core.ApplyConfigPatch([]byte(v), patch, core.ResolveConfigFormat(c.configs, key), manager.BuildValueTransformer(key))
if err != nil {
return nil, err
}
@@ -129,14 +129,14 @@ func NewTemplateMerger(template parametersv1alpha1.ConfigTemplateExtension,
templateRender render.TemplateRender,
configSpec appsv1.ComponentFileTemplate,
paramsDefs []*parametersv1alpha1.ParametersDefinition,
- configRender *parametersv1alpha1.ParamConfigRenderer,
+ configs []parametersv1alpha1.ComponentConfigDescription,
) (TemplateMerger, error) {
templateData := &mergeContext{
configSpec: configSpec,
template: template,
TemplateRender: templateRender,
paramsDefs: paramsDefs,
- configRender: configRender,
+ configs: configs,
}
var merger TemplateMerger
@@ -160,8 +160,8 @@ func mergerConfigTemplate(template parametersv1alpha1.ConfigTemplateExtension,
configSpec appsv1.ComponentFileTemplate,
baseData map[string]string,
paramsDefs []*parametersv1alpha1.ParametersDefinition,
- configRender *parametersv1alpha1.ParamConfigRenderer) (map[string]string, error) {
- templateMerger, err := NewTemplateMerger(template, templateRender, configSpec, paramsDefs, configRender)
+ configs []parametersv1alpha1.ComponentConfigDescription) (map[string]string, error) {
+ templateMerger, err := NewTemplateMerger(template, templateRender, configSpec, paramsDefs, configs)
if err != nil {
return nil, err
}
@@ -172,7 +172,7 @@ func mergerConfigTemplate(template parametersv1alpha1.ConfigTemplateExtension,
if len(data) == 0 {
return nil, nil
}
- return templateMerger.merge(baseData, data, NewValueManager(paramsDefs, configRender.Spec.Configs))
+ return templateMerger.merge(baseData, data, NewValueManager(paramsDefs, configs))
}
func splitParameters(params []core.VisualizedParam) map[string]map[string]*string {
diff --git a/pkg/parameters/template_merger_test.go b/pkg/parameters/template_merger_test.go
index e5ca890ec2d..9ff22fa03cc 100644
--- a/pkg/parameters/template_merger_test.go
+++ b/pkg/parameters/template_merger_test.go
@@ -27,7 +27,6 @@ import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
- "k8s.io/apimachinery/pkg/runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
@@ -97,7 +96,7 @@ max_connections=666
templateBuilder render.TemplateRender
configSpec appsv1.ComponentFileTemplate
paramsDefs *parametersv1alpha1.ParametersDefinition
- pdcr *parametersv1alpha1.ParamConfigRenderer
+ configDescs []parametersv1alpha1.ComponentConfigDescription
baseCMObject *corev1.ConfigMap
updatedCMObject *corev1.ConfigMap
@@ -110,9 +109,11 @@ max_connections=666
paramsDefs = testparameters.NewParametersDefinitionFactory("test-pd").
SetConfigFile(testConfigName).
GetObject()
- pdcr = testparameters.NewParamConfigRendererFactory("test-pdcr").
- SetTemplateName(testConfigSpecName).
- GetObject()
+ configDescs = []parametersv1alpha1.ComponentConfigDescription{{
+ Name: testConfigName,
+ TemplateName: testConfigSpecName,
+ FileFormatConfig: paramsDefs.Spec.FileFormatConfig.DeepCopy(),
+ }}
baseCMObject = &corev1.ConfigMap{
Data: map[string]string{
@@ -166,10 +167,6 @@ max_connections=666
updatedCMObject,
jsonUpdatedCMObject,
}), testutil.WithAnyTimes()))
- mockClient.MockNListMethod(0, testutil.WithListReturned(
- testutil.WithConstructListReturnedResult([]runtime.Object{pdcr}),
- testutil.WithAnyTimes(),
- ))
})
AfterEach(func() {
@@ -186,11 +183,11 @@ max_connections=666
}
tmpCM := baseCMObject.DeepCopy()
- mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
+ mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, configDescs)
Expect(err).To(Succeed())
Expect(mergedData).Should(HaveLen(2))
- configReaders, err := cfgcore.LoadRawConfigObject(mergedData, pdcr.Spec.Configs[0].FileFormatConfig, []string{testConfigName})
+ configReaders, err := cfgcore.LoadRawConfigObject(mergedData, configDescs[0].FileFormatConfig, []string{testConfigName})
Expect(err).Should(Succeed())
Expect(configReaders).Should(HaveLen(1))
configObject := configReaders[testConfigName]
@@ -213,12 +210,12 @@ max_connections=666
}
tmpCM := baseCMObject.DeepCopy()
- mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
+ mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, configDescs)
Expect(err).Should(Succeed())
Expect(mergedData).Should(HaveLen(2))
Expect(reflect.DeepEqual(mergedData, updatedCMObject.Data)).Should(BeTrue())
- configReaders, err := cfgcore.LoadRawConfigObject(mergedData, pdcr.Spec.Configs[0].FileFormatConfig, []string{testConfigName})
+ configReaders, err := cfgcore.LoadRawConfigObject(mergedData, configDescs[0].FileFormatConfig, []string{testConfigName})
Expect(err).Should(Succeed())
Expect(configReaders).Should(HaveLen(1))
configObject := configReaders[testConfigName]
@@ -238,7 +235,7 @@ max_connections=666
}
tmpCM := baseCMObject.DeepCopy()
- _, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
+ _, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, configDescs)
Expect(err).ShouldNot(Succeed())
})
})
@@ -252,7 +249,7 @@ max_connections=666
}
tmpCM := baseCMObject.DeepCopy()
- mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
+ mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, configDescs)
Expect(err).Should(Succeed())
Expect(reflect.DeepEqual(mergedData, updatedCMObject.Data)).Should(BeTrue())
})
@@ -267,7 +264,7 @@ max_connections=666
}
tmpCM := baseCMObject.DeepCopy()
- _, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, pdcr)
+ _, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, configDescs)
Expect(err).ShouldNot(Succeed())
})
@@ -279,7 +276,7 @@ max_connections=666
}
tmpCM := baseCMObject.DeepCopy()
- _, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, ¶metersv1alpha1.ParamConfigRenderer{})
+ _, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, tmpCM.Data, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, nil)
Expect(err).Should(Succeed())
})
})
@@ -302,15 +299,18 @@ max_connections=666
mockData := map[string]string{
testConfigName: "{}",
}
- mockPcr := pdcr.DeepCopy()
- mockPcr.Spec.Configs[0].FileFormatConfig = ¶metersv1alpha1.FileFormatConfig{
- Format: parametersv1alpha1.JSON,
- }
- mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, mockData, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, mockPcr)
+ mockConfigs := []parametersv1alpha1.ComponentConfigDescription{{
+ Name: testConfigName,
+ TemplateName: testConfigSpecName,
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.JSON,
+ },
+ }}
+ mergedData, err := mergerConfigTemplate(importedTemplate, templateBuilder, configSpec, mockData, []*parametersv1alpha1.ParametersDefinition{paramsDefs}, mockConfigs)
Expect(err).To(Succeed())
Expect(mergedData).Should(HaveLen(1))
- configReaders, err := cfgcore.LoadRawConfigObject(mergedData, mockPcr.Spec.Configs[0].FileFormatConfig, []string{testConfigName})
+ configReaders, err := cfgcore.LoadRawConfigObject(mergedData, mockConfigs[0].FileFormatConfig, []string{testConfigName})
Expect(err).Should(Succeed())
Expect(configReaders).Should(HaveLen(1))
configObject := configReaders[testConfigName]
diff --git a/pkg/parameters/template_render.go b/pkg/parameters/template_render.go
index 81afb328f85..8a07b3a49b8 100644
--- a/pkg/parameters/template_render.go
+++ b/pkg/parameters/template_render.go
@@ -31,10 +31,10 @@ import (
func RerenderParametersTemplate(reconcileCtx *render.ReconcileCtx,
item parametersv1alpha1.ConfigTemplateItemDetail,
- configRender *parametersv1alpha1.ParamConfigRenderer,
+ configs []parametersv1alpha1.ComponentConfigDescription,
parametersDefs []*parametersv1alpha1.ParametersDefinition) (*corev1.ConfigMap, error) {
parametersValidate := func(m map[string]string) error {
- return validateRenderedData(m, parametersDefs, configRender)
+ return validateRenderedData(m, parametersDefs, configs)
}
configSpec := *item.ConfigSpec
@@ -56,7 +56,7 @@ func RerenderParametersTemplate(reconcileCtx *render.ReconcileCtx,
configSpec,
rerenderCMObj.Data,
parametersDefs,
- configRender)
+ configs)
if err != nil {
return nil, err
}
@@ -66,13 +66,13 @@ func RerenderParametersTemplate(reconcileCtx *render.ReconcileCtx,
func ApplyParameters(item parametersv1alpha1.ConfigTemplateItemDetail,
baseConfig *corev1.ConfigMap,
- configRender *parametersv1alpha1.ParamConfigRenderer,
+ configs []parametersv1alpha1.ComponentConfigDescription,
paramsDefs []*parametersv1alpha1.ParametersDefinition) (*corev1.ConfigMap, error) {
- if configRender == nil || len(configRender.Spec.Configs) == 0 {
+ if len(configs) == 0 {
return nil, fmt.Errorf("not support parameter reconfigure")
}
- newData, err := DoMerge(baseConfig.Data, item.ConfigFileParams, paramsDefs, configRender.Spec.Configs)
+ newData, err := DoMerge(baseConfig.Data, item.ConfigFileParams, paramsDefs, configs)
if err != nil {
return nil, err
}
diff --git a/pkg/parameters/template_render_test.go b/pkg/parameters/template_render_test.go
index 9117f45c34c..1451048e0fd 100644
--- a/pkg/parameters/template_render_test.go
+++ b/pkg/parameters/template_render_test.go
@@ -45,7 +45,7 @@ var _ = Describe("ToolsImageBuilderTest", func() {
var compDefObj *appsv1.ComponentDefinition
var clusterComponent *component.SynthesizedComponent
var paramsDef *parametersv1alpha1.ParametersDefinition
- var pdcr *parametersv1alpha1.ParamConfigRenderer
+ var configDescs []parametersv1alpha1.ComponentConfigDescription
BeforeEach(func() {
mockK8sCli = testutil.NewK8sMockClient()
@@ -53,15 +53,12 @@ var _ = Describe("ToolsImageBuilderTest", func() {
// Add any setup steps that needs to be executed before each test
clusterObj, compDefObj, _ = newAllFieldsClusterObj(nil, false)
paramsDef = testparameters.NewParametersDefinitionFactory(paramsDefName).
- SetReloadAction(testparameters.WithNoneAction()).
- GetObject()
- clusterComponent = newAllFieldsSynthesizedComponent(compDefObj, clusterObj)
-
- pdcr = testparameters.NewParamConfigRendererFactory(pdcrName).
- SetParametersDefs(paramsDef.Name).
SetComponentDefinition(compDefObj.GetName()).
SetTemplateName(configTemplateName).
GetObject()
+ clusterComponent = newAllFieldsSynthesizedComponent(compDefObj, clusterObj)
+
+ configDescs = BuildConfigDescriptionsFromParametersDefs([]*parametersv1alpha1.ParametersDefinition{paramsDef})
})
AfterEach(func() {
@@ -100,21 +97,21 @@ var _ = Describe("ToolsImageBuilderTest", func() {
CustomTemplates: customTemplate,
}
pds := []*parametersv1alpha1.ParametersDefinition{paramsDef}
- cmObj, err := RerenderParametersTemplate(rctx, item, pdcr, pds)
+ cmObj, err := RerenderParametersTemplate(rctx, item, configDescs, pds)
Expect(err).Should(Succeed())
- configdesc := pdcr.Spec.Configs[0]
+ configdesc := configDescs[0]
if len(parameters) == 0 {
configReaders, err := cfgcore.LoadRawConfigObject(cmObj.Data, configdesc.FileFormatConfig, []string{configdesc.Name})
Expect(err).Should(Succeed())
return configReaders[configdesc.Name]
}
- params, err := ClassifyComponentParameters(parameters, pds, []appsv1.ComponentFileTemplate{*item.ConfigSpec}, map[string]*corev1.ConfigMap{configTemplateName: tpl}, pdcr)
+ params, err := ClassifyComponentParameters(parameters, pds, []appsv1.ComponentFileTemplate{*item.ConfigSpec}, map[string]*corev1.ConfigMap{configTemplateName: tpl}, configDescs)
Expect(err).Should(Succeed())
tplParams, ok := params[configTemplateName]
Expect(ok).Should(BeTrue())
item.ConfigFileParams = deRef(tplParams)
- result, err := ApplyParameters(item, cmObj, pdcr, pds)
+ result, err := ApplyParameters(item, cmObj, configDescs, pds)
Expect(err).Should(Succeed())
configReaders, err := cfgcore.LoadRawConfigObject(result.Data, configdesc.FileFormatConfig, []string{configdesc.Name})
Expect(err).Should(Succeed())
diff --git a/pkg/parameters/template_validate.go b/pkg/parameters/template_validate.go
index cebdf2c35a1..3e77ecf936f 100644
--- a/pkg/parameters/template_validate.go
+++ b/pkg/parameters/template_validate.go
@@ -26,8 +26,8 @@ import (
)
// validateRenderedData validates config file against constraint
-func validateRenderedData(renderedData map[string]string, paramsDefs []*parametersv1alpha1.ParametersDefinition, configRender *parametersv1alpha1.ParamConfigRenderer) error {
- if len(paramsDefs) == 0 || configRender == nil || len(configRender.Spec.Configs) == 0 {
+func validateRenderedData(renderedData map[string]string, paramsDefs []*parametersv1alpha1.ParametersDefinition, configs []parametersv1alpha1.ComponentConfigDescription) error {
+ if len(paramsDefs) == 0 || len(configs) == 0 {
return nil
}
for _, paramsDef := range paramsDefs {
@@ -38,7 +38,7 @@ func validateRenderedData(renderedData map[string]string, paramsDefs []*paramete
if _, ok := renderedData[fileName]; !ok {
continue
}
- if fileConfig := resolveFileFormatConfig(configRender.Spec.Configs, fileName); fileConfig != nil {
+ if fileConfig := resolveFileFormatConfig(configs, fileName); fileConfig != nil {
if err := validateConfigContent(renderedData[fileName], ¶msDef.Spec, fileConfig); err != nil {
return err
}
diff --git a/pkg/testutil/parameters/paramconfigrenderer_factory.go b/pkg/testutil/parameters/paramconfigrenderer_factory.go
deleted file mode 100644
index 00166f29a9e..00000000000
--- a/pkg/testutil/parameters/paramconfigrenderer_factory.go
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
-Copyright (C) 2022-2025 ApeCloud Co., Ltd
-
-This file is part of KubeBlocks project
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU Affero General Public License as published by
-the Free Software Foundation, either version 3 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU Affero General Public License for more details.
-
-You should have received a copy of the GNU Affero General Public License
-along with this program. If not, see .
-*/
-
-package parameters
-
-import (
- parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
- "github.com/apecloud/kubeblocks/pkg/generics"
- testapps "github.com/apecloud/kubeblocks/pkg/testutil/apps"
-)
-
-type MockParamConfigRendererFactory struct {
- testapps.BaseFactory[parametersv1alpha1.ParamConfigRenderer, *parametersv1alpha1.ParamConfigRenderer, MockParamConfigRendererFactory]
-}
-
-func NewParamConfigRendererFactory(name string) *MockParamConfigRendererFactory {
- f := &MockParamConfigRendererFactory{}
- f.Init("", name, ¶metersv1alpha1.ParamConfigRenderer{
- Spec: parametersv1alpha1.ParamConfigRendererSpec{
- Configs: []parametersv1alpha1.ComponentConfigDescription{
- {
- Name: MysqlConfigFile,
- FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
- Format: parametersv1alpha1.Ini,
- FormatterAction: parametersv1alpha1.FormatterAction{
- IniConfig: ¶metersv1alpha1.IniConfig{
- SectionName: "mysqld",
- },
- },
- },
- },
- },
- },
- }, f)
- return f
-}
-
-func (f *MockParamConfigRendererFactory) SetParametersDefs(paramsDefs ...string) *MockParamConfigRendererFactory {
- f.Get().Spec.ParametersDefs = paramsDefs
- return f
-}
-
-func (f *MockParamConfigRendererFactory) SetComponentDefinition(cmpd string) *MockParamConfigRendererFactory {
- f.Get().Spec.ComponentDef = cmpd
- return f
-}
-
-func (f *MockParamConfigRendererFactory) safeGetConfigDescription(key string) *parametersv1alpha1.ComponentConfigDescription {
- desc := f.getComponentConfigDescription(&f.Get().Spec, key)
- if desc != nil {
- return desc
- }
- f.Get().Spec.Configs = append(f.Get().Spec.Configs, parametersv1alpha1.ComponentConfigDescription{
- Name: key,
- })
- return f.getComponentConfigDescription(&f.Get().Spec, key)
-}
-
-func (f *MockParamConfigRendererFactory) SetConfigDescription(key, tpl string, formatter parametersv1alpha1.FileFormatConfig) *MockParamConfigRendererFactory {
- desc := f.safeGetConfigDescription(key)
- desc.TemplateName = tpl
- desc.FileFormatConfig = formatter.DeepCopy()
- return f
-}
-
-func (f *MockParamConfigRendererFactory) SetTemplateName(tpl string) *MockParamConfigRendererFactory {
- desc := f.safeGetConfigDescription(MysqlConfigFile)
- desc.TemplateName = tpl
- return f
-}
-
-func (f *MockParamConfigRendererFactory) HScaleEnabled() *MockParamConfigRendererFactory {
- desc := f.safeGetConfigDescription(MysqlConfigFile)
- desc.ReRenderResourceTypes = append(desc.ReRenderResourceTypes, parametersv1alpha1.ComponentHScaleType)
- return f
-}
-
-func (f *MockParamConfigRendererFactory) TLSEnabled() *MockParamConfigRendererFactory {
- desc := f.safeGetConfigDescription(MysqlConfigFile)
- desc.ReRenderResourceTypes = append(desc.ReRenderResourceTypes, parametersv1alpha1.ComponentTLSType)
- return f
-}
-
-func (f *MockParamConfigRendererFactory) VScaleEnabled() *MockParamConfigRendererFactory {
- desc := f.safeGetConfigDescription(MysqlConfigFile)
- desc.ReRenderResourceTypes = append(desc.ReRenderResourceTypes, parametersv1alpha1.ComponentVScaleType)
- return f
-}
-
-func (f *MockParamConfigRendererFactory) getComponentConfigDescription(pdcr *parametersv1alpha1.ParamConfigRendererSpec, name string) *parametersv1alpha1.ComponentConfigDescription {
- match := func(desc parametersv1alpha1.ComponentConfigDescription) bool {
- return desc.Name == name
- }
- if index := generics.FindFirstFunc(pdcr.Configs, match); index >= 0 {
- return &pdcr.Configs[index]
- }
- return nil
-}
diff --git a/pkg/testutil/parameters/parametersdefinition_factory.go b/pkg/testutil/parameters/parametersdefinition_factory.go
index 6715bc507ba..cdbfadfef37 100644
--- a/pkg/testutil/parameters/parametersdefinition_factory.go
+++ b/pkg/testutil/parameters/parametersdefinition_factory.go
@@ -33,13 +33,45 @@ func NewParametersDefinitionFactory(name string) *MockParametersDefinitionFactor
f := &MockParametersDefinitionFactory{}
f.Init("", name, ¶metersv1alpha1.ParametersDefinition{
Spec: parametersv1alpha1.ParametersDefinitionSpec{
- FileName: MysqlConfigFile,
- ReloadAction: WithNoneAction(),
+ FileName: MysqlConfigFile,
+ FileFormatConfig: ¶metersv1alpha1.FileFormatConfig{
+ Format: parametersv1alpha1.Ini,
+ FormatterAction: parametersv1alpha1.FormatterAction{
+ IniConfig: ¶metersv1alpha1.IniConfig{
+ SectionName: "mysqld",
+ },
+ },
+ },
},
}, f)
return f
}
+func (f *MockParametersDefinitionFactory) SetComponentDefinition(name string) *MockParametersDefinitionFactory {
+ f.Get().Spec.ComponentDef = name
+ return f
+}
+
+func (f *MockParametersDefinitionFactory) SetServiceVersion(version string) *MockParametersDefinitionFactory {
+ f.Get().Spec.ServiceVersion = version
+ return f
+}
+
+func (f *MockParametersDefinitionFactory) SetTemplateName(name string) *MockParametersDefinitionFactory {
+ f.Get().Spec.TemplateName = name
+ return f
+}
+
+func (f *MockParametersDefinitionFactory) SetConfigFile(name string) *MockParametersDefinitionFactory {
+ f.Get().Spec.FileName = name
+ return f
+}
+
+func (f *MockParametersDefinitionFactory) SetFileFormatConfig(cfg parametersv1alpha1.FileFormatConfig) *MockParametersDefinitionFactory {
+ f.Get().Spec.FileFormatConfig = &cfg
+ return f
+}
+
func (f *MockParametersDefinitionFactory) Schema(cue string) *MockParametersDefinitionFactory {
openAPISchema, _ := openapi.GenerateOpenAPISchema(cue, "")
f.Get().Spec.ParametersSchema = ¶metersv1alpha1.ParametersSchema{
@@ -49,11 +81,6 @@ func (f *MockParametersDefinitionFactory) Schema(cue string) *MockParametersDefi
return f
}
-func (f *MockParametersDefinitionFactory) SetConfigFile(name string) *MockParametersDefinitionFactory {
- f.Get().Spec.FileName = name
- return f
-}
-
func (f *MockParametersDefinitionFactory) StaticParameters(params []string) *MockParametersDefinitionFactory {
f.Get().Spec.StaticParameters = params
return f
@@ -68,16 +95,3 @@ func (f *MockParametersDefinitionFactory) ImmutableParameters(params []string) *
f.Get().Spec.ImmutableParameters = params
return f
}
-
-func (f *MockParametersDefinitionFactory) SetReloadAction(action *parametersv1alpha1.ReloadAction) *MockParametersDefinitionFactory {
- f.Get().Spec.ReloadAction = action
- return f
-}
-
-func WithNoneAction() *parametersv1alpha1.ReloadAction {
- return ¶metersv1alpha1.ReloadAction{
- AutoTrigger: ¶metersv1alpha1.AutoTrigger{
- ProcessName: "",
- },
- }
-}
|