mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
fd43ee1323
- Maps 1 to 1 with container's networking stack - It holds container's specific nw options which before were incorrectly owned by Endpoint. - Sandbox creation no longer coupled with Endpoint Join, sandbox and endpoint have now separate lifecycle. - LeaveAll naturally replaced by Sandbox.Delete - some pkg and file renaming in order to have clear mapping between structure name and entity ("sandbox") - Revisited hosts and resolv.conf handling - Removed from JoinInfo interface capability of setting hosts and resolv.conf paths - Changed etchosts.Build() to first write the search domains and then the nameservers Signed-off-by: Alessandro Boch <aboch@docker.com>
109 lines
2.1 KiB
Go
109 lines
2.1 KiB
Go
package overlay
|
|
|
|
import (
|
|
"encoding/binary"
|
|
"fmt"
|
|
"net"
|
|
|
|
"github.com/docker/libnetwork/driverapi"
|
|
"github.com/docker/libnetwork/netutils"
|
|
)
|
|
|
|
type endpointTable map[string]*endpoint
|
|
|
|
type endpoint struct {
|
|
id string
|
|
mac net.HardwareAddr
|
|
addr *net.IPNet
|
|
}
|
|
|
|
func (n *network) endpoint(eid string) *endpoint {
|
|
n.Lock()
|
|
defer n.Unlock()
|
|
|
|
return n.endpoints[eid]
|
|
}
|
|
|
|
func (n *network) addEndpoint(ep *endpoint) {
|
|
n.Lock()
|
|
n.endpoints[ep.id] = ep
|
|
n.Unlock()
|
|
}
|
|
|
|
func (n *network) deleteEndpoint(eid string) {
|
|
n.Lock()
|
|
delete(n.endpoints, eid)
|
|
n.Unlock()
|
|
}
|
|
|
|
func (d *driver) CreateEndpoint(nid, eid string, epInfo driverapi.EndpointInfo,
|
|
epOptions map[string]interface{}) error {
|
|
if err := validateID(nid, eid); err != nil {
|
|
return err
|
|
}
|
|
|
|
n := d.network(nid)
|
|
if n == nil {
|
|
return fmt.Errorf("network id %q not found", nid)
|
|
}
|
|
|
|
ep := &endpoint{
|
|
id: eid,
|
|
}
|
|
|
|
if epInfo != nil && (len(epInfo.Interfaces()) > 0) {
|
|
addr := epInfo.Interfaces()[0].Address()
|
|
ep.addr = &addr
|
|
ep.mac = epInfo.Interfaces()[0].MacAddress()
|
|
n.addEndpoint(ep)
|
|
return nil
|
|
}
|
|
|
|
ipID, err := d.ipAllocator.GetID()
|
|
if err != nil {
|
|
return fmt.Errorf("could not allocate ip from subnet %s: %v",
|
|
bridgeSubnet.String(), err)
|
|
}
|
|
|
|
ep.addr = &net.IPNet{
|
|
Mask: bridgeSubnet.Mask,
|
|
}
|
|
ep.addr.IP = make([]byte, 4)
|
|
|
|
binary.BigEndian.PutUint32(ep.addr.IP, bridgeSubnetInt+ipID)
|
|
|
|
ep.mac = netutils.GenerateMACFromIP(ep.addr.IP)
|
|
|
|
err = epInfo.AddInterface(1, ep.mac, *ep.addr, net.IPNet{})
|
|
if err != nil {
|
|
return fmt.Errorf("could not add interface to endpoint info: %v", err)
|
|
}
|
|
|
|
n.addEndpoint(ep)
|
|
|
|
return nil
|
|
}
|
|
|
|
func (d *driver) DeleteEndpoint(nid, eid string) error {
|
|
if err := validateID(nid, eid); err != nil {
|
|
return err
|
|
}
|
|
|
|
n := d.network(nid)
|
|
if n == nil {
|
|
return fmt.Errorf("network id %q not found", nid)
|
|
}
|
|
|
|
ep := n.endpoint(eid)
|
|
if ep == nil {
|
|
return fmt.Errorf("endpoint id %q not found", eid)
|
|
}
|
|
|
|
d.ipAllocator.Release(binary.BigEndian.Uint32(ep.addr.IP) - bridgeSubnetInt)
|
|
n.deleteEndpoint(eid)
|
|
return nil
|
|
}
|
|
|
|
func (d *driver) EndpointOperInfo(nid, eid string) (map[string]interface{}, error) {
|
|
return make(map[string]interface{}, 0), nil
|
|
}
|