From f80331d31b1a46373a686467f6af2b9686156d5a Mon Sep 17 00:00:00 2001 From: dogukanayd Date: Thu, 21 May 2020 14:55:21 +0300 Subject: [PATCH] refactor --- mysql/compose.go | 49 +++++++++++++++++++++++ mysql/creator.go | 24 ++++++++++++ mysql/dockerize.go | 96 ++++++++++++++++++++++++++++++++++++++++++++++ mysql/unit.go | 1 + path.config | 0 5 files changed, 170 insertions(+) create mode 100644 mysql/compose.go create mode 100644 mysql/creator.go create mode 100644 mysql/dockerize.go create mode 100644 path.config diff --git a/mysql/compose.go b/mysql/compose.go new file mode 100644 index 0000000..139c6bd --- /dev/null +++ b/mysql/compose.go @@ -0,0 +1,49 @@ +package mysql + +import ( + "docker.io/go-docker" + "docker.io/go-docker/api/types/container" + "fmt" + "upper.io/db.v3/lib/sqlbuilder" +) + +func NewUnitV2() (sqlbuilder.Database, func()) { + var cp ContainerProperties + var err error + + cp.CLI, err = docker.NewEnvClient() + + if err != nil { + panic(err) + } + + cp.Config = &container.Config{ + Image: "mysql:5.6", + Env: []string{ + "MYSQL_ROOT_PASSWORD=root", + "MYSQL_DATABASE=test_database_v2", + }, + } + cp.HostPort = "3305" + cp.TCP = "3306" + cpr := cp.Creator(&DockerContainer{}) + + fmt.Println("container id ******************") + fmt.Println(cpr.ID) + + fmt.Println("connection start ******************") + connection, err := Connections.ConnectOrReuse("test_database_v2", "127.0.0.1:3305") + + fmt.Println("connection end ******************") + + if err != nil { + panic(err) + } + + tearDown := func() { + _ = connection + _ = connection.Close() + } + + return connection, tearDown +} diff --git a/mysql/creator.go b/mysql/creator.go new file mode 100644 index 0000000..7030f22 --- /dev/null +++ b/mysql/creator.go @@ -0,0 +1,24 @@ +package mysql + +import ( + "docker.io/go-docker" + "docker.io/go-docker/api/types/container" +) + +type ContainerProperties struct { + Config *container.Config + HostPort string + CLI *docker.Client + TCP string + Name string +} + +func (cp *ContainerProperties) Creator(d Docker) *DockerContainer { + d.SetConfig(cp.Config) + d.SetContainerHostPort(cp.HostPort) + d.SetTCP(cp.TCP) + d.SetContainerCLI(cp.CLI) + d.SetContainerName(cp.Name) + + return d.CreateContainer() +} diff --git a/mysql/dockerize.go b/mysql/dockerize.go new file mode 100644 index 0000000..18c9d86 --- /dev/null +++ b/mysql/dockerize.go @@ -0,0 +1,96 @@ +package mysql + +import ( + "context" + "docker.io/go-docker" + "docker.io/go-docker/api/types" + "docker.io/go-docker/api/types/container" + "github.com/docker/go-connections/nat" +) + +type Docker interface { + SetContainerID(id string) + SetContainerName(name string) + SetContainerHost(host string) + SetContainerHostIP(hostIp string) + SetContainerHostPort(hostPort string) + SetTCP(tcp string) + SetConfig(config *container.Config) + SetContainerCLI(client *docker.Client) + CreateContainer() *DockerContainer +} + +type DockerContainer struct { + ID string + Host string + Name string + HostIP string + HostPort string + TCP string + Config *container.Config + CLI *docker.Client + CustomArgs map[string]interface{} +} + +func (d *DockerContainer) SetContainerID(id string) { + d.ID = id +} + +func (d *DockerContainer) SetContainerName(name string) { + d.Name = name +} + +func (d *DockerContainer) SetContainerHost(host string) { + d.Host = host +} + +func (d *DockerContainer) SetContainerHostIP(hostIp string) { + d.HostIP = hostIp +} + +func (d *DockerContainer) SetContainerHostPort(hostPort string) { + d.HostPort = hostPort +} + +func (d *DockerContainer) SetTCP(tcp string) { + d.TCP = tcp +} + +func (d *DockerContainer) SetConfig(config *container.Config) { + d.Config = config +} + +func (d *DockerContainer) SetContainerCLI(client *docker.Client) { + d.CLI = client +} + +func (d *DockerContainer) CreateContainer() *DockerContainer { + ctx := context.Background() + hostBinding := nat.PortBinding{ + HostIP: d.HostIP, + HostPort: d.HostPort, + } + containerPort, err := nat.NewPort("tcp", d.TCP) + + if err != nil { + panic(err) + } + + portBinding := nat.PortMap{containerPort: []nat.PortBinding{hostBinding}} + hcfg := &container.HostConfig{ + PortBindings: portBinding, + } + cnt, err := d.CLI.ContainerCreate(ctx, d.Config, hcfg, nil, d.Name) + + if err != nil { + panic(err) + } + + if err = d.CLI.ContainerStart(ctx, cnt.ID, types.ContainerStartOptions{}); err != nil { + panic(err) + } + + d.SetContainerID(cnt.ID) + + return d +} diff --git a/mysql/unit.go b/mysql/unit.go index e730ca8..f00b282 100644 --- a/mysql/unit.go +++ b/mysql/unit.go @@ -15,6 +15,7 @@ type Unit struct { // NewUnit generates a new unit instance // +// Deprecated: HeaderMap exists for historical compatibility // Example: // mysqlunit.NewUnit(t, "test_database").Start() func NewUnit(t *testing.T, dbName string) *Unit { diff --git a/path.config b/path.config new file mode 100644 index 0000000..e69de29