-
Notifications
You must be signed in to change notification settings - Fork 1
/
mysql.go
88 lines (79 loc) · 1.98 KB
/
mysql.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package mysql
import (
"bytes"
_ "encoding/json"
"fmt"
"github.com/ory/dockertest/v3"
dc "github.com/ory/dockertest/v3/docker"
"github.com/rudderlabs/rudder-go-kit/testhelper/docker/resource"
)
const (
defaultDB = "sources"
defaultUser = "root"
defaultPassword = "password"
)
type Resource struct {
DBDsn string
Database string
Password string
User string
Host string
Port string
}
func Setup(pool *dockertest.Pool, d resource.Cleaner, opts ...func(*Config)) (*Resource, error) {
c := &Config{
Tag: "8.2",
}
for _, opt := range opts {
opt(c)
}
// pulls an image, creates a container based on it and runs it
mysqlContainer, err := pool.RunWithOptions(&dockertest.RunOptions{
Repository: "mysql",
Tag: c.Tag,
Env: []string{
"MYSQL_ROOT_PASSWORD=" + defaultPassword,
"MYSQL_DATABASE=" + defaultDB,
},
}, func(hc *dc.HostConfig) {
hc.ShmSize = c.ShmSize
})
if err != nil {
return nil, fmt.Errorf("running container: %w", err)
}
d.Cleanup(func() {
if err := pool.Purge(mysqlContainer); err != nil {
d.Log("Could not purge resource:", err)
}
})
dbDSN := fmt.Sprintf("%s:%s@tcp(127.0.0.1:%s)/%s?tls=false",
defaultUser, defaultPassword, mysqlContainer.GetPort("3306/tcp"), defaultDB,
)
// exponential backoff-retry, because the application in the container might not be ready to accept connections yet
err = pool.Retry(func() (err error) {
var w bytes.Buffer
code, err := mysqlContainer.Exec([]string{
"bash",
"-c",
"mysqladmin ping -h 127.0.0.1 --silent",
}, dockertest.ExecOptions{StdOut: &w, StdErr: &w})
if err != nil {
return err
}
if code != 0 {
return fmt.Errorf("mysql not ready:\n%s" + w.String())
}
return nil
})
if err != nil {
return nil, fmt.Errorf("pinging container: %w", err)
}
return &Resource{
DBDsn: dbDSN,
Database: defaultDB,
User: defaultUser,
Password: defaultPassword,
Host: "localhost",
Port: mysqlContainer.GetPort("3306/tcp"),
}, nil
}