Skip to content
This repository was archived by the owner on Feb 28, 2024. It is now read-only.

Commit 379dd77

Browse files
committed
Added config pkg
1 parent 56c3053 commit 379dd77

File tree

4 files changed

+268
-14
lines changed

4 files changed

+268
-14
lines changed

go.mod

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,9 @@ module github.com/mariadb-operator/init
33
go 1.20
44

55
require (
6-
github.com/mariadb-operator/agent v0.0.0-20230622165508-059bdc8cac7c
7-
github.com/mariadb-operator/mariadb-operator v0.0.15
6+
github.com/mariadb-operator/agent v0.0.1
7+
github.com/mariadb-operator/mariadb-operator v0.0.16-0.20230702105210-e7121043bc33
8+
k8s.io/apimachinery v0.24.2
89
k8s.io/client-go v0.24.2
910
)
1011

@@ -47,10 +48,10 @@ require (
4748
go.uber.org/atomic v1.9.0 // indirect
4849
go.uber.org/multierr v1.8.0 // indirect
4950
go.uber.org/zap v1.24.0 // indirect
50-
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b // indirect
51+
golang.org/x/net v0.1.0 // indirect
5152
golang.org/x/oauth2 v0.0.0-20221014153046-6fdb5e3db783 // indirect
52-
golang.org/x/sys v0.0.0-20220908164124-27713097b956 // indirect
53-
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
53+
golang.org/x/sys v0.1.0 // indirect
54+
golang.org/x/term v0.1.0 // indirect
5455
golang.org/x/text v0.4.0 // indirect
5556
golang.org/x/time v0.0.0-20220609170525-579cf78fd858 // indirect
5657
gomodules.xyz/jsonpatch/v2 v2.2.0 // indirect
@@ -61,7 +62,6 @@ require (
6162
gopkg.in/yaml.v3 v3.0.1 // indirect
6263
k8s.io/api v0.24.2 // indirect
6364
k8s.io/apiextensions-apiserver v0.24.2 // indirect
64-
k8s.io/apimachinery v0.24.2 // indirect
6565
k8s.io/component-base v0.24.2 // indirect
6666
k8s.io/klog/v2 v2.60.1 // indirect
6767
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 // indirect

go.sum

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,10 @@ github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN
318318
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
319319
github.com/mailru/easyjson v0.7.6 h1:8yTIVnZgCoiM1TgqoeTl+LfU5Jg6/xL3QhGQnimLYnA=
320320
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
321-
github.com/mariadb-operator/agent v0.0.0-20230622165508-059bdc8cac7c h1:8U3TmVfTAAc5loBD8+91997cRQjUY533vjSghlBMo58=
322-
github.com/mariadb-operator/agent v0.0.0-20230622165508-059bdc8cac7c/go.mod h1:TGDSu8zPTK1lAnLwhOF78NdO3Sc6McC5DFFGLqKEq2w=
323-
github.com/mariadb-operator/mariadb-operator v0.0.15 h1:jJXzn3+bES2Rd0uK+7nVoBDQvKmWBtxhvhD3GlTGGIE=
324-
github.com/mariadb-operator/mariadb-operator v0.0.15/go.mod h1:GHxMSxB0AQKqKjIoSzaRCGjwPygVAtc2wdoHKTjTAUA=
321+
github.com/mariadb-operator/agent v0.0.1 h1:YxME2EAueNJVirGWnQ7qFmUWpEWdZ4OFNzDdRmx8nXQ=
322+
github.com/mariadb-operator/agent v0.0.1/go.mod h1:TGDSu8zPTK1lAnLwhOF78NdO3Sc6McC5DFFGLqKEq2w=
323+
github.com/mariadb-operator/mariadb-operator v0.0.16-0.20230702105210-e7121043bc33 h1:vsYIJc31saaSP/OiJln3NnhnEHtQWODdJej033f7x3c=
324+
github.com/mariadb-operator/mariadb-operator v0.0.16-0.20230702105210-e7121043bc33/go.mod h1:83Yz2Jj63rO/Kq34JIVFYhpEJCNSsySiOesjDuQBDWI=
325325
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
326326
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
327327
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
@@ -599,8 +599,8 @@ golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qx
599599
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
600600
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
601601
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
602-
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b h1:tvrvnPFcdzp294diPnrdZZZ8XUt2Tyj7svb7X52iDuU=
603-
golang.org/x/net v0.0.0-20221014081412-f15817d10f9b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
602+
golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0=
603+
golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco=
604604
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
605605
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
606606
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -691,11 +691,13 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc
691691
golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
692692
golang.org/x/sys v0.0.0-20220114195835-da31bd327af9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
693693
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
694-
golang.org/x/sys v0.0.0-20220908164124-27713097b956 h1:XeJjHH1KiLpKGb6lvMiksZ9l0fVUh+AmGcm0nOMEBOY=
695694
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
695+
golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U=
696+
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
696697
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
697-
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
698698
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
699+
golang.org/x/term v0.1.0 h1:g6Z6vPFA9dYBAF7DWcH6sCcOntplXsDKcliusYijMlw=
700+
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
699701
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
700702
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
701703
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

pkg/config/config.go

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package config
2+
3+
import (
4+
"bytes"
5+
"errors"
6+
"fmt"
7+
"os"
8+
"strings"
9+
"text/template"
10+
11+
mariadbv1alpha1 "github.com/mariadb-operator/mariadb-operator/api/v1alpha1"
12+
ctrlresources "github.com/mariadb-operator/mariadb-operator/controllers/resources"
13+
"github.com/mariadb-operator/mariadb-operator/pkg/statefulset"
14+
)
15+
16+
const (
17+
BootstrapFile = `[galera]
18+
wsrep_new_cluster="ON"`
19+
)
20+
21+
type ConfigFile struct {
22+
mariadb *mariadbv1alpha1.MariaDB
23+
}
24+
25+
func NewConfigFile(mariadb *mariadbv1alpha1.MariaDB) *ConfigFile {
26+
return &ConfigFile{
27+
mariadb: mariadb,
28+
}
29+
}
30+
31+
func (c *ConfigFile) Marshal() ([]byte, error) {
32+
tpl := createTpl("galera", `[mysqld]
33+
bind-address=0.0.0.0
34+
default_storage_engine=InnoDB
35+
binlog_format=row
36+
innodb_autoinc_lock_mode=2
37+
38+
# Cluster configuration
39+
wsrep_on=ON
40+
wsrep_provider=/usr/lib/galera/libgalera_smm.so
41+
wsrep_cluster_address="{{ .ClusterAddress }}"
42+
wsrep_cluster_name=mariadb-operator
43+
wsrep_slave_threads={{ .Threads }}
44+
45+
# Node configuration
46+
wsrep_node_address="{{ .Pod }}.{{ .Service }}"
47+
wsrep_node_name="{{ .Pod }}"
48+
wsrep_sst_method="{{ .SST }}"
49+
{{- if .SSTAuth }}
50+
wsrep_sst_auth="root:{{ .RootPassword }}"
51+
{{- end }}
52+
`)
53+
buf := new(bytes.Buffer)
54+
clusterAddr, err := c.clusterAddress()
55+
if err != nil {
56+
return nil, fmt.Errorf("error getting cluster address: %v", err)
57+
}
58+
sst, err := c.mariadb.Spec.Galera.SST.MariaDBFormat()
59+
if err != nil {
60+
return nil, fmt.Errorf("error getting SST: %v", err)
61+
}
62+
hostname := os.Getenv("HOSTNAME")
63+
if hostname == "" {
64+
return nil, errors.New("HOSTNAME environment variable not found")
65+
}
66+
rootPassword := os.Getenv("MARIADB_ROOT_PASSWORD")
67+
if rootPassword == "" {
68+
return nil, errors.New("MARIADB_ROOT_PASSWORD environment variable not found")
69+
}
70+
71+
err = tpl.Execute(buf, struct {
72+
ClusterAddress string
73+
Threads int
74+
Pod string
75+
Service string
76+
SST string
77+
SSTAuth bool
78+
RootPassword string
79+
}{
80+
ClusterAddress: clusterAddr,
81+
Threads: c.mariadb.Spec.Galera.ReplicaThreads,
82+
Pod: hostname,
83+
Service: statefulset.ServiceFQDNWithService(
84+
c.mariadb.ObjectMeta,
85+
ctrlresources.InternalServiceKey(c.mariadb).Name,
86+
),
87+
SST: sst,
88+
SSTAuth: c.mariadb.Spec.Galera.SST == mariadbv1alpha1.SSTMariaBackup || c.mariadb.Spec.Galera.SST == mariadbv1alpha1.SSTMysqldump,
89+
RootPassword: rootPassword,
90+
})
91+
if err != nil {
92+
return nil, err
93+
}
94+
return buf.Bytes(), nil
95+
}
96+
97+
func (c *ConfigFile) clusterAddress() (string, error) {
98+
if c.mariadb.Spec.Replicas == 0 {
99+
return "", errors.New("at least one replica must be specified to get a valid cluster address")
100+
}
101+
pods := make([]string, c.mariadb.Spec.Replicas)
102+
for i := 0; i < int(c.mariadb.Spec.Replicas); i++ {
103+
pods[i] = statefulset.PodFQDNWithService(
104+
c.mariadb.ObjectMeta,
105+
i,
106+
ctrlresources.InternalServiceKey(c.mariadb).Name,
107+
)
108+
}
109+
return fmt.Sprintf("gcomm://%s", strings.Join(pods, ",")), nil
110+
}
111+
112+
func createTpl(name, t string) *template.Template {
113+
return template.Must(template.New(name).Parse(t))
114+
}

pkg/config/config_test.go

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
package config
2+
3+
import (
4+
"testing"
5+
6+
mariadbv1alpha1 "github.com/mariadb-operator/mariadb-operator/api/v1alpha1"
7+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
8+
)
9+
10+
func TestConfigMarshal(t *testing.T) {
11+
tests := []struct {
12+
name string
13+
mariadb *mariadbv1alpha1.MariaDB
14+
env map[string]string
15+
wantConfig string
16+
wantErr bool
17+
}{
18+
{
19+
name: "no env",
20+
mariadb: &mariadbv1alpha1.MariaDB{
21+
ObjectMeta: v1.ObjectMeta{
22+
Name: "mariadb-galera",
23+
Namespace: "default",
24+
},
25+
Spec: mariadbv1alpha1.MariaDBSpec{
26+
Galera: &mariadbv1alpha1.Galera{
27+
SST: mariadbv1alpha1.SSTRsync,
28+
ReplicaThreads: 1,
29+
},
30+
Replicas: 3,
31+
},
32+
},
33+
env: map[string]string{},
34+
wantConfig: "",
35+
wantErr: true,
36+
},
37+
{
38+
name: "rsync",
39+
mariadb: &mariadbv1alpha1.MariaDB{
40+
ObjectMeta: v1.ObjectMeta{
41+
Name: "mariadb-galera",
42+
Namespace: "default",
43+
},
44+
Spec: mariadbv1alpha1.MariaDBSpec{
45+
Galera: &mariadbv1alpha1.Galera{
46+
SST: mariadbv1alpha1.SSTRsync,
47+
ReplicaThreads: 1,
48+
},
49+
Replicas: 3,
50+
},
51+
},
52+
env: map[string]string{
53+
"HOSTNAME": "mariadb-galera-0",
54+
"MARIADB_ROOT_PASSWORD": "foo",
55+
},
56+
//nolint:lll
57+
wantConfig: `[mysqld]
58+
bind-address=0.0.0.0
59+
default_storage_engine=InnoDB
60+
binlog_format=row
61+
innodb_autoinc_lock_mode=2
62+
63+
# Cluster configuration
64+
wsrep_on=ON
65+
wsrep_provider=/usr/lib/galera/libgalera_smm.so
66+
wsrep_cluster_address="gcomm://mariadb-galera-0.mariadb-galera-internal.default.svc.cluster.local,mariadb-galera-1.mariadb-galera-internal.default.svc.cluster.local,mariadb-galera-2.mariadb-galera-internal.default.svc.cluster.local"
67+
wsrep_cluster_name=mariadb-operator
68+
wsrep_slave_threads=1
69+
70+
# Node configuration
71+
wsrep_node_address="mariadb-galera-0.mariadb-galera-internal.default.svc.cluster.local"
72+
wsrep_node_name="mariadb-galera-0"
73+
wsrep_sst_method="rsync"
74+
`,
75+
wantErr: false,
76+
},
77+
{
78+
name: "mariabackup",
79+
mariadb: &mariadbv1alpha1.MariaDB{
80+
ObjectMeta: v1.ObjectMeta{
81+
Name: "mariadb-galera",
82+
Namespace: "default",
83+
},
84+
Spec: mariadbv1alpha1.MariaDBSpec{
85+
Galera: &mariadbv1alpha1.Galera{
86+
SST: mariadbv1alpha1.SSTMariaBackup,
87+
ReplicaThreads: 2,
88+
},
89+
Replicas: 3,
90+
},
91+
},
92+
env: map[string]string{
93+
"HOSTNAME": "mariadb-galera-1",
94+
"MARIADB_ROOT_PASSWORD": "foo",
95+
},
96+
//nolint:lll
97+
wantConfig: `[mysqld]
98+
bind-address=0.0.0.0
99+
default_storage_engine=InnoDB
100+
binlog_format=row
101+
innodb_autoinc_lock_mode=2
102+
103+
# Cluster configuration
104+
wsrep_on=ON
105+
wsrep_provider=/usr/lib/galera/libgalera_smm.so
106+
wsrep_cluster_address="gcomm://mariadb-galera-0.mariadb-galera-internal.default.svc.cluster.local,mariadb-galera-1.mariadb-galera-internal.default.svc.cluster.local,mariadb-galera-2.mariadb-galera-internal.default.svc.cluster.local"
107+
wsrep_cluster_name=mariadb-operator
108+
wsrep_slave_threads=2
109+
110+
# Node configuration
111+
wsrep_node_address="mariadb-galera-1.mariadb-galera-internal.default.svc.cluster.local"
112+
wsrep_node_name="mariadb-galera-1"
113+
wsrep_sst_method="mariabackup"
114+
wsrep_sst_auth="root:foo"
115+
`,
116+
wantErr: false,
117+
},
118+
}
119+
for _, tt := range tests {
120+
t.Run(tt.name, func(t *testing.T) {
121+
config := NewConfigFile(tt.mariadb)
122+
for k, v := range tt.env {
123+
t.Setenv(k, v)
124+
}
125+
126+
bytes, err := config.Marshal()
127+
if tt.wantErr && err == nil {
128+
t.Fatal("error expected, got nil")
129+
}
130+
if !tt.wantErr && err != nil {
131+
t.Fatalf("error unexpected, got %v", err)
132+
}
133+
if tt.wantConfig != string(bytes) {
134+
t.Fatalf("unexpected result:\nexpected:\n%s\ngot:\n%s\n", tt.wantConfig, string(bytes))
135+
}
136+
})
137+
}
138+
}

0 commit comments

Comments
 (0)