package mcat_test import ( "github.com/cloudfoundry/hm9000/models" "github.com/cloudfoundry/hm9000/testhelpers/appfixture" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Evacuation and Shutdown", func() { var dea appfixture.DeaFixture var app appfixture.AppFixture BeforeEach(func() { dea = appfixture.NewDeaFixture() app = dea.GetApp(0) simulator.SetCurrentHeartbeats(dea.HeartbeatWith(app.InstanceAtIndex(0).Heartbeat())) simulator.SetDesiredState(app.DesiredState(1)) simulator.Tick(simulator.TicksToAttainFreshness) }) Describe("Shutdown handling by the evacuator component", func() { Context("when a SHUTDOWN droplet.exited message comes in", func() { BeforeEach(func() { cliRunner.StartEvacuator(simulator.currentTimestamp) coordinator.MessageBus.Publish("droplet.exited", app.InstanceAtIndex(0).DropletExited(models.DropletExitedReasonDEAShutdown).ToJSON()) }) AfterEach(func() { cliRunner.StopEvacuator() })
app3 appfixture.AppFixture app4 appfixture.AppFixture crashCount []models.CrashCount ) conf, _ = config.DefaultConfig() BeforeEach(func() { storeAdapter = etcdstoreadapter.NewETCDStoreAdapter(etcdRunner.NodeURLS(), workerpool.NewWorkerPool(conf.StoreMaxConcurrentRequests)) err := storeAdapter.Connect() Ω(err).ShouldNot(HaveOccurred()) store = NewStore(conf, storeAdapter, fakelogger.NewFakeLogger()) dea = appfixture.NewDeaFixture() app1 = dea.GetApp(0) app2 = dea.GetApp(1) app3 = dea.GetApp(2) app4 = dea.GetApp(3) actualState := []models.InstanceHeartbeat{ app1.InstanceAtIndex(0).Heartbeat(), app1.InstanceAtIndex(1).Heartbeat(), app1.InstanceAtIndex(2).Heartbeat(), app2.InstanceAtIndex(0).Heartbeat(), } desiredState := []models.DesiredAppState{ app1.DesiredState(1), app3.DesiredState(1), }
"github.com/cloudfoundry/hm9000/models" "github.com/cloudfoundry/hm9000/testhelpers/appfixture" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Crashes", func() { var ( dea appfixture.DeaFixture a appfixture.AppFixture crashingHeartbeat models.Heartbeat ) BeforeEach(func() { dea = appfixture.NewDeaFixture() a = dea.GetApp(0) }) Describe("when all instances are crashed", func() { BeforeEach(func() { simulator.SetDesiredState(a.DesiredState(3)) crashingHeartbeat = dea.HeartbeatWith( a.CrashedInstanceHeartbeatAtIndex(0), a.CrashedInstanceHeartbeatAtIndex(1), a.CrashedInstanceHeartbeatAtIndex(2), ) simulator.SetCurrentHeartbeats(crashingHeartbeat) simulator.Tick(simulator.TicksToAttainFreshness) })
store storepackage.Store clock *fakeclock.FakeClock dea appfixture.DeaFixture app appfixture.AppFixture ) conf, _ := config.DefaultConfig() BeforeEach(func() { storeAdapter = fakestoreadapter.New() store = storepackage.NewStore(conf, storeAdapter, fakelogger.NewFakeLogger()) clock = fakeclock.NewFakeClock(time.Unix(1000, 0)) dea = appfixture.NewDeaFixture() app = dea.GetApp(0) store.BumpActualFreshness(time.Unix(100, 0)) store.BumpDesiredFreshness(time.Unix(100, 0)) analyzer = New(store, clock, fakelogger.NewFakeLogger(), conf) }) startMessages := func() []models.PendingStartMessage { messages, _ := store.GetPendingStartMessages() messagesArr := []models.PendingStartMessage{} for _, message := range messages { messagesArr = append(messagesArr, message) } return messagesArr }
import ( "github.com/cloudfoundry/hm9000/testhelpers/appfixture" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" ) var _ = Describe("Expiring Heartbeats Test", func() { var dea1, dea2 appfixture.DeaFixture var app1, app2, app3 appfixture.AppFixture BeforeEach(func() { dea1 = appfixture.NewDeaFixture() dea2 = appfixture.NewDeaFixture() app1 = dea1.GetApp(0) app2 = dea1.GetApp(1) app3 = dea2.GetApp(2) simulator.SetCurrentHeartbeats( dea1.HeartbeatWith(app1.InstanceAtIndex(0).Heartbeat(), app2.InstanceAtIndex(0).Heartbeat()), dea2.HeartbeatWith(app3.InstanceAtIndex(0).Heartbeat()), ) simulator.SetDesiredState(app1.DesiredState(1), app2.DesiredState(1), app3.DesiredState(1)) simulator.Tick(simulator.TicksToAttainFreshness) }) Context("when a dea reports than an instance is no longer present", func() { BeforeEach(func() { simulator.SetCurrentHeartbeats( dea1.HeartbeatWith(app1.InstanceAtIndex(0).Heartbeat()),
Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfMissingIndices", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfCrashedInstances", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfCrashedIndices", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfDesiredApps", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfDesiredInstances", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfDesiredAppsPendingStaging", Value: -1})) }) }) Context("when the store is fresh", func() { var dea appfixture.DeaFixture var a appfixture.AppFixture BeforeEach(func() { dea = appfixture.NewDeaFixture() a = dea.GetApp(0) store.BumpDesiredFreshness(time.Unix(0, 0)) store.BumpActualFreshness(time.Unix(0, 0)) }) Context("when the apps fail to load", func() { BeforeEach(func() { storeAdapter.ListErrInjector = fakestoreadapter.NewFakeStoreAdapterErrorInjector("apps", errors.New("oops")) }) It("should emit -1 for all its metrics", func() { context := metricsServer.Emit() Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfAppsWithAllInstancesReporting", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfAppsWithMissingInstances", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfUndesiredRunningApps", Value: -1})) Ω(context.Metrics).Should(ContainElement(instrumentation.Metric{Name: "NumberOfRunningInstances", Value: -1}))
Ω(err).ShouldNot(HaveOccurred()) conf.StoreHeartbeatCacheRefreshIntervalInMilliseconds = 100 store = NewStore(conf, storeAdapter, fakelogger.NewFakeLogger()) dea = appfixture.NewDeaFixture() otherDea = appfixture.NewDeaFixture() }) AfterEach(func() { storeAdapter.Disconnect() }) Describe("Saving actual state", func() { BeforeEach(func() { store.SyncHeartbeats(dea.HeartbeatWith( dea.GetApp(0).InstanceAtIndex(1).Heartbeat(), dea.GetApp(1).InstanceAtIndex(3).Heartbeat(), )) }) It("should save the instance heartbeats for the passed-in heartbeat", func() { results, err := store.GetInstanceHeartbeats() Ω(err).ShouldNot(HaveOccurred()) Ω(results).Should(HaveLen(2)) Ω(results).Should(ContainElement(dea.GetApp(0).InstanceAtIndex(1).Heartbeat())) Ω(results).Should(ContainElement(dea.GetApp(1).InstanceAtIndex(3).Heartbeat())) }) Context("when there are already instance heartbeats stored for the DEA in question", func() { var modifiedHeartbeat models.InstanceHeartbeat BeforeEach(func() {