Skip to content

Commit 343ccf4

Browse files
Merge pull request #172 from dciabrin/db-utf8
Make database character encoding configurable
2 parents 34d6c99 + 2798ed1 commit 343ccf4

File tree

12 files changed

+238
-8
lines changed

12 files changed

+238
-8
lines changed

api/bases/mariadb.openstack.org_mariadbdatabases.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,23 @@ spec:
3535
spec:
3636
description: MariaDBDatabaseSpec defines the desired state of MariaDBDatabase
3737
properties:
38+
defaultCharacterSet:
39+
default: utf8
40+
description: Default character set for this database
41+
type: string
42+
defaultCollation:
43+
default: utf8_general_ci
44+
description: Default collation for this database
45+
type: string
3846
name:
47+
description: Name of the database in MariaDB
3948
type: string
4049
secret:
41-
description: Secret Name of secret which contains DatabasePassword
50+
description: Name of secret which contains DatabasePassword
4251
type: string
52+
required:
53+
- defaultCharacterSet
54+
- defaultCollation
4355
type: object
4456
status:
4557
description: MariaDBDatabaseStatus defines the observed state of MariaDBDatabase

api/v1beta1/mariadbdatabase_types.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,9 +30,16 @@ const (
3030

3131
// MariaDBDatabaseSpec defines the desired state of MariaDBDatabase
3232
type MariaDBDatabaseSpec struct {
33-
// Secret Name of secret which contains DatabasePassword
33+
// Name of secret which contains DatabasePassword
3434
Secret string `json:"secret,omitempty"`
35-
Name string `json:"name,omitempty"`
35+
// Name of the database in MariaDB
36+
Name string `json:"name,omitempty"`
37+
// +kubebuilder:default=utf8
38+
// Default character set for this database
39+
DefaultCharacterSet string `json:"defaultCharacterSet"`
40+
// +kubebuilder:default=utf8_general_ci
41+
// Default collation for this database
42+
DefaultCollation string `json:"defaultCollation"`
3643
}
3744

3845
// MariaDBDatabaseStatus defines the observed state of MariaDBDatabase

config/crd/bases/mariadb.openstack.org_mariadbdatabases.yaml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,23 @@ spec:
3535
spec:
3636
description: MariaDBDatabaseSpec defines the desired state of MariaDBDatabase
3737
properties:
38+
defaultCharacterSet:
39+
default: utf8
40+
description: Default character set for this database
41+
type: string
42+
defaultCollation:
43+
default: utf8_general_ci
44+
description: Default collation for this database
45+
type: string
3846
name:
47+
description: Name of the database in MariaDB
3948
type: string
4049
secret:
41-
description: Secret Name of secret which contains DatabasePassword
50+
description: Name of secret which contains DatabasePassword
4251
type: string
52+
required:
53+
- defaultCharacterSet
54+
- defaultCollation
4355
type: object
4456
status:
4557
description: MariaDBDatabaseStatus defines the observed state of MariaDBDatabase

kuttl-test.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ reportFormat: JSON
2020
reportName: kuttl-test-mariadb
2121
namespace: mariadb-kuttl-tests
2222
timeout: 180
23-
parallel: 2
23+
parallel: 1
2424
suppress:
2525
- events # Remove spammy event logs

pkg/mariadb/database.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,20 @@ type dbCreateOptions struct {
1414
DatabaseName string
1515
DatabaseHostname string
1616
DatabaseAdminUsername string
17+
DefaultCharacterSet string
18+
DefaultCollation string
1719
}
1820

1921
// DbDatabaseJob -
2022
func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName string, databaseSecret string, containerImage string, serviceAccountName string) (*batchv1.Job, error) {
2123

22-
opts := dbCreateOptions{database.Spec.Name, databaseHostName, "root"}
24+
opts := dbCreateOptions{
25+
database.Spec.Name,
26+
databaseHostName,
27+
"root",
28+
database.Spec.DefaultCharacterSet,
29+
database.Spec.DefaultCollation,
30+
}
2331
dbCmd, err := util.ExecuteTemplateFile("database.sh", &opts)
2432
if err != nil {
2533
return nil, err
@@ -83,7 +91,13 @@ func DbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName s
8391
// DeleteDbDatabaseJob -
8492
func DeleteDbDatabaseJob(database *databasev1beta1.MariaDBDatabase, databaseHostName string, databaseSecret string, containerImage string, serviceAccountName string) (*batchv1.Job, error) {
8593

86-
opts := dbCreateOptions{database.Spec.Name, databaseHostName, "root"}
94+
opts := dbCreateOptions{
95+
database.Spec.Name,
96+
databaseHostName,
97+
"root",
98+
database.Spec.DefaultCharacterSet,
99+
database.Spec.DefaultCollation,
100+
}
87101
delCmd, err := util.ExecuteTemplateFile("delete_database.sh", &opts)
88102
if err != nil {
89103
return nil, err

templates/database.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
#!/bin/bash
22
export DatabasePassword=${DatabasePassword:?"Please specify a DatabasePassword variable."}
33

4-
mysql -h {{.DatabaseHostname}} -u {{.DatabaseAdminUsername}} -P 3306 -e "CREATE DATABASE IF NOT EXISTS {{.DatabaseName}}; GRANT ALL PRIVILEGES ON {{.DatabaseName}}.* TO '{{.DatabaseName}}'@'localhost' IDENTIFIED BY '$DatabasePassword';GRANT ALL PRIVILEGES ON {{.DatabaseName}}.* TO '{{.DatabaseName}}'@'%' IDENTIFIED BY '$DatabasePassword';"
4+
mysql -h {{.DatabaseHostname}} -u {{.DatabaseAdminUsername}} -P 3306 -e "CREATE DATABASE IF NOT EXISTS {{.DatabaseName}}; ALTER DATABASE {{.DatabaseName}} CHARACTER SET '{{.DefaultCharacterSet}}' COLLATE '{{.DefaultCollation}}'; GRANT ALL PRIVILEGES ON {{.DatabaseName}}.* TO '{{.DatabaseName}}'@'localhost' IDENTIFIED BY '$DatabasePassword';GRANT ALL PRIVILEGES ON {{.DatabaseName}}.* TO '{{.DatabaseName}}'@'%' IDENTIFIED BY '$DatabasePassword';"
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
#
2+
# Check for:
3+
#
4+
# - 1 MariaDB CR
5+
# - 1 Pod for MariaDB CR
6+
#
7+
8+
apiVersion: mariadb.openstack.org/v1beta1
9+
kind: Galera
10+
metadata:
11+
name: openstack
12+
spec:
13+
replicas: 1
14+
secret: osp-secret
15+
storageRequest: 500M
16+
status:
17+
bootstrapped: true
18+
conditions:
19+
- message: Setup complete
20+
reason: Ready
21+
status: "True"
22+
type: Ready
23+
- message: Deployment completed
24+
reason: Ready
25+
status: "True"
26+
type: DeploymentReady
27+
- message: Exposing service completed
28+
reason: Ready
29+
status: "True"
30+
type: ExposeServiceReady
31+
- message: RoleBinding created
32+
reason: Ready
33+
status: "True"
34+
type: RoleBindingReady
35+
- message: Role created
36+
reason: Ready
37+
status: "True"
38+
type: RoleReady
39+
- message: ServiceAccount created
40+
reason: Ready
41+
status: "True"
42+
type: ServiceAccountReady
43+
- message: Service config create completed
44+
reason: Ready
45+
status: "True"
46+
type: ServiceConfigReady
47+
---
48+
apiVersion: apps/v1
49+
kind: StatefulSet
50+
metadata:
51+
name: openstack-galera
52+
spec:
53+
replicas: 1
54+
selector:
55+
matchLabels:
56+
app: galera
57+
cr: galera-openstack
58+
galera/name: openstack
59+
serviceName: openstack-galera
60+
template:
61+
metadata:
62+
labels:
63+
app: galera
64+
cr: galera-openstack
65+
galera/name: openstack
66+
spec:
67+
containers:
68+
- command:
69+
- /usr/bin/dumb-init
70+
- --
71+
- /usr/local/bin/kolla_start
72+
name: galera
73+
ports:
74+
- containerPort: 3306
75+
name: mysql
76+
protocol: TCP
77+
- containerPort: 4567
78+
name: galera
79+
protocol: TCP
80+
serviceAccount: galera-openstack
81+
serviceAccountName: galera-openstack
82+
status:
83+
availableReplicas: 1
84+
readyReplicas: 1
85+
replicas: 1
86+
---
87+
apiVersion: v1
88+
kind: Pod
89+
metadata:
90+
name: openstack-galera-0
91+
---
92+
apiVersion: v1
93+
kind: Service
94+
metadata:
95+
name: openstack-galera
96+
spec:
97+
ports:
98+
- name: mysql
99+
port: 3306
100+
protocol: TCP
101+
targetPort: 3306
102+
selector:
103+
app: galera
104+
cr: galera-openstack
105+
---
106+
apiVersion: v1
107+
kind: Endpoints
108+
metadata:
109+
name: openstack-galera
110+
---
111+
apiVersion: v1
112+
kind: ConfigMap
113+
metadata:
114+
name: openstack-config-data
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
apiVersion: mariadb.openstack.org/v1beta1
2+
kind: Galera
3+
metadata:
4+
name: openstack
5+
spec:
6+
secret: osp-secret
7+
storageClass: local-storage
8+
storageRequest: 500M
9+
replicas: 1
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
apiVersion: batch/v1
3+
kind: Job
4+
metadata:
5+
name: kuttldb-utf8-db-create
6+
status:
7+
succeeded: 1
8+
---
9+
apiVersion: batch/v1
10+
kind: Job
11+
metadata:
12+
name: kuttldb-latin1-db-create
13+
status:
14+
succeeded: 1
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
apiVersion: mariadb.openstack.org/v1beta1
2+
kind: MariaDBDatabase
3+
metadata:
4+
name: kuttldb-utf8
5+
labels:
6+
dbName: openstack
7+
spec:
8+
secret: osp-secret
9+
name: kuttldb_utf8
10+
---
11+
apiVersion: mariadb.openstack.org/v1beta1
12+
kind: MariaDBDatabase
13+
metadata:
14+
name: kuttldb-latin1
15+
labels:
16+
dbName: openstack
17+
spec:
18+
secret: osp-secret
19+
name: kuttldb_latin1
20+
defaultCharacterSet: latin1
21+
defaultCollation: latin1_general_ci
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
---
2+
apiVersion: kuttl.dev/v1beta1
3+
kind: TestAssert
4+
commands:
5+
- script: |
6+
oc rsh -n ${NAMESPACE} -c galera openstack-galera-0 /bin/sh -c 'mysql -uroot -p${DB_ROOT_PASSWORD} -Nse "select @@character_set_database;" kuttldb_latin1' | grep -o -w latin1
7+
oc rsh -n ${NAMESPACE} -c galera openstack-galera-0 /bin/sh -c 'mysql -uroot -p${DB_ROOT_PASSWORD} -Nse "select @@collation_database;" kuttldb_latin1' | grep -o -w latin1_general_ci
8+
9+
---
10+
apiVersion: kuttl.dev/v1beta1
11+
kind: TestAssert
12+
commands:
13+
- script: |
14+
oc rsh -n ${NAMESPACE} -c galera openstack-galera-0 /bin/sh -c 'mysql -uroot -p${DB_ROOT_PASSWORD} -Nse "select @@character_set_database;" kuttldb_utf8' | grep -o -w utf8
15+
oc rsh -n ${NAMESPACE} -c galera openstack-galera-0 /bin/sh -c 'mysql -uroot -p${DB_ROOT_PASSWORD} -Nse "select @@collation_database;" kuttldb_utf8' | grep -o -w utf8_general_ci
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
apiVersion: kuttl.dev/v1beta
2+
kind: TestStep
3+
delete:
4+
- apiVersion: mariadb.openstack.org/v1beta1
5+
kind: Galera
6+
name: openstack
7+
- apiVersion: mariadb.openstack.org/v1beta1
8+
kind: MariaDBDatabase
9+
commands:
10+
- script: |
11+
oc delete -n $NAMESPACE pvc mysql-db-openstack-galera-0
12+
for i in `oc get pv | awk '/'$NAMESPACE'\/mysql-db-openstack-galera/ {print $1}'`; do oc patch pv $i -p '{"spec":{"claimRef": null}}'; done

0 commit comments

Comments
 (0)