diff --git a/components/engine/vendor/github.com/docker/libnetwork/endpoint.go b/components/engine/vendor/github.com/docker/libnetwork/endpoint.go index 1e1b6a16753..71426d78235 100644 --- a/components/engine/vendor/github.com/docker/libnetwork/endpoint.go +++ b/components/engine/vendor/github.com/docker/libnetwork/endpoint.go @@ -103,6 +103,7 @@ func (ep *endpoint) MarshalJSON() ([]byte, error) { epMap["ingressPorts"] = ep.ingressPorts epMap["svcAliases"] = ep.svcAliases epMap["loadBalancer"] = ep.loadBalancer + epMap["serviceEnabled"] = ep.serviceEnabled return json.Marshal(epMap) } @@ -221,6 +222,10 @@ func (ep *endpoint) UnmarshalJSON(b []byte) (err error) { var myAliases []string json.Unmarshal(ma, &myAliases) ep.myAliases = myAliases + + if s, ok := epMap["serviceEnabled"]; ok { + ep.serviceEnabled = s.(bool) + } return nil } @@ -245,6 +250,7 @@ func (ep *endpoint) CopyTo(o datastore.KVObject) error { dstEp.svcID = ep.svcID dstEp.virtualIP = ep.virtualIP dstEp.loadBalancer = ep.loadBalancer + dstEp.serviceEnabled = ep.serviceEnabled dstEp.svcAliases = make([]string, len(ep.svcAliases)) copy(dstEp.svcAliases, ep.svcAliases) @@ -759,6 +765,12 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption) logrus.Warnf("Could not cleanup network resources on container %s disconnect: %v", ep.name, err) } + if ep.isServiceEnabled() { + if e := ep.deleteServiceInfoFromCluster(sb, "sbLeave"); e != nil { + logrus.Warnf("delete of service state for endpoint %s from cluster: %v failed", ep.Name(), e) + } + ep.disableService() + } // Update the store about the sandbox detach only after we // have completed sb.clearNetworkresources above to avoid // spurious logs when cleaning up the sandbox when the daemon diff --git a/components/engine/vendor/github.com/docker/libnetwork/sandbox.go b/components/engine/vendor/github.com/docker/libnetwork/sandbox.go index 423066c128a..29645e54ebb 100644 --- a/components/engine/vendor/github.com/docker/libnetwork/sandbox.go +++ b/components/engine/vendor/github.com/docker/libnetwork/sandbox.go @@ -682,13 +682,30 @@ func (sb *sandbox) EnableService() (err error) { } }() for _, ep := range sb.getConnectedEndpoints() { + n, err := ep.getNetworkFromStore() + if err != nil { + return fmt.Errorf("failed to enable service on sandbox:%s,endpoint:%s,err: %v", sb.ID(), ep.Name(), err) + } + + ep, err = n.getEndpointFromStore(ep.id) + if err != nil { + return fmt.Errorf("failed to get endpoint %s from store : %v", ep.Name(), err) + } if !ep.isServiceEnabled() { if err := ep.addServiceInfoToCluster(sb); err != nil { - return fmt.Errorf("could not update state for endpoint %s into cluster: %v", ep.Name(), err) + return fmt.Errorf("failed to add service info for endpoint %s into cluster: %v", ep.Name(), err) } + + // enable service on the endpoint copy in the sandbox + // Should the disabling service and saving to store be swapped? @YT ep.enableService() + + if err := n.getController().updateToStore(ep); err != nil { + return fmt.Errorf("failed to update store for endpoint %s", ep.Name()) + } } } + logrus.Debugf("EnableService %s DONE", sb.containerID) return nil } @@ -703,13 +720,32 @@ func (sb *sandbox) DisableService() (err error) { }() for _, ep := range sb.getConnectedEndpoints() { if ep.isServiceEnabled() { + n, err := ep.getNetworkFromStore() + if err != nil { + logrus.Warnf("failed tp disable service on sanbox:%s,endpoint:%s,err: %v", sb.ID(), ep.Name(), err) + failedEps = append(failedEps, ep.Name()) + continue + } + ep, err = n.getEndpointFromStore(ep.id) + if err != nil { + logrus.Warnf("failed to get endpoint from store : %v", err) + continue + } if err := ep.deleteServiceInfoFromCluster(sb, "DisableService"); err != nil { failedEps = append(failedEps, ep.Name()) logrus.Warnf("failed update state for endpoint %s into cluster: %v", ep.Name(), err) } + + // Should the disabling service and saving to store be swapped? @YT ep.disableService() + + if err := n.getController().updateToStore(ep); err != nil { + failedEps = append(failedEps, ep.Name()) + logrus.Warnf("failed to update the store on disable service for ep:%s err: %v", ep.ID(), err) + } } } + logrus.Debugf("DisableService %s DONE", sb.containerID) return nil }