Skip to content

Commit

Permalink
cmd/atlas: allow run sqlserver docker (#2336)
Browse files Browse the repository at this point in the history
* cmd/atlas: allow run sqlserver docker

* chore: default image tag
  • Loading branch information
giautm authored Dec 5, 2023
1 parent a7c9132 commit f0c7b30
Show file tree
Hide file tree
Showing 2 changed files with 137 additions and 8 deletions.
51 changes: 43 additions & 8 deletions cmd/atlas/internal/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,10 @@ import (
"github.com/go-sql-driver/mysql"
)

const pass = "pass"
const (
pass = "pass"
passSQLServer = "P@ssw0rd0995"
)

type (
// Config is used to configure container creation.
Expand Down Expand Up @@ -70,9 +73,10 @@ func NewConfig(opts ...ConfigOption) (*Config, error) {
}

const (
DriverMySQL = "mysql"
DriverMariaDB = "mariadb"
DriverPostgres = "postgres"
DriverMySQL = "mysql"
DriverMariaDB = "mariadb"
DriverPostgres = "postgres"
DriverSQLServer = "sqlserver"
)

// FromURL parses a URL in the format of
Expand All @@ -95,14 +99,14 @@ func FromURL(u *url.URL) (*Config, error) {
case n == 2:
parts[0] = fmt.Sprintf("%s/%s", parts[0], parts[1])
}
switch u.Scheme {
case "docker+postgres", "docker+mysql", "docker+maria":
// Support docker+driver://image/tag
if drv, ok := strings.CutPrefix(u.Scheme, "docker+"); ok {
img := Image(parts[0])
if u.Host != "" && u.Host != "_" {
img = Image(u.Host, parts[0])
}
opts = append(opts, img)
u.Host = u.Scheme[len("docker+"):]
u.Host = drv
}
var (
err error
Expand Down Expand Up @@ -131,6 +135,16 @@ func FromURL(u *url.URL) (*Config, error) {
opts = append(opts, Env("POSTGRES_DB="+parts[1]))
}
cfg, err = PostgreSQL(tag, opts...)
case DriverSQLServer:
if len(parts) > 1 {
if db := parts[1]; db != "master" {
opts = append(opts, Setup(fmt.Sprintf("CREATE DATABASE [%s]", db)))
}
}
cfg, err = SQLServer(tag, opts...)
if err != nil {
return nil, err
}
default:
return nil, fmt.Errorf("unsupported docker image %q", u.Host)
}
Expand Down Expand Up @@ -197,6 +211,25 @@ func PostgreSQL(version string, opts ...ConfigOption) (*Config, error) {
)
}

// SQLServer returns a new Config for a SQLServer image.
func SQLServer(version string, opts ...ConfigOption) (*Config, error) {
return NewConfig(
append(
[]ConfigOption{
Image("mcr.microsoft.com/mssql/server:" + version),
Port("1433"),
Database("master"),
Env(
"ACCEPT_EULA=Y",
"MSSQL_PID=Developer",
"MSSQL_SA_PASSWORD="+passSQLServer,
),
},
opts...,
)...,
)
}

// Image sets the docker image to use. For example:
//
// Image("mysql")
Expand Down Expand Up @@ -352,6 +385,8 @@ func (c *Container) Wait(ctx context.Context, timeout time.Duration) error {
// URL returns a URL to connect to the Container.
func (c *Container) URL() (*url.URL, error) {
switch c.cfg.driver {
case DriverSQLServer:
return url.Parse(fmt.Sprintf("sqlserver://sa:%s@localhost:%s?database=%s", passSQLServer, c.Port, c.cfg.Database))
case DriverPostgres:
return url.Parse(fmt.Sprintf("postgres://postgres:%s@localhost:%s/%s?sslmode=disable", c.Passphrase, c.Port, c.cfg.Database))
case DriverMySQL, DriverMariaDB:
Expand Down Expand Up @@ -388,7 +423,7 @@ func init() {
sqlclient.Register(
"docker",
sqlclient.OpenerFunc(Open),
sqlclient.RegisterFlavours("docker+postgres", "docker+mysql", "docker+maria"),
sqlclient.RegisterFlavours("docker+postgres", "docker+mysql", "docker+maria", "docker+sqlserver"),
)
}

Expand Down
94 changes: 94 additions & 0 deletions cmd/atlas/internal/docker/docker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,21 @@ func TestDockerConfig(t *testing.T) {
Port: "5432",
Out: io.Discard,
}, cfg)

// SQL Server
cfg, err = SQLServer("2022-latest", Out(io.Discard))
require.NoError(t, err)
require.Equal(t, &Config{
Image: "mcr.microsoft.com/mssql/server:2022-latest",
Port: "1433",
Database: "master",
Out: io.Discard,
Env: []string{
"ACCEPT_EULA=Y",
"MSSQL_PID=Developer",
"MSSQL_SA_PASSWORD=" + passSQLServer,
},
}, cfg)
}

func TestFromURL(t *testing.T) {
Expand Down Expand Up @@ -116,6 +131,78 @@ func TestFromURL(t *testing.T) {
Port: "5432",
Out: io.Discard,
}, cfg)

// SQL Server
u, err = url.Parse("docker://sqlserver")
require.NoError(t, err)
cfg, err = FromURL(u)
require.NoError(t, err)
require.Equal(t, &Config{
driver: "sqlserver",
Image: "mcr.microsoft.com/mssql/server",
Database: "master",
Port: "1433",
Out: io.Discard,
Env: []string{
"ACCEPT_EULA=Y",
"MSSQL_PID=Developer",
"MSSQL_SA_PASSWORD=" + passSQLServer,
},
}, cfg)

u, err = url.Parse("docker://sqlserver/2022-latest")
require.NoError(t, err)
cfg, err = FromURL(u)
require.NoError(t, err)
require.Equal(t, &Config{
driver: "sqlserver",
Image: "mcr.microsoft.com/mssql/server:2022-latest",
Database: "master",
Port: "1433",
Out: io.Discard,
Env: []string{
"ACCEPT_EULA=Y",
"MSSQL_PID=Developer",
"MSSQL_SA_PASSWORD=" + passSQLServer,
},
}, cfg)

u, err = url.Parse("docker://sqlserver/2019-latest/foo")
require.NoError(t, err)
cfg, err = FromURL(u)
require.NoError(t, err)
require.Equal(t, &Config{
driver: "sqlserver",
setup: []string{"CREATE DATABASE [foo]"},
Image: "mcr.microsoft.com/mssql/server:2019-latest",
Database: "foo",
Port: "1433",
Out: io.Discard,
Env: []string{
"ACCEPT_EULA=Y",
"MSSQL_PID=Developer",
"MSSQL_SA_PASSWORD=" + passSQLServer,
},
}, cfg)

// Azure SQL Edge
u, err = url.Parse("docker+sqlserver://mcr.microsoft.com/azure-sql-edge:1.0.7/foo")
require.NoError(t, err)
cfg, err = FromURL(u)
require.NoError(t, err)
require.Equal(t, &Config{
driver: "sqlserver",
setup: []string{"CREATE DATABASE [foo]"},
Image: "mcr.microsoft.com/azure-sql-edge:1.0.7",
Database: "foo",
Port: "1433",
Out: io.Discard,
Env: []string{
"ACCEPT_EULA=Y",
"MSSQL_PID=Developer",
"MSSQL_SA_PASSWORD=" + passSQLServer,
},
}, cfg)
}

func TestFromURL_CustomImage(t *testing.T) {
Expand Down Expand Up @@ -235,4 +322,11 @@ func TestImageURL(t *testing.T) {
require.NoError(t, err)
require.Equal(t, u, got.String())
}
for img, u := range map[string]string{
"mcr.microsoft.com/azure-sql-edge:1.0.7": "docker+sqlserver://mcr.microsoft.com/azure-sql-edge:1.0.7",
} {
got, err := ImageURL(DriverSQLServer, img)
require.NoError(t, err)
require.Equal(t, u, got.String())
}
}

0 comments on commit f0c7b30

Please sign in to comment.