mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
3c81dc3103
Blocks the execution of tasks during the Prepare phase until there exists an IP address for every overlay network in use by the task. This prevents a task from starting before the NetworkAttachment containing the IP address has been sent down to the node. Includes a basic test for the correct use case. Signed-off-by: Drew Erny <drew.erny@docker.com>
81 lines
2.5 KiB
Go
81 lines
2.5 KiB
Go
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
|
|
}
|