Skip to content

Commit

Permalink
feat: support for mssql connector
Browse files Browse the repository at this point in the history
  • Loading branch information
jamar-criteo committed Apr 8, 2024
1 parent ab0d835 commit d74c600
Show file tree
Hide file tree
Showing 25 changed files with 1,498 additions and 8 deletions.
10 changes: 9 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ test-bench: generate-mocks ## Run benchmark tests. See https://pkg.go.dev/cmd/go
#-----------------------------------------------------------------------------------------------------------------------
.PHONY: dev-run

dev-run: $(GO_BIN)/CompileDaemon $(GO_BIN)/openfga ## Run the OpenFGA server with hot reloading. Data storage type can be overridden using DATASTORE="mysql", available options are `in-memory`, `mysql`, ´postgres`, default is "in-memory". Usage `DATASTORE="mysql" make dev-run`
dev-run: $(GO_BIN)/CompileDaemon $(GO_BIN)/openfga ## Run the OpenFGA server with hot reloading. Data storage type can be overridden using DATASTORE="mysql", available options are `in-memory`, `mysql`, ´postgres`, ´mssql`, default is "in-memory". Usage `DATASTORE="mysql" make dev-run`
${call print, "Starting OpenFGA server"}
@case "${DATASTORE}" in \
"in-memory") \
Expand All @@ -137,6 +137,14 @@ dev-run: $(GO_BIN)/CompileDaemon $(GO_BIN)/openfga ## Run the OpenFGA server wit
CompileDaemon -graceful-kill -build='make install' -command="openfga run --datastore-engine postgres --datastore-uri postgres://postgres:password@localhost:5432/postgres"; \
break; \
;; \
"mssql") \
echo "==> Running OpenFGA with MSSQL data storage"; \
docker run -d --name mssql -p 1433:1433 -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=pKC8mMA_qu5SLeaG" mcr.microsoft.com/mssql/server:2022-latest > /dev/null 2>&1 || docker start mssql; \
sleep 2; \
openfga migrate --datastore-engine mssql --datastore-uri 'sqlserver://sa:pKC8mMA_qu5SLeaG@localhost:1433'; \
CompileDaemon -graceful-kill -build='make install' -command="openfga run --datastore-engine mssql --datastore-uri sqlserver://sa:pKC8mMA_qu5SLeaG@localhost:1433"; \
break; \
;; \
*) \
echo "Invalid option. Try again."; \
;; \
Expand Down
1 change: 1 addition & 0 deletions assets/assets.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import "embed"
const (
MySQLMigrationDir = "migrations/mysql"
PostgresMigrationDir = "migrations/postgres"
MSSQLMigrationDir = "migrations/mssql"
)

//go:embed migrations/*
Expand Down
56 changes: 56 additions & 0 deletions assets/migrations/mssql/001_initialize_schema.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
-- +goose Up
CREATE TABLE tuple (
store NVARCHAR(26) NOT NULL,
object_type NVARCHAR(128) NOT NULL,
object_id NVARCHAR(128) NOT NULL,
relation NVARCHAR(50) NOT NULL,
_user NVARCHAR(256) NOT NULL,
user_type NVARCHAR(7) NOT NULL,
ulid NVARCHAR(26) NOT NULL,
inserted_at DATETIME2 NOT NULL,
PRIMARY KEY NONCLUSTERED (store, object_type, object_id, relation, _user)
);

CREATE UNIQUE INDEX idx_tuple_ulid ON tuple (ulid);

CREATE TABLE authorization_model (
store NVARCHAR(26) NOT NULL,
authorization_model_id NVARCHAR(26) NOT NULL,
type NVARCHAR(256) NOT NULL,
type_definition VARBINARY(MAX),
PRIMARY KEY (store, authorization_model_id, type)
);

CREATE TABLE store (
id NVARCHAR(26) PRIMARY KEY,
name NVARCHAR(64) NOT NULL,
created_at DATETIME2 NOT NULL,
updated_at DATETIME2,
deleted_at DATETIME2
);

CREATE TABLE assertion (
store NVARCHAR(26) NOT NULL,
authorization_model_id NVARCHAR(26) NOT NULL,
assertions VARBINARY(MAX),
PRIMARY KEY (store, authorization_model_id)
);

