func init() { // Mock data env.Config = &env.Flags{ APIVersion: "v0", LogFormatterType: "text", ForceColors: true, SessionDuration: 72, RedisAddress: "127.0.0.1:6379", NSQdAddress: "127.0.0.1:4150", LookupdAddress: "127.0.0.1:4160", RethinkDBAddress: "127.0.0.1:28015", RethinkDBKey: "", RethinkDBDatabase: "test", } // Connect to the RethinkDB server rdbSession, err := gorethink.Connect(gorethink.ConnectOpts{ Address: env.Config.RethinkDBAddress, AuthKey: env.Config.RethinkDBKey, MaxIdle: 10, Timeout: time.Second * 10, }) if err != nil { panic("connecting to RethinkDB should not return an error, got " + err.Error()) } // Clear the test database err = gorethink.DbDrop("test").Exec(rdbSession) if err != nil { fmt.Println("removing the test database should not return an error, got " + err.Error()) } // Disconnect err = rdbSession.Close() if err != nil { panic("closing the RethinkDB session should not return an error, got " + err.Error()) } // Prepare a new mux (initialize the API) mux := setup.PrepareMux(env.Config) if mux == nil { panic("returned mux was nil") } // Set up a new temporary HTTP test server server = httptest.NewServer(mux) if server == nil { panic("returned httptest server was nil") } }
func main() { // Parse the flags flag.Parse() // Put config into the environment package env.Config = &env.Flags{ BindAddress: *bindAddress, APIVersion: *apiVersion, LogFormatterType: *logFormatterType, ForceColors: *forceColors, EmailDomain: *emailDomain, SessionDuration: *sessionDuration, RedisAddress: *redisAddress, RedisDatabase: *redisDatabase, RedisPassword: *redisPassword, RethinkDBAddress: *rethinkdbAddress, RethinkDBKey: *rethinkdbKey, RethinkDBDatabase: *rethinkdbDatabase, NSQdAddress: *nsqdAddress, LookupdAddress: *lookupdAddress, YubiCloudID: *yubiCloudID, YubiCloudKey: *yubiCloudKey, SlackURL: *slackURL, SlackLevels: *slackLevels, SlackChannel: *slackChannel, SlackIcon: *slackIcon, SlackUsername: *slackUsername, BloomFilter: *bloomFilter, BloomCount: *bloomCount, RavenDSN: *ravenDSN, } // Generate a mux mux := setup.PrepareMux(env.Config) // Make the mux handle every request http.Handle("/", mux) // Log that we're starting the server env.Log.WithFields(logrus.Fields{ "address": env.Config.BindAddress, }).Info("Starting the HTTP server") // Initialize the goroutine listening to signals passed to the app graceful.HandleSignals() // Pre-graceful shutdown event graceful.PreHook(func() { env.Log.Info("Received a singnal, stopping the application") }) // Post-shutdown event graceful.PostHook(func() { env.Log.Info("Stopped the application") }) // Listen to the passed address listener, err := net.Listen("tcp", env.Config.BindAddress) if err != nil { env.Log.WithFields(logrus.Fields{ "error": err, "address": *bindAddress, }).Fatal("Cannot set up a TCP listener") } // Start the listening err = graceful.Serve(listener, http.DefaultServeMux) if err != nil { // Don't use .Fatal! We need the code to shut down properly. env.Log.Error(err) } // If code reaches this place, it means that it was forcefully closed. // Wait until open connections close. graceful.Wait() }