func constructApiServer(cfg config.Config, database db.DB, statsdClient statsd.Statter, stopChan chan struct{}, logger lager.Logger) ifrit.Runner { var token authentication.Token if *devMode { token = authentication.NullToken{} } else { token = authentication.NewAccessToken(cfg.UAAPublicKey) err := token.CheckPublicToken() if err != nil { logger.Error("failed to check public token", err) os.Exit(1) } } validator := handlers.NewValidator() routesHandler := handlers.NewRoutesHandler(token, *maxTTL, validator, database, logger) eventStreamHandler := handlers.NewEventStreamHandler(token, database, logger, statsdClient, stopChan) actions := rata.Handlers{ "Upsert": route(routesHandler.Upsert), "Delete": route(routesHandler.Delete), "List": route(routesHandler.List), "EventStream": route(eventStreamHandler.EventStream), } handler, err := rata.NewRouter(routing_api.Routes, actions) if err != nil { logger.Error("failed to create router", err) os.Exit(1) } handler = handlers.LogWrap(handler, logger) return http_server.New(":"+strconv.Itoa(*port), handler) }
func (f *FakeCC) Run(signals <-chan os.Signal, ready chan<- struct{}) error { err := http_server.New(f.address, f).Run(signals, ready) f.Reset() return err }
func initializeServer( bbsClient bbs.Client, executorClient executor.Client, evacuatable evacuation_context.Evacuatable, evacuationReporter evacuation_context.EvacuationReporter, logger lager.Logger, stackMap rep.StackPathMap, supportedProviders []string, ) (ifrit.Runner, string) { lrpStopper := initializeLRPStopper(*cellID, executorClient, logger) auctionCellRep := auction_cell_rep.New(*cellID, stackMap, supportedProviders, *zone, generateGuid, executorClient, evacuationReporter, logger) handlers := handlers.New(auctionCellRep, lrpStopper, executorClient, evacuatable, logger) router, err := rata.NewRouter(rep.Routes, handlers) if err != nil { logger.Fatal("failed-to-construct-router", err) } ip, err := localip.LocalIP() if err != nil { logger.Fatal("failed-to-fetch-ip", err) } port := strings.Split(*listenAddr, ":")[1] address := fmt.Sprintf("http://%s:%s", ip, port) return http_server.New(*listenAddr, router), address }
func (w *windowsJobSupervisor) MonitorJobFailures(handler JobFailureHandler) error { hl := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() if s.stateIs(stateDisabled) { return } var event windowsServiceEvent err := json.NewDecoder(r.Body).Decode(&event) if err != nil { s.logger.Error(s.logTag, "MonitorJobFailures received unknown request: %s", err) return } handler(boshalert.MonitAlert{ Action: "Start", Date: time.Now().Format(time.RFC1123Z), Event: event.Event, ID: event.ProcessName, Service: event.ProcessName, Description: fmt.Sprintf("exited with code %d", event.ExitCode), }) }) server := http_server.New(fmt.Sprintf("localhost:%d", s.jobFailuresServerPort), hl) process := ifrit.Invoke(server) for { select { case <-s.cancelServer: process.Signal(os.Kill) case err := <-process.Wait(): if err != nil { return bosherr.WrapError(err, "Listen for HTTP") } return nil } } }
func initializeServer(logger lager.Logger, uploaderConfig config.UploaderConfig) ifrit.Runner { transport := &http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: ccUploadDialTimeout, KeepAlive: ccUploadKeepAlive, }).Dial, TLSClientConfig: &tls.Config{ InsecureSkipVerify: uploaderConfig.SkipCertVerify, }, TLSHandshakeTimeout: ccUploadTLSHandshakeTimeout, } pollerHttpClient := cfhttp.NewClient() pollerHttpClient.Transport = transport uploader := ccclient.NewUploader(logger, &http.Client{Transport: transport}) poller := ccclient.NewPoller(logger, pollerHttpClient, time.Duration(uploaderConfig.CCJobPollingInterval)) ccUploaderHandler, err := handlers.New(uploader, poller, logger) if err != nil { logger.Error("router-building-failed", err) os.Exit(1) } return http_server.New(uploaderConfig.ListenAddress, ccUploaderHandler) }
func ServeAPI(l logger.Logger, conf *config.Config) { store := connectToStore(l, conf) apiHandler, err := handlers.New(l, store, buildTimeProvider(l)) if err != nil { l.Error("initialize-handler.failed", err) panic(err) } handler := handlers.BasicAuthWrap(apiHandler, conf.APIServerUsername, conf.APIServerPassword) listenAddr := fmt.Sprintf("%s:%d", conf.APIServerAddress, conf.APIServerPort) members := grouper.Members{ {"api", http_server.New(listenAddr, handler)}, } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) l.Info("started") l.Info(listenAddr) err = <-monitor.Wait() if err != nil { l.Error("exited", err) os.Exit(1) } l.Info("exited") os.Exit(0) }
func initializeServer(logger lager.Logger) ifrit.Runner { if *staticDirectory == "" { logger.Fatal("static-directory-missing", nil) } transport := &http.Transport{ Proxy: http.ProxyFromEnvironment, Dial: (&net.Dialer{ Timeout: ccUploadDialTimeout, KeepAlive: ccUploadKeepAlive, }).Dial, TLSClientConfig: &tls.Config{ InsecureSkipVerify: *skipCertVerify, }, TLSHandshakeTimeout: ccUploadTLSHandshakeTimeout, } pollerHttpClient := cf_http.NewClient() pollerHttpClient.Transport = transport fileServerHandler, err := handlers.New(*staticDirectory, logger) if err != nil { logger.Error("router-building-failed", err) os.Exit(1) } return http_server.New(*serverAddress, fileServerHandler) }
func main() { cf_debug_server.AddFlags(flag.CommandLine) cf_lager.AddFlags(flag.CommandLine) flag.Parse() logger, reconfigurableSink := cf_lager.New("tps-listener") initializeDropsonde(logger) noaaClient := noaa.NewConsumer(*trafficControllerURL, &tls.Config{InsecureSkipVerify: *skipSSLVerification}, nil) defer noaaClient.Close() apiHandler := initializeHandler(logger, noaaClient, *maxInFlightRequests, initializeBBSClient(logger)) members := grouper.Members{ {"api", http_server.New(*listenAddr, apiHandler)}, } if dbgAddr := cf_debug_server.DebugAddress(flag.CommandLine); dbgAddr != "" { members = append(grouper.Members{ {"debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)}, }, members...) } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) logger.Info("started") err := <-monitor.Wait() if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } logger.Info("exited") }
func StartDebugServer(address string, sink *lager.ReconfigurableSink, metrics Metrics) (ifrit.Process, error) { expvar.Publish("numCPUS", expvar.Func(func() interface{} { return metrics.NumCPU() })) expvar.Publish("numGoRoutines", expvar.Func(func() interface{} { return metrics.NumGoroutine() })) expvar.Publish("loopDevices", expvar.Func(func() interface{} { return metrics.LoopDevices() })) expvar.Publish("backingStores", expvar.Func(func() interface{} { return metrics.BackingStores() })) expvar.Publish("depotDirs", expvar.Func(func() interface{} { return metrics.DepotDirs() })) server := http_server.New(address, handler(sink)) p := ifrit.Invoke(server) select { case <-p.Ready(): case err := <-p.Wait(): return nil, err } return p, nil }
func main() { logger := configureLogger() flag.Parse() validateFlags(logger) router := configureRouter(logger) var server ifrit.Runner server = http_server.New(*listenAddress, router) members := grouper.Members{ {"server", server}, } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) logger.Info("started") err := <-monitor.Wait() if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } logger.Info("exited") }
func main() { logger := lager.NewLogger("checkin") logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.INFO)) var opts Opts _, err := flags.Parse(&opts) if err != nil { logger.Error("parsing-flags", err) os.Exit(1) } // ts := oauth2.StaticTokenSource( // &oauth2.Token{AccessToken: opts.GitHubAccessToken}, // ) // tc := oauth2.NewClient(oauth2.NoContext, ts) // githubClient := github.NewClient(tc) // checker := build.NewConcourseChecker() // checker = build.NewStatusReporter(checker, githubClient.Repositories) dbConn, err := migration.Open(opts.DBDriver, opts.DBURL, migrations.Migrations) if err != nil { logger.Error("failed-to-run-migrations", err) os.Exit(1) } sqlDB := db.NewSQL(logger.Session("db"), dbConn) enqueuer := build.NewEnqueuer(sqlDB) apiServer := api.NewServer(opts.GitHubSecret, enqueuer) members := []grouper.Member{ { "api", http_server.New( opts.Addr, apiServer, ), }, } group := grouper.NewParallel(os.Interrupt, members) running := ifrit.Invoke(sigmon.New(group)) logger.Info("listening", lager.Data{ "api": opts.Addr, }) err = <-running.Wait() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
func main() { flag.Parse() logger := lager.NewLogger("lattice-app") if quiet { logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.INFO)) } else { logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.DEBUG)) } ports := getServerPorts() logger.Info("lattice-app.starting", lager.Data{"ports": ports}) handler, err := rata.NewRouter(routes.Routes, handlers.New(logger)) if err != nil { logger.Fatal("router.creation.failed", err) } index, err := helpers.FetchIndex() appName := fetchAppName() go func() { t := time.NewTicker(time.Second) for { <-t.C if err != nil { fmt.Fprintf(os.Stderr, "Failed to fetch index: %s\n", err.Error()) } else { fmt.Println(fmt.Sprintf("%s. Says %s. on index: %d", appName, message, index)) } } }() wg := sync.WaitGroup{} for _, port := range ports { wg.Add(1) go func(wg *sync.WaitGroup, port string) { defer wg.Done() server := ifrit.Envoke(http_server.New(":"+port, handler)) logger.Info("lattice-app.up", lager.Data{"port": port}) err = <-server.Wait() if err != nil { logger.Error("shutting down server", err, lager.Data{"server port": port}) } logger.Info("shutting down server", lager.Data{"server port": port}) }(&wg, port) } wg.Wait() logger.Info("shutting latice app") }
func main() { cf_debug_server.AddFlags(flag.CommandLine) cf_lager.AddFlags(flag.CommandLine) lifecycles := flags.LifecycleMap{} flag.Var(&lifecycles, "lifecycle", "app lifecycle binary bundle mapping (lifecycle[/stack]:bundle-filepath-in-fileserver)") flag.Parse() cf_http.Initialize(*communicationTimeout) logger, reconfigurableSink := cf_lager.New("nsync-listener") initializeDropsonde(logger) recipeBuilderConfig := recipebuilder.Config{ Lifecycles: lifecycles, FileServerURL: *fileServerURL, KeyFactory: keys.RSAKeyPairFactory, } recipeBuilders := map[string]recipebuilder.RecipeBuilder{ "buildpack": recipebuilder.NewBuildpackRecipeBuilder(logger, recipeBuilderConfig), "docker": recipebuilder.NewDockerRecipeBuilder(logger, recipeBuilderConfig), } handler := handlers.New(logger, initializeBBSClient(logger), recipeBuilders) members := grouper.Members{ {"server", http_server.New(*listenAddress, handler)}, } if dbgAddr := cf_debug_server.DebugAddress(flag.CommandLine); dbgAddr != "" { members = append(grouper.Members{ {"debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)}, }, members...) } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) logger.Info("started") err := <-monitor.Wait() if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } logger.Info("exited") }
func main() { cf_debug_server.AddFlags(flag.CommandLine) cf_lager.AddFlags(flag.CommandLine) flag.Var( &insecureDockerRegistries, "insecureDockerRegistry", "Docker registry to allow connecting to even if not secure. (Can be specified multiple times to allow insecure connection to multiple repositories)", ) lifecycles := flags.LifecycleMap{} flag.Var(&lifecycles, "lifecycle", "app lifecycle binary bundle mapping (lifecycle[/stack]:bundle-filepath-in-fileserver)") flag.Parse() logger, reconfigurableSink := cf_lager.New("stager") initializeDropsonde(logger) ccClient := cc_client.NewCcClient(*ccBaseURL, *ccUsername, *ccPassword, *skipCertVerify) backends := initializeBackends(logger, lifecycles) handler := handlers.New(logger, ccClient, initializeBBSClient(logger), backends, clock.NewClock()) members := grouper.Members{ {"server", http_server.New(*listenAddress, handler)}, } if dbgAddr := cf_debug_server.DebugAddress(flag.CommandLine); dbgAddr != "" { members = append(grouper.Members{ {"debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)}, }, members...) } logger.Info("starting") group := grouper.NewOrdered(os.Interrupt, members) process := ifrit.Invoke(sigmon.New(group)) logger.Info("Listening for staging requests!") err := <-process.Wait() if err != nil { logger.Fatal("Stager exited with error", err) } logger.Info("stopped") }
func constructApiServer(cfg config.Config, database db.DB, statsdClient statsd.Statter, stopChan chan struct{}, logger lager.Logger) ifrit.Runner { var tokenValidator authentication.TokenValidator if *devMode { tokenValidator = authentication.NullTokenValidator{} } else { uaaKeyFetcher := authentication.NewUaaKeyFetcher(logger, cfg.UAAEndpoint+"/token_key") uaaPublicKey, err := uaaKeyFetcher.FetchKey() if err != nil { logger.Error("Failed to get verification key from UAA", err) os.Exit(1) } tokenValidator = authentication.NewAccessTokenValidator(logger, uaaPublicKey, uaaKeyFetcher) err = tokenValidator.CheckPublicToken() if err != nil { logger.Error("Failed to check public token", err) os.Exit(1) } } validator := handlers.NewValidator() routesHandler := handlers.NewRoutesHandler(tokenValidator, *maxTTL, validator, database, logger) eventStreamHandler := handlers.NewEventStreamHandler(tokenValidator, database, logger, statsdClient, stopChan) routeGroupsHandler := handlers.NewRouteGroupsHandler(tokenValidator, logger) tcpMappingsHandler := handlers.NewTcpRouteMappingsHandler(tokenValidator, validator, database, logger) actions := rata.Handlers{ routing_api.UpsertRoute: route(routesHandler.Upsert), routing_api.DeleteRoute: route(routesHandler.Delete), routing_api.ListRoute: route(routesHandler.List), routing_api.EventStreamRoute: route(eventStreamHandler.EventStream), routing_api.ListRouterGroups: route(routeGroupsHandler.ListRouterGroups), routing_api.UpsertTcpRouteMapping: route(tcpMappingsHandler.Upsert), routing_api.DeleteTcpRouteMapping: route(tcpMappingsHandler.Delete), routing_api.ListTcpRouteMapping: route(tcpMappingsHandler.List), routing_api.EventStreamTcpRoute: route(eventStreamHandler.TcpEventStream), } handler, err := rata.NewRouter(routing_api.Routes, actions) if err != nil { logger.Error("failed to create router", err) os.Exit(1) } handler = handlers.LogWrap(handler, logger) return http_server.New(":"+strconv.Itoa(int(*port)), handler) }
func createVolmanServer(logger lager.Logger, atAddress string, driverPaths string) grouper.Members { if driverPaths == "" { panic("'-volmanDriverPaths' must be provided") } cfg := vollocal.NewDriverConfig() cfg.DriverPaths = filepath.SplitList(driverPaths) client, runner := vollocal.NewServer(logger, cfg) handler, err := volhttp.NewHandler(logger, client) exitOnFailure(logger, err) return grouper.Members{ {"driver-syncer", runner}, {"http-server", http_server.New(atAddress, handler)}, } }
func Run(address string, sink *lager.ReconfigurableSink) (ifrit.Process, error) { expvar.Publish("numCPUS", expvar.Func(func() interface{} { return int64(runtime.NumCPU()) })) expvar.Publish("numGoRoutines", expvar.Func(func() interface{} { return int64(runtime.NumGoroutine()) })) server := http_server.New(address, handler(sink)) p := ifrit.Invoke(server) select { case <-p.Ready(): case err := <-p.Wait(): return nil, err } return p, nil }
func main() { logger := lager.NewLogger("lattice-app") if quiet { logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.INFO)) } else { logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.DEBUG)) } port := os.Getenv("PORT") if port == "" { port = "8080" } logger.Info("lattice-app.starting", lager.Data{"port": port}) handler, err := rata.NewRouter(routes.Routes, handlers.New(logger)) if err != nil { logger.Fatal("router.creation.failed", err) } index, err := helpers.FetchIndex() appName := helpers.FetchAppName() go func() { t := time.NewTicker(time.Second) for { <-t.C if err != nil { fmt.Fprintf(os.Stderr, "Failed to fetch index: %s\n", err.Error()) } else { fmt.Println(fmt.Sprintf("%s. Says %s. on index: %d", appName, message, index)) } } }() server := ifrit.Envoke(http_server.New(":"+port, handler)) logger.Info("lattice-app.up", lager.Data{"port": port}) err = <-server.Wait() if err != nil { logger.Error("farewell", err) } logger.Info("farewell") }
func constructApiServer(cfg config.Config, database db.DB, statsdClient statsd.Statter, logger lager.Logger) ifrit.Runner { uaaClient, err := newUaaClient(logger, cfg) if err != nil { logger.Error("Failed to create uaa client", err) os.Exit(1) } _, err = uaaClient.FetchKey() if err != nil { logger.Error("Failed to get verification key from UAA", err) os.Exit(1) } validator := handlers.NewValidator() routesHandler := handlers.NewRoutesHandler(uaaClient, int(maxTTL.Seconds()), validator, database, logger) eventStreamHandler := handlers.NewEventStreamHandler(uaaClient, database, logger, statsdClient) routeGroupsHandler := handlers.NewRouteGroupsHandler(uaaClient, logger, database) tcpMappingsHandler := handlers.NewTcpRouteMappingsHandler(uaaClient, validator, database, int(maxTTL.Seconds()), logger) actions := rata.Handlers{ routing_api.UpsertRoute: route(routesHandler.Upsert), routing_api.DeleteRoute: route(routesHandler.Delete), routing_api.ListRoute: route(routesHandler.List), routing_api.EventStreamRoute: route(eventStreamHandler.EventStream), routing_api.ListRouterGroups: route(routeGroupsHandler.ListRouterGroups), routing_api.UpsertTcpRouteMapping: route(tcpMappingsHandler.Upsert), routing_api.DeleteTcpRouteMapping: route(tcpMappingsHandler.Delete), routing_api.ListTcpRouteMapping: route(tcpMappingsHandler.List), routing_api.EventStreamTcpRoute: route(eventStreamHandler.TcpEventStream), } handler, err := rata.NewRouter(routing_api.Routes, actions) if err != nil { logger.Error("failed to create router", err) os.Exit(1) } handler = handlers.LogWrap(handler, logger) return http_server.New(":"+strconv.Itoa(int(*port)), handler) }
func main() { apiServer := NewGRPCRunner("localhost:50051", func(s *grpc.Server) { airfreight.RegisterAirfreightServer(s, &server{}) }) debugServer := http_server.New( "localhost:6060", debugHandler(), ) members := []grouper.Member{ {"api", apiServer}, {"debug", debugServer}, } runner := sigmon.New(grouper.NewParallel(os.Interrupt, members)) err := <-ifrit.Invoke(runner).Wait() if err != nil { log.Fatalln(err) } }
func main() { logger := lager.NewLogger("cnsim-server") logger.RegisterSink(lager.NewWriterSink(os.Stdout, lager.DEBUG)) port := getEnv(logger, "PORT", "9000") listenAddress := getEnv(logger, "LISTEN_ADDRESS", "127.0.0.1") address := fmt.Sprintf("%s:%s", listenAddress, port) logger.Info("listen", lager.Data{"address": address}) routes := rata.Routes{ {Name: "root", Method: "GET", Path: "/"}, {Name: "steady_state", Method: "GET", Path: "/steady_state"}, } rataHandlers := rata.Handlers{ "root": &handlers.Root{ Logger: logger, }, "steady_state": gziphandler.GzipHandler(&handlers.SteadyState{ Logger: logger, Simulator: &simulate.SteadyState{ AppSizeDistribution: &distributions.GeometricWithPositiveSupport{}, }, }), } router, err := rata.NewRouter(routes, rataHandlers) if err != nil { log.Fatalf("unable to create rata Router: %s", err) // not tested } monitor := ifrit.Invoke(sigmon.New(grouper.NewOrdered(os.Interrupt, grouper.Members{ {"http_server", http_server.New(address, router)}, }))) err = <-monitor.Wait() if err != nil { log.Fatalf("ifrit: %s", err) } }
func main() { cf_lager.AddFlags(flag.CommandLine) flag.Parse() if *repGuid == "" { panic("need rep-guid") } if *httpAddr == "" { panic("need http addr") } simulationRep := simulationrep.New(*stack, *zone, rep.Resources{ MemoryMB: int32(*memoryMB), DiskMB: int32(*diskMB), Containers: *containers, }) logger, _ := cf_lager.New("repnode-http") fakeLRPStopper := new(fake_lrp_stopper.FakeLRPStopper) fakeExecutorClient := new(executorfakes.FakeClient) fakeEvacuatable := new(fake_evacuation_context.FakeEvacuatable) handlers := rephandlers.New(simulationRep, fakeLRPStopper, fakeExecutorClient, fakeEvacuatable, logger.Session(*repGuid)) router, err := rata.NewRouter(rep.Routes, handlers) if err != nil { log.Fatalln("failed to make router:", err) } httpServer := http_server.New(*httpAddr, router) monitor := ifrit.Invoke(sigmon.New(httpServer)) fmt.Println("rep node listening") err = <-monitor.Wait() if err != nil { println("EXITED WITH ERROR: ", err.Error()) } }
func (cmd *ATCCommand) Runner(args []string) (ifrit.Runner, error) { err := cmd.validate() if err != nil { return nil, err } logger, reconfigurableSink := cmd.constructLogger() cmd.configureMetrics(logger) sqlDB, pipelineDBFactory, err := cmd.constructDB(logger) if err != nil { return nil, err } trackerFactory := resource.TrackerFactory{} workerClient := cmd.constructWorkerPool(logger, sqlDB, trackerFactory) tracker := resource.NewTracker(workerClient) engine := cmd.constructEngine(sqlDB, workerClient, tracker) radarSchedulerFactory := pipelines.NewRadarSchedulerFactory( tracker, cmd.ResourceCheckingInterval, engine, sqlDB, ) radarScannerFactory := radar.NewScannerFactory( tracker, cmd.ResourceCheckingInterval, cmd.ExternalURL.String(), ) signingKey, err := cmd.loadOrGenerateSigningKey() if err != nil { return nil, err } err = sqlDB.CreateDefaultTeamIfNotExists() if err != nil { return nil, err } authValidator := cmd.constructValidator(signingKey, sqlDB) err = cmd.updateBasicAuthCredentials(sqlDB) if err != nil { return nil, err } jwtReader := auth.JWTReader{ PublicKey: &signingKey.PublicKey, } err = cmd.configureOAuthProviders(logger, sqlDB) if err != nil { return nil, err } providerFactory := provider.NewOAuthFactory( sqlDB, cmd.oauthBaseURL(), auth.OAuthRoutes, auth.OAuthCallback, ) if err != nil { return nil, err } drain := make(chan struct{}) apiHandler, err := cmd.constructAPIHandler( logger, reconfigurableSink, sqlDB, authValidator, jwtReader, providerFactory, signingKey, pipelineDBFactory, engine, workerClient, drain, radarSchedulerFactory, radarScannerFactory, ) if err != nil { return nil, err } oauthHandler, err := auth.NewOAuthHandler( logger, providerFactory, signingKey, sqlDB, ) if err != nil { return nil, err } webHandler, err := cmd.constructWebHandler( logger, authValidator, jwtReader, pipelineDBFactory, ) if err != nil { return nil, err } members := []grouper.Member{ {"drainer", drainer(drain)}, {"web", http_server.New( cmd.bindAddr(), cmd.constructHTTPHandler( webHandler, apiHandler, oauthHandler, ), )}, {"debug", http_server.New( cmd.debugBindAddr(), http.DefaultServeMux, )}, {"pipelines", pipelines.SyncRunner{ Syncer: cmd.constructPipelineSyncer( logger.Session("syncer"), sqlDB, pipelineDBFactory, radarSchedulerFactory, ), Interval: 10 * time.Second, Clock: clock.NewClock(), }}, {"builds", builds.TrackerRunner{ Tracker: builds.NewTracker( logger.Session("build-tracker"), sqlDB, engine, ), Interval: 10 * time.Second, Clock: clock.NewClock(), }}, {"lostandfound", lostandfound.NewRunner( logger.Session("lost-and-found"), lostandfound.NewBaggageCollector( logger.Session("baggage-collector"), workerClient, sqlDB, pipelineDBFactory, cmd.OldResourceGracePeriod, 24*time.Hour, ), sqlDB, clock.NewClock(), cmd.ResourceCacheCleanupInterval, )}, } members = cmd.appendStaticWorker(logger, sqlDB, members) return onReady(grouper.NewParallel(os.Interrupt, members), func() { logger.Info("listening", lager.Data{ "web": cmd.bindAddr(), "debug": cmd.debugBindAddr(), }) }), nil }
func main() { cf_debug_server.AddFlags(flag.CommandLine) cf_lager.AddFlags(flag.CommandLine) lifecycles := flags.LifecycleMap{} flag.Var(&lifecycles, "lifecycle", "app lifecycle binary bundle mapping (lifecycle[/stack]:bundle-filepath-in-fileserver)") flag.Parse() cf_http.Initialize(*communicationTimeout) logger, reconfigurableSink := cf_lager.New("nsync-listener") initializeDropsonde(logger) recipeBuilderConfig := recipebuilder.Config{ Lifecycles: lifecycles, FileServerURL: *fileServerURL, KeyFactory: keys.RSAKeyPairFactory, } recipeBuilders := map[string]recipebuilder.RecipeBuilder{ "buildpack": recipebuilder.NewBuildpackRecipeBuilder(logger, recipeBuilderConfig), "docker": recipebuilder.NewDockerRecipeBuilder(logger, recipeBuilderConfig), } handler := handlers.New(logger, initializeBBSClient(logger), recipeBuilders) consulClient, err := consuladapter.NewClientFromUrl(*consulCluster) if err != nil { logger.Fatal("new-consul-client-failed", err) } _, portString, err := net.SplitHostPort(*listenAddress) if err != nil { logger.Fatal("failed-invalid-listen-address", err) } portNum, err := net.LookupPort("tcp", portString) if err != nil { logger.Fatal("failed-invalid-listen-port", err) } clock := clock.NewClock() registrationRunner := initializeRegistrationRunner(logger, consulClient, portNum, clock) members := grouper.Members{ {"server", http_server.New(*listenAddress, handler)}, {"registration-runner", registrationRunner}, } if dbgAddr := cf_debug_server.DebugAddress(flag.CommandLine); dbgAddr != "" { members = append(grouper.Members{ {"debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)}, }, members...) } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) logger.Info("started") err = <-monitor.Wait() if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } logger.Info("exited") }
Eventually(process.Wait()).Should(Receive()) }) It("serves requests with the given handler", func() { resp, err := httpGetUnix("unix://"+socketPath+"/", socketPath) Ω(err).ShouldNot(HaveOccurred()) body, err := ioutil.ReadAll(resp.Body) Ω(err).ShouldNot(HaveOccurred()) Ω(string(body)).Should(Equal("yo")) }) }) Context("when the server starts successfully", func() { BeforeEach(func() { server = http_server.New(address, handler) process = ifrit.Invoke(server) }) AfterEach(func() { process.Signal(syscall.SIGINT) Eventually(process.Wait()).Should(Receive()) }) Context("and a request is in flight", func() { type httpResponse struct { response *http.Response err error } var responses chan httpResponse
func initializeAuctionServer(logger lager.Logger, runner auctiontypes.AuctionRunner) ifrit.Runner { return http_server.New(*listenAddr, handlers.New(runner, logger)) }
func Runner(address string) ifrit.Runner { return http_server.New(address, Handler()) }
func main() { debugserver.AddFlags(flag.CommandLine) lagerflags.AddFlags(flag.CommandLine) etcdFlags := AddETCDFlags(flag.CommandLine) encryptionFlags := encryption.AddEncryptionFlags(flag.CommandLine) flag.Parse() cfhttp.Initialize(*communicationTimeout) logger, reconfigurableSink := lagerflags.New("bbs") logger.Info("starting") initializeDropsonde(logger) clock := clock.NewClock() consulClient, err := consuladapter.NewClientFromUrl(*consulCluster) if err != nil { logger.Fatal("new-consul-client-failed", err) } serviceClient := bbs.NewServiceClient(consulClient, clock) maintainer := initializeLockMaintainer(logger, serviceClient) _, portString, err := net.SplitHostPort(*listenAddress) if err != nil { logger.Fatal("failed-invalid-listen-address", err) } portNum, err := net.LookupPort("tcp", portString) if err != nil { logger.Fatal("failed-invalid-listen-port", err) } _, portString, err = net.SplitHostPort(*healthAddress) if err != nil { logger.Fatal("failed-invalid-health-address", err) } _, err = net.LookupPort("tcp", portString) if err != nil { logger.Fatal("failed-invalid-health-port", err) } registrationRunner := initializeRegistrationRunner(logger, consulClient, portNum, clock) var activeDB db.DB var sqlDB *sqldb.SQLDB var sqlConn *sql.DB var storeClient etcddb.StoreClient var etcdDB *etcddb.ETCDDB key, keys, err := encryptionFlags.Parse() if err != nil { logger.Fatal("cannot-setup-encryption", err) } keyManager, err := encryption.NewKeyManager(key, keys) if err != nil { logger.Fatal("cannot-setup-encryption", err) } cryptor := encryption.NewCryptor(keyManager, rand.Reader) etcdOptions, err := etcdFlags.Validate() if err != nil { logger.Fatal("etcd-validation-failed", err) } if etcdOptions.IsConfigured { storeClient = initializeEtcdStoreClient(logger, etcdOptions) etcdDB = initializeEtcdDB(logger, cryptor, storeClient, serviceClient, *desiredLRPCreationTimeout) activeDB = etcdDB } // If SQL database info is passed in, use SQL instead of ETCD if *databaseDriver != "" && *databaseConnectionString != "" { var err error connectionString := appendSSLConnectionStringParam(logger, *databaseDriver, *databaseConnectionString, *sqlCACertFile) sqlConn, err = sql.Open(*databaseDriver, connectionString) if err != nil { logger.Fatal("failed-to-open-sql", err) } defer sqlConn.Close() sqlConn.SetMaxOpenConns(*maxDatabaseConnections) sqlConn.SetMaxIdleConns(*maxDatabaseConnections) err = sqlConn.Ping() if err != nil { logger.Fatal("sql-failed-to-connect", err) } sqlDB = sqldb.NewSQLDB(sqlConn, *convergenceWorkers, *updateWorkers, format.ENCRYPTED_PROTO, cryptor, guidprovider.DefaultGuidProvider, clock, *databaseDriver) err = sqlDB.SetIsolationLevel(logger, sqldb.IsolationLevelReadCommitted) if err != nil { logger.Fatal("sql-failed-to-set-isolation-level", err) } err = sqlDB.CreateConfigurationsTable(logger) if err != nil { logger.Fatal("sql-failed-create-configurations-table", err) } activeDB = sqlDB } if activeDB == nil { logger.Fatal("no-database-configured", errors.New("no database configured")) } encryptor := encryptor.New(logger, activeDB, keyManager, cryptor, clock) migrationsDone := make(chan struct{}) migrationManager := migration.NewManager( logger, etcdDB, storeClient, sqlDB, sqlConn, cryptor, migrations.Migrations, migrationsDone, clock, *databaseDriver, ) desiredHub := events.NewHub() actualHub := events.NewHub() repTLSConfig := &rep.TLSConfig{ RequireTLS: *repRequireTLS, CaCertFile: *repCACert, CertFile: *repClientCert, KeyFile: *repClientKey, ClientCacheSize: *repClientSessionCacheSize, } httpClient := cfhttp.NewClient() repClientFactory, err := rep.NewClientFactory(httpClient, httpClient, repTLSConfig) if err != nil { logger.Fatal("new-rep-client-factory-failed", err) } auctioneerClient := initializeAuctioneerClient(logger) exitChan := make(chan struct{}) var accessLogger lager.Logger if *accessLogPath != "" { accessLogger = lager.NewLogger("bbs-access") file, err := os.OpenFile(*accessLogPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) if err != nil { logger.Error("invalid-access-log-path", err, lager.Data{"access-log-path": *accessLogPath}) os.Exit(1) } accessLogger.RegisterSink(lager.NewWriterSink(file, lager.INFO)) } var tlsConfig *tls.Config if *requireSSL { tlsConfig, err = cfhttp.NewTLSConfig(*certFile, *keyFile, *caFile) if err != nil { logger.Fatal("tls-configuration-failed", err) } } cbWorkPool := taskworkpool.New(logger, *taskCallBackWorkers, taskworkpool.HandleCompletedTask, tlsConfig) handler := handlers.New( logger, accessLogger, *updateWorkers, *convergenceWorkers, activeDB, desiredHub, actualHub, cbWorkPool, serviceClient, auctioneerClient, repClientFactory, migrationsDone, exitChan, ) metricsNotifier := metrics.NewPeriodicMetronNotifier(logger) retirer := controllers.NewActualLRPRetirer(activeDB, actualHub, repClientFactory, serviceClient) lrpConvergenceController := controllers.NewLRPConvergenceController(logger, activeDB, actualHub, auctioneerClient, serviceClient, retirer, *convergenceWorkers) taskController := controllers.NewTaskController(activeDB, cbWorkPool, auctioneerClient, serviceClient, repClientFactory) convergerProcess := converger.New( logger, clock, lrpConvergenceController, taskController, serviceClient, *convergeRepeatInterval, *kickTaskDuration, *expirePendingTaskDuration, *expireCompletedTaskDuration) var server ifrit.Runner if tlsConfig != nil { server = http_server.NewTLSServer(*listenAddress, handler, tlsConfig) } else { server = http_server.New(*listenAddress, handler) } healthcheckServer := http_server.New(*healthAddress, http.HandlerFunc(healthCheckHandler)) members := grouper.Members{ {"healthcheck", healthcheckServer}, {"lock-maintainer", maintainer}, {"workpool", cbWorkPool}, {"server", server}, {"migration-manager", migrationManager}, {"encryptor", encryptor}, {"hub-maintainer", hubMaintainer(logger, desiredHub, actualHub)}, {"metrics", *metricsNotifier}, {"converger", convergerProcess}, {"registration-runner", registrationRunner}, } if dbgAddr := debugserver.DebugAddress(flag.CommandLine); dbgAddr != "" { members = append(grouper.Members{ {"debug-server", debugserver.Runner(dbgAddr, reconfigurableSink)}, }, members...) } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) go func() { // If a handler writes to this channel, we've hit an unrecoverable error // and should shut down (cleanly) <-exitChan monitor.Signal(os.Interrupt) }() logger.Info("started") err = <-monitor.Wait() if sqlConn != nil { sqlConn.Close() } if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } logger.Info("exited") }
func main() { cf_debug_server.AddFlags(flag.CommandLine) cf_lager.AddFlags(flag.CommandLine) etcdFlags := etcdstoreadapter.AddFlags(flag.CommandLine) flag.Parse() cf_http.Initialize(*communicationTimeout) logger, reconfigurableSink := cf_lager.New("receptor") logger.Info("starting") initializeDropsonde(logger) etcdOptions, err := etcdFlags.Validate() if err != nil { logger.Fatal("etcd-validation-failed", err) } if err := validateNatsArguments(); err != nil { logger.Error("invalid-nats-flags", err) os.Exit(1) } bbs := initializeReceptorBBS(etcdOptions, logger) hub := event.NewHub() handler := handlers.New(bbs, hub, logger, *username, *password, *corsEnabled) worker, enqueue := task_handler.NewTaskWorkerPool(bbs, logger) taskHandler := task_handler.New(enqueue, logger) lrpChangeWatcher := watcher.NewWatcher( bbs, hub, clock.NewClock(), bbsWatchRetryWaitDuration, logger, ) members := grouper.Members{ {"lrp-change-watcher", lrpChangeWatcher}, {"server", http_server.New(*serverAddress, handler)}, {"worker", worker}, {"task-complete-handler", http_server.New(*taskHandlerAddress, taskHandler)}, {"hub-closer", closeHub(logger.Session("hub-closer"), hub)}, } if *registerWithRouter { registration := initializeServerRegistration(logger) natsClient := diegonats.NewClient() members = append(members, grouper.Member{ Name: "background-heartbeat", Runner: natbeat.NewBackgroundHeartbeat(natsClient, *natsAddresses, *natsUsername, *natsPassword, logger, registration), }) } if dbgAddr := cf_debug_server.DebugAddress(flag.CommandLine); dbgAddr != "" { members = append(grouper.Members{ {"debug-server", cf_debug_server.Runner(dbgAddr, reconfigurableSink)}, }, members...) } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) logger.Info("started") err = <-monitor.Wait() if err != nil { logger.Error("exited-with-failure", err) os.Exit(1) } logger.Info("exited") }
func main() { var configFilePath string const configFileFlag = "configFile" cf_lager.AddFlags(flag.CommandLine) flag.StringVar(&configFilePath, configFileFlag, "", "") flag.Parse() conf, err := config.ParseConfigFile(configFilePath) if err != nil { log.Fatalf("parsing config: %s", err) } subnet := conf.LocalSubnet overlay := conf.OverlayNetwork if !overlay.Contains(subnet.IP) { log.Fatalf("overlay network does not contain local subnet") } retriableConnector := db.RetriableConnector{ Connector: db.GetConnectionPool, Sleeper: db.SleeperFunc(time.Sleep), RetryInterval: 3 * time.Second, MaxRetries: 10, } databaseURL := conf.DatabaseURL dbConnectionPool, err := retriableConnector.GetConnectionPool(databaseURL) if err != nil { log.Fatalf("db connect: %s", err) } dataStore, err := store.New(dbConnectionPool) if err != nil { log.Fatalf("failed to construct datastore: %s", err) } logger, reconfigurableSink := cf_lager.New("ducatid") configFactory := &ipam.ConfigFactory{ Config: types.IPConfig{ IP: *subnet, }, } ipAllocator := ipam.New( &ipam.StoreFactory{}, &sync.Mutex{}, configFactory, &sync.Mutex{}, ) rataHandlers := rata.Handlers{} addressManager := &ip.AddressManager{Netlinker: nl.Netlink} routeManager := &ip.RouteManager{Netlinker: nl.Netlink} linkFactory := &links.Factory{Netlinker: nl.Netlink} osThreadLocker := &ossupport.OSLocker{} sandboxNamespaceRepo, err := namespace.NewRepository(logger, conf.SandboxRepoDir, osThreadLocker) if err != nil { log.Fatalf("unable to make repo: %s", err) // not tested } namespaceOpener := &namespace.PathOpener{ Logger: logger, ThreadLocker: osThreadLocker, } subscriber := &subscriber.Subscriber{ Logger: logger.Session("subscriber"), Netlinker: nl.Netlink, } resolver := &watcher.Resolver{ Logger: logger, Store: dataStore, } arpInserter := &neigh.ARPInserter{ Logger: logger, Netlinker: nl.Netlink, } missWatcher := watcher.New( logger, subscriber, &sync.Mutex{}, resolver, arpInserter, ) networkMapper := &network.FixedNetworkMapper{DefaultNetworkID: "default"} reloader := &reloader.Reloader{ Watcher: missWatcher, } sandboxRepo := &sandbox.Repository{ Logger: logger.Session("sandbox-repository"), Locker: &sync.Mutex{}, NamespaceRepo: sandboxNamespaceRepo, Invoker: sandbox.InvokeFunc(ifrit.Invoke), LinkFactory: linkFactory, Watcher: missWatcher, SandboxFactory: sandbox.NewSandboxFunc(sandbox.New), Sandboxes: map[string]sandbox.Sandbox{}, } hostNamespace, err := namespaceOpener.OpenPath("/proc/self/ns/net") if err != nil { log.Fatalf("unable to open host namespace: %s", err) // not tested } commandBuilder := &container.CommandBuilder{ MissWatcher: missWatcher, HostNamespace: hostNamespace, } dnsFactory := &executor.DNSFactory{ Logger: logger, ExternalServer: fmt.Sprintf("%s:%d", conf.ExternalDNSServer, 53), Suffix: conf.Suffix, DucatiAPI: "http://" + conf.ListenAddress, DecoratorFactory: executor.WriterDecoratorFactoryFunc(executor.NamespaceDecoratorFactory), } executor := executor.New( logger, addressManager, routeManager, linkFactory, sandboxNamespaceRepo, sandboxRepo, executor.ListenUDPFunc(net.ListenUDP), dnsFactory, ) creator := &container.Creator{ Executor: executor, SandboxRepo: sandboxRepo, Watcher: missWatcher, CommandBuilder: commandBuilder, DNSAddress: fmt.Sprintf("%s:%d", conf.OverlayDNSAddress, 53), HostIP: conf.HostAddress, NamespaceOpener: namespaceOpener, } deletor := &container.Deletor{ Executor: executor, NamespaceOpener: namespaceOpener, } addController := &cni.AddController{ IPAllocator: ipAllocator, NetworkMapper: networkMapper, Creator: creator, Datastore: dataStore, } delController := &cni.DelController{ Datastore: dataStore, Deletor: deletor, IPAllocator: ipAllocator, NetworkMapper: networkMapper, } marshaler := marshal.MarshalFunc(json.Marshal) unmarshaler := marshal.UnmarshalFunc(json.Unmarshal) rataHandlers["get_container"] = &handlers.GetContainer{ Marshaler: marshaler, Logger: logger, Datastore: dataStore, } rataHandlers["networks_list_containers"] = &handlers.NetworksListContainers{ Marshaler: marshaler, Logger: logger, Datastore: dataStore, } rataHandlers["list_containers"] = &handlers.ListContainers{ Marshaler: marshaler, Logger: logger, Datastore: dataStore, } rataHandlers["cni_add"] = &handlers.CNIAdd{ Logger: logger, Marshaler: marshaler, Unmarshaler: unmarshaler, Controller: addController, } rataHandlers["cni_del"] = &handlers.CNIDel{ Logger: logger, Marshaler: marshaler, Unmarshaler: unmarshaler, Controller: delController, } routes := rata.Routes{ {Name: "get_container", Method: "GET", Path: "/containers/:container_id"}, {Name: "networks_list_containers", Method: "GET", Path: "/networks/:network_id"}, {Name: "list_containers", Method: "GET", Path: "/containers"}, {Name: "cni_add", Method: "POST", Path: "/cni/add"}, {Name: "cni_del", Method: "POST", Path: "/cni/del"}, } rataRouter, err := rata.NewRouter(routes, rataHandlers) if err != nil { log.Fatalf("unable to create rata Router: %s", err) // not tested } err = sandboxRepo.Load(conf.SandboxRepoDir) if err != nil { log.Fatalf("unable to load sandboxRepo: %s", err) } err = sandboxRepo.ForEach(reloader) if err != nil { log.Fatalf("unable to restart monitors: %s", err) } httpServer := http_server.New(conf.ListenAddress, rataRouter) members := grouper.Members{ {"http_server", httpServer}, } if conf.DebugAddress != "" { members = append(grouper.Members{ {"debug-server", cf_debug_server.Runner(conf.DebugAddress, reconfigurableSink)}, }, members...) } group := grouper.NewOrdered(os.Interrupt, members) monitor := ifrit.Invoke(sigmon.New(group)) err = <-monitor.Wait() if err != nil { log.Fatalf("daemon terminated: %s", err) } }