func (i *InstallerTestSuite) TestIsSupportedMySQLVersion(t *C) { var got bool var err error agentConfig := &agent.Config{} flags := installer.Flags{} apiConnector := pct.NewAPI() api := api.New(apiConnector, false) logChan := make(chan *proto.LogEntry, 100) logger := pct.NewLogger(logChan, "instance-repo") instanceRepo := instance.NewRepo(logger, pct.Basedir.Dir("config"), apiConnector) terminal := term.NewTerminal(os.Stdin, false, true) inst := installer.NewInstaller(terminal, "", api, instanceRepo, agentConfig, flags) conn := mock.NewNullMySQL() errSomethingWentWrong := fmt.Errorf("Something went wrong") conn.SetAtLeastVersion(false, errSomethingWentWrong) got, err = inst.IsVersionSupported(conn) t.Assert(conn.Version, Equals, agent.MIN_SUPPORTED_MYSQL_VERSION) t.Assert(err, Equals, errSomethingWentWrong) t.Assert(got, Equals, false) conn.SetAtLeastVersion(true, nil) got, err = inst.IsVersionSupported(conn) t.Assert(conn.Version, Equals, agent.MIN_SUPPORTED_MYSQL_VERSION) t.Assert(err, IsNil) t.Assert(got, Equals, true) conn.Close() }
func main() { // It flag is unknown it exist with os.Exit(10), // so exit code=10 is strictly reserved for flags // Don't use it anywhere else, as shell script install.sh depends on it // NOTE: standard flag.Parse() was using os.Exit(2) // which was the same as returned with ctrl+c if err := flag.CommandLine.Parse(os.Args[1:]); err != nil { os.Exit(10) } agentConfig := &agent.Config{ ApiHostname: flagApiHostname, ApiKey: flagApiKey, } // todo: do flags a better way if !flagMySQL { flagCreateMySQLInstance = false flagStartMySQLServices = false } if flagMySQLSocket != "" && flagMySQLHost != "" { log.Println("Options -mysql-socket and -mysql-host are exclusive\n") os.Exit(1) } if flagMySQLSocket != "" && flagMySQLPort != "" { log.Println("Options -mysql-socket and -mysql-port are exclusive\n") os.Exit(1) } flags := installer.Flags{ Bool: map[string]bool{ "debug": flagDebug, "create-server-instance": flagCreateServerInstance, "start-services": flagStartServices, "create-mysql-instance": flagCreateMySQLInstance, "start-mysql-services": flagStartMySQLServices, "create-agent": flagCreateAgent, "old-passwords": flagOldPasswords, "plain-passwords": flagPlainPasswords, "interactive": flagInteractive, "auto-detect-mysql": flagAutoDetectMySQL, "create-mysql-user": flagCreateMySQLUser, "mysql": flagMySQL, }, String: map[string]string{ "app-host": DEFAULT_APP_HOSTNAME, "mysql-defaults-file": flagMySQLDefaultsFile, "agent-mysql-user": flagAgentMySQLUser, "agent-mysql-pass": flagAgentMySQLPass, "mysql-user": flagMySQLUser, "mysql-pass": flagMySQLPass, "mysql-host": flagMySQLHost, "mysql-port": flagMySQLPort, "mysql-socket": flagMySQLSocket, }, Int64: map[string]int64{ "mysql-max-user-connections": flagMySQLMaxUserConnections, }, } // Agent stores all its files in the basedir. This must be called first // because installer uses pct.Basedir and assumes it's already initialized. if err := pct.Basedir.Init(flagBasedir); err != nil { log.Printf("Error initializing basedir %s: %s\n", flagBasedir, err) os.Exit(1) } apiConnector := pct.NewAPI() api := api.New(apiConnector, flagDebug) logChan := make(chan *proto.LogEntry, 100) logger := pct.NewLogger(logChan, "instance-repo") instanceRepo := instance.NewRepo(logger, pct.Basedir.Dir("config"), apiConnector) terminal := term.NewTerminal(os.Stdin, flagInteractive, flagDebug) agentInstaller := installer.NewInstaller(terminal, flagBasedir, api, instanceRepo, agentConfig, flags) fmt.Println("CTRL-C at any time to quit") // todo: catch SIGINT and clean up if err := agentInstaller.Run(); err != nil { fmt.Println(err) os.Exit(1) } os.Exit(0) }