func (c *BootstrapCommand) startMongo(addrs []network.Address, agentConfig agent.Config) error { logger.Debugf("starting mongo") info, ok := agentConfig.MongoInfo() if !ok { return fmt.Errorf("no state info available") } // When bootstrapping, we need to allow enough time for mongo // to start as there's no retry loop in place. // 5 minutes should suffice. mongoDialOpts := mongo.DialOpts{Timeout: 5 * time.Minute} dialInfo, err := mongo.DialInfo(info.Info, mongoDialOpts) if err != nil { return err } servingInfo, ok := agentConfig.StateServingInfo() if !ok { return fmt.Errorf("agent config has no state serving info") } // Use localhost to dial the mongo server, because it's running in // auth mode and will refuse to perform any operations unless // we dial that address. dialInfo.Addrs = []string{ net.JoinHostPort("127.0.0.1", fmt.Sprint(servingInfo.StatePort)), } logger.Debugf("calling ensureMongoServer") ensureServerParams, err := cmdutil.NewEnsureServerParams(agentConfig) if err != nil { return err } err = cmdutil.EnsureMongoServer(ensureServerParams) if err != nil { return err } peerAddr := mongo.SelectPeerAddress(addrs) if peerAddr == "" { return fmt.Errorf("no appropriate peer address found in %q", addrs) } peerHostPort := net.JoinHostPort(peerAddr, fmt.Sprint(servingInfo.StatePort)) if err := initiateMongoServer(peergrouper.InitiateMongoParams{ DialInfo: dialInfo, MemberHostPort: peerHostPort, }); err != nil { return err } logger.Infof("started mongo") return nil }
// 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 }