func main() { rootConfig, err := config.NewConfig(os.Args) logger := rootConfig.Logger err = rootConfig.Validate() if err != nil { logger.Fatal("Error validating config:", err, lager.Data{"config": rootConfig}) } go func() { logger.Info(fmt.Sprintf("Starting profiling server on port %d", rootConfig.ProfilerPort)) err := http.ListenAndServe(fmt.Sprintf("0.0.0.0:%d", rootConfig.ProfilerPort), nil) if err != nil { logger.Error("profiler failed with error", err) } }() if _, err := os.Stat(rootConfig.StaticDir); os.IsNotExist(err) { logger.Fatal(fmt.Sprintf("staticDir: %s does not exist", rootConfig.StaticDir), nil) } backends := domain.NewBackends(rootConfig.Proxy.Backends, logger) arpManager := domain.NewArmManager(logger) cluster := domain.NewCluster( backends, rootConfig.Proxy.HealthcheckTimeout(), logger, arpManager, ) handler := api.NewHandler(backends, logger, rootConfig.API, rootConfig.StaticDir) members := grouper.Members{ { Name: "proxy", Runner: proxy.NewRunner(cluster, rootConfig.Proxy.Port, logger), }, { Name: "api", Runner: api.NewRunner(rootConfig.API.Port, handler, logger), }, } if rootConfig.HealthPort != rootConfig.API.Port { members = append(members, grouper.Member{ Name: "health", Runner: health.NewRunner(rootConfig.HealthPort, logger), }) } group := grouper.NewDynamic(os.Kill, len(members), len(members)) process := ifrit.Invoke(group) inserter := group.Client().Inserter() for _, member := range members { inserter <- member } group.Client().Close() err = waitUntilReady(process, logger) if err != nil { logger.Fatal("Error starting switchboard", err, lager.Data{"proxyConfig": rootConfig.Proxy}) } logger.Info("Proxy started", lager.Data{"proxyConfig": rootConfig.Proxy}) err = ioutil.WriteFile(rootConfig.PidFile, []byte(strconv.Itoa(os.Getpid())), 0644) if err == nil { logger.Info(fmt.Sprintf("Wrote pidFile to %s", rootConfig.PidFile)) } else { logger.Fatal("Cannot write pid to file", err, lager.Data{"pidFile": rootConfig.PidFile}) } err = <-process.Wait() if err != nil { logger.Fatal("Switchboard exited unexpectedly", err, lager.Data{"proxyConfig": rootConfig.Proxy}) } }
var _ = Describe("Cluster", func() { var backends *fakes.FakeBackends var logger lager.Logger var cluster domain.Cluster var fakeArpManager *fakes.FakeArpManager const healthcheckTimeout = time.Second BeforeEach(func() { fakeArpManager = nil backends = &fakes.FakeBackends{} }) JustBeforeEach(func() { logger = lagertest.NewTestLogger("Cluster test") cluster = domain.NewCluster(backends, healthcheckTimeout, logger, fakeArpManager) }) Describe("Monitor", func() { var backend1, backend2, backend3 *fakes.FakeBackend var urlGetter *fakes.FakeUrlGetter var healthyResponse = &http.Response{ Body: &fakes.FakeReadWriteCloser{}, StatusCode: http.StatusOK, } BeforeEach(func() { backend1 = &fakes.FakeBackend{} backend1.AsJSONReturns(domain.BackendJSON{Host: "10.10.1.2"}) backend1.HealthcheckUrlReturns("backend1")