func (c *Configurator) upsertLocation(host *Host, loc *Location) error { if err := c.upsertHost(host); err != nil { return err } // If location already exists, do nothing if loc := c.a.GetHttpLocation(host.Name, loc.Id); loc != nil { return nil } router := c.a.GetPathRouter(host.Name) if router == nil { return fmt.Errorf("Router not found for %s", host) } // Create a load balancer that handles all the endpoints within the given location rr, err := roundrobin.NewRoundRobin() if err != nil { return err } // Create a location itself location, err := httploc.NewLocation(loc.Id, rr) if err != nil { return err } // Always register a global connection watcher location.GetObserverChain().Upsert(ConnWatch, c.connWatcher) // Add the location to the router if err := router.AddLocation(loc.Path, location); err != nil { return err } // Add rate and connection limits for _, rl := range loc.RateLimits { if err := c.upsertLocationRateLimit(host, loc, rl); err != nil { log.Errorf("Failed to add rate limit: %s", err) } } for _, cl := range loc.ConnLimits { if err := c.upsertLocationConnLimit(host, loc, cl); err != nil { log.Errorf("Failed to add connection limit: %s", err) } } // Once the location added, configure all endpoints return c.syncLocationEndpoints(loc) }
func (s *Service) addLocation(host *Host, loc *Location) error { router, err := s.getPathRouter(host.Name) if err != nil { return err } // Create a load balancer that handles all the endpoints within the given location rr, err := roundrobin.NewRoundRobin() if err != nil { return err } // Create a location itself location, err := httploc.NewLocation(loc.Name, rr) if err != nil { return err } // Add the location to the router if err := router.AddLocation(loc.Path, location); err != nil { return err } // Once the location added, configure all endpoints return s.configureLocation(host, loc) }