func (watcher *Watcher) removeAndEmit(logger lager.Logger, actualLRPInfo *routing_table.ActualLRPRoutingInfo) { endpoints, err := routing_table.EndpointsFromActual(actualLRPInfo) if err != nil { logger.Error("failed-to-extract-endpoint-from-actual", err) return } for _, key := range routing_table.RoutingKeysFromActual(actualLRPInfo.ActualLRP) { for _, endpoint := range endpoints { if key.ContainerPort == endpoint.ContainerPort { messagesToEmit := watcher.table.RemoveEndpoint(key, endpoint) watcher.emitMessages(logger, messagesToEmit) } } } }
Expect(endpoints[routing_table.RoutingKey{ProcessGuid: "abc", ContainerPort: 99}]).To(HaveLen(2)) Expect(endpoints[routing_table.RoutingKey{ProcessGuid: "abc", ContainerPort: 99}]).To(ContainElement(routing_table.Endpoint{Host: "1.1.1.1", Port: 66, ContainerPort: 99})) Expect(endpoints[routing_table.RoutingKey{ProcessGuid: "abc", ContainerPort: 99}]).To(ContainElement(routing_table.Endpoint{Host: "2.2.2.2", Port: 88, ContainerPort: 99})) Expect(endpoints[routing_table.RoutingKey{ProcessGuid: "def", ContainerPort: 55}]).To(HaveLen(1)) Expect(endpoints[routing_table.RoutingKey{ProcessGuid: "def", ContainerPort: 55}]).To(ContainElement(routing_table.Endpoint{Host: "3.3.3.3", Port: 33, ContainerPort: 55})) }) }) Describe("EndpointsFromActual", func() { It("builds a map of container port to endpoint", func() { endpoints, err := routing_table.EndpointsFromActual(&routing_table.ActualLRPRoutingInfo{ ActualLRP: &models.ActualLRP{ ActualLRPKey: models.NewActualLRPKey("process-guid", 0, "domain"), ActualLRPInstanceKey: models.NewActualLRPInstanceKey("instance-guid", "cell-id"), ActualLRPNetInfo: models.NewActualLRPNetInfo("1.1.1.1", models.NewPortMapping(11, 44), models.NewPortMapping(66, 99)), }, Evacuating: true, }) Expect(err).NotTo(HaveOccurred()) Expect(endpoints).To(ConsistOf([]routing_table.Endpoint{ routing_table.Endpoint{Host: "1.1.1.1", Port: 11, InstanceGuid: "instance-guid", ContainerPort: 44, Evacuating: true}, routing_table.Endpoint{Host: "1.1.1.1", Port: 66, InstanceGuid: "instance-guid", ContainerPort: 99, Evacuating: true}, })) }) }) Describe("RoutingKeysFromActual", func() { It("creates a list of keys for an actual LRP", func() { keys := routing_table.RoutingKeysFromActual(&models.ActualLRP{
actualLRPRoutingInfo = &routing_table.ActualLRPRoutingInfo{ ActualLRP: actualLRP, Evacuating: false, } }) JustBeforeEach(func() { table.AddEndpointReturns(dummyMessagesToEmit) nextEvent.Store(EventHolder{models.NewActualLRPCreatedEvent(actualLRPGroup)}) }) It("should add/update the endpoints on the table", func() { Eventually(table.AddEndpointCallCount).Should(Equal(2)) keys := routing_table.RoutingKeysFromActual(actualLRP) endpoints, err := routing_table.EndpointsFromActual(actualLRPRoutingInfo) Expect(err).NotTo(HaveOccurred()) key, endpoint := table.AddEndpointArgsForCall(0) Expect(keys).To(ContainElement(key)) Expect(endpoint).To(Equal(endpoints[key.ContainerPort])) key, endpoint = table.AddEndpointArgsForCall(1) Expect(keys).To(ContainElement(key)) Expect(endpoint).To(Equal(endpoints[key.ContainerPort])) }) It("should emit whatever the table tells it to emit", func() { Eventually(emitter.EmitCallCount).Should(Equal(3)) messagesToEmit := emitter.EmitArgsForCall(1)