Ω(err).ShouldNot(HaveOccurred()) Ω(startMessages()).Should(BeEmpty()) Ω(stopMessages()).Should(HaveLen(2)) expectedMessage := models.NewPendingStopMessage(clock.Now(), 0, conf.GracePeriod(), app.AppGuid, app.AppVersion, app.InstanceAtIndex(1).InstanceGuid, models.PendingStopMessageReasonExtra) Ω(stopMessages()).Should(ContainElement(EqualPendingStopMessage(expectedMessage))) expectedMessage = models.NewPendingStopMessage(clock.Now(), 0, conf.GracePeriod(), app.AppGuid, app.AppVersion, app.InstanceAtIndex(2).InstanceGuid, models.PendingStopMessageReasonExtra) Ω(stopMessages()).Should(ContainElement(EqualPendingStopMessage(expectedMessage))) }) }) Context("and desired instances are missing", func() { BeforeEach(func() { storeAdapter.Delete("/hm/v1/apps/actual/" + app.AppGuid + "," + app.AppVersion + "/" + app.InstanceAtIndex(0).InstanceGuid) }) It("should return a start message containing the missing indices and no stop messages", func() { err := analyzer.Analyze() Ω(err).ShouldNot(HaveOccurred()) Ω(startMessages()).Should(HaveLen(1)) expectedMessage := models.NewPendingStartMessage(clock.Now(), conf.GracePeriod(), 0, app.AppGuid, app.AppVersion, 0, 1.0, models.PendingStartMessageReasonMissing) Ω(startMessages()).Should(ContainElement(EqualPendingStartMessage(expectedMessage))) Ω(stopMessages()).Should(BeEmpty()) }) }) })
It("returns nil when it eventually wins", func() { preExistingNode := storeadapter.StoreNode{ Key: "syslog_drain_binder/leader", Value: []byte("some-other-instance"), } err := fakeStore.Create(preExistingNode) Expect(err).NotTo(HaveOccurred()) errChan := make(chan error) go func() { errChan <- candidate.RunForElection() }() time.Sleep(1 * time.Second) fakeStore.Delete(preExistingNode.Key) Eventually(errChan, 2).Should(Receive(BeNil())) }) }) Describe("StayAsLeader", func() { var candidate *elector.Elector BeforeEach(func() { fakeStore.Create(storeadapter.StoreNode{ Key: "syslog_drain_binder/leader", Value: []byte("candidate1"), }) }) Context("when already leader", func() {
conf, _ := config.DefaultConfig() conf.StoreSchemaVersion = 2 store := storepackage.NewStore(conf, storeAdapter, fakelogger.NewFakeLogger()) shredder = New(store) storeAdapter.SetMulti([]storeadapter.StoreNode{ {Key: "/hm/v2/pokemon/geodude", Value: []byte{}}, {Key: "/hm/v2/deep-pokemon/abra/kadabra/alakazam", Value: []byte{}}, {Key: "/hm/v2/pokemonCount", Value: []byte("151")}, {Key: "/hm/v1/nuke/me/cause/im/an/old/version", Value: []byte("abc")}, {Key: "/hm/v3/leave/me/alone/since/im/a/new/version", Value: []byte("abc")}, {Key: "/hm/nuke/me/cause/im/not/versioned", Value: []byte("abc")}, {Key: "/let/me/be", Value: []byte("abc")}, }) storeAdapter.Delete("/hm/v2/pokemon/geodude", "/hm/v2/deep-pokemon/abra/kadabra/alakazam") err := shredder.Shred() Ω(err).ShouldNot(HaveOccurred()) }) It("should delete empty directories", func() { _, err := storeAdapter.Get("/hm/v2/pokemon") Ω(err).Should(Equal(storeadapter.ErrorKeyNotFound)) _, err = storeAdapter.Get("/hm/v2/deep-pokemon") Ω(err).Should(Equal(storeadapter.ErrorKeyNotFound)) _, err = storeAdapter.Get("/hm/v2/pokemonCount") Ω(err).ShouldNot(HaveOccurred()) })