// Add a new service to the Registry. // Do not replace an existing service. func (s *ServiceRegistry) AddService(svcCfg client.ServiceConfig) error { s.Lock() defer s.Unlock() log.Debug("Adding service:", svcCfg.Name) if _, ok := s.svcs[svcCfg.Name]; ok { log.Debug("Service already exists:", svcCfg.Name) return ErrDuplicateService } s.setServiceDefaults(&svcCfg) svcCfg = svcCfg.SetDefaults() service := NewService(svcCfg) err := service.start() if err != nil { return err } s.svcs[service.Name] = service svcCfg.VirtualHosts = filterEmpty(svcCfg.VirtualHosts) for _, name := range svcCfg.VirtualHosts { vhost := s.vhosts[name] if vhost == nil { vhost = &VirtualHost{Name: name} s.vhosts[name] = vhost } vhost.Add(service) } return nil }
func (s *HTTPSuite) TestAddRemoveVHosts(c *C) { svcCfg := client.ServiceConfig{ Name: "VHostTest", Addr: "127.0.0.1:9000", VirtualHosts: []string{"test-vhost"}, } for _, srv := range s.backendServers { cfg := client.BackendConfig{ Addr: srv.addr, Name: srv.addr, } svcCfg.Backends = append(svcCfg.Backends, cfg) } err := Registry.AddService(svcCfg) if err != nil { c.Fatal(err) } // now update the service with another vhost svcCfg.VirtualHosts = append(svcCfg.VirtualHosts, "test-vhost-2") err = Registry.UpdateService(svcCfg) if err != nil { c.Fatal(err) } if Registry.VHostsLen() != 2 { c.Fatal("missing new vhost") } // remove the first vhost svcCfg.VirtualHosts = []string{"test-vhost-2"} err = Registry.UpdateService(svcCfg) if err != nil { c.Fatal(err) } if Registry.VHostsLen() != 1 { c.Fatal("extra vhost:", Registry.VHostsLen()) } // check responses from this new vhost for _, srv := range s.backendServers { checkHTTP("http://"+s.httpAddr+"/addr", "test-vhost-2", srv.addr, 200, c) } }