Skip to content

Commit fad88b6

Browse files
committed
fix: preserve parameter remove markers in componentparameter
1 parent a4e4088 commit fad88b6

File tree

6 files changed

+120
-12
lines changed

6 files changed

+120
-12
lines changed

controllers/parameters/componentparameter_controller_test.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,9 @@ var _ = Describe("ComponentParameter Controller", func() {
227227
item := parameters.GetConfigTemplateItem(&cfg.Spec, configSpecName)
228228
g.Expect(item).ShouldNot(BeNil())
229229
g.Expect(item.ConfigFileParams).Should(HaveKey("my.cnf"))
230-
g.Expect(item.ConfigFileParams["my.cnf"].Parameters).Should(HaveKey("max_connections"))
231-
g.Expect(item.ConfigFileParams["my.cnf"].Parameters["max_connections"]).Should(BeNil())
230+
decoded := parameters.DecodeParameterOverlay(item.ConfigFileParams["my.cnf"].Parameters)
231+
g.Expect(decoded).Should(HaveKey("max_connections"))
232+
g.Expect(decoded["max_connections"]).Should(BeNil())
232233
})).Should(Succeed())
233234
})
234235

controllers/parameters/componentparameter_controller_utils.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,8 @@ func reconcileParameterValuesIntoSpec(ctx context.Context, cli client.Client, co
9898
if reflect.DeepEqual(compParam.Spec, *specCopy) {
9999
return false, nil
100100
}
101-
patch := client.MergeFrom(compParam.DeepCopy())
102101
compParam.Spec = *specCopy
103-
return true, cli.Patch(ctx, compParam, patch)
102+
return true, cli.Update(ctx, compParam)
104103
}
105104

106105
func applyParameterInputs(spec *parametersv1alpha1.ComponentParameterSpec,
@@ -304,11 +303,24 @@ func mergeItemParameters(item *parametersv1alpha1.ConfigTemplateItemDetail, upda
304303
if parametersInFile.Content != nil {
305304
merged.Content = parametersInFile.Content
306305
}
307-
if merged.Parameters == nil && len(parametersInFile.Parameters) > 0 {
308-
merged.Parameters = map[string]*string{}
309-
}
310-
for paramKey, paramValue := range parametersInFile.Parameters {
311-
merged.Parameters[paramKey] = paramValue
306+
if override {
307+
encodedParameters := parameters.EncodeParameterOverlay(parametersInFile.Parameters)
308+
if len(encodedParameters) == 0 {
309+
merged.Parameters = nil
310+
} else {
311+
merged.Parameters = make(map[string]*string, len(encodedParameters))
312+
for paramKey, paramValue := range encodedParameters {
313+
merged.Parameters[paramKey] = paramValue
314+
}
315+
}
316+
} else {
317+
encodedParameters := parameters.EncodeParameterOverlay(parametersInFile.Parameters)
318+
if merged.Parameters == nil && len(encodedParameters) > 0 {
319+
merged.Parameters = map[string]*string{}
320+
}
321+
for paramKey, paramValue := range encodedParameters {
322+
merged.Parameters[paramKey] = paramValue
323+
}
312324
}
313325
item.ConfigFileParams[key] = merged
314326
}

controllers/parameters/componentparameter_controller_utils_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525
"k8s.io/utils/ptr"
2626

2727
parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
28+
parampkg "github.com/apecloud/kubeblocks/pkg/parameters"
2829
)
2930

3031
func TestNormalizeManagedParameterInputs(t *testing.T) {
@@ -67,3 +68,43 @@ func TestNormalizeManagedParameterInputs(t *testing.T) {
6768
}
6869
})
6970
}
71+
72+
func TestMergeItemParameters(t *testing.T) {
73+
t.Run("override replaces managed parameter overlay for a file", func(t *testing.T) {
74+
item := &parametersv1alpha1.ConfigTemplateItemDetail{
75+
ConfigFileParams: map[string]parametersv1alpha1.ParametersInFile{
76+
"my.cnf": {
77+
Content: ptr.To("[mysqld]\nmax_connections=1000\n"),
78+
Parameters: map[string]*string{
79+
"max_connections": ptr.To("1000"),
80+
"sync_binlog": ptr.To("1"),
81+
},
82+
},
83+
},
84+
}
85+
updated := map[string]parametersv1alpha1.ParametersInFile{
86+
"my.cnf": {
87+
Parameters: map[string]*string{
88+
"max_connections": nil,
89+
},
90+
},
91+
}
92+
93+
mergeItemParameters(item, updated, true)
94+
95+
got := item.ConfigFileParams["my.cnf"]
96+
if got.Content == nil || *got.Content != "[mysqld]\nmax_connections=1000\n" {
97+
t.Fatalf("expected non-managed fields to be preserved, got %#v", got.Content)
98+
}
99+
if len(got.Parameters) != 1 {
100+
t.Fatalf("expected managed overlay to be replaced, got %#v", got.Parameters)
101+
}
102+
decoded := parampkg.DecodeParameterOverlay(got.Parameters)
103+
if _, ok := decoded["max_connections"]; !ok {
104+
t.Fatalf("expected max_connections remove marker to be kept")
105+
}
106+
if decoded["max_connections"] != nil {
107+
t.Fatalf("expected max_connections to be overridden to nil remove marker, got %#v", decoded["max_connections"])
108+
}
109+
})
110+
}

