package libnetwork import ( "fmt" "net" "sync" ) 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 sync.Mutex } 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]net.IP // Back pointer to service to which the loadbalancer belongs. service *service }