diff --git a/daemon/network.go b/daemon/network.go index 0420caaad5..573901e7a6 100644 --- a/daemon/network.go +++ b/daemon/network.go @@ -3,6 +3,7 @@ package daemon import ( "fmt" "net" + "runtime" "sort" "strings" "sync" @@ -183,21 +184,14 @@ func (daemon *Daemon) setupIngress(create *clustertypes.NetworkCreateRequest, ip // Otherwise continue down the call to create or recreate sandbox. } - n, err := daemon.GetNetworkByID(create.ID) + _, err := daemon.GetNetworkByID(create.ID) if err != nil { logrus.Errorf("Failed getting ingress network by id after creating: %v", err) } - - if err = daemon.createLoadBalancerSandbox("ingress", create.ID, ip, n, libnetwork.OptionIngress()); err != nil { - logrus.Errorf("Failed creating load balancer sandbox for ingress network: %v", err) - } } func (daemon *Daemon) releaseIngress(id string) { controller := daemon.netController - if err := controller.SandboxDestroy("ingress-sbox"); err != nil { - logrus.Errorf("Failed to delete ingress sandbox: %v", err) - } if id == "" { return @@ -209,13 +203,6 @@ func (daemon *Daemon) releaseIngress(id string) { return } - for _, ep := range n.Endpoints() { - if err := ep.Delete(true); err != nil { - logrus.Errorf("Failed to delete endpoint %s (%s): %v", ep.Name(), ep.ID(), err) - return - } - } - if err := n.Delete(); err != nil { logrus.Errorf("Failed to delete ingress network %s: %v", n.ID(), err) return @@ -270,34 +257,6 @@ func (daemon *Daemon) CreateNetwork(create types.NetworkCreateRequest) (*types.N return resp, err } -func (daemon *Daemon) createLoadBalancerSandbox(prefix, id string, ip net.IP, n libnetwork.Network, options ...libnetwork.SandboxOption) error { - c := daemon.netController - sandboxName := prefix + "-sbox" - sb, err := c.NewSandbox(sandboxName, options...) - if err != nil { - if _, ok := err.(networktypes.ForbiddenError); !ok { - return errors.Wrapf(err, "Failed creating %s sandbox", sandboxName) - } - return nil - } - - endpointName := prefix + "-endpoint" - ep, err := n.CreateEndpoint(endpointName, libnetwork.CreateOptionIpam(ip, nil, nil, nil), libnetwork.CreateOptionLoadBalancer()) - if err != nil { - return errors.Wrapf(err, "Failed creating %s in sandbox %s", endpointName, sandboxName) - } - - if err := ep.Join(sb, nil); err != nil { - return errors.Wrapf(err, "Failed joining %s to sandbox %s", endpointName, sandboxName) - } - - if err := sb.EnableService(); err != nil { - return errors.Wrapf(err, "Failed enabling service in %s sandbox", sandboxName) - } - - return nil -} - func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string, agent bool) (*types.NetworkCreateResponse, error) { if runconfig.IsPreDefinedNetwork(create.Name) && !agent { err := fmt.Errorf("%s is a pre-defined network and cannot be created", create.Name) @@ -360,6 +319,15 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string nwOptions = append(nwOptions, libnetwork.NetworkOptionConfigFrom(create.ConfigFrom.Network)) } + if agent && driver == "overlay" && (create.Ingress || runtime.GOOS == "windows") { + nodeIP, exists := daemon.GetAttachmentStore().GetIPForNetwork(id) + if !exists { + return nil, fmt.Errorf("Failed to find a load balancer IP to use for network: %v", id) + } + + nwOptions = append(nwOptions, libnetwork.NetworkOptionLBEndpoint(nodeIP)) + } + n, err := c.NewNetwork(driver, create.Name, id, nwOptions...) if err != nil { if _, ok := err.(libnetwork.ErrDataStoreNotInitialized); ok { @@ -375,18 +343,6 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string } daemon.LogNetworkEvent(n, "create") - if agent && !n.Info().Ingress() && n.Type() == "overlay" { - nodeIP, exists := daemon.GetAttachmentStore().GetIPForNetwork(id) - if !exists { - return nil, fmt.Errorf("Failed to find a load balancer IP to use for network: %v", id) - } - - if err := daemon.createLoadBalancerSandbox(create.Name, id, nodeIP, n); err != nil { - return nil, err - } - - } - return &types.NetworkCreateResponse{ ID: n.ID(), Warning: warning, @@ -517,43 +473,16 @@ func (daemon *Daemon) DeleteNetwork(networkID string) error { return daemon.deleteNetwork(networkID, false) } -func (daemon *Daemon) deleteLoadBalancerSandbox(n libnetwork.Network) { - controller := daemon.netController - - //The only endpoint left should be the LB endpoint (nw.Name() + "-endpoint") - endpoints := n.Endpoints() - if len(endpoints) == 1 { - sandboxName := n.Name() + "-sbox" - - info := endpoints[0].Info() - if info != nil { - sb := info.Sandbox() - if sb != nil { - if err := sb.DisableService(); err != nil { - logrus.Warnf("Failed to disable service on sandbox %s: %v", sandboxName, err) - //Ignore error and attempt to delete the load balancer endpoint - } - } - } - - if err := endpoints[0].Delete(true); err != nil { - logrus.Warnf("Failed to delete endpoint %s (%s) in %s: %v", endpoints[0].Name(), endpoints[0].ID(), sandboxName, err) - //Ignore error and attempt to delete the sandbox. - } - - if err := controller.SandboxDestroy(sandboxName); err != nil { - logrus.Warnf("Failed to delete %s sandbox: %v", sandboxName, err) - //Ignore error and attempt to delete the network. - } - } -} - func (daemon *Daemon) deleteNetwork(networkID string, dynamic bool) error { nw, err := daemon.FindNetwork(networkID) if err != nil { return err } + if nw.Info().Ingress() { + return nil + } + if runconfig.IsPreDefinedNetwork(nw.Name()) && !dynamic { err := fmt.Errorf("%s is a pre-defined network and cannot be removed", nw.Name()) return notAllowedError{err} @@ -569,10 +498,6 @@ func (daemon *Daemon) deleteNetwork(networkID string, dynamic bool) error { return notAllowedError{err} } - if !nw.Info().Ingress() && nw.Type() == "overlay" { - daemon.deleteLoadBalancerSandbox(nw) - } - if err := nw.Delete(); err != nil { return err }