func (watcher *Watcher) handleDesiredUpdate(logger lager.Logger, before, after *models.DesiredLRPSchedulingInfo) { logger = logger.Session("handling-desired-update", lager.Data{ "before": desiredLRPData(before), "after": desiredLRPData(after), }) logger.Info("starting") defer logger.Info("complete") afterKeysSet := watcher.setRoutesForDesired(logger, after) beforeRoutingKeys := routing_table.RoutingKeysFromSchedulingInfo(before) afterRoutes, _ := cfroutes.CFRoutesFromRoutingInfo(after.Routes) afterContainerPorts := set{} for _, route := range afterRoutes { afterContainerPorts.add(route.Port) } for _, key := range beforeRoutingKeys { if !afterKeysSet.contains(key) || !afterContainerPorts.contains(key.ContainerPort) { messagesToEmit := watcher.table.RemoveRoutes(key, &after.ModificationTag) watcher.emitMessages(logger, messagesToEmit) } } }
func (watcher *Watcher) handleDesiredDelete(logger lager.Logger, schedulingInfo *models.DesiredLRPSchedulingInfo) { logger = logger.Session("handling-desired-delete", desiredLRPData(schedulingInfo)) logger.Info("starting") defer logger.Info("complete") for _, key := range routing_table.RoutingKeysFromSchedulingInfo(schedulingInfo) { messagesToEmit := watcher.table.RemoveRoutes(key, &schedulingInfo.ModificationTag) watcher.emitMessages(logger, messagesToEmit) } }
func (watcher *Watcher) setRoutesForDesired(logger lager.Logger, schedulingInfo *models.DesiredLRPSchedulingInfo) set { routingKeys := routing_table.RoutingKeysFromSchedulingInfo(schedulingInfo) routes, _ := cfroutes.CFRoutesFromRoutingInfo(schedulingInfo.Routes) routingKeySet := set{} for _, key := range routingKeys { routingKeySet.add(key) for _, route := range routes { if key.ContainerPort == route.Port { messagesToEmit := watcher.table.SetRoutes(key, routing_table.Routes{ Hostnames: route.Hostnames, LogGuid: schedulingInfo.LogGuid, RouteServiceUrl: route.RouteServiceUrl, }) watcher.emitMessages(logger, messagesToEmit) } } } return routingKeySet }
}) }) Describe("RoutingKeysFromDesired", func() { It("creates a list of keys for an actual LRP", func() { routes := cfroutes.CFRoutes{ {Hostnames: []string{"foo.com", "bar.com"}, Port: 8080}, {Hostnames: []string{"foo.example.com"}, Port: 9090}, } schedulingInfo := &models.DesiredLRPSchedulingInfo{ DesiredLRPKey: models.NewDesiredLRPKey("process-guid", "tests", "abc-guid"), Routes: routes.RoutingInfo(), } keys := routing_table.RoutingKeysFromSchedulingInfo(schedulingInfo) Expect(keys).To(HaveLen(2)) Expect(keys).To(ContainElement(routing_table.RoutingKey{ProcessGuid: "process-guid", ContainerPort: 8080})) Expect(keys).To(ContainElement(routing_table.RoutingKey{ProcessGuid: "process-guid", ContainerPort: 9090})) }) Context("when the desired LRP does not define any container ports", func() { It("still uses the routes property", func() { schedulingInfo := &models.DesiredLRPSchedulingInfo{ DesiredLRPKey: models.NewDesiredLRPKey("process-guid", "tests", "abc-guid"), Routes: cfroutes.CFRoutes{{Hostnames: []string{"foo.com", "bar.com"}, Port: 8080}}.RoutingInfo(), } keys := routing_table.RoutingKeysFromSchedulingInfo(schedulingInfo) Expect(keys).To(HaveLen(1))