func (ctx *ClusterContext) initServiceDiscovery() error { descriptions := ctx.getSortedSDDescriptionByType() log.Debugf("deploying all service discovery related container. len:%d", len(descriptions)) for _, description := range descriptions { log.Debugf("deploy service discovery container. group:%s", description.Group) ctx.deployContainersByDescription(&description) } log.Debugf("loading all container infos.") cinfos, err := ctx.loadAllContainers() if err != nil { return err } loadRegistry := func(group string, description *dcluster.ContainerDescription, infos []dcontainer.ContainerInfo) []string { ipPorts := []string{} for _, c := range infos { if c.Group != group { continue } if !c.IsUp() { log.Debugf("Container '%s' found for group '%s', but container is not up.\n", c.Name[0], c.Group) continue } for _, iPort := range c.IpPorts { if iPort.PrivatePort != description.PortBinding.ContainerPort { continue } ipPort := fmt.Sprintf("%s:%d", iPort.IP, iPort.PublicPort) ipPorts = append(ipPorts, ipPort) } } return ipPorts } for sdName, sdd := range ctx.clusterDesc.ServiceDiscover { driver, err := discovery.NewRegDriver(sdd["driver"], ctx.clusterDesc) if err != nil { return errors.New(fmt.Sprintf("Failed to create Reg Driver:'%s'. err:%s", sdName, err.Error())) } containerGroup, ok := sdd["container"] log.Debugf("Load registry for '%s'\n", containerGroup) if ok { fmt.Printf("Load registry for service discover. sd name: '%s', group: '%s'.\n", sdName, containerGroup) description, exists := ctx.clusterDesc.Container.Topology.GetDescription(containerGroup) if !exists { panic(fmt.Sprintf("No container description found for group '%s'", containerGroup)) } ipPorts := loadRegistry(containerGroup, description, cinfos) if len(ipPorts) == 0 { fmt.Printf("No available container for service discovery:%s, container group:%s\n", sdName, containerGroup) } else { fmt.Printf("Service discover registry found: %+v\n", ipPorts) (*driver).Registry(ipPorts) } } fmt.Printf("Service discover registered name:%s. \n", sdName) ctx.serviceRegistries[sdName] = driver } return nil }
func (ctx *ClusterContext) initServiceDiscovery(cinfos []dcontainer.ContainerInfo) error { loadRegistry := func(group string, description dcluster.ContainerDescription, infos []dcontainer.ContainerInfo) []string { ipPorts := []string{} for _, c := range infos { if c.Group != group { continue } if !c.IsUp() { fmt.Printf("Container '%s' found for group '%s', but container is not up.\n", c.Name[0], c.Group) } for _, iPort := range c.IpPorts { if iPort.PrivatePort != description.PortBinding.ContainerPort { continue } ipPort := fmt.Sprintf("%s:%d", iPort.IP, iPort.PublicPort) ipPorts = append(ipPorts, ipPort) } } return ipPorts } for sdName, sdd := range ctx.clusterDesc.ServiceDiscover { driver, err := discovery.NewRegDriver(sdd) if err != nil { return errors.New(fmt.Sprintf("Failed to create Reg Driver:'%s'. err:%s", sdName, err.Error())) } containerGroup, ok := sdd["container"] fmt.Printf("Load registry for '%s'\n", containerGroup) if ok { fmt.Printf("Load registry for service discover. sd name: '%s', group: '%s'.\n", sdName, containerGroup) description, exists := ctx.clusterDesc.Container.Topology[containerGroup] if !exists { panic(fmt.Sprintf("No container description found for group '%s'", containerGroup)) } ipPorts := loadRegistry(containerGroup, description, cinfos) if len(ipPorts) == 0 { fmt.Printf("No available container for service discovery:%s, container group:%s\n", sdName, containerGroup) } else { fmt.Printf("Service discover registry found: %+v\n", ipPorts) (*driver).Registry(ipPorts) } } fmt.Printf("Service discover registered: name:%s. \n", sdName) ctx.serviceRegistries[sdName] = driver } return nil }