var _ = Describe("Elector", func() { var fakeStore *fakestoreadapter.FakeStoreAdapter var logger *gosteno.Logger var testingSink *gosteno.TestingSink BeforeEach(func() { gosteno.EnterTestMode() testingSink = gosteno.GetMeTheGlobalTestSink() fakeStore = fakestoreadapter.New() logger = gosteno.NewLogger("test") }) Context("at initialization", func() { It("connects to the store", func() { elector.NewElector("name", fakeStore, 1*time.Millisecond, logger) Expect(fakeStore.DidConnect).To(BeTrue()) }) Context("when store connection fails", func() { BeforeEach(func() { fakeStore.ConnectErr = errors.New("connection error") }) It("logs an error", func() { go elector.NewElector("name", fakeStore, 100*time.Millisecond, logger) Eventually(func() int { return len(testingSink.Records()) }).Should(BeNumerically(">=", 1)) var messages []string for _, record := range testingSink.Records() { messages = append(messages, record.Message)
func main() { flag.Parse() config, logger := parseConfig(*debug, *configFile, *logFilePath) dropsonde.Initialize(config.MetronAddress, "syslog_drain_binder") workPool, err := workpool.NewWorkPool(config.EtcdMaxConcurrentRequests) if err != nil { panic(err) } adapter := etcdstoreadapter.NewETCDStoreAdapter(config.EtcdUrls, workPool) updateInterval := time.Duration(config.UpdateIntervalSeconds) * time.Second politician := elector.NewElector(config.InstanceName, adapter, updateInterval, logger) drainTTL := time.Duration(config.DrainUrlTtlSeconds) * time.Second store := etcd_syslog_drain_store.NewEtcdSyslogDrainStore(adapter, drainTTL, logger) ticker := time.NewTicker(updateInterval) for { select { case <-cfcomponent.RegisterGoRoutineDumpSignalChannel(): cfcomponent.DumpGoRoutine() case <-ticker.C: if politician.IsLeader() { err = politician.StayAsLeader() if err != nil { logger.Errorf("Error when staying leader: %s", err.Error()) politician.Vacate() continue } } else { err = politician.RunForElection() if err != nil { logger.Errorf("Error when running for leader: %s", err.Error()) politician.Vacate() continue } } logger.Debugf("Polling %s for updates", config.CloudControllerAddress) drainUrls, err := Poll(config.CloudControllerAddress, config.BulkApiUsername, config.BulkApiPassword, config.PollingBatchSize, config.SkipCertVerify) if err != nil { logger.Errorf("Error when polling cloud controller: %s", err.Error()) politician.Vacate() continue } metrics.IncrementCounter("pollCount") var totalDrains int for _, drainList := range drainUrls { totalDrains += len(drainList) } metrics.SendValue("totalDrains", float64(totalDrains), "drains") logger.Debugf("Updating drain URLs for %d application(s)", len(drainUrls)) err = store.UpdateDrains(drainUrls) if err != nil { logger.Errorf("Error when updating ETCD: %s", err.Error()) politician.Vacate() continue } } } }