Skip to content

Commit 9fff6b0

Browse files
committed
Get MYSQL_PWD using an on-demand cluster query
In order to facilitate an in-place change to the name of the Secret that is referenced by a Galera instance for the mysql root password, rework the approach used by pods and shell scripts to no longer require the root secret name and/or password be passed by environment variable, instead using a pod-level cluster query to retrieve the current root password. The logic to retrieve this password is encapsulated into a single shell script that is present as a volume mount on running containers. This allows Job objects to be created with hashes that do not link to a specific Secret name, as well as to create StatefulSet objects that don't refer to this name. When the Secret name changes on a Galera instance for an in-place root password change, the hashes / CRs for these objects will remain unchanged. A subsequent change to the mariadb operator will add the ability to change the mysql root password of a Galera cluster using a dual-reference architecture where the "current" root secret will be part of <CR>/Status, while the secret referenced in <CR>/Spec will be the "new" root secret. When these two names differ, that will indicate an in-place password change should take place, as well as allowing the pre-existing root password to be available at the same time as the new one in order to do a root password change. The same architecture will be applied to a new class of "system" MariaDBAccount objects that are for use only by the Galera instance itself and do not have a link to any MariaDBDatabase CR. The Galera CR itself will no longer use osp-secret for the mysql root password nor will the secret be directly referenced from the Galera CR, instead referenced by a "system" MariaDBAccount CR which the Galera operator itself will create.
1 parent 08026fd commit 9fff6b0

File tree

28 files changed

+176
-164
lines changed

28 files changed

+176
-164
lines changed

