github.com/rawahars/moby@v24.0.4+incompatible/libnetwork/service.go (about)

     1  package libnetwork
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"sync"
     7  
     8  	"github.com/docker/docker/libnetwork/internal/setmatrix"
     9  )
    10  
    11  var (
    12  	// A global monotonic counter to assign firewall marks to
    13  	// services.
    14  	fwMarkCtr   uint32 = 256
    15  	fwMarkCtrMu sync.Mutex
    16  )
    17  
    18  type portConfigs []*PortConfig
    19  
    20  func (p portConfigs) String() string {
    21  	if len(p) == 0 {
    22  		return ""
    23  	}
    24  
    25  	pc := p[0]
    26  	str := fmt.Sprintf("%d:%d/%s", pc.PublishedPort, pc.TargetPort, PortConfig_Protocol_name[int32(pc.Protocol)])
    27  	for _, pc := range p[1:] {
    28  		str = str + fmt.Sprintf(",%d:%d/%s", pc.PublishedPort, pc.TargetPort, PortConfig_Protocol_name[int32(pc.Protocol)])
    29  	}
    30  
    31  	return str
    32  }
    33  
    34  type serviceKey struct {
    35  	id    string
    36  	ports string
    37  }
    38  
    39  type service struct {
    40  	name string // Service Name
    41  	id   string // Service ID
    42  
    43  	// Map of loadbalancers for the service one-per attached
    44  	// network. It is keyed with network ID.
    45  	loadBalancers map[string]*loadBalancer
    46  
    47  	// List of ingress ports exposed by the service
    48  	ingressPorts portConfigs
    49  
    50  	// Service aliases
    51  	aliases []string
    52  
    53  	// This maps tracks for each IP address the list of endpoints ID
    54  	// associated with it. At stable state the endpoint ID expected is 1
    55  	// but during transition and service change it is possible to have
    56  	// temporary more than 1
    57  	ipToEndpoint setmatrix.SetMatrix[string]
    58  
    59  	deleted bool
    60  
    61  	sync.Mutex
    62  }
    63  
    64  // assignIPToEndpoint inserts the mapping between the IP and the endpoint identifier
    65  // returns true if the mapping was not present, false otherwise
    66  // returns also the number of endpoints associated to the IP
    67  func (s *service) assignIPToEndpoint(ip, eID string) (bool, int) {
    68  	return s.ipToEndpoint.Insert(ip, eID)
    69  }
    70  
    71  // removeIPToEndpoint removes the mapping between the IP and the endpoint identifier
    72  // returns true if the mapping was deleted, false otherwise
    73  // returns also the number of endpoints associated to the IP
    74  func (s *service) removeIPToEndpoint(ip, eID string) (bool, int) {
    75  	return s.ipToEndpoint.Remove(ip, eID)
    76  }
    77  
    78  func (s *service) printIPToEndpoint(ip string) (string, bool) {
    79  	return s.ipToEndpoint.String(ip)
    80  }
    81  
    82  type lbBackend struct {
    83  	ip       net.IP
    84  	disabled bool
    85  }
    86  
    87  type loadBalancer struct {
    88  	vip    net.IP
    89  	fwMark uint32
    90  
    91  	// Map of backend IPs backing this loadbalancer on this
    92  	// network. It is keyed with endpoint ID.
    93  	backEnds map[string]*lbBackend
    94  
    95  	// Back pointer to service to which the loadbalancer belongs.
    96  	service *service
    97  	sync.Mutex
    98  }