func initializeDopplerPool(config *config.Config, logger *gosteno.Logger) (*clientpool.DopplerPool, error) { adapter, err := storeAdapterProvider(config.EtcdUrls, config.EtcdMaxConcurrentRequests) if err != nil { return nil, err } err = adapter.Connect() if err != nil { logger.Warnd(map[string]interface{}{ "error": err.Error(), }, "Failed to connect to etcd") } preferInZone := func(relativePath string) bool { return strings.HasPrefix(relativePath, "/"+config.Zone+"/") } var tlsConfig *tls.Config if config.PreferredProtocol == "tls" { c := config.TLSConfig tlsConfig, err = listeners.NewTLSConfig(c.CertFile, c.KeyFile, c.CAFile) if err != nil { return nil, err } tlsConfig.ServerName = "doppler" } clientPool := clientpool.NewDopplerPool(logger, func(logger *gosteno.Logger, url string) (clientpool.Client, error) { client, err := clientpool.NewClient(logger, url, tlsConfig) if err == nil && client.Scheme() != config.PreferredProtocol { logger.Warnd(map[string]interface{}{ "url": url, }, "Doppler advertising UDP only") } return client, err }) onUpdate := func(all map[string]string, preferred map[string]string) { clientPool.Set(all, preferred) } dopplers, err := dopplerservice.NewFinder(adapter, config.PreferredProtocol, preferInZone, onUpdate, logger) if err != nil { return nil, err } dopplers.Start() onLegacyUpdate := func(all map[string]string, preferred map[string]string) { clientPool.SetLegacy(all, preferred) } legacyDopplers := dopplerservice.NewLegacyFinder(adapter, config.LoggregatorDropsondePort, preferInZone, onLegacyUpdate, logger) legacyDopplers.Start() return clientPool, nil }
func makeProxy(adapter storeadapter.StoreAdapter, config *config.Config, logger *gosteno.Logger, messageGenerator marshaller.MessageGenerator, translator dopplerproxy.RequestTranslator, listenerConstructor channel_group_connector.ListenerConstructor, cookieDomain string) *dopplerproxy.Proxy { logAuthorizer := authorization.NewLogAccessAuthorizer(*disableAccessControl, config.ApiHost, config.SkipCertVerify) uaaClient := uaa_client.NewUaaClient(config.UaaHost, config.UaaClientId, config.UaaClientSecret, config.SkipCertVerify) adminAuthorizer := authorization.NewAdminAccessAuthorizer(*disableAccessControl, &uaaClient) preferredServers := func(string) bool { return false } finder := dopplerservice.NewLegacyFinder(adapter, int(config.DopplerPort), preferredServers, nil, logger) finder.Start() cgc := channel_group_connector.NewChannelGroupConnector(finder, listenerConstructor, messageGenerator, logger) return dopplerproxy.NewDopplerProxy(logAuthorizer, adminAuthorizer, cgc, translator, cookieDomain, logger) }
func initializeClientPool(config *config.Config, logger *gosteno.Logger) (*clientpool.DopplerPool, error) { adapter := storeAdapterProvider(config.EtcdUrls, config.EtcdMaxConcurrentRequests) err := adapter.Connect() if err != nil { return nil, err } preferInZone := func(relativePath string) bool { return strings.HasPrefix(relativePath, "/"+config.Zone+"/") } clientPool := clientpool.NewDopplerPool(logger, func(logger *gosteno.Logger, url string) (loggregatorclient.Client, error) { client, err := clientpool.NewClient(logger, url) if err == nil && client.Scheme() != config.PreferredProtocol { logger.Warnd(map[string]interface{}{ "url": url, }, "Doppler advertising UDP only") } return client, err }) onUpdate := func(all map[string]string, preferred map[string]string) { clientPool.Set(all, preferred) } dopplers, err := dopplerservice.NewFinder(adapter, config.PreferredProtocol, preferInZone, onUpdate, logger) if err != nil { return nil, err } dopplers.Start() onLegacyUpdate := func(all map[string]string, preferred map[string]string) { clientPool.SetLegacy(all, preferred) } legacyDopplers := dopplerservice.NewLegacyFinder(adapter, config.LoggregatorDropsondePort, preferInZone, onLegacyUpdate, logger) legacyDopplers.Start() return clientPool, nil }
AfterEach(func() { etcdRunner.Start() }) It("continues to run if the store times out", func() { Consistently(finder.AllServers).ShouldNot(HaveLen(0)) Expect(finder.PreferredServers()).NotTo(HaveLen(0)) }) }) }) } } Context("LegacyFinder", func() { BeforeEach(func() { finder = dopplerservice.NewLegacyFinder(storeAdapter, 1234, preferredCallback, updateCallback, loggertesthelper.Logger()) node = storeadapter.StoreNode{ Key: dopplerservice.LEGACY_ROOT + "/z1/loggregator_z1/0", Value: []byte("10.0.0.1"), } updateNode = node updateNode.Value = []byte("10.0.0.2") }) Context("Basics", testFinder(map[string]string{"/z1/loggregator_z1/0": "udp://10.0.0.1:1234"})) Context("Update", testUpdateFinder(map[string]string{"/z1/loggregator_z1/0": "udp://10.0.0.2:1234"})) }) Context("Finder", func() { var preferredProtocol string
func main() { flag.Parse() config, err := config.ParseConfig(*logLevel, *configFile, *logFilePath) if err != nil { panic(err) } log := logger.NewLogger(*logLevel, *logFilePath, "loggregator trafficcontroller", config.Syslog) log.Info("Startup: Setting up the loggregator traffic controller") dropsonde.Initialize("127.0.0.1:"+strconv.Itoa(config.MetronPort), "LoggregatorTrafficController") profiler := profiler.NewProfiler(*cpuprofile, *memprofile, 1*time.Second, log) profiler.Profile() defer profiler.Stop() uptimeMonitor := monitor.NewUptimeMonitor(time.Duration(config.MonitorIntervalSeconds) * time.Second) go uptimeMonitor.Start() defer uptimeMonitor.Stop() etcdAdapter := DefaultStoreAdapterProvider(config.EtcdUrls, config.EtcdMaxConcurrentRequests) err = etcdAdapter.Connect() if err != nil { log.Errorf("Cannot connect to ETCD: %s", err.Error()) os.Exit(-1) } ipAddress, err := localip.LocalIP() if err != nil { panic(err) } logAuthorizer := authorization.NewLogAccessAuthorizer(*disableAccessControl, config.ApiHost, config.SkipCertVerify) uaaClient := uaa_client.NewUaaClient(config.UaaHost, config.UaaClientId, config.UaaClientSecret, config.SkipCertVerify) adminAuthorizer := authorization.NewAdminAccessAuthorizer(*disableAccessControl, &uaaClient) preferredServers := func(string) bool { return false } finder := dopplerservice.NewLegacyFinder(etcdAdapter, int(config.DopplerPort), preferredServers, nil, log) finder.Start() dopplerProxy := makeProxy(etcdAdapter, config, log, marshaller.DropsondeLogMessage, dopplerproxy.TranslateFromDropsondePath, newDropsondeWebsocketListener, finder, logAuthorizer, adminAuthorizer, "doppler."+config.SystemDomain) startOutgoingDopplerProxy(net.JoinHostPort(ipAddress, strconv.FormatUint(uint64(config.OutgoingDropsondePort), 10)), dopplerProxy) legacyProxy := makeProxy(etcdAdapter, config, log, marshaller.LoggregatorLogMessage, dopplerproxy.TranslateFromLegacyPath, newLegacyWebsocketListener, finder, logAuthorizer, adminAuthorizer, "loggregator."+config.SystemDomain) startOutgoingProxy(net.JoinHostPort(ipAddress, strconv.FormatUint(uint64(config.OutgoingPort), 10)), legacyProxy) killChan := make(chan os.Signal) signal.Notify(killChan, os.Kill, os.Interrupt) dumpChan := registerGoRoutineDumpSignalChannel() for { select { case <-dumpChan: logger.DumpGoRoutine() case <-killChan: break } } }
func main() { // Put os.Exit in a deferred statement so that other defers get executed prior to // the os.Exit call. exitCode := 0 defer func() { os.Exit(exitCode) }() flag.Parse() config, err := config.ParseConfig(*logLevel, *configFile, *logFilePath) if err != nil { panic(err) } log := logger.NewLogger(*logLevel, *logFilePath, "loggregator trafficcontroller", config.Syslog) log.Info("Startup: Setting up the loggregator traffic controller") dropsonde.Initialize("127.0.0.1:"+strconv.Itoa(config.MetronPort), "LoggregatorTrafficController") profiler := profiler.New(*cpuprofile, *memprofile, 1*time.Second, log) profiler.Profile() defer profiler.Stop() uptimeMonitor := monitor.NewUptimeMonitor(time.Duration(config.MonitorIntervalSeconds) * time.Second) go uptimeMonitor.Start() defer uptimeMonitor.Stop() etcdAdapter := DefaultStoreAdapterProvider(config.EtcdUrls, config.EtcdMaxConcurrentRequests) err = etcdAdapter.Connect() if err != nil { log.Errorf("Cannot connect to ETCD: %s", err.Error()) exitCode = -1 return } ipAddress, err := localip.LocalIP() if err != nil { panic(err) } logAuthorizer := authorization.NewLogAccessAuthorizer(*disableAccessControl, config.ApiHost, config.SkipCertVerify) uaaClient := uaa_client.NewUaaClient(config.UaaHost, config.UaaClientId, config.UaaClientSecret, config.SkipCertVerify) adminAuthorizer := authorization.NewAdminAccessAuthorizer(*disableAccessControl, &uaaClient) preferredServers := func(string) bool { return false } finder := dopplerservice.NewLegacyFinder(etcdAdapter, int(config.DopplerPort), preferredServers, nil, log) finder.Start() dopplerCgc := channel_group_connector.NewChannelGroupConnector(finder, newDropsondeWebsocketListener, marshaller.DropsondeLogMessage, log) dopplerProxy := dopplerproxy.NewDopplerProxy(logAuthorizer, adminAuthorizer, dopplerCgc, dopplerproxy.TranslateFromDropsondePath, "doppler."+config.SystemDomain, log) startOutgoingProxy(net.JoinHostPort(ipAddress, strconv.FormatUint(uint64(config.OutgoingDropsondePort), 10)), dopplerProxy) legacyCgc := channel_group_connector.NewChannelGroupConnector(finder, newLegacyWebsocketListener, marshaller.LoggregatorLogMessage, log) legacyProxy := dopplerproxy.NewDopplerProxy(logAuthorizer, adminAuthorizer, legacyCgc, dopplerproxy.TranslateFromLegacyPath, "loggregator."+config.SystemDomain, log) startOutgoingProxy(net.JoinHostPort(ipAddress, strconv.FormatUint(uint64(config.OutgoingPort), 10)), legacyProxy) killChan := signalmanager.RegisterKillSignalChannel() dumpChan := signalmanager.RegisterGoRoutineDumpSignalChannel() for { select { case <-dumpChan: signalmanager.DumpGoRoutine() case <-killChan: log.Info("Shutting down") return } } }