pkg/operations/reconfigure_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ var _ = Describe("Reconfigure OpsRequest", func() {
6565
testapps.ClearResources(&testCtx, generics.OpsRequestSignature, inNS, ml)
6666
testapps.ClearResources(&testCtx, generics.ConfigMapSignature, inNS, ml)
6767
testapps.ClearResources(&testCtx, generics.ParametersDefinitionSignature, ml)
68-
testapps.ClearResources(&testCtx, generics.InstanceSetSignature, inNS, ml)
69-
testapps.ClearResources(&testCtx, generics.ComponentParameterSignature, inNS)
68+
testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.InstanceSetSignature, true, inNS, ml)
69+
testapps.ClearResourcesWithRemoveFinalizerOption(&testCtx, generics.ComponentParameterSignature, true, inNS)
7070
}
7171

7272
BeforeEach(cleanEnv)

pkg/parameters/patch_merger.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ func DoMerge(baseData map[string]string,
4242
updatedFiles[key] = *params.Content
4343
}
4444
if len(params.Parameters) > 0 {
45-
upParams, _ := core.FromStringMap(params.Parameters, builder.BuildValueTransformer(key))
45+
upParams, _ := core.FromStringMap(DecodeParameterOverlay(params.Parameters), builder.BuildValueTransformer(key))
4646
updatedParams = append(updatedParams, core.ParamPairs{
4747
Key: key,
4848
UpdatedParams: upParams,

pkg/parameters/remove_marker.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
/*
2+
Copyright (C) 2022-2025 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 parameters
21+
22+
import "k8s.io/utils/ptr"
23+
24+
const parameterRemoveMarker = "__kb_internal_remove_marker__"
25+
26+
func EncodeParameterOverlay(parameters map[string]*string) map[string]*string {
27+
if len(parameters) == 0 {
28+
return nil
29+
}
30+
encoded := make(map[string]*string, len(parameters))
31+
for key, value := range parameters {
32+
if value == nil {
33+
encoded[key] = ptr.To(parameterRemoveMarker)
34+
continue
35+
}
36+
encoded[key] = value
37+
}
38+
return encoded
39+
}
40+
41+
func DecodeParameterOverlay(parameters map[string]*string) map[string]*string {
42+
if len(parameters) == 0 {
43+
return nil
44+
}
45+
decoded := make(map[string]*string, len(parameters))
46+
for key, value := range parameters {
47+
if value != nil && *value == parameterRemoveMarker {
48+
decoded[key] = nil
49+
continue
50+
}
51+
decoded[key] = value
52+
}
53+
return decoded
54+
}

0 commit comments

Comments
 (0)