Skip to content

Commit b1b853e

Browse files
Merge pull request openstack-k8s-operators#383 from stuggi/tlse_db_status
[tlse] TLS database connection
2 parents 2dc967b + 9f53adf commit b1b853e

File tree

3 files changed

+95
-57
lines changed

3 files changed

+95
-57
lines changed

controllers/keystoneapi_controller.go

Lines changed: 79 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -733,60 +733,12 @@ func (r *KeystoneAPIReconciler) reconcileNormal(
733733
//
734734
// create service DB instance
735735
//
736-
db := mariadbv1.NewDatabase(
737-
instance.Name,
738-
instance.Spec.DatabaseUser,
739-
instance.Spec.Secret,
740-
map[string]string{
741-
"dbName": instance.Spec.DatabaseInstance,
742-
},
743-
)
744-
// create or patch the DB
745-
ctrlResult, err := db.CreateOrPatchDB(
746-
ctx,
747-
helper,
748-
)
736+
db, result, err := r.ensureDB(ctx, helper, instance)
749737
if err != nil {
750-
instance.Status.Conditions.Set(condition.FalseCondition(
751-
condition.DBReadyCondition,
752-
condition.ErrorReason,
753-
condition.SeverityWarning,
754-
condition.DBReadyErrorMessage,
755-
err.Error()))
756738
return ctrl.Result{}, err
739+
} else if (result != ctrl.Result{}) {
740+
return result, nil
757741
}
758-
if (ctrlResult != ctrl.Result{}) {
759-
instance.Status.Conditions.Set(condition.FalseCondition(
760-
condition.DBReadyCondition,
761-
condition.RequestedReason,
762-
condition.SeverityInfo,
763-
condition.DBReadyRunningMessage))
764-
return ctrlResult, nil
765-
}
766-
767-
// wait for the DB to be setup
768-
ctrlResult, err = db.WaitForDBCreated(ctx, helper)
769-
if err != nil {
770-
instance.Status.Conditions.Set(condition.FalseCondition(
771-
condition.DBReadyCondition,
772-
condition.ErrorReason,
773-
condition.SeverityWarning,
774-
condition.DBReadyErrorMessage,
775-
err.Error()))
776-
return ctrlResult, err
777-
}
778-
if (ctrlResult != ctrl.Result{}) {
779-
instance.Status.Conditions.Set(condition.FalseCondition(
780-
condition.DBReadyCondition,
781-
condition.RequestedReason,
782-
condition.SeverityInfo,
783-
condition.DBReadyRunningMessage))
784-
return ctrlResult, nil
785-
}
786-
// update Status.DatabaseHostname, used to bootstrap/config the service
787-
instance.Status.DatabaseHostname = db.GetDatabaseHostname()
788-
instance.Status.Conditions.MarkTrue(condition.DBReadyCondition, condition.DBReadyMessage)
789-
790742
// create service DB - end
791743

792744
//
@@ -880,7 +832,7 @@ func (r *KeystoneAPIReconciler) reconcileNormal(
880832
// - %-config configmap holding minimal keystone config required to get the service up, user can add additional files to be added to the service
881833
// - parameters which has passwords gets added from the OpenStack secret via the init container
882834
//
883-
err = r.generateServiceConfigMaps(ctx, instance, helper, &configMapVars, memcached)
835+
err = r.generateServiceConfigMaps(ctx, instance, helper, &configMapVars, memcached, db)
884836
if err != nil {
885837
instance.Status.Conditions.Set(condition.FalseCondition(
886838
condition.ServiceConfigReadyCondition,
@@ -1158,6 +1110,7 @@ func (r *KeystoneAPIReconciler) generateServiceConfigMaps(
11581110
h *helper.Helper,
11591111
envVars *map[string]env.Setter,
11601112
mc *memcachedv1.Memcached,
1113+
db *mariadbv1.Database,
11611114
) error {
11621115
//
11631116
// create Configmap/Secret required for keystone input
@@ -1168,12 +1121,18 @@ func (r *KeystoneAPIReconciler) generateServiceConfigMaps(
11681121

11691122
cmLabels := labels.GetLabels(instance, labels.GetGroupLabel(keystone.ServiceName), map[string]string{})
11701123

1124+
var tlsCfg *tls.Service
1125+
if instance.Spec.TLS.Ca.CaBundleSecretName != "" {
1126+
tlsCfg = &tls.Service{}
1127+
}
1128+
11711129
// customData hold any customization for the service.
11721130
// custom.conf is going to /etc/<service>/<service>.conf.d
11731131
// all other files get placed into /etc/<service> to allow overwrite of e.g. policy.json
11741132
// TODO: make sure custom.conf can not be overwritten
11751133
customData := map[string]string{
11761134
common.CustomServiceConfigFileName: instance.Spec.CustomServiceConfig,
1135+
"my.cnf": db.GetDatabaseClientConfig(tlsCfg), //(mschuppert) for now just get the default my.cnf
11771136
}
11781137
for key, data := range instance.Spec.DefaultConfigOverwrite {
11791138
customData[key] = data
@@ -1192,7 +1151,7 @@ func (r *KeystoneAPIReconciler) generateServiceConfigMaps(
11921151
templateParameters := map[string]interface{}{
11931152
"memcachedServers": strings.Join(mc.Status.ServerList, ","),
11941153
"TransportURL": string(transportURLSecret.Data["transport_url"]),
1195-
"DatabaseConnection": fmt.Sprintf("mysql+pymysql://%s:%s@%s/%s",
1154+
"DatabaseConnection": fmt.Sprintf("mysql+pymysql://%s:%s@%s/%s?read_default_file=/etc/my.cnf",
11961155
instance.Spec.DatabaseUser,
11971156
string(ospSecret.Data[instance.Spec.PasswordSelectors.Database]),
11981157
instance.Status.DatabaseHostname,
@@ -1416,3 +1375,70 @@ func (r *KeystoneAPIReconciler) getKeystoneMemcached(
14161375
}
14171376
return memcached, err
14181377
}
1378+
1379+
func (r *KeystoneAPIReconciler) ensureDB(
1380+
ctx context.Context,
1381+
h *helper.Helper,
1382+
instance *keystonev1.KeystoneAPI,
1383+
) (*mariadbv1.Database, ctrl.Result, error) {
1384+
//
1385+
// create service DB instance
1386+
//
1387+
db := mariadbv1.NewDatabase(
1388+
instance.Name,
1389+
instance.Spec.DatabaseUser,
1390+
instance.Spec.Secret,
1391+
map[string]string{
1392+
"dbName": instance.Spec.DatabaseInstance,
1393+
},
1394+
)
1395+
1396+
// create or patch the DB
1397+
ctrlResult, err := db.CreateOrPatchDBByName(
1398+
ctx,
1399+
h,
1400+
instance.Spec.DatabaseInstance,
1401+
)
1402+
if err != nil {
1403+
instance.Status.Conditions.Set(condition.FalseCondition(
1404+
condition.DBReadyCondition,
1405+
condition.ErrorReason,
1406+
condition.SeverityWarning,
1407+
condition.DBReadyErrorMessage,
1408+
err.Error()))
1409+
return db, ctrl.Result{}, err
1410+
}
1411+
if (ctrlResult != ctrl.Result{}) {
1412+
instance.Status.Conditions.Set(condition.FalseCondition(
1413+
condition.DBReadyCondition,
1414+
condition.RequestedReason,
1415+
condition.SeverityInfo,
1416+
condition.DBReadyRunningMessage))
1417+
return db, ctrlResult, nil
1418+
}
1419+
// wait for the DB to be setup
1420+
// (ksambor) should we use WaitForDBCreatedWithTimeout instead?
1421+
ctrlResult, err = db.WaitForDBCreated(ctx, h)
1422+
if err != nil {
1423+
instance.Status.Conditions.Set(condition.FalseCondition(
1424+
condition.DBReadyCondition,
1425+
condition.ErrorReason,
1426+
condition.SeverityWarning,
1427+
condition.DBReadyErrorMessage,
1428+
err.Error()))
1429+
return db, ctrlResult, err
1430+
}
1431+
if (ctrlResult != ctrl.Result{}) {
1432+
instance.Status.Conditions.Set(condition.FalseCondition(
1433+
condition.DBReadyCondition,
1434+
condition.RequestedReason,
1435+
condition.SeverityInfo,
1436+
condition.DBReadyRunningMessage))
1437+
return db, ctrlResult, nil
1438+
}
1439+
1440+
// update Status.DatabaseHostname, used to config the service
1441+
instance.Status.DatabaseHostname = db.GetDatabaseHostname()
1442+
instance.Status.Conditions.MarkTrue(condition.DBReadyCondition, condition.DBReadyMessage)
1443+
return db, ctrlResult, nil
1444+
}

templates/keystoneapi/config/keystone-api-config.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,12 @@
5252
"dest": "/etc/keystone/",
5353
"owner": "keystone:keystone",
5454
"perm": "0700"
55+
},
56+
{
57+
"source": "/var/lib/config-data/default/my.cnf",
58+
"dest": "/etc/my.cnf",
59+
"owner": "keystone",
60+
"perm": "0644"
5561
}
5662
]
5763
}

tests/functional/keystoneapi_controller_test.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -374,13 +374,16 @@ var _ = Describe("Keystone controller", func() {
374374
)
375375
})
376376

377-
It("should create a Secret for keystone.conf", func() {
377+
It("should create a Secret for keystone.conf and my.cnf", func() {
378378
scrt := th.GetSecret(keystoneApiConfigDataName)
379379
configData := string(scrt.Data["keystone.conf"])
380380
Expect(configData).To(
381381
ContainSubstring("memcache_servers=memcached-0.memcached:11211,memcached-1.memcached:11211,memcached-2.memcached:11211"))
382382
Expect(configData).To(
383-
ContainSubstring(fmt.Sprintf("connection=mysql+pymysql://keystone:12345678@hostname-for-openstack.%s.svc/keystone", namespace)))
383+
ContainSubstring(fmt.Sprintf("connection=mysql+pymysql://keystone:12345678@hostname-for-openstack.%s.svc/keystone?read_default_file=/etc/my.cnf", namespace)))
384+
configData = string(scrt.Data["my.cnf"])
385+
Expect(configData).To(
386+
ContainSubstring("[client]\nssl=0"))
384387
})
385388
It("should create a Secret for fernet keys", func() {
386389
th.GetSecret(types.NamespacedName{
@@ -904,13 +907,16 @@ var _ = Describe("Keystone controller", func() {
904907
th.AssertVolumeMountExists(caBundleSecretName.Name, "tls-ca-bundle.pem", j.Spec.Template.Spec.Containers[0].VolumeMounts)
905908
})
906909

907-
It("should create a Secret for keystone.conf", func() {
910+
It("should create a Secret for keystone.conf and my.cnf", func() {
908911
scrt := th.GetSecret(keystoneApiConfigDataName)
909912
configData := string(scrt.Data["keystone.conf"])
910913
Expect(configData).To(
911914
ContainSubstring("memcache_servers=memcached-0.memcached:11211,memcached-1.memcached:11211,memcached-2.memcached:11211"))
912915
Expect(configData).To(
913-
ContainSubstring(fmt.Sprintf("connection=mysql+pymysql://keystone:12345678@hostname-for-openstack.%s.svc/keystone", namespace)))
916+
ContainSubstring(fmt.Sprintf("connection=mysql+pymysql://keystone:12345678@hostname-for-openstack.%s.svc/keystone?read_default_file=/etc/my.cnf", namespace)))
917+
configData = string(scrt.Data["my.cnf"])
918+
Expect(configData).To(
919+
ContainSubstring("[client]\nssl-ca=/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem\nssl=1"))
914920
})
915921

916922
It("it creates deployment with CA and service certs mounted", func() {

0 commit comments

Comments
 (0)