// dialAndLogin returns a mongo session logged in as a user with administrative // privileges func dialAndLogin(mongoInfo *mongo.MongoInfo, callArgs retry.CallArgs) (mgoSession, mgoDb, error) { var session *mgo.Session opts := mongo.DefaultDialOpts() callArgs.Func = func() error { // Try to connect, retry a few times until the db comes up. var err error session, err = mongo.DialWithInfo(mongoInfo.Info, opts) if err == nil { return nil } logger.Errorf("cannot open mongo connection: %v", err) return err } if err := retry.Call(callArgs); err != nil { return nil, nil, errors.Annotate(err, "error dialing mongo to resume HA") } admin := session.DB("admin") if mongoInfo.Tag != nil { if err := admin.Login(mongoInfo.Tag.String(), mongoInfo.Password); err != nil { return nil, nil, errors.Annotatef(err, "cannot log in to admin database as %q", mongoInfo.Tag) } } else if mongoInfo.Password != "" { if err := admin.Login(mongo.AdminUser, mongoInfo.Password); err != nil { return nil, nil, errors.Annotate(err, "cannot log in to admin database") } } return session, admin, nil }
func mongoDumpCall( runCommand utilsRun, tmpDir, mongoPath, adminPassword, migrationName string, statePort int, callArgs retry.CallArgs, ) (string, error) { mongodump := filepath.Join(mongoPath, "mongodump") dumpParams := []string{ "--ssl", "-u", "admin", "-p", adminPassword, "--port", strconv.Itoa(statePort), "--host", "localhost", "--out", filepath.Join(tmpDir, fmt.Sprintf("migrateTo%sdump", migrationName)), } var out string callArgs.Func = func() error { var err error out, err = runCommand(mongodump, dumpParams...) if err == nil { return nil } logger.Errorf("cannot dump db %v: %s", err, out) return err } if err := retry.Call(callArgs); err != nil { logger.Errorf(out) return out, errors.Annotate(err, "cannot dump mongo db") } return out, nil }
func (*retrySuite) TestCallArgsDefaults(c *gc.C) { // BackoffFactor is one of the two values with reasonable // defaults, and the default is linear if not specified. // The other default is the Clock. If not specified, it is the // wall clock. args := retry.CallArgs{ Func: func() error { return errors.New("bah") }, Attempts: 5, Delay: time.Minute, } err := args.Validate() c.Assert(err, jc.ErrorIsNil) c.Assert(args.BackoffFactor, gc.Equals, float64(1)) c.Assert(args.Clock, gc.Equals, clock.WallClock) }