diff --git a/libnetwork/controller.go b/libnetwork/controller.go index a62d4fb980..c3d25ee720 100644 --- a/libnetwork/controller.go +++ b/libnetwork/controller.go @@ -682,6 +682,10 @@ func (c *controller) NewNetwork(networkType, name string, id string, options ... return nil, err } + if network.ingress && cap.DataScope != datastore.GlobalScope { + return nil, types.ForbiddenErrorf("Ingress network can only be global scope network") + } + if cap.DataScope == datastore.GlobalScope && !c.isDistributedControl() && !network.dynamic { if c.isManager() { // For non-distributed controlled environment, globalscoped non-dynamic networks are redirected to Manager @@ -1161,15 +1165,29 @@ func (c *controller) clearIngress(clusterLeave bool) { c.ingressSandbox = nil c.Unlock() + var n *network if ingressSandbox != nil { + for _, ep := range ingressSandbox.getConnectedEndpoints() { + if nw := ep.getNetwork(); nw.ingress { + n = nw + break + } + } if err := ingressSandbox.Delete(); err != nil { logrus.Warnf("Could not delete ingress sandbox while leaving: %v", err) } } - n, err := c.NetworkByName("ingress") - if err != nil && clusterLeave { - logrus.Warnf("Could not find ingress network while leaving: %v", err) + if n == nil { + for _, nw := range c.Networks() { + if nw.Info().Ingress() { + n = nw.(*network) + break + } + } + } + if n == nil && clusterLeave { + logrus.Warnf("Could not find ingress network while leaving") } if n != nil { diff --git a/libnetwork/network.go b/libnetwork/network.go index 2b9f422538..8077770018 100644 --- a/libnetwork/network.go +++ b/libnetwork/network.go @@ -66,6 +66,7 @@ type NetworkInfo interface { IPv6Enabled() bool Internal() bool Attachable() bool + Ingress() bool Labels() map[string]string Dynamic() bool Created() time.Time @@ -615,9 +616,9 @@ func NetworkOptionGeneric(generic map[string]interface{}) NetworkOption { // NetworkOptionIngress returns an option setter to indicate if a network is // an ingress network. -func NetworkOptionIngress() NetworkOption { +func NetworkOptionIngress(ingress bool) NetworkOption { return func(n *network) { - n.ingress = true + n.ingress = ingress } } @@ -1589,6 +1590,13 @@ func (n *network) Attachable() bool { return n.attachable } +func (n *network) Ingress() bool { + n.Lock() + defer n.Unlock() + + return n.ingress +} + func (n *network) Dynamic() bool { n.Lock() defer n.Unlock()