package libnetwork import ( "fmt" "net" "sync" "github.com/docker/libnetwork/internal/setmatrix" ) var ( // A global monotonic counter to assign firewall marks to // services. fwMarkCtr uint32 = 256 fwMarkCtrMu sync.Mutex ) type portConfigs []*PortConfig func (p portConfigs) String() string { if len(p) == 0 { return "" } pc := p[0] str := fmt.Sprintf("%d:%d/%s", pc.PublishedPort, pc.TargetPort, PortConfig_Protocol_name[int32(pc.Protocol)]) for _, pc := range p[1:] { str = str + fmt.Sprintf(",%d:%d/%s", pc.PublishedPort, pc.TargetPort, PortConfig_Protocol_name[int32(pc.Protocol)]) } return str } type serviceKey struct { id string ports string } type service struct { name string // Service Name id string // Service ID // Map of loadbalancers for the service one-per attached // network. It is keyed with network ID. loadBalancers map[string]*loadBalancer // List of ingress ports exposed by the service ingressPorts portConfigs // Service aliases aliases []string // This maps tracks for each IP address the list of endpoints ID // associated with it. At stable state the endpoint ID expected is 1 // but during transition and service change it is possible to have // temporary more than 1 ipToEndpoint setmatrix.SetMatrix deleted bool sync.Mutex } // assignIPToEndpoint inserts the mapping between the IP and the endpoint identifier // returns true if the mapping was not present, false otherwise // returns also the number of endpoints associated to the IP func (s *service) assignIPToEndpoint(ip, eID string) (bool, int) { return s.ipToEndpoint.Insert(ip, eID) } // removeIPToEndpoint removes the mapping between the IP and the endpoint identifier // returns true if the mapping was deleted, false otherwise // returns also the number of endpoints associated to the IP func (s *service) removeIPToEndpoint(ip, eID string) (bool, int) { return s.ipToEndpoint.Remove(ip, eID) } func (s *service) printIPToEndpoint(ip string) (string, bool) { return s.ipToEndpoint.String(ip) } type lbBackend struct { ip net.IP disabled bool } type loadBalancer struct { vip net.IP fwMark uint32 // Map of backend IPs backing this loadbalancer on this // network. It is keyed with endpoint ID. backEnds map[string]*lbBackend // Back pointer to service to which the loadbalancer belongs. service *service sync.Mutex }