Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions apis/parameters/v1alpha1/parametersdefinition_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,7 @@ type ReloadAction struct {

// Enables reloading process using a Go template script.
//
// +kubebuilder:deprecatedversion:warning="This field has been deprecated since 1.1.0"
// +optional
TPLScriptTrigger *TPLScriptTrigger `json:"tplScriptTrigger"`

Expand Down
5 changes: 0 additions & 5 deletions controllers/parameters/reconfigure_policy.go
Original file line number Diff line number Diff line change
Expand Up @@ -142,11 +142,6 @@ func enableSyncTrigger(reloadAction *parametersv1alpha1.ReloadAction) bool {
if reloadAction == nil {
return false
}

if reloadAction.TPLScriptTrigger != nil {
return !core.IsWatchModuleForTplTrigger(reloadAction.TPLScriptTrigger)
}

if reloadAction.ShellTrigger != nil {
return !core.IsWatchModuleForShellTrigger(reloadAction.ShellTrigger)
}
Expand Down
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ go 1.24.0

require (
cuelang.org/go v0.8.0
github.com/DATA-DOG/go-sqlmock v1.5.0
github.com/Masterminds/semver/v3 v3.2.1
github.com/Masterminds/sprig/v3 v3.2.3
github.com/StudioSol/set v1.0.0
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -56,8 +56,6 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ=
Expand Down
74 changes: 0 additions & 74 deletions pkg/parameters/configmanager/builder.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,12 +26,9 @@ import (
"strconv"

"github.com/imdario/mergo"
"gopkg.in/yaml.v2"
corev1 "k8s.io/api/core/v1"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
apiruntime "k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/util/retry"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -41,18 +38,13 @@ import (
parametersv1alpha1 "github.com/apecloud/kubeblocks/apis/parameters/v1alpha1"
"github.com/apecloud/kubeblocks/pkg/constant"
"github.com/apecloud/kubeblocks/pkg/controller/multicluster"
"github.com/apecloud/kubeblocks/pkg/parameters/core"
cfgutil "github.com/apecloud/kubeblocks/pkg/parameters/util"
viper "github.com/apecloud/kubeblocks/pkg/viperx"
)

const (
configTemplateName = "reload.yaml"
scriptVolumePrefix = "cm-script-"

scriptConfigField = "scripts"
formatterConfigField = "formatterConfig"

configManagerConfigVolumeName = "config-manager-config"
configManagerConfig = "config-manager.yaml"
configManagerConfigMountPoint = "/opt/config-manager"
Expand All @@ -77,7 +69,6 @@ func BuildConfigManagerContainerParams(cli client.Client, ctx context.Context, m
ctrl.Log.Info(fmt.Sprintf("volume mount not be use : %s", buildParam.ConfigSpec.VolumeName))
continue
}
buildParam.MountPoint = volume.MountPath
if err := buildConfigSpecHandleMeta(cli, ctx, buildParam, managerParams); err != nil {
return err
}
Expand Down Expand Up @@ -180,41 +171,6 @@ func buildConfigSpecHandleMeta(cli client.Client, ctx context.Context, buildPara
return err
}
}
if buildParam.ReloadType == parametersv1alpha1.TPLScriptType {
return buildTPLScriptCM(buildParam, cmBuildParam, cli, ctx)
}
return nil
}

func buildTPLScriptCM(configSpecBuildMeta *ConfigSpecMeta, manager *CfgManagerBuildParams, cli client.Client, ctx context.Context) error {
var (
options = configSpecBuildMeta.TPLScriptTrigger
formatConfig = configSpecBuildMeta.FormatterConfig
mountPoint = GetScriptsMountPoint(configSpecBuildMeta.ConfigSpec)
)

reloadYamlFn := func(cm *corev1.ConfigMap) error {
newData, err := checkAndUpdateReloadYaml(cm.Data, configTemplateName, formatConfig)
if err != nil {
return err
}
cm.Data = newData
return nil
}

referenceCMKey := client.ObjectKey{
Namespace: options.Namespace,
Name: options.ScriptConfigMapRef,
}
scriptCMKey := client.ObjectKey{
Namespace: manager.Cluster.GetNamespace(),
Name: fmt.Sprintf("%s%s-%s", configManagerCMPrefix, options.ScriptConfigMapRef, manager.Cluster.GetName()),
}
if err := checkOrCreateConfigMap(referenceCMKey, scriptCMKey, cli, ctx, manager.Cluster, reloadYamlFn); err != nil {
return err
}
buildReloadScriptVolume(scriptCMKey.Name, manager, mountPoint, GetScriptsVolumeName(configSpecBuildMeta.ConfigSpec))
configSpecBuildMeta.TPLConfig = filepath.Join(mountPoint, configTemplateName)
return nil
}

Expand Down Expand Up @@ -295,32 +251,6 @@ func mergeWithOverride(dst, src interface{}) {
_ = mergo.Merge(dst, src, mergo.WithOverride)
}

func checkAndUpdateReloadYaml(data map[string]string, reloadConfig string, formatterConfig parametersv1alpha1.FileFormatConfig) (map[string]string, error) {
configObject := make(map[string]interface{})
if content, ok := data[reloadConfig]; ok {
if err := yaml.Unmarshal([]byte(content), &configObject); err != nil {
return nil, err
}
}
if res, _, _ := unstructured.NestedFieldNoCopy(configObject, scriptConfigField); res == nil {
return nil, core.MakeError("reload.yaml required field: %s", scriptConfigField)
}

formatObject, err := apiruntime.DefaultUnstructuredConverter.ToUnstructured(&formatterConfig)
if err != nil {
return nil, err
}
if err := unstructured.SetNestedField(configObject, formatObject, formatterConfigField); err != nil {
return nil, err
}
b, err := yaml.Marshal(configObject)
if err != nil {
return nil, err
}
data[reloadConfig] = string(b)
return data, nil
}

func buildCfgManagerScripts(options parametersv1alpha1.ScriptConfig, manager *CfgManagerBuildParams, cli client.Client, ctx context.Context, configSpec appsv1.ComponentFileTemplate) error {
mountPoint := filepath.Join(KBScriptVolumePath, configSpec.Name)
referenceCMKey := client.ObjectKey{
Expand All @@ -338,10 +268,6 @@ func buildCfgManagerScripts(options parametersv1alpha1.ScriptConfig, manager *Cf
return nil
}

func GetScriptsMountPoint(configSpec appsv1.ComponentFileTemplate) string {
return filepath.Join(KBScriptVolumePath, configSpec.Name)
}

func GetScriptsVolumeName(configSpec appsv1.ComponentFileTemplate) string {
return fmt.Sprintf("%s%s", scriptVolumePrefix, configSpec.Name)
}
Expand Down
149 changes: 1 addition & 148 deletions pkg/parameters/configmanager/builder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,12 @@ package configmanager

import (
"context"
"reflect"
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"

"github.com/stretchr/testify/assert"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/yaml"
"sigs.k8s.io/controller-runtime/pkg/client"

appsv1 "github.com/apecloud/kubeblocks/apis/apps/v1"
Expand All @@ -43,8 +39,6 @@ var _ = Describe("Config Builder Test", func() {
const (
scriptsName = "script_cm"
scriptsNS = "default"

lazyRenderedTemplateName = "lazy-rendered-template"
)

var mockK8sCli *testutil.K8sClientMockHelper
Expand All @@ -58,8 +52,6 @@ var _ = Describe("Config Builder Test", func() {
DeferCleanup(mockK8sCli.Finish)
})

syncFn := func(sync bool) *bool { r := sync; return &r }

newVolumeMounts := func() []corev1.VolumeMount {
return []corev1.VolumeMount{
{
Expand All @@ -71,13 +63,6 @@ var _ = Describe("Config Builder Test", func() {
shellHandle := &parametersv1alpha1.ShellTrigger{
Command: []string{"pwd"},
}
scriptHandle := &parametersv1alpha1.TPLScriptTrigger{
Sync: sync,
ScriptConfig: parametersv1alpha1.ScriptConfig{
ScriptConfigMapRef: "reload-script",
Namespace: scriptsNS,
},
}
autoHandle := &parametersv1alpha1.AutoTrigger{
ProcessName: "postgres",
}
Expand All @@ -86,9 +71,6 @@ var _ = Describe("Config Builder Test", func() {
case parametersv1alpha1.ShellType:
return &parametersv1alpha1.ReloadAction{
ShellTrigger: shellHandle}
case parametersv1alpha1.TPLScriptType:
return &parametersv1alpha1.ReloadAction{
TPLScriptTrigger: scriptHandle}
case parametersv1alpha1.AutoType:
return &parametersv1alpha1.ReloadAction{
AutoTrigger: autoHandle}
Expand Down Expand Up @@ -132,35 +114,8 @@ var _ = Describe("Config Builder Test", func() {
return param
}

mockTplScriptCM := func() {
mockK8sCli.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
&corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: "reload-script",
Namespace: scriptsNS,
},
Data: map[string]string{
"reload.yaml": `
scripts: reload.tpl
fileRegex: my.cnf
formatterConfig:
format: ini
`,
}},
&corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Name: lazyRenderedTemplateName,
Namespace: scriptsNS,
},
Data: map[string]string{
"my.cnf": "",
}},
}), testutil.WithAnyTimes()))
mockK8sCli.MockCreateMethod(testutil.WithCreateReturned(testutil.WithCreatedSucceedResult(), testutil.WithAnyTimes()))
}

Context("TestBuildConfigManagerContainer", func() {
It("builds shellTrigger reloader correctly", func() {
It("build shell reloader correctly", func() {
mockK8sCli.MockGetMethod(testutil.WithGetReturned(testutil.WithConstructSimpleGetResult([]client.Object{
&corev1.ConfigMap{
ObjectMeta: metav1.ObjectMeta{
Expand All @@ -180,107 +135,5 @@ formatterConfig:
}
Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param)).Should(Succeed())
})

It("builds tplScriptsTrigger reloader correctly", func() {
mockTplScriptCM()
param := newCMBuildParams(false)
reloadOptions := newReloadOptions(parametersv1alpha1.TPLScriptType, syncFn(true))
for i := range param.ConfigSpecsBuildParams {
buildParam := &param.ConfigSpecsBuildParams[i]
buildParam.ReloadAction = reloadOptions
buildParam.ReloadType = parametersv1alpha1.TPLScriptType
}
Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param)).Should(Succeed())
for _, arg := range []string{`--operator-update-enable`} {
Expect(param.Args).Should(ContainElement(arg))
}
})

It("builds tplScriptsTrigger reloader correctly with sync", func() {
mockTplScriptCM()
param := newCMBuildParams(false)
reloadOptions := newReloadOptions(parametersv1alpha1.TPLScriptType, syncFn(false))
for i := range param.ConfigSpecsBuildParams {
buildParam := &param.ConfigSpecsBuildParams[i]
buildParam.ReloadAction = reloadOptions
buildParam.ReloadType = parametersv1alpha1.TPLScriptType
}
Expect(BuildConfigManagerContainerParams(mockK8sCli.Client(), context.TODO(), param)).Should(Succeed())
})
})

})

func TestCheckAndUpdateReloadYaml(t *testing.T) {
customEqual := func(l, r map[string]string) bool {
if len(l) != len(r) {
return false
}
var err error
for k, v := range l {
var lv any
var rv any
err = yaml.Unmarshal([]byte(v), &lv)
assert.Nil(t, err)
err = yaml.Unmarshal([]byte(r[k]), &rv)
assert.Nil(t, err)
if !reflect.DeepEqual(lv, rv) {
return false
}
}
return true
}

type args struct {
data map[string]string
reloadConfig string
formatterConfig *parametersv1alpha1.FileFormatConfig
}
tests := []struct {
name string
args args
want map[string]string
wantErr bool
}{{
name: "testCheckAndUpdateReloadYaml",
args: args{
data: map[string]string{"reload.yaml": `
fileRegex: my.cnf
scripts: reload.tpl
`},
reloadConfig: "reload.yaml",
formatterConfig: &parametersv1alpha1.FileFormatConfig{
Format: parametersv1alpha1.Ini,
},
},
wantErr: false,
want: map[string]string{"reload.yaml": `
scripts: reload.tpl
fileRegex: my.cnf
formatterConfig:
format: ini
`,
},
}, {
name: "testCheckAndUpdateReloadYaml",
args: args{
data: map[string]string{},
reloadConfig: "reload.yaml",
formatterConfig: &parametersv1alpha1.FileFormatConfig{Format: parametersv1alpha1.Ini},
},
wantErr: true,
want: map[string]string{},
}}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
got, err := checkAndUpdateReloadYaml(tt.args.data, tt.args.reloadConfig, *tt.args.formatterConfig)
if (err != nil) != tt.wantErr {
t.Errorf("checkAndUpdateReloadYaml() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !customEqual(got, tt.want) {
t.Errorf("checkAndUpdateReloadYaml() got = %v, want %v", got, tt.want)
}
})
}
}
Loading