package network // import "github.com/docker/docker/daemon/network" import ( "net" "sync" networktypes "github.com/docker/docker/api/types/network" clustertypes "github.com/docker/docker/daemon/cluster/provider" "github.com/docker/go-connections/nat" "github.com/pkg/errors" ) // Settings stores configuration details about the daemon network config // TODO Windows. Many of these fields can be factored out., type Settings struct { Bridge string SandboxID string HairpinMode bool LinkLocalIPv6Address string LinkLocalIPv6PrefixLen int Networks map[string]*EndpointSettings Service *clustertypes.ServiceConfig Ports nat.PortMap SandboxKey string SecondaryIPAddresses []networktypes.Address SecondaryIPv6Addresses []networktypes.Address IsAnonymousEndpoint bool HasSwarmEndpoint bool } // EndpointSettings is a package local wrapper for // networktypes.EndpointSettings which stores Endpoint state that // needs to be persisted to disk but not exposed in the api. type EndpointSettings struct { *networktypes.EndpointSettings IPAMOperational bool } // AttachmentStore stores the load balancer IP address for a network id. type AttachmentStore struct { sync.Mutex // key: networkd id // value: load balancer ip address networkToNodeLBIP map[string]net.IP } // ResetAttachments clears any existing load balancer IP to network mapping and // sets the mapping to the given attachments. func (store *AttachmentStore) ResetAttachments(attachments map[string]string) error { store.Lock() defer store.Unlock() store.clearAttachments() for nid, nodeIP := range attachments { ip, _, err := net.ParseCIDR(nodeIP) if err != nil { store.networkToNodeLBIP = make(map[string]net.IP) return errors.Wrapf(err, "Failed to parse load balancer address %s", nodeIP) } store.networkToNodeLBIP[nid] = ip } return nil } // ClearAttachments clears all the mappings of network to load balancer IP Address. func (store *AttachmentStore) ClearAttachments() { store.Lock() defer store.Unlock() store.clearAttachments() } func (store *AttachmentStore) clearAttachments() { store.networkToNodeLBIP = make(map[string]net.IP) } // GetIPForNetwork return the load balancer IP address for the given network. func (store *AttachmentStore) GetIPForNetwork(networkID string) (net.IP, bool) { store.Lock() defer store.Unlock() ip, exists := store.networkToNodeLBIP[networkID] return ip, exists }