controllers/galera_controller.go

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,21 @@ func (r *GaleraReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res
481481
Resources: []string{"services"},
482482
Verbs: []string{"get", "list", "update", "patch"},
483483
},
484+
{
485+
APIGroups: []string{"mariadb.openstack.org"},
486+
Resources: []string{"galeras"},
487+
Verbs: []string{"get", "list"},
488+
},
489+
{
490+
APIGroups: []string{"mariadb.openstack.org"},
491+
Resources: []string{"mariadbaccounts"},
492+
Verbs: []string{"get"},
493+
},
494+
{
495+
APIGroups: []string{""},
496+
Resources: []string{"secrets"},
497+
Verbs: []string{"get"},
498+
},
484499
}
485500
rbacResult, err := common_rbac.ReconcileRbac(ctx, helper, instance, rbacRules)
486501
if err != nil {
@@ -930,19 +945,21 @@ func (r *GaleraReconciler) generateConfigMaps(
930945
) error {
931946
log := GetLog(ctx, "galera")
932947
templateParameters := map[string]interface{}{
933-
"logToDisk": instance.Spec.LogToDisk,
948+
"logToDisk": instance.Spec.LogToDisk,
949+
"galeraInstanceName": instance.Name,
934950
}
935951
customData := make(map[string]string)
936952
customData[mariadbv1.CustomServiceConfigFile] = instance.Spec.CustomServiceConfig
937953

938954
cms := []util.Template{
939955
// ScriptsConfigMap
940956
{
941-
Name: configMapNameForScripts(instance),
942-
Namespace: instance.Namespace,
943-
Type: util.TemplateTypeScripts,
944-
InstanceType: instance.Kind,
945-
Labels: map[string]string{},
957+
Name: configMapNameForScripts(instance),
958+
Namespace: instance.Namespace,
959+
Type: util.TemplateTypeScripts,
960+
InstanceType: instance.Kind,
961+
Labels: map[string]string{},
962+
ConfigOptions: templateParameters,
946963
},
947964
// ConfigMap
948965
{

controllers/mariadbaccount_controller.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -237,14 +237,13 @@ func (r *MariaDBAccountReconciler) reconcileCreate(
237237
return ctrl.Result{}, err
238238
}
239239

240-
var dbAdminSecret, dbContainerImage, serviceAccountName string
240+
var dbContainerImage, serviceAccountName string
241241

242242
if !dbGalera.Status.Bootstrapped {
243243
log.Info("DB bootstrap not complete. Requeue...")
244244
return ctrl.Result{RequeueAfter: time.Duration(10) * time.Second}, nil
245245
}
246246

247-
dbAdminSecret = dbGalera.Spec.Secret
248247
dbContainerImage = dbGalera.Spec.ContainerImage
249248
serviceAccountName = dbGalera.RbacResourceName()
250249

@@ -282,7 +281,7 @@ func (r *MariaDBAccountReconciler) reconcileCreate(
282281

283282
log.Info(fmt.Sprintf("Running account create '%s' MariaDBDatabase '%s'", instance.Name, mariadbDatabaseName))
284283

285-
jobDef, err := mariadb.CreateDbAccountJob(instance, mariadbDatabase.Spec.Name, dbHostname, dbAdminSecret, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
284+
jobDef, err := mariadb.CreateDbAccountJob(dbGalera, instance, mariadbDatabase.Spec.Name, dbHostname, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
286285
if err != nil {
287286
return ctrl.Result{}, err
288287
}
@@ -473,7 +472,7 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
473472
}
474473
}
475474

476-
var dbAdminSecret, dbContainerImage, serviceAccountName string
475+
var dbContainerImage, serviceAccountName string
477476

478477
if !dbGalera.Status.Bootstrapped {
479478
log.Info("DB bootstrap not complete. Requeue...")
@@ -488,7 +487,6 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
488487
return ctrl.Result{RequeueAfter: time.Second * 10}, nil
489488
}
490489

491-
dbAdminSecret = dbGalera.Spec.Secret
492490
dbContainerImage = dbGalera.Spec.ContainerImage
493491
serviceAccountName = dbGalera.RbacResourceName()
494492

@@ -507,7 +505,7 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
507505

508506
log.Info(fmt.Sprintf("Running account delete '%s' MariaDBDatabase '%s'", instance.Name, mariadbDatabaseName))
509507

510-
jobDef, err := mariadb.DeleteDbAccountJob(instance, mariadbDatabase.Spec.Name, dbHostname, dbAdminSecret, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
508+
jobDef, err := mariadb.DeleteDbAccountJob(dbGalera, instance, mariadbDatabase.Spec.Name, dbHostname, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
511509
if err != nil {
512510
return ctrl.Result{}, err
513511
}

controllers/mariadbdatabase_controller.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func (r *MariaDBDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Requ
161161
//
162162
// Non-deletion (normal) flow follows
163163
//
164-
var dbSecret, dbContainerImage, serviceAccount string
164+
var dbContainerImage, serviceAccount string
165165
// NOTE(dciabrin) When configured to only allow TLS connections, all clients
166166
// accessing this DB must support client connection via TLS.
167167
useTLS := dbGalera.Spec.TLS.Enabled() && dbGalera.Spec.DisableNonTLSListeners
@@ -179,7 +179,6 @@ func (r *MariaDBDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Requ
179179
return ctrl.Result{RequeueAfter: time.Second * 10}, nil
180180
}
181181

182-
dbSecret = dbGalera.Spec.Secret
183182
dbContainerImage = dbGalera.Spec.ContainerImage
184183
serviceAccount = dbGalera.RbacResourceName()
185184

@@ -195,7 +194,7 @@ func (r *MariaDBDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Requ
195194
)
196195

197196
// Define a new Job object (hostname, password, containerImage)
198-
jobDef, err := mariadb.DbDatabaseJob(instance, dbHostname, dbSecret, dbContainerImage, serviceAccount, useTLS, dbGalera.Spec.NodeSelector)
197+
jobDef, err := mariadb.DbDatabaseJob(dbGalera, instance, dbHostname, dbContainerImage, serviceAccount, useTLS, dbGalera.Spec.NodeSelector)
199198
if err != nil {
200199
return ctrl.Result{}, err
201200
}

pkg/mariadb/account.go

Lines changed: 10 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
util "github.com/openstack-k8s-operators/lib-common/modules/common/util"
77
databasev1beta1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
8+
mariadbv1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
89
batchv1 "k8s.io/api/batch/v1"
910
corev1 "k8s.io/api/core/v1"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -18,7 +19,7 @@ type accountCreateOrDeleteOptions struct {
1819
RequireTLS string
1920
}
2021

21-
func CreateDbAccountJob(account *databasev1beta1.MariaDBAccount, databaseName string, databaseHostName string, databaseSecret string, containerImage string, serviceAccountName string, nodeSelector *map[string]string) (*batchv1.Job, error) {
22+
func CreateDbAccountJob(galera *mariadbv1.Galera, account *databasev1beta1.MariaDBAccount, databaseName string, databaseHostName string, containerImage string, serviceAccountName string, nodeSelector *map[string]string) (*batchv1.Job, error) {
2223
var tlsStatement string
2324
if account.Spec.RequireTLS {
2425
tlsStatement = " REQUIRE SSL"
@@ -60,17 +61,6 @@ func CreateDbAccountJob(account *databasev1beta1.MariaDBAccount, databaseName st
6061
Image: containerImage,
6162
Command: []string{"/bin/sh", "-c", dbCmd},
6263
Env: []corev1.EnvVar{
63-
{
64-
Name: "MYSQL_PWD",
65-
ValueFrom: &corev1.EnvVarSource{
66-
SecretKeyRef: &corev1.SecretKeySelector{
67-
LocalObjectReference: corev1.LocalObjectReference{
68-
Name: databaseSecret,
69-
},
70-
Key: databasev1beta1.DbRootPasswordSelector,
71-
},
72-
},
73-
},
7464
{
7565
Name: "DatabasePassword",
7666
ValueFrom: &corev1.EnvVarSource{
@@ -83,8 +73,10 @@ func CreateDbAccountJob(account *databasev1beta1.MariaDBAccount, databaseName st
8373
},
8474
},
8575
},
76+
VolumeMounts: getGaleraRootOnlyVolumeMounts(),
8677
},
8778
},
79+
Volumes: getGaleraRootOnlyVolumes(galera),
8880
},
8981
},
9082
},
@@ -97,7 +89,7 @@ func CreateDbAccountJob(account *databasev1beta1.MariaDBAccount, databaseName st
9789
return job, nil
9890
}
9991

100-
func DeleteDbAccountJob(account *databasev1beta1.MariaDBAccount, databaseName string, databaseHostName string, databaseSecret string, containerImage string, serviceAccountName string, nodeSelector *map[string]string) (*batchv1.Job, error) {
92+
func DeleteDbAccountJob(galera *mariadbv1.Galera, account *databasev1beta1.MariaDBAccount, databaseName string, databaseHostName string, containerImage string, serviceAccountName string, nodeSelector *map[string]string) (*batchv1.Job, error) {
10193

10294
opts := accountCreateOrDeleteOptions{account.Spec.UserName, databaseName, databaseHostName, "root", ""}
10395

@@ -121,24 +113,13 @@ func DeleteDbAccountJob(account *databasev1beta1.MariaDBAccount, databaseName st
121113
ServiceAccountName: serviceAccountName,
122114
Containers: []corev1.Container{
123115
{
124-
Name: "mariadb-account-delete",
125-
Image: containerImage,
126-
Command: []string{"/bin/sh", "-c", delCmd},
127-
Env: []corev1.EnvVar{
128-
{
129-
Name: "MYSQL_PWD",
130-
ValueFrom: &corev1.EnvVarSource{
131-
SecretKeyRef: &corev1.SecretKeySelector{
132-
LocalObjectReference: corev1.LocalObjectReference{
133-
Name: databaseSecret,
134-
},
135-
Key: databasev1beta1.DbRootPasswordSelector,
136-
},
137-
},
138-
},
139-
},
116+
Name: "mariadb-account-delete",
117+
Image: containerImage,
118+
Command: []string{"/bin/sh", "-c", delCmd},
119+
VolumeMounts: getGaleraRootOnlyVolumeMounts(),
140120
},
141121
},
122+
Volumes: getGaleraRootOnlyVolumes(galera),
142123
},
143124
},
144125
},

pkg/mariadb/database.go

Lines changed: 17 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
util "github.com/openstack-k8s-operators/lib-common/modules/common/util"
77
databasev1beta1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
8+
mariadbv1 "github.com/openstack-k8s-operators/mariadb-operator/api/v1beta1"
89
batchv1 "k8s.io/api/batch/v1"
910
corev1 "k8s.io/api/core/v1"
1011
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -20,7 +21,7 @@ type dbCreateOptions struct {
2021
}
2122

2223
// DbDatabaseJob -
23-
func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName string, databaseSecret string, containerImage string, serviceAccountName string, useTLS bool, nodeSelector *map[string]string) (*batchv1.Job, error) {
24+
func DbDatabaseJob(galera *mariadbv1.Galera, database *databasev1beta1.MariaDBDatabase, databaseHostName string, containerImage string, serviceAccountName string, useTLS bool, nodeSelector *map[string]string) (*batchv1.Job, error) {
2425
var tlsStatement string
2526
if useTLS {
2627
tlsStatement = " REQUIRE SSL"
@@ -48,17 +49,6 @@ func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName s
4849

4950
if database.Spec.Secret != nil {
5051
scriptEnv = []corev1.EnvVar{
51-
{
52-
Name: "MYSQL_PWD",
53-
ValueFrom: &corev1.EnvVarSource{
54-
SecretKeyRef: &corev1.SecretKeySelector{
55-
LocalObjectReference: corev1.LocalObjectReference{
56-
Name: databaseSecret,
57-
},
58-
Key: "DbRootPassword",
59-
},
60-
},
61-
},
6252
// send deprecated Secret field but only if non-nil
6353
{
6454
Name: "DatabasePassword",
@@ -73,19 +63,7 @@ func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName s
7363
},
7464
}
7565
} else {
76-
scriptEnv = []corev1.EnvVar{
77-
{
78-
Name: "MYSQL_PWD",
79-
ValueFrom: &corev1.EnvVarSource{
80-
SecretKeyRef: &corev1.SecretKeySelector{
81-
LocalObjectReference: corev1.LocalObjectReference{
82-
Name: databaseSecret,
83-
},
84-
Key: "DbRootPassword",
85-
},
86-
},
87-
},
88-
}
66+
scriptEnv = []corev1.EnvVar{}
8967
}
9068

9169
job := &batchv1.Job{
@@ -104,12 +82,14 @@ func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName s
10482
ServiceAccountName: serviceAccountName,
10583
Containers: []corev1.Container{
10684
{
107-
Name: "mariadb-database-create",
108-
Image: containerImage,
109-
Command: []string{"/bin/sh", "-c", dbCmd},
110-
Env: scriptEnv,
85+
Name: "mariadb-database-create",
86+
Image: containerImage,
87+
Command: []string{"/bin/sh", "-c", dbCmd},
88+
Env: scriptEnv,
89+
VolumeMounts: getGaleraRootOnlyVolumeMounts(),
11190
},
11291
},
92+
Volumes: getGaleraRootOnlyVolumes(galera),
11393
},
11494
},
11595
},
@@ -123,7 +103,7 @@ func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName s
123103
}
124104

125105
// DeleteDbDatabaseJob -
126-
func DeleteDbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName string, databaseSecret string, containerImage string, serviceAccountName string, nodeSelector *map[string]string) (*batchv1.Job, error) {
106+
func DeleteDbDatabaseJob(galera *mariadbv1.Galera, database *databasev1beta1.MariaDBDatabase, databaseHostName string, containerImage string, serviceAccountName string, nodeSelector *map[string]string) (*batchv1.Job, error) {
127107

128108
opts := dbCreateOptions{
129109
database.Spec.Name,
@@ -145,17 +125,6 @@ func DeleteDbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHost
145125

146126
if database.Spec.Secret != nil {
147127
scriptEnv = []corev1.EnvVar{
148-
{
149-
Name: "MYSQL_PWD",
150-
ValueFrom: &corev1.EnvVarSource{
151-
SecretKeyRef: &corev1.SecretKeySelector{
152-
LocalObjectReference: corev1.LocalObjectReference{
153-
Name: databaseSecret,
154-
},
155-
Key: databasev1beta1.DbRootPasswordSelector,
156-
},
157-
},
158-
},
159128
// send deprecated Secret field but only if non-nil. otherwise
160129
// the script should not try to drop usernames from mysql.user
161130
{
@@ -171,19 +140,7 @@ func DeleteDbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHost
171140
},
172141
}
173142
} else {
174-
scriptEnv = []corev1.EnvVar{
175-
{
176-
Name: "MYSQL_PWD",
177-
ValueFrom: &corev1.EnvVarSource{
178-
SecretKeyRef: &corev1.SecretKeySelector{
179-
LocalObjectReference: corev1.LocalObjectReference{
180-
Name: databaseSecret,
181-
},
182-
Key: databasev1beta1.DbRootPasswordSelector,
183-
},
184-
},
185-
},
186-
}
143+
scriptEnv = []corev1.EnvVar{}
187144
}
188145

189146
job := &batchv1.Job{
@@ -199,12 +156,14 @@ func DeleteDbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHost
199156
ServiceAccountName: serviceAccountName,
200157
Containers: []corev1.Container{
201158
{
202-
Name: "mariadb-database-create",
203-
Image: containerImage,
204-
Command: []string{"/bin/sh", "-c", delCmd},
205-
Env: scriptEnv,
159+
Name: "mariadb-database-create",
160+
Image: containerImage,
161+
Command: []string{"/bin/sh", "-c", delCmd},
162+
Env: scriptEnv,
163+
VolumeMounts: getGaleraRootOnlyVolumeMounts(),
206164
},
207165
},
166+
Volumes: getGaleraRootOnlyVolumes(galera),
208167
},
209168
},
210169
},

pkg/mariadb/statefulset.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,6 @@ func getGaleraInitContainers(g *mariadbv1.Galera) []corev1.Container {
104104
}, {
105105
Name: "KOLLA_CONFIG_STRATEGY",
106106
Value: "COPY_ALWAYS",
107-
}, {
108-
Name: "DB_ROOT_PASSWORD",
109-
ValueFrom: &corev1.EnvVarSource{
110-
SecretKeyRef: &corev1.SecretKeySelector{
111-
LocalObjectReference: corev1.LocalObjectReference{
112-
Name: g.Spec.Secret,
113-
},
114-
Key: "DbRootPassword",
115-
},
116-
},
117107
}},
118108
VolumeMounts: getGaleraInitVolumeMounts(g),
119109
}}
@@ -131,16 +121,6 @@ func getGaleraContainers(g *mariadbv1.Galera, configHash string) []corev1.Contai
131121
}, {
132122
Name: "KOLLA_CONFIG_STRATEGY",
133123
Value: "COPY_ALWAYS",
134-
}, {
135-
Name: "DB_ROOT_PASSWORD",
136-
ValueFrom: &corev1.EnvVarSource{
137-
SecretKeyRef: &corev1.SecretKeySelector{
138-
LocalObjectReference: corev1.LocalObjectReference{
139-
Name: g.Spec.Secret,
140-
},
141-
Key: "DbRootPassword",
142-
},
143-
},
144124
}},
145125
Ports: []corev1.ContainerPort{{
146126
ContainerPort: 3306,

0 commit comments

Comments
 (0)