CREATE TABLE changelog (
store NVARCHAR(26) NOT NULL,
object_type NVARCHAR(256) NOT NULL,
object_id NVARCHAR(256) NOT NULL,
relation NVARCHAR(50) NOT NULL,
_user NVARCHAR(512) NOT NULL,
operation BIGINT NOT NULL,
ulid NVARCHAR(26) NOT NULL,
inserted_at DATETIME2 NOT NULL,
PRIMARY KEY (store, ulid, object_type)
);

-- +goose Down
DROP TABLE tuple;
DROP TABLE authorization_model;
DROP TABLE store;
DROP TABLE assertion;
DROP TABLE changelog;
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
-- +goose Up
ALTER TABLE authorization_model ADD schema_version NVARCHAR(5) CONSTRAINT DF_schema_version DEFAULT '1.0' NOT NULL;

-- +goose Down
ALTER TABLE authorization_model DROP CONSTRAINT DF_schema_version;
ALTER TABLE authorization_model DROP COLUMN schema_version;
5 changes: 5 additions & 0 deletions assets/migrations/mssql/003_add_reverse_lookup_index.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- +goose Up
CREATE INDEX idx_reverse_lookup_user on tuple (store, object_type, relation, _user);

-- +goose Down
DROP INDEX idx_reverse_lookup_user on tuple;
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
-- +goose Up
ALTER TABLE authorization_model ADD serialized_protobuf VARBINARY(MAX);

-- +goose Down
ALTER TABLE authorization_model DROP COLUMN serialized_protobuf;
11 changes: 11 additions & 0 deletions assets/migrations/mssql/005_add_conditions_to_tuples.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
-- +goose Up
ALTER TABLE tuple ADD condition_name NVARCHAR(256);
ALTER TABLE tuple ADD condition_context VARBINARY(MAX);
ALTER TABLE changelog ADD condition_name NVARCHAR(256);
ALTER TABLE changelog ADD condition_context VARBINARY(MAX);

-- +goose Down
ALTER TABLE tuple DROP COLUMN condition_name;
ALTER TABLE tuple DROP COLUMN condition_context;
ALTER TABLE changelog DROP COLUMN condition_name;
ALTER TABLE changelog DROP COLUMN condition_context;
20 changes: 20 additions & 0 deletions cmd/migrate/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,26 @@ func runMigration(_ *cobra.Command, _ []string) error {
}
dbURI.User = url.UserPassword(username, password)

// Replace CLI uri with the one we just updated.
uri = dbURI.String()

case "mssql":
driver = "sqlserver"
migrationsPath = assets.MSSQLMigrationDir

// Parse the database uri with url.Parse() and update username/password, if set via flags
dbURI, err := url.Parse(uri)
if err != nil {
log.Fatalf("invalid database uri: %v\n", err)
}
if username == "" && dbURI.User != nil {
username = dbURI.User.Username()
}
if password == "" && dbURI.User != nil {
password, _ = dbURI.User.Password()
}
dbURI.User = url.UserPassword(username, password)

