diff --git a/go.mod b/go.mod index 148fdc849..8c7cbfa51 100644 --- a/go.mod +++ b/go.mod @@ -19,7 +19,6 @@ require ( github.com/flimzy/kivik v1.8.1 // indirect github.com/flimzy/testy v0.1.16 // indirect github.com/fortytw2/leaktest v1.3.0 // indirect - github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 github.com/go-kivik/couchdb v1.8.1 github.com/go-kivik/kivik v1.8.1 github.com/go-kivik/kiviktest v1.1.2 // indirect @@ -49,10 +48,15 @@ require ( github.com/sirupsen/logrus v1.4.1 // indirect github.com/stretchr/testify v1.3.0 github.com/syndtr/goleveldb v1.0.0 + github.com/tidwall/pretty v1.0.0 // indirect + github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c // indirect + github.com/xdg/stringprep v1.0.0 // indirect go.etcd.io/bbolt v1.3.2 // indirect + go.mongodb.org/mongo-driver v1.0.4 go.opencensus.io v0.20.2 // indirect - golang.org/x/net v0.0.0-20190420063019-afa5a82059c6 // indirect + golang.org/x/net v0.0.0-20190620200207-3b0461eec859 // indirect golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a // indirect + golang.org/x/sync v0.0.0-20190423024810-112230192c58 // indirect golang.org/x/sys v0.0.0-20190419153524-e8e3143a4f4a // indirect google.golang.org/api v0.3.2 google.golang.org/appengine v1.5.0 // indirect diff --git a/go.sum b/go.sum index eaa438b9d..ba0de749c 100644 --- a/go.sum +++ b/go.sum @@ -54,8 +54,6 @@ github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8 github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8 h1:DujepqpGd1hyOd7aW59XpK7Qymp8iy83xq74fLr21is= -github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kivik/couchdb v1.8.1 h1:2yjmysS48JYpyWTkx2E3c7ASZP8Kh0eABWnkKlV8bbw= github.com/go-kivik/couchdb v1.8.1/go.mod h1:5XJRkAMpBlEVA4q0ktIZjUPYBjoBmRoiWvwUBzP3BOQ= @@ -68,6 +66,7 @@ github.com/go-kivik/pouchdb v1.3.5/go.mod h1:U+siUrqLCVxeMU3QjQTYIC3/F/e6EUKm+o5 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1 h1:72R+M5VuhED/KujmZVcIquuo8mBgX4oVda//DQb3PXo= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -180,12 +179,21 @@ github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0 github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c h1:u40Z8hqBAAQyv+vATcGgV0YCnDjqSL7/q/JyPhhJSPk= +github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= +github.com/xdg/stringprep v1.0.0 h1:d9X0esnoa3dFsV0FG35rAT0RIhYFlPq7MiP+DW89La0= +github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= go.etcd.io/bbolt v1.3.2 h1:Z/90sZLPOeCy2PwprqkFa25PdkusRzaj9P8zm/KNyvk= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.mongodb.org/mongo-driver v1.0.4 h1:bHxbjH6iwh1uInchXadI6hQR107KEbgYsMzoblDONmQ= +go.mongodb.org/mongo-driver v1.0.4/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.20.2 h1:NAfh7zF0/3/HqtMvJNZ/RFrSlCE6ZTlHmKfhL/Dm1Jk= go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -200,8 +208,8 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190420063019-afa5a82059c6 h1:HdqqaWmYAUI7/dmByKKEw+yxDksGSo+9GjkUc9Zp34E= -golang.org/x/net v0.0.0-20190420063019-afa5a82059c6/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859 h1:R/3boaszxrf1GEUWTVDzSKVwLmSJpwZ1yqXm8j0v2QI= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190402181905-9f3314589c9a h1:tImsplftrFpALCYumobsd0K86vlAs/eXGFms2txfJfA= @@ -210,7 +218,10 @@ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f h1:Bl/8QSvNqXvPGPGXa2z5xUTmV7VDcZyvRZ+QQXkXTZQ= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6 h1:bjcUS9ztw9kFmmIxJInhon/0Is3p+EHBKNgquIzo1OI= golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58 h1:8gQV6CLnAEikrhgkHFbMAEhagSSnXWGV915qUMm9mrU= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/legacy/nosql/mongo/mongo.go b/legacy/nosql/mongo/mongo.go index 94ee8a594..5b20401a5 100644 --- a/legacy/nosql/mongo/mongo.go +++ b/legacy/nosql/mongo/mongo.go @@ -4,14 +4,18 @@ import ( "context" "encoding/base64" "fmt" + "net/url" "strings" "time" - "github.com/globalsign/mgo" - "github.com/globalsign/mgo/bson" - "github.com/hidal-go/hidalgo/base" "github.com/hidal-go/hidalgo/legacy/nosql" + + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/x/bsonx" ) const Name = "mongo" @@ -43,83 +47,119 @@ func init() { }) } -func dialMongo(addr string, dbName string, options nosql.Options) (*mgo.Session, error) { - if connVal, ok := options["session"]; ok { - if conn, ok := connVal.(*mgo.Session); ok { +func dialMongo(addr string, dbName string, noSqloptions nosql.Options) (*mongo.Client, error) { + if connVal, ok := noSqloptions["session"]; ok { + if conn, ok := connVal.(*mongo.Client); ok { return conn, nil } } if strings.HasPrefix(addr, "mongodb://") || strings.ContainsAny(addr, `@/\`) { // full mongodb url - return mgo.Dial(addr) + client, err := mongo.NewClient(options.Client().ApplyURI(addr)) + + if err != nil { + return nil, err + } + err = client.Connect(context.TODO()) + + if err != nil { + return nil, err + } + + return client, err } - var dialInfo mgo.DialInfo - dialInfo.Addrs = strings.Split(addr, ",") - if user := options.GetString("username", ""); user != "" { - dialInfo.Username = user - dialInfo.Password = options.GetString("password", "") + var connString = "mongodb://" + + if user := noSqloptions.GetString("username", ""); user != "" { + connString = fmt.Sprintf("%s%s:%s", connString, url.QueryEscape(user), url.QueryEscape(noSqloptions.GetString("password", ""))) } - dialInfo.Database = options.GetString("database_name", dbName) - return mgo.DialWithInfo(&dialInfo) + connString = fmt.Sprintf("%s@%s/%s", connString, addr, dbName) + client, err := mongo.NewClient(options.Client().ApplyURI(connString)) + if err != nil { + return nil, err + } + return client, client.Connect(context.TODO()) } -func New(sess *mgo.Session) (*DB, error) { +func New(sess *mongo.Client, dbName string) (*DB, error) { return &DB{ - sess: sess, db: sess.DB(""), + sess: sess, db: sess.Database(dbName), colls: make(map[string]collection), }, nil } func Dial(addr string, dbName string, opt nosql.Options) (*DB, error) { - sess, err := dialMongo(addr, dbName, opt) + //the dbName parameter is actually the defaultDatabase name, check if we had an override via the options + dbOverride := opt.GetString("database_name", dbName) + + sess, err := dialMongo(addr, dbOverride, opt) if err != nil { return nil, err } - return New(sess) + return New(sess, dbOverride) } type collection struct { - c *mgo.Collection + c *mongo.Collection compPK bool // compose PK from existing keys; if false, use _id instead of target field primary nosql.Index secondary []nosql.Index } type DB struct { - sess *mgo.Session - db *mgo.Database + sess *mongo.Client + db *mongo.Database colls map[string]collection } func (db *DB) Close() error { - db.sess.Close() + db.sess.Disconnect(context.TODO()) return nil } func (db *DB) EnsureIndex(ctx context.Context, col string, primary nosql.Index, secondary []nosql.Index) error { if primary.Type != nosql.StringExact { return fmt.Errorf("unsupported type of primary index: %v", primary.Type) } - c := db.db.C(col) + c := db.db.Collection(col) compPK := len(primary.Fields) != 1 if compPK { - err := c.EnsureIndex(mgo.Index{ - Key: []string(primary.Fields), - Unique: true, - }) + indexView := c.Indexes() + indexOptions := options.Index().SetUnique(true) + keys := make(bson.D, 0, len(primary.Fields)) + + for _, field := range primary.Fields { + keys = append(keys, primitive.E{Key: field, Value: bsonx.Int32(1)}) + } + index := mongo.IndexModel{ + Keys: keys, + Options: indexOptions, + } + + _, err := indexView.CreateOne(ctx, index) + if err != nil { return err } } for _, ind := range secondary { - err := c.EnsureIndex(mgo.Index{ - Key: []string(ind.Fields), - Unique: false, - Background: true, - Sparse: true, - }) + indexView := c.Indexes() + indexOptions := options.Index().SetUnique(false).SetSparse(true).SetBackground(true) + keys := make(bson.D, 0, len(ind.Fields)) + + for _, field := range ind.Fields { + keys = append(keys, primitive.E{Key: field, Value: bsonx.Int32(1)}) + } + index := mongo.IndexModel{ + Keys: keys, + Options: indexOptions, + } + + _, err := indexView.CreateOne(ctx, index) + if err != nil { return err } + } db.colls[col] = collection{ c: c, @@ -170,7 +210,7 @@ func fromBsonValue(v interface{}) nosql.Value { arr = append(arr, string(str)) } return arr - case bson.ObjectId: + case primitive.ObjectID: return nosql.String(objidString(v)) case string: return nosql.String(v) @@ -178,12 +218,17 @@ func fromBsonValue(v interface{}) nosql.Value { return nosql.Int(v) case int64: return nosql.Int(v) + case int32: + return nosql.Int(v) case float64: return nosql.Float(v) case bool: return nosql.Bool(v) case time.Time: return nosql.Time(v) + case primitive.DateTime: + const ms = int64(time.Millisecond) + return nosql.Time(time.Unix(int64(v)/1000, int64(v)%1000*ms)) case []byte: return nosql.Bytes(v) default: @@ -260,7 +305,7 @@ func getOrGenID(key nosql.Key) (nosql.Key, string) { var mid string if key == nil { // TODO: maybe allow to pass custom key types as nosql.Key - oid := objidString(bson.NewObjectId()) + oid := objidString(primitive.NewObjectID()) mid = oid key = nosql.Key{oid} } else { @@ -280,8 +325,8 @@ func (c *collection) convIns(key nosql.Key, d nosql.Document) (nosql.Key, bson.M return key, m } -func objidString(id bson.ObjectId) string { - return base64.StdEncoding.EncodeToString([]byte(id)) +func objidString(id primitive.ObjectID) string { + return base64.StdEncoding.EncodeToString(id[:]) } func compKey(key nosql.Key) string { @@ -297,16 +342,19 @@ func (db *DB) Insert(ctx context.Context, col string, key nosql.Key, d nosql.Doc return nil, fmt.Errorf("collection %q not found", col) } key, m := c.convIns(key, d) - if err := c.c.Insert(m); err != nil { + if _, err := c.c.InsertOne(ctx, m); err != nil { return nil, err } return key, nil } func (db *DB) FindByKey(ctx context.Context, col string, key nosql.Key) (nosql.Document, error) { c := db.colls[col] + + res := c.c.FindOne(ctx, bson.M{"_id": compKey(key)}) var m bson.M - err := c.c.FindId(compKey(key)).One(&m) - if err == mgo.ErrNotFound { + err := res.Decode(&m) + + if err == mongo.ErrNoDocuments { return nil, nosql.ErrNotFound } else if err != nil { return nil, err @@ -396,51 +444,107 @@ func (q *Query) Limit(n int) nosql.Query { q.limit = n return q } -func (q *Query) build() *mgo.Query { - var m interface{} +func (q *Query) build() (*mongo.Cursor, error) { + var m interface{} = bson.D{} if q.query != nil { m = q.query } - qu := q.c.c.Find(m) + findOptions := options.Find() if q.limit > 0 { - qu = qu.Limit(q.limit) + findOptions.SetLimit(int64(q.limit)) } - return qu + + qu, err := q.c.c.Find(context.TODO(), m, findOptions) + + return qu, err } func (q *Query) Count(ctx context.Context) (int64, error) { - n, err := q.build().Count() - return int64(n), err + + var m interface{} = bson.D{} + if q.query != nil { + m = q.query + } + countOptions := options.Count() + + if q.limit > 0 { + countOptions.SetLimit(int64(q.limit)) + } + + count, err := q.c.c.CountDocuments(ctx, m, countOptions) + + if err != nil { + return 0, err + } + + return count, nil } func (q *Query) One(ctx context.Context) (nosql.Document, error) { - var m bson.M - err := q.build().One(&m) - if err == mgo.ErrNotFound { + var m = &bson.M{} + cursor, err := q.build() + + if err != nil { + return nil, err + } + defer cursor.Close(ctx) + + if !cursor.Next(ctx) { return nil, nosql.ErrNotFound - } else if err != nil { + } + if err := cursor.Decode(m); err != nil { return nil, err } - return q.c.convDoc(m), nil + return q.c.convDoc(*m), nil + } func (q *Query) Iterate() nosql.DocIterator { - it := q.build().Iter() + it, err := q.build() + + if err != nil { + return &Iterator{it: it, err: err, c: q.c} + } return &Iterator{it: it, c: q.c} } type Iterator struct { c *collection - it *mgo.Iter + err error + it *mongo.Cursor res bson.M } func (it *Iterator) Next(ctx context.Context) bool { - it.res = make(bson.M) - return it.it.Next(&it.res) + elem := make(bson.M) + + if it.it == nil { + return false + } + if !it.it.Next(ctx) { + return false + } + err := it.it.Decode(&elem) + + if err == nil { + it.res = elem + } + + return true + } func (it *Iterator) Err() error { - return it.it.Err() + if it.err != nil { + return it.err + } + if it.it != nil { + return it.it.Err() + } + return nil + } func (it *Iterator) Close() error { - return it.it.Close() + if it.it != nil { + return it.it.Close(context.TODO()) + } + return nil } func (it *Iterator) Key() nosql.Key { return it.c.getKey(it.res) @@ -489,7 +593,8 @@ func (d *Delete) Do(ctx context.Context) error { if d.query != nil { qu = d.query } - _, err := d.col.c.RemoveAll(qu) + _, err := d.col.c.DeleteMany(ctx, qu) + return err } @@ -527,16 +632,15 @@ func (u *Update) Upsert(d nosql.Document) nosql.Update { return u } func (u *Update) Do(ctx context.Context) error { - key := compKey(u.key) - var err error - if u.upsert != nil { - if len(u.upsert) != 0 { - u.update["$setOnInsert"] = u.upsert - } - _, err = u.col.c.UpsertId(key, u.update) - } else { - err = u.col.c.UpdateId(key, u.update) + idFilter := bson.M{idField: compKey(u.key)} + + updateOptions := options.Update() + if u.upsert != nil && len(u.upsert) != 0 { + updateOptions.SetUpsert(true) + u.update["$setOnInsert"] = u.upsert } + _, err := u.col.c.UpdateOne(ctx, idFilter, u.update, updateOptions) + return err } @@ -571,7 +675,7 @@ func (w *inserter) Flush(ctx context.Context) error { if len(w.buf) == 0 { return w.err } - if err := w.col.c.Insert(w.buf...); err != nil { + if _, err := w.col.c.InsertMany(ctx, w.buf, options.InsertMany()); err != nil { w.err = err return err } diff --git a/legacy/nosql/mongo/test/mongotest.go b/legacy/nosql/mongo/test/mongotest.go index f64487a6b..4d16ff582 100644 --- a/legacy/nosql/mongo/test/mongotest.go +++ b/legacy/nosql/mongo/test/mongotest.go @@ -1,10 +1,13 @@ package mongotest import ( + "context" + "fmt" "testing" - "github.com/globalsign/mgo" "github.com/ory/dockertest" + gomongo "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" "github.com/hidal-go/hidalgo/legacy/nosql" "github.com/hidal-go/hidalgo/legacy/nosql/mongo" @@ -33,21 +36,27 @@ func MongoVersion(vers string) nosqltest.Database { t.Fatal(err) } - addr := cont.GetHostPort("27017/tcp") - + addr := fmt.Sprintf("mongodb://%s", cont.GetHostPort("27017/tcp")) err = pool.Retry(func() error { - sess, err := mgo.Dial(addr) + sess, err := gomongo.NewClient(options.Client().ApplyURI(addr)) + + if err != nil { + return err + } + + err = sess.Connect(context.TODO()) + if err != nil { return err } - sess.Close() + + sess.Disconnect(context.TODO()) return nil }) if err != nil { cont.Close() t.Fatal(err) } - qs, err := mongo.Dial(addr, "test", nil) if err != nil { cont.Close()