func (s *UtilsSuite) TestSupportsIPv6Error(c *gc.C) { s.PatchValue(network.NetListen, func(netFamily, bindAddress string) (net.Listener, error) { c.Check(netFamily, gc.Equals, "tcp6") c.Check(bindAddress, gc.Equals, "[::1]:0") return nil, errors.New("boom!") }) c.Check(network.SupportsIPv6(), jc.IsFalse) }
// EnsureServiceInstalled is a convenience method to [re]create // the mongo service. func EnsureServiceInstalled(dataDir string, statePort, oplogSizeMB int, setNumaControlPolicy bool, version Version, auth bool) error { mongoPath, err := Path(version) if err != nil { return errors.Annotate(err, "cannot get mongo path") } dbDir := filepath.Join(dataDir, "db") if oplogSizeMB == 0 { var err error if oplogSizeMB, err = defaultOplogSize(dbDir); err != nil { return err } } svcConf := newConf(ConfigArgs{ DataDir: dataDir, DBDir: dbDir, MongoPath: mongoPath, Port: statePort, OplogSizeMB: oplogSizeMB, WantNumaCtl: setNumaControlPolicy, Version: version, Auth: auth, IPv6: network.SupportsIPv6(), }) svc, err := newService(ServiceName, svcConf) if err != nil { return errors.Trace(err) } logger.Debugf("installing mongo service") if err := svc.Install(); err != nil { return errors.Trace(err) } return nil }
func (s *UtilsSuite) TestSupportsIPv6OK(c *gc.C) { s.PatchValue(network.NetListen, func(_, _ string) (net.Listener, error) { return &mockListener{}, nil }) c.Check(network.SupportsIPv6(), jc.IsTrue) }
// EnsureServer ensures that the MongoDB server is installed, // configured, and ready to run. // // This method will remove old versions of the mongo init service as necessary // before installing the new version. func EnsureServer(args EnsureServerParams) error { logger.Infof( "Ensuring mongo server is running; data directory %s; port %d", args.DataDir, args.StatePort, ) dbDir := filepath.Join(args.DataDir, "db") if err := os.MkdirAll(dbDir, 0700); err != nil { return fmt.Errorf("cannot create mongo database directory: %v", err) } oplogSizeMB := args.OplogSize if oplogSizeMB == 0 { var err error if oplogSizeMB, err = defaultOplogSize(dbDir); err != nil { return err } } operatingsystem := series.HostSeries() if err := installMongod(operatingsystem, args.SetNUMAControlPolicy); err != nil { // This isn't treated as fatal because the Juju MongoDB // package is likely to be already installed anyway. There // could just be a temporary issue with apt-get/yum/whatever // and we don't want this to stop jujud from starting. // (LP #1441904) logger.Errorf("cannot install/upgrade mongod (will proceed anyway): %v", err) } mgoVersion := InstalledVersion() mongoPath, err := Path(mgoVersion) if err != nil { return err } logVersion(mongoPath) if err := UpdateSSLKey(args.DataDir, args.Cert, args.PrivateKey); err != nil { return err } err = utils.AtomicWriteFile(sharedSecretPath(args.DataDir), []byte(args.SharedSecret), 0600) if err != nil { return fmt.Errorf("cannot write mongod shared secret: %v", err) } // Disable the default mongodb installed by the mongodb-server package. // Only do this if the file doesn't exist already, so users can run // their own mongodb server if they wish to. if _, err := os.Stat(mongoConfigPath); os.IsNotExist(err) { err = utils.AtomicWriteFile( mongoConfigPath, []byte("ENABLE_MONGODB=no"), 0644, ) if err != nil { return err } } svcConf := newConf(ConfigArgs{ DataDir: args.DataDir, DBDir: dbDir, MongoPath: mongoPath, Port: args.StatePort, OplogSizeMB: oplogSizeMB, WantNUMACtl: args.SetNUMAControlPolicy, Version: mgoVersion, Auth: true, IPv6: network.SupportsIPv6(), }) svc, err := newService(ServiceName, svcConf) if err != nil { return err } installed, err := svc.Installed() if err != nil { return errors.Trace(err) } if installed { exists, err := svc.Exists() if err != nil { return errors.Trace(err) } if exists { logger.Debugf("mongo exists as expected") running, err := svc.Running() if err != nil { return errors.Trace(err) } if !running { return svc.Start() } return nil } } if err := svc.Stop(); err != nil { return errors.Annotatef(err, "failed to stop mongo") } if err := makeJournalDirs(dbDir); err != nil { return fmt.Errorf("error creating journal directories: %v", err) } if err := preallocOplog(dbDir, oplogSizeMB); err != nil { return fmt.Errorf("error creating oplog files: %v", err) } if err := service.InstallAndStart(svc); err != nil { return errors.Trace(err) } return nil }