mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Merge pull request #17381 from mavenugo/rc3v1
Vendoring in libnetwork with fixes for issues identified in RC1 & RC2
This commit is contained in:
commit
91de5ddf18
10 changed files with 144 additions and 30 deletions
|
@ -21,7 +21,7 @@ clone git github.com/vdemeester/shakers 3c10293ce22b900c27acad7b28656196fcc2f73b
|
||||||
clone git golang.org/x/net 3cffabab72adf04f8e3b01c5baf775361837b5fe https://github.com/golang/net.git
|
clone git golang.org/x/net 3cffabab72adf04f8e3b01c5baf775361837b5fe https://github.com/golang/net.git
|
||||||
|
|
||||||
#get libnetwork packages
|
#get libnetwork packages
|
||||||
clone git github.com/docker/libnetwork bf041154d27ed34ed39722328c8f1b0144a56fe2
|
clone git github.com/docker/libnetwork c92c21bca42a3581fd108d3222848faa16372249
|
||||||
clone git github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
clone git github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec
|
||||||
clone git github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ece5810165097b
|
clone git github.com/hashicorp/go-msgpack 71c2886f5a673a35f909803f38ece5810165097b
|
||||||
clone git github.com/hashicorp/memberlist 9a1e242e454d2443df330bdd51a436d5a9058fc4
|
clone git github.com/hashicorp/memberlist 9a1e242e454d2443df330bdd51a436d5a9058fc4
|
||||||
|
|
|
@ -178,7 +178,7 @@ func New(cfgOptions ...config.Option) (NetworkController, error) {
|
||||||
if err := c.initDiscovery(cfg.Cluster.Watcher); err != nil {
|
if err := c.initDiscovery(cfg.Cluster.Watcher); err != nil {
|
||||||
// Failing to initalize discovery is a bad situation to be in.
|
// Failing to initalize discovery is a bad situation to be in.
|
||||||
// But it cannot fail creating the Controller
|
// But it cannot fail creating the Controller
|
||||||
log.Debugf("Failed to Initialize Discovery : %v", err)
|
log.Errorf("Failed to Initialize Discovery : %v", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -133,7 +133,7 @@ func makeDefaultScopes() map[string]*ScopeCfg {
|
||||||
def := make(map[string]*ScopeCfg)
|
def := make(map[string]*ScopeCfg)
|
||||||
def[LocalScope] = &ScopeCfg{
|
def[LocalScope] = &ScopeCfg{
|
||||||
Client: ScopeClientCfg{
|
Client: ScopeClientCfg{
|
||||||
Provider: "boltdb",
|
Provider: string(store.BOLTDB),
|
||||||
Address: defaultPrefix + "/local-kv.db",
|
Address: defaultPrefix + "/local-kv.db",
|
||||||
Config: &store.Config{
|
Config: &store.Config{
|
||||||
Bucket: "libnetwork",
|
Bucket: "libnetwork",
|
||||||
|
@ -144,7 +144,8 @@ func makeDefaultScopes() map[string]*ScopeCfg {
|
||||||
return def
|
return def
|
||||||
}
|
}
|
||||||
|
|
||||||
var rootChain = []string{"docker", "network", "v1.0"}
|
var defaultRootChain = []string{"docker", "network", "v1.0"}
|
||||||
|
var rootChain = defaultRootChain
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
consul.Register()
|
consul.Register()
|
||||||
|
@ -195,6 +196,7 @@ func ParseKey(key string) ([]string, error) {
|
||||||
|
|
||||||
// newClient used to connect to KV Store
|
// newClient used to connect to KV Store
|
||||||
func newClient(scope string, kv string, addr string, config *store.Config, cached bool) (DataStore, error) {
|
func newClient(scope string, kv string, addr string, config *store.Config, cached bool) (DataStore, error) {
|
||||||
|
|
||||||
if cached && scope != LocalScope {
|
if cached && scope != LocalScope {
|
||||||
return nil, fmt.Errorf("caching supported only for scope %s", LocalScope)
|
return nil, fmt.Errorf("caching supported only for scope %s", LocalScope)
|
||||||
}
|
}
|
||||||
|
@ -203,7 +205,21 @@ func newClient(scope string, kv string, addr string, config *store.Config, cache
|
||||||
config = &store.Config{}
|
config = &store.Config{}
|
||||||
}
|
}
|
||||||
|
|
||||||
addrs := strings.Split(addr, ",")
|
var addrs []string
|
||||||
|
|
||||||
|
if kv == string(store.BOLTDB) {
|
||||||
|
// Parse file path
|
||||||
|
addrs = strings.Split(addr, ",")
|
||||||
|
} else {
|
||||||
|
// Parse URI
|
||||||
|
parts := strings.SplitN(addr, "/", 2)
|
||||||
|
addrs = strings.Split(parts[0], ",")
|
||||||
|
|
||||||
|
// Add the custom prefix to the root chain
|
||||||
|
if len(parts) == 2 {
|
||||||
|
rootChain = append([]string{parts[1]}, defaultRootChain...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
store, err := libkv.NewStore(store.Backend(kv), addrs, config)
|
store, err := libkv.NewStore(store.Backend(kv), addrs, config)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -58,6 +58,8 @@ func (sb *sandbox) setupDefaultGW(srcEp *endpoint) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
createOptions = append(createOptions, CreateOptionAnonymous())
|
||||||
|
|
||||||
eplen := gwEPlen
|
eplen := gwEPlen
|
||||||
if len(sb.containerID) < gwEPlen {
|
if len(sb.containerID) < gwEPlen {
|
||||||
eplen = len(sb.containerID)
|
eplen = len(sb.containerID)
|
||||||
|
|
|
@ -118,10 +118,12 @@ func (d *driver) Leave(nid, eid string) error {
|
||||||
return fmt.Errorf("could not find network with id %s", nid)
|
return fmt.Errorf("could not find network with id %s", nid)
|
||||||
}
|
}
|
||||||
|
|
||||||
d.notifyCh <- ovNotify{
|
if d.notifyCh != nil {
|
||||||
action: "leave",
|
d.notifyCh <- ovNotify{
|
||||||
nid: nid,
|
action: "leave",
|
||||||
eid: eid,
|
nid: nid,
|
||||||
|
eid: eid,
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
n.leaveSandbox()
|
n.leaveSandbox()
|
||||||
|
|
|
@ -2,6 +2,7 @@ package overlay
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
|
@ -120,8 +121,30 @@ func (d *driver) Type() string {
|
||||||
return networkType
|
return networkType
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func validateSelf(node string) error {
|
||||||
|
advIP := net.ParseIP(node)
|
||||||
|
if advIP == nil {
|
||||||
|
return fmt.Errorf("invalid self address (%s)", node)
|
||||||
|
}
|
||||||
|
|
||||||
|
addrs, err := net.InterfaceAddrs()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Unable to get interface addresses %v", err)
|
||||||
|
}
|
||||||
|
for _, addr := range addrs {
|
||||||
|
ip, _, err := net.ParseCIDR(addr.String())
|
||||||
|
if err == nil && ip.Equal(advIP) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fmt.Errorf("Multi-Host overlay networking requires cluster-advertise(%s) to be configured with a local ip-address that is reachable within the cluster", advIP.String())
|
||||||
|
}
|
||||||
|
|
||||||
func (d *driver) nodeJoin(node string, self bool) {
|
func (d *driver) nodeJoin(node string, self bool) {
|
||||||
if self && !d.isSerfAlive() {
|
if self && !d.isSerfAlive() {
|
||||||
|
if err := validateSelf(node); err != nil {
|
||||||
|
logrus.Errorf("%s", err.Error())
|
||||||
|
}
|
||||||
d.Lock()
|
d.Lock()
|
||||||
d.bindAddress = node
|
d.bindAddress = node
|
||||||
d.Unlock()
|
d.Unlock()
|
||||||
|
|
|
@ -106,6 +106,51 @@ func (ep *endpoint) UnmarshalJSON(b []byte) (err error) {
|
||||||
|
|
||||||
if v, ok := epMap["generic"]; ok {
|
if v, ok := epMap["generic"]; ok {
|
||||||
ep.generic = v.(map[string]interface{})
|
ep.generic = v.(map[string]interface{})
|
||||||
|
|
||||||
|
if opt, ok := ep.generic[netlabel.PortMap]; ok {
|
||||||
|
pblist := []types.PortBinding{}
|
||||||
|
|
||||||
|
for i := 0; i < len(opt.([]interface{})); i++ {
|
||||||
|
pb := types.PortBinding{}
|
||||||
|
tmp := opt.([]interface{})[i].(map[string]interface{})
|
||||||
|
|
||||||
|
bytes, err := json.Marshal(tmp)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(bytes, &pb)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
pblist = append(pblist, pb)
|
||||||
|
}
|
||||||
|
ep.generic[netlabel.PortMap] = pblist
|
||||||
|
}
|
||||||
|
|
||||||
|
if opt, ok := ep.generic[netlabel.ExposedPorts]; ok {
|
||||||
|
tplist := []types.TransportPort{}
|
||||||
|
|
||||||
|
for i := 0; i < len(opt.([]interface{})); i++ {
|
||||||
|
tp := types.TransportPort{}
|
||||||
|
tmp := opt.([]interface{})[i].(map[string]interface{})
|
||||||
|
|
||||||
|
bytes, err := json.Marshal(tmp)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
err = json.Unmarshal(bytes, &tp)
|
||||||
|
if err != nil {
|
||||||
|
log.Error(err)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
tplist = append(tplist, tp)
|
||||||
|
}
|
||||||
|
ep.generic[netlabel.ExposedPorts] = tplist
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := epMap["anonymous"]; ok {
|
if v, ok := epMap["anonymous"]; ok {
|
||||||
|
@ -345,7 +390,7 @@ func (ep *endpoint) sbJoin(sbox Sandbox, options ...EndpointOption) error {
|
||||||
if ip := ep.getFirstInterfaceAddress(); ip != nil {
|
if ip := ep.getFirstInterfaceAddress(); ip != nil {
|
||||||
address = ip.String()
|
address = ip.String()
|
||||||
}
|
}
|
||||||
if err = sb.updateHostsFile(address, network.getSvcRecords()); err != nil {
|
if err = sb.updateHostsFile(address, network.getSvcRecords(ep)); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,8 +512,7 @@ func (ep *endpoint) sbLeave(sbox Sandbox, options ...EndpointOption) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// unwatch for service records
|
sb.deleteHostsEntries(n.getSvcRecords(ep))
|
||||||
n.getController().unWatchSvcRecord(ep)
|
|
||||||
|
|
||||||
if sb.needDefaultGW() {
|
if sb.needDefaultGW() {
|
||||||
ep := sb.getEPwithoutGateway()
|
ep := sb.getEPwithoutGateway()
|
||||||
|
@ -501,17 +545,6 @@ func (ep *endpoint) Delete() error {
|
||||||
}
|
}
|
||||||
ep.Unlock()
|
ep.Unlock()
|
||||||
|
|
||||||
if err = n.getEpCnt().DecEndpointCnt(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
defer func() {
|
|
||||||
if err != nil {
|
|
||||||
if e := n.getEpCnt().IncEndpointCnt(); e != nil {
|
|
||||||
log.Warnf("failed to update network %s : %v", n.name, e)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
|
|
||||||
if err = n.getController().deleteFromStore(ep); err != nil {
|
if err = n.getController().deleteFromStore(ep); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -524,6 +557,20 @@ func (ep *endpoint) Delete() error {
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
if err = n.getEpCnt().DecEndpointCnt(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
if e := n.getEpCnt().IncEndpointCnt(); e != nil {
|
||||||
|
log.Warnf("failed to update network %s : %v", n.name, e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// unwatch for service records
|
||||||
|
n.getController().unWatchSvcRecord(ep)
|
||||||
|
|
||||||
if err = ep.deleteEndpoint(); err != nil {
|
if err = ep.deleteEndpoint(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,10 +84,6 @@ func (a *Allocator) refresh(as string) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := a.updateBitMasks(aSpace); err != nil {
|
|
||||||
return fmt.Errorf("error updating bit masks during init: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
a.Lock()
|
a.Lock()
|
||||||
a.addrSpaces[as] = aSpace
|
a.addrSpaces[as] = aSpace
|
||||||
a.Unlock()
|
a.Unlock()
|
||||||
|
|
|
@ -5,6 +5,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
log "github.com/Sirupsen/logrus"
|
log "github.com/Sirupsen/logrus"
|
||||||
|
@ -685,6 +686,14 @@ func (n *network) CreateEndpoint(name string, options ...EndpointOption) (Endpoi
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// Watch for service records
|
||||||
|
n.getController().watchSvcRecord(ep)
|
||||||
|
defer func() {
|
||||||
|
if err != nil {
|
||||||
|
n.getController().unWatchSvcRecord(ep)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
// Increment endpoint count to indicate completion of endpoint addition
|
// Increment endpoint count to indicate completion of endpoint addition
|
||||||
if err = n.getEpCnt().IncEndpointCnt(); err != nil {
|
if err = n.getEpCnt().IncEndpointCnt(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
|
@ -768,6 +777,12 @@ func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool
|
||||||
var recs []etchosts.Record
|
var recs []etchosts.Record
|
||||||
if iface := ep.Iface(); iface.Address() != nil {
|
if iface := ep.Iface(); iface.Address() != nil {
|
||||||
if isAdd {
|
if isAdd {
|
||||||
|
// If we already have this endpoint in service db just return
|
||||||
|
if _, ok := sr[ep.Name()]; ok {
|
||||||
|
n.Unlock()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
sr[ep.Name()] = iface.Address().IP
|
sr[ep.Name()] = iface.Address().IP
|
||||||
sr[ep.Name()+"."+n.name] = iface.Address().IP
|
sr[ep.Name()+"."+n.name] = iface.Address().IP
|
||||||
} else {
|
} else {
|
||||||
|
@ -793,8 +808,12 @@ func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool
|
||||||
}
|
}
|
||||||
|
|
||||||
var sbList []*sandbox
|
var sbList []*sandbox
|
||||||
for _, ep := range localEps {
|
for _, lEp := range localEps {
|
||||||
if sb, hasSandbox := ep.getSandbox(); hasSandbox {
|
if ep.ID() == lEp.ID() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
if sb, hasSandbox := lEp.getSandbox(); hasSandbox {
|
||||||
sbList = append(sbList, sb)
|
sbList = append(sbList, sb)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -808,7 +827,7 @@ func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *network) getSvcRecords() []etchosts.Record {
|
func (n *network) getSvcRecords(ep *endpoint) []etchosts.Record {
|
||||||
n.Lock()
|
n.Lock()
|
||||||
defer n.Unlock()
|
defer n.Unlock()
|
||||||
|
|
||||||
|
@ -816,6 +835,10 @@ func (n *network) getSvcRecords() []etchosts.Record {
|
||||||
sr, _ := n.ctrlr.svcDb[n.id]
|
sr, _ := n.ctrlr.svcDb[n.id]
|
||||||
|
|
||||||
for h, ip := range sr {
|
for h, ip := range sr {
|
||||||
|
if ep != nil && strings.Split(h, ".")[0] == ep.Name() {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
recs = append(recs, etchosts.Record{
|
recs = append(recs, etchosts.Record{
|
||||||
Hosts: h,
|
Hosts: h,
|
||||||
IP: ip.String(),
|
IP: ip.String(),
|
||||||
|
|
|
@ -367,6 +367,11 @@ func (c *controller) processEndpointDelete(nmap map[string]*netWatch, ep *endpoi
|
||||||
c.Lock()
|
c.Lock()
|
||||||
if len(nw.localEps) == 0 {
|
if len(nw.localEps) == 0 {
|
||||||
close(nw.stopCh)
|
close(nw.stopCh)
|
||||||
|
|
||||||
|
// This is the last container going away for the network. Destroy
|
||||||
|
// this network's svc db entry
|
||||||
|
delete(c.svcDb, ep.getNetwork().ID())
|
||||||
|
|
||||||
delete(nmap, ep.getNetwork().ID())
|
delete(nmap, ep.getNetwork().ID())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue