Skip to content

Commit a91d023

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 07ea8f2 commit a91d023

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
@@ -486,6 +486,21 @@ func (r *GaleraReconciler) Reconcile(ctx context.Context, req ctrl.Request) (res
486486
Resources: []string{"services"},
487487
Verbs: []string{"get", "list", "update", "patch"},
488488
},
489+
{
490+
APIGroups: []string{"mariadb.openstack.org"},
491+
Resources: []string{"galeras"},
492+
Verbs: []string{"get", "list"},
493+
},
494+
{
495+
APIGroups: []string{"mariadb.openstack.org"},
496+
Resources: []string{"mariadbaccounts"},
497+
Verbs: []string{"get"},
498+
},
499+
{
500+
APIGroups: []string{""},
501+
Resources: []string{"secrets"},
502+
Verbs: []string{"get"},
503+
},
489504
}
490505
rbacResult, err := common_rbac.ReconcileRbac(ctx, helper, instance, rbacRules)
491506
if err != nil {
@@ -935,19 +950,21 @@ func (r *GaleraReconciler) generateConfigMaps(
935950
) error {
936951
log := GetLog(ctx, "galera")
937952
templateParameters := map[string]interface{}{
938-
"logToDisk": instance.Spec.LogToDisk,
953+
"logToDisk": instance.Spec.LogToDisk,
954+
"galeraInstanceName": instance.Name,
939955
}
940956
customData := make(map[string]string)
941957
customData[mariadbv1.CustomServiceConfigFile] = instance.Spec.CustomServiceConfig
942958

943959
cms := []util.Template{
944960
// ScriptsConfigMap
945961
{
946-
Name: configMapNameForScripts(instance),
947-
Namespace: instance.Namespace,
948-
Type: util.TemplateTypeScripts,
949-
InstanceType: instance.Kind,
950-
Labels: map[string]string{},
962+
Name: configMapNameForScripts(instance),
963+
Namespace: instance.Namespace,
964+
Type: util.TemplateTypeScripts,
965+
InstanceType: instance.Kind,
966+
Labels: map[string]string{},
967+
ConfigOptions: templateParameters,
951968
},
952969
// ConfigMap
953970
{

controllers/mariadbaccount_controller.go

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

245-
var dbAdminSecret, dbContainerImage, serviceAccountName string
245+
var dbContainerImage, serviceAccountName string
246246

247247
if !dbGalera.Status.Bootstrapped {
248248
log.Info("DB bootstrap not complete. Requeue...")
249249
return ctrl.Result{RequeueAfter: time.Duration(10) * time.Second}, nil
250250
}
251251

252-
dbAdminSecret = dbGalera.Spec.Secret
253252
dbContainerImage = dbGalera.Spec.ContainerImage
254253
serviceAccountName = dbGalera.RbacResourceName()
255254

@@ -287,7 +286,7 @@ func (r *MariaDBAccountReconciler) reconcileCreate(
287286

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

290-
jobDef, err := mariadb.CreateDbAccountJob(instance, mariadbDatabase.Spec.Name, dbHostname, dbAdminSecret, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
289+
jobDef, err := mariadb.CreateDbAccountJob(dbGalera, instance, mariadbDatabase.Spec.Name, dbHostname, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
291290
if err != nil {
292291
return ctrl.Result{}, err
293292
}
@@ -478,7 +477,7 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
478477
}
479478
}
480479

481-
var dbAdminSecret, dbContainerImage, serviceAccountName string
480+
var dbContainerImage, serviceAccountName string
482481

483482
if !dbGalera.Status.Bootstrapped {
484483
log.Info("DB bootstrap not complete. Requeue...")
@@ -493,7 +492,6 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
493492
return ctrl.Result{RequeueAfter: time.Second * 10}, nil
494493
}
495494

496-
dbAdminSecret = dbGalera.Spec.Secret
497495
dbContainerImage = dbGalera.Spec.ContainerImage
498496
serviceAccountName = dbGalera.RbacResourceName()
499497

@@ -512,7 +510,7 @@ func (r *MariaDBAccountReconciler) reconcileDelete(
512510

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

515-
jobDef, err := mariadb.DeleteDbAccountJob(instance, mariadbDatabase.Spec.Name, dbHostname, dbAdminSecret, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
513+
jobDef, err := mariadb.DeleteDbAccountJob(dbGalera, instance, mariadbDatabase.Spec.Name, dbHostname, dbContainerImage, serviceAccountName, dbGalera.Spec.NodeSelector)
516514
if err != nil {
517515
return ctrl.Result{}, err
518516
}

controllers/mariadbdatabase_controller.go

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

186-
dbSecret = dbGalera.Spec.Secret
187186
dbContainerImage = dbGalera.Spec.ContainerImage
188187
serviceAccount = dbGalera.RbacResourceName()
189188

@@ -199,7 +198,7 @@ func (r *MariaDBDatabaseReconciler) Reconcile(ctx context.Context, req ctrl.Requ
199198
)
200199

201200
// Define a new Job object (hostname, password, containerImage)
202-
jobDef, err := mariadb.DbDatabaseJob(instance, dbHostname, dbSecret, dbContainerImage, serviceAccount, useTLS, dbGalera.Spec.NodeSelector)
201+
jobDef, err := mariadb.DbDatabaseJob(dbGalera, instance, dbHostname, dbContainerImage, serviceAccount, useTLS, dbGalera.Spec.NodeSelector)
203202
if err != nil {
204203
return ctrl.Result{}, err
205204
}

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
Resources: g.Spec.Resources,
119109
VolumeMounts: getGaleraInitVolumeMounts(g),
@@ -132,16 +122,6 @@ func getGaleraContainers(g *mariadbv1.Galera, configHash string) []corev1.Contai
132122
}, {
133123
Name: "KOLLA_CONFIG_STRATEGY",
134124
Value: "COPY_ALWAYS",
135-
}, {
136-
Name: "DB_ROOT_PASSWORD",
137-
ValueFrom: &corev1.EnvVarSource{
138-
SecretKeyRef: &corev1.SecretKeySelector{
139-
LocalObjectReference: corev1.LocalObjectReference{
140-
Name: g.Spec.Secret,
141-
},
142-
Key: "DbRootPassword",
143-
},
144-
},
145125
}},
146126
Ports: []corev1.ContainerPort{{
147127
ContainerPort: 3306,

0 commit comments

Comments
 (0)