dae33031e0
The API's EndpointConfig struct has a MacAddress field that's used for both the configured address, and the current address (which may be generated). A configured address must be restored when a container is restarted, but a generated address must not. The previous attempt to differentiate between the two, without adding a field to the API's EndpointConfig that would show up in 'inspect' output, was a field in the daemon's version of EndpointSettings, MACOperational. It did not work, MACOperational was set to true when a configured address was used. So, while it ensured addresses were regenerated, it failed to preserve a configured address. So, this change removes that code, and adds DesiredMacAddress to the wrapped version of EndpointSettings, where it is persisted but does not appear in 'inspect' results. Its value is copied from MacAddress (the API field) when a container is created. Signed-off-by: Rob Murray <rob.murray@docker.com>
83 lines
2.6 KiB
Go
83 lines
2.6 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
|
|
SandboxKey string
|
|
HairpinMode bool
|
|
LinkLocalIPv6Address string
|
|
LinkLocalIPv6PrefixLen int
|
|
Networks map[string]*EndpointSettings
|
|
Service *clustertypes.ServiceConfig
|
|
Ports nat.PortMap
|
|
SecondaryIPAddresses []networktypes.Address
|
|
SecondaryIPv6Addresses []networktypes.Address
|
|
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
|
|
// DesiredMacAddress is the configured value, it's copied from MacAddress (the
|
|
// API param field) when the container is created.
|
|
DesiredMacAddress string
|
|
}
|
|
|
|
// 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
|
|
}
|