// Replace CLI uri with the one we just updated.
uri = dbURI.String()
case "":
Expand Down
2 changes: 1 addition & 1 deletion cmd/migrate/migrate_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import (
const defaultDuration = 1 * time.Minute

func TestMigrateCommandRollbacks(t *testing.T) {
engines := []string{"postgres", "mysql"}
engines := []string{"postgres", "mssql", "mysql"}

for _, engine := range engines {
t.Run(engine, func(t *testing.T) {
Expand Down
6 changes: 6 additions & 0 deletions cmd/run/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ import (
"github.com/openfga/openfga/pkg/server/health"
"github.com/openfga/openfga/pkg/storage"
"github.com/openfga/openfga/pkg/storage/memory"
"github.com/openfga/openfga/pkg/storage/mssql"
"github.com/openfga/openfga/pkg/storage/mysql"
"github.com/openfga/openfga/pkg/storage/postgres"
"github.com/openfga/openfga/pkg/storage/sqlcommon"
Expand Down Expand Up @@ -348,6 +349,11 @@ func (s *ServerContext) Run(ctx context.Context, config *serverconfig.Config) er
if err != nil {
return fmt.Errorf("initialize postgres datastore: %w", err)
}
case "mssql":
datastore, err = mssql.New(config.Datastore.URI, dsCfg)
if err != nil {
return fmt.Errorf("initialize mssql datastore: %w", err)
}
default:
return fmt.Errorf("storage engine '%s' is unsupported", config.Datastore.Engine)
}
Expand Down
3 changes: 3 additions & 0 deletions cmd/run/run_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -739,6 +739,9 @@ func TestServerMetricsReporting(t *testing.T) {
t.Run("postgres", func(t *testing.T) {
testServerMetricsReporting(t, "postgres")
})
t.Run("mssql", func(t *testing.T) {
testServerMetricsReporting(t, "mssql")
})
}

func testServerMetricsReporting(t *testing.T, engine string) {
Expand Down
3 changes: 3 additions & 0 deletions cmd/util/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/openfga/openfga/pkg/storage/memory"

"github.com/openfga/openfga/pkg/storage"
"github.com/openfga/openfga/pkg/storage/mssql"
"github.com/openfga/openfga/pkg/storage/mysql"
"github.com/openfga/openfga/pkg/storage/postgres"
"github.com/openfga/openfga/pkg/storage/sqlcommon"
Expand Down Expand Up @@ -64,6 +65,8 @@ func MustBootstrapDatastore(t testing.TB, engine string) (storagefixtures.Datast
ds, err = postgres.New(uri, sqlcommon.NewConfig())
case "mysql":
ds, err = mysql.New(uri, sqlcommon.NewConfig())
case "mssql":
ds, err = mssql.New(uri, sqlcommon.NewConfig())
default:
t.Fatalf("unsupported datastore engine: %q", engine)
}
Expand Down
3 changes: 3 additions & 0 deletions cmd/validatemodels/validate_models.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"github.com/spf13/viper"

"github.com/openfga/openfga/pkg/storage"
"github.com/openfga/openfga/pkg/storage/mssql"
"github.com/openfga/openfga/pkg/storage/mysql"
"github.com/openfga/openfga/pkg/storage/postgres"
"github.com/openfga/openfga/pkg/storage/sqlcommon"
Expand Down Expand Up @@ -63,6 +64,8 @@ func runValidate(_ *cobra.Command, _ []string) error {
db, err = mysql.New(uri, sqlcommon.NewConfig())
case "postgres":
db, err = postgres.New(uri, sqlcommon.NewConfig())
case "mssql":
db, err = mssql.New(uri, sqlcommon.NewConfig())
case "":
return fmt.Errorf("missing datastore engine type")
case "memory":
Expand Down
2 changes: 1 addition & 1 deletion cmd/validatemodels/validate_models_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import (
)

func TestValidationResult(t *testing.T) {
engines := []string{"postgres", "mysql"}
engines := []string{"postgres", "mssql", "mysql"}

totalStores := 200
totalModelsForOneStore := 200
Expand Down
4 changes: 4 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ require (
github.com/jackc/pgx/v5 v5.5.5
github.com/jon-whit/go-grpc-prometheus v1.4.0
github.com/karlseguin/ccache/v3 v3.0.5
github.com/microsoft/go-mssqldb v1.7.0
github.com/natefinch/wrap v0.2.0
github.com/oklog/ulid/v2 v2.1.0
github.com/openfga/api/proto v0.0.0-20240318145204-66b9e5cb403c
Expand All @@ -36,6 +37,7 @@ require (
github.com/spf13/viper v1.18.2
github.com/stretchr/testify v1.9.0
github.com/testcontainers/testcontainers-go v0.29.1
github.com/testcontainers/testcontainers-go/modules/mssql v0.29.1
github.com/testcontainers/testcontainers-go/modules/mysql v0.29.1
github.com/testcontainers/testcontainers-go/modules/postgres v0.29.1
github.com/tidwall/gjson v1.17.1
Expand Down Expand Up @@ -76,6 +78,8 @@ require (
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-ole/go-ole v1.2.6 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
github.com/golang-sql/sqlexp v0.1.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
Expand Down
26 changes: 26 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,20 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1 h1:lGlwhPtrX6EVml1hO0ivjkUxsSyl4dsiw9qcA1k/3IQ=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.9.1/go.mod h1:RKUqNu35KJYcVG/fqTRqmuXJZYNhYkBrnC/hX7yGbTA=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1 h1:sO0/P7g68FrryJzljemN+6GTssUXdANk6aJ7T1ZxnsQ=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.5.1/go.mod h1:h8hyGFDsU5HMivxiS2iYFZsgDbU9OnnJ163x5UGVKYo=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1 h1:6oNBlSdi1QqM1PNW7FPA6xOGA5UNsXnkaYZz9vdPGhA=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.5.1/go.mod h1:s4kgfzA0covAXNicZHDMN58jExvcng2mC/DepXiF1EI=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80=
github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1 h1:DzHpqpoJVaCgOUdVHxE8QB52S6NiVdDQvGlny1qvPqA=
github.com/AzureAD/microsoft-authentication-library-for-go v1.2.1/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0=
github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw=
Expand Down Expand Up @@ -111,6 +123,12 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69
github.com/golang-jwt/jwt/v4 v4.4.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
github.com/golang-jwt/jwt/v5 v5.2.0 h1:d/ix8ftRUorsN+5eMIlF4T6J8CAt9rch3My2winC1Jw=
github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 h1:au07oEsX2xN0ktxqI+Sida1w446QrXBRJ0nee3SNZlA=
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0=
github.com/golang-sql/sqlexp v0.1.0 h1:ZCD6MBpcuOVfGVqsEmY5/4FtYiKz6tSyUv9LPEDei6A=
github.com/golang-sql/sqlexp v0.1.0/go.mod h1:J4ad9Vo8ZCWQ2GMrC4UCQy1JpCbwU9m3EOqtpKwwwHI=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
Expand Down Expand Up @@ -184,6 +202,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 h1:SOEGU9fKiNWd/HOJuq6+3iTQz8KNCLtVX6idSoTLdUw=
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 h1:P6pPBnrTSX3DEVR4fDembhRWSsG5rVo6hYhAB/ADZrk=
Expand All @@ -202,6 +222,8 @@ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWE
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
github.com/microsoft/go-mssqldb v1.7.0 h1:sgMPW0HA6Ihd37Yx0MzHyKD726C2kY/8KJsQtXHNaAs=
github.com/microsoft/go-mssqldb v1.7.0/go.mod h1:kOvZKUdrhhFQmxLZqbwUV0rHkNkZpthMITIb2Ko1IoA=
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
github.com/moby/patternmatcher v0.6.0 h1:GmP9lR19aU5GqSSFko+5pRqHi+Ohk1O69aFiKkVGiPk=
Expand Down Expand Up @@ -240,6 +262,8 @@ github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOS
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
Expand Down Expand Up @@ -317,6 +341,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/testcontainers/testcontainers-go v0.29.1 h1:z8kxdFlovA2y97RWx98v/TQ+tR+SXZm6p35M+xB92zk=
github.com/testcontainers/testcontainers-go v0.29.1/go.mod h1:SnKnKQav8UcgtKqjp/AD8bE1MqZm+3TDb/B8crE3XnI=
github.com/testcontainers/testcontainers-go/modules/mssql v0.29.1 h1:N5GqwKhyoytElzELjR9KCdiAvvy+6GpJ7ibtvdyY/o4=
github.com/testcontainers/testcontainers-go/modules/mssql v0.29.1/go.mod h1:Hc7lzst9KkM+JMMrv4OjQOE7GUEDzzjBXVfq04iBE6E=
github.com/testcontainers/testcontainers-go/modules/mysql v0.29.1 h1:SnJtZNcskgxOMyVAT7M+MQjpveP59nwKzlBw2ItX+C8=
github.com/testcontainers/testcontainers-go/modules/mysql v0.29.1/go.mod h1:VhA5dV+O19sx3Y9u9bfO+fbJfP3E7RiMq0nDMEGjslw=
github.com/testcontainers/testcontainers-go/modules/postgres v0.29.1 h1:hTn3MzhR9w4btwfzr/NborGCaeNZG0MPBpufeDj10KA=
Expand Down
Loading

0 comments on commit d74c600

Please sign in to comment.