// ensureMongoServer ensures that mongo is installed and running, // and ready for opening a state connection. func (a *MachineAgent) ensureMongoServer(agentConfig agent.Config) (err error) { a.mongoInitMutex.Lock() defer a.mongoInitMutex.Unlock() if a.mongoInitialized { logger.Debugf("mongo is already initialized") return nil } defer func() { if err == nil { a.mongoInitialized = true } }() mongoInstalled, err := mongo.IsServiceInstalled() if err != nil { return errors.Annotate(err, "error while checking if mongodb service is installed") } if !mongoInstalled { // EnsureMongoServer installs/upgrades the init config as necessary. ensureServerParams, err := cmdutil.NewEnsureServerParams(agentConfig) if err != nil { return err } if err := cmdutil.EnsureMongoServer(ensureServerParams); err != nil { return err } } logger.Debugf("mongodb service is installed") // Mongo is installed, record the version. err = a.ChangeConfig(func(config agent.ConfigSetter) error { config.SetMongoVersion(mongo.InstalledVersion()) return nil }) if err != nil { return errors.Annotate(err, "cannot set mongo version") } return nil }
dumpName = "mongodump" restoreName = "mongorestore" ) // DBDumper is any type that dumps something to a dump dir. type DBDumper interface { // Dump something to dumpDir. Dump(dumpDir string) error } var getMongodumpPath = func() (string, error) { return getMongoToolPath(dumpName, os.Stat, exec.LookPath) } var getMongodPath = func() (string, error) { return mongo.Path(mongo.InstalledVersion()) } func getMongoToolPath(toolName string, stat func(name string) (os.FileInfo, error), lookPath func(file string) (string, error)) (string, error) { mongod, err := getMongodPath() if err != nil { return "", errors.Annotate(err, "failed to get mongod path") } mongoTool := filepath.Join(filepath.Dir(mongod), toolName) if _, err := stat(mongoTool); err == nil { // It already exists so no need to continue. return mongoTool, nil } path, err := lookPath(toolName)