|
@@ -182,27 +182,8 @@ func (daemon *Daemon) setupIngress(create *clustertypes.NetworkCreateRequest, ip
|
|
|
logrus.Errorf("Failed getting ingress network by id after creating: %v", err)
|
|
|
}
|
|
|
|
|
|
- sb, err := controller.NewSandbox("ingress-sbox", libnetwork.OptionIngress())
|
|
|
- if err != nil {
|
|
|
- if _, ok := err.(networktypes.ForbiddenError); !ok {
|
|
|
- logrus.Errorf("Failed creating ingress sandbox: %v", err)
|
|
|
- }
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- ep, err := n.CreateEndpoint("ingress-endpoint", libnetwork.CreateOptionIpam(ip, nil, nil, nil))
|
|
|
- if err != nil {
|
|
|
- logrus.Errorf("Failed creating ingress endpoint: %v", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if err := ep.Join(sb, nil); err != nil {
|
|
|
- logrus.Errorf("Failed joining ingress sandbox to ingress endpoint: %v", err)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- if err := sb.EnableService(); err != nil {
|
|
|
- logrus.Errorf("Failed enabling service for ingress sandbox")
|
|
|
+ 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)
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -283,6 +264,34 @@ 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 +369,18 @@ func (daemon *Daemon) createNetwork(create types.NetworkCreateRequest, id string
|
|
|
}
|
|
|
daemon.LogNetworkEvent(n, "create")
|
|
|
|
|
|
+ if agent && !n.Info().Ingress() && n.Type() == "overlay" {
|
|
|
+ nodeIP, exists := daemon.GetLBAttachmentStore().GetLBIPForNetwork(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,
|
|
@@ -496,6 +517,31 @@ 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"
|
|
|
+
|
|
|
+ if err := endpoints[0].Info().Sandbox().DisableService(); err != nil {
|
|
|
+ logrus.Errorf("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.Errorf("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.Errorf("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 {
|
|
@@ -517,6 +563,10 @@ 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
|
|
|
}
|