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 }
// 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 }