@@ -21,6 +21,7 @@ import (
2121 "crypto/sha256"
2222 "embed"
2323 "fmt"
24+ "maps"
2425 "slices"
2526
2627 corev1 "k8s.io/api/core/v1"
@@ -40,50 +41,56 @@ const (
4041//go:embed scripts/*
4142var scripts embed.FS
4243
44+ func getConfigMapName (clusterName string ) string {
45+ return clusterName + "-config"
46+ }
47+
4348// Create or update a default valkey.conf
4449// If additional config is provided, append to the default map
4550func (r * ValkeyClusterReconciler ) upsertConfigMap (ctx context.Context , cluster * valkeyiov1alpha1.ValkeyCluster ) error {
4651
4752 log := logf .FromContext (ctx )
4853
54+ // Hash writer for embedded scripts, and configuration parameters
55+ hashConfigContents := sha256 .New ()
56+
4957 // Embed readiness check script
5058 readiness , err := scripts .ReadFile ("scripts/readiness-check.sh" )
5159 if err != nil {
5260 return err
5361 }
62+ hashConfigContents .Write (readiness )
5463
5564 // Embed liveness check script
5665 liveness , err := scripts .ReadFile ("scripts/liveness-check.sh" )
5766 if err != nil {
5867 return err
5968 }
69+ hashConfigContents .Write (liveness )
6070
71+ // Base config
6172 serverConfig := `# Base operator config
6273cluster-enabled yes
6374protected-mode no
6475cluster-node-timeout 2000
6576`
6677
67- // Shortcut
78+ // Local copy
6879 specConfig := cluster .Spec .ValkeySpec .Configuration
6980
7081 // If there are any user-defined config parameters
7182 if len (specConfig ) > 0 {
7283
7384 // Sort the config keys to keep consistent processing order
74- sortedConfig := make ([]string , 0 , len (specConfig ))
75- for k := range specConfig {
76- sortedConfig = append (sortedConfig , k )
77- }
78- slices .Sort (sortedConfig )
85+ sortedKeys := slices .Sorted (maps .Keys (specConfig ))
7986
8087 // Build the config
8188 serverConfig += "\n # Extra config\n "
82- for _ , k := range sortedConfig {
89+ for _ , k := range sortedKeys {
8390
8491 if slices .Contains (valkeyiov1alpha1 .NonUserOverrideConfigParameters , k ) {
8592 log .Error (nil , "Prohibited valkey server config" , "parameter" , k )
86- r .Recorder .Eventf (cluster , corev1 .EventTypeWarning , "ConfigMapUpdateFailed" , "Prohibited config: %v" , k )
93+ r .Recorder .Eventf (cluster , nil , corev1 .EventTypeWarning , "ConfigMapUpdateFailed" , "UpsertConfigMap " , "Prohibited config: %v" , k )
8794 continue
8895 }
8996
@@ -124,15 +131,16 @@ cluster-node-timeout 2000
124131 // Register ownership of the configMap
125132 if err := controllerutil .SetControllerReference (cluster , serverConfigMap , r .Scheme ); err != nil {
126133 log .Error (err , "Failed to grab ownership of server configMap" )
127- r .Recorder .Eventf (cluster , corev1 .EventTypeWarning , "ConfigMapCreationFailed" , "Failed to grab ownership of server configMap: %v" , err )
134+ r .Recorder .Eventf (cluster , nil , corev1 .EventTypeWarning , "ConfigMapCreationFailed" , "UpsertConfigMap " , "Failed to grab ownership of server configMap: %v" , err )
128135 return err
129136 }
130137
131138 // Calculate hash of existing config parameters
132139 origServerConfigHash := fmt .Sprintf ("%x" , sha256 .Sum256 ([]byte (serverConfigMap .Data [configFileKey ])))
133140
134141 // Calculate hash of new config parameters
135- newServerConfigHash := fmt .Sprintf ("%x" , sha256 .Sum256 ([]byte (serverConfig )))
142+ hashConfigContents .Write ([]byte (serverConfig ))
143+ newServerConfigHash := fmt .Sprintf ("%x" , hashConfigContents .Sum (nil ))
136144
137145 // Was the configMap changed? This is an invalid action, as users should modify
138146 // the ValkeyCluster CR to change parameters, not the configMap itself.
@@ -143,34 +151,37 @@ cluster-node-timeout 2000
143151
144152 // Original config is not modified, and new config doesn't change anything
145153 if ! origConfigModified && ! needsUpdate {
146- log .V (1 ).Info ("Server configMap unchanged" )
154+ log .V (1 ).Info ("server config unchanged" )
147155 return nil
148156 }
149157
150158 // In all other cases (ie: user modified configMap, or modified CR),
151- // update the config with the newly changed config
159+ // update the config with the newly changed config. Also sync the
160+ // check scripts in case they are updated in a later operator version.
161+ serverConfigMap .Data ["readiness-check.sh" ] = string (readiness )
162+ serverConfigMap .Data ["liveness-check.sh" ] = string (liveness )
152163 serverConfigMap .Data [configFileKey ] = serverConfig
153164
154165 // Need to create new configMap
155166 if needCreateConfigMap {
156167 if err := r .Create (ctx , serverConfigMap ); err != nil {
157168 log .Error (err , "Failed to create server configMap" )
158- r .Recorder .Eventf (cluster , corev1 .EventTypeWarning , "ConfigMapCreationFailed" , "Failed to create server configMap: %v" , err )
169+ r .Recorder .Eventf (cluster , nil , corev1 .EventTypeWarning , "ConfigMapCreationFailed" , "UpsertConfigMap " , "Failed to create server configMap: %v" , err )
159170 return err
160171 } else {
161- r .Recorder .Eventf (cluster , corev1 .EventTypeNormal , "ConfigMapCreated" , "Created server configMap" )
172+ r .Recorder .Eventf (cluster , nil , corev1 .EventTypeNormal , "ConfigMapCreated" , "UpsertConfigMap " , "Created server configMap" )
162173 return nil
163174 }
164175 }
165176
166177 // Otherwise, update it
167178 if err := r .Update (ctx , serverConfigMap ); err != nil {
168179 log .Error (err , "Failed to update server configMap" )
169- r .Recorder .Eventf (cluster , corev1 .EventTypeWarning , "ConfigMapUpdateFailed" , "Failed to update server configMap: %v" , err )
180+ r .Recorder .Eventf (cluster , nil , corev1 .EventTypeWarning , "ConfigMapUpdateFailed" , "UpsertConfigMap " , "Failed to update server configMap: %v" , err )
170181 return err
171182 }
172183
173- r .Recorder .Eventf (cluster , corev1 .EventTypeNormal , "ConfigMapUpdated" , "Synchronized server configMap" )
184+ r .Recorder .Eventf (cluster , nil , corev1 .EventTypeNormal , "ConfigMapUpdated" , "UpsertConfigMap " , "Synchronized server configMap" )
174185
175186 // All is good. Server configMap will be auto-mounted in the deployment
176187 return nil
0 commit comments