in common/community_client.go [81:166]
func NewMongoCommunityConn(url string, connectMode string, timeout bool, readConcern,
writeConcern string, sslRootFile string) (*MongoCommunityConn, error) {
clientOps := options.Client().ApplyURI(url)
// tls tlsInsecure + tlsCaFile
if sslRootFile != "" {
tlsConfig := new(tls.Config)
err := addCACertFromFile(tlsConfig, sslRootFile)
if err != nil {
return nil, fmt.Errorf("load rootCaFile[%v] failed: %v", sslRootFile, err)
}
// not check hostname
tlsConfig.InsecureSkipVerify = true
clientOps.SetTLSConfig(tlsConfig)
}
// read concern
switch readConcern {
case ReadWriteConcernDefault:
default:
clientOps.SetReadConcern(readconcern.New(readconcern.Level(readConcern)))
}
// write concern
switch writeConcern {
case ReadWriteConcernMajority:
clientOps.SetWriteConcern(writeconcern.New(writeconcern.WMajority()))
}
// read pref
readPreference := readpref.Primary()
switch connectMode {
case VarMongoConnectModePrimary:
readPreference = readpref.Primary()
case VarMongoConnectModeSecondaryPreferred:
readPreference = readpref.SecondaryPreferred()
case VarMongoConnectModeStandalone:
// TODO, no standalone, choose nearest
fallthrough
case VarMongoConnectModeNearset:
readPreference = readpref.Nearest()
default:
readPreference = readpref.Primary()
}
clientOps.SetReadPreference(readPreference)
// set timeout
if !timeout {
clientOps.SetConnectTimeout(0)
} else {
clientOps.SetConnectTimeout(20 * time.Minute)
}
//clientOps.SetMaxConnIdleTime(1 * time.Hour)
// create default context
ctx := context.Background()
// connect
client, err := mongo.NewClient(clientOps)
if err != nil {
return nil, fmt.Errorf("new client failed: %v", err)
}
if err := client.Connect(ctx); err != nil {
return nil, fmt.Errorf("connect to %s failed: %v", BlockMongoUrlPassword(url, "***"), err)
}
// ping
if err = client.Ping(ctx, clientOps.ReadPreference); err != nil {
return nil, fmt.Errorf("ping to %v failed: %v\n"+
"If Mongo Server is standalone(single node) Or conn address is different with mongo server address"+
" try atandalone mode by mongodb://ip:port/admin?connect=direct",
BlockMongoUrlPassword(url, "***"), err)
}
LOG.Info("New session to %s successfully", BlockMongoUrlPassword(url, "***"))
return &MongoCommunityConn{
Client: client,
URL: url,
ctx: ctx,
}, nil
}