| // FIXME(thaJeztah): remove once we are a module; the go:build directive prevents go from downgrading language version to go1.16: | |
| //go:build go1.22 | |
| package libnetwork | |
| import ( | |
| "fmt" | |
| "net" | |
| "sync" | |
| "github.com/docker/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[string] | |
| 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 | |
| } |