Disable service on release network
Brian Goff authored on 2018/01/19 01:19:47... | ... |
@@ -966,6 +966,9 @@ func (daemon *Daemon) releaseNetwork(container *container.Container) { |
966 | 966 |
logrus.Warnf("error locating sandbox id %s: %v", sid, err) |
967 | 967 |
return |
968 | 968 |
} |
969 |
+ if err := sb.DisableService(); err != nil { |
|
970 |
+ logrus.WithFields(logrus.Fields{"container": container.ID, "sandbox": sid}).WithError(err).Error("Error removing service from sandbox") |
|
971 |
+ } |
|
969 | 972 |
|
970 | 973 |
if err := sb.Delete(); err != nil { |
971 | 974 |
logrus.Errorf("Error deleting sandbox id %s for container %s: %v", sid, container.ID, err) |
... | ... |
@@ -31,7 +31,7 @@ github.com/moby/buildkit aaff9d591ef128560018433fe61beb802e149de8 |
31 | 31 |
github.com/tonistiigi/fsutil dea3a0da73aee887fc02142d995be764106ac5e2 |
32 | 32 |
|
33 | 33 |
#get libnetwork packages |
34 |
-github.com/docker/libnetwork a1dfea384b39779552a3b4837ea9303194950976 |
|
34 |
+github.com/docker/libnetwork 315a076a4e9ded2abc950318c71d5f1637547977 |
|
35 | 35 |
github.com/docker/go-events 9461782956ad83b30282bf90e31fa6a70c255ba9 |
36 | 36 |
github.com/armon/go-radix e39d623f12e8e41c7b5529e9a9dd67a1e2261f80 |
37 | 37 |
github.com/armon/go-metrics eb0af217e5e9747e41dd5303755356b62d28e3ec |
... | ... |
@@ -311,16 +311,25 @@ func (ep *endpoint) isAnonymous() bool { |
311 | 311 |
return ep.anonymous |
312 | 312 |
} |
313 | 313 |
|
314 |
-// enableService sets ep's serviceEnabled to the passed value if it's not in the |
|
315 |
-// current state and returns true; false otherwise. |
|
316 |
-func (ep *endpoint) enableService(state bool) bool { |
|
314 |
+// isServiceEnabled check if service is enabled on the endpoint |
|
315 |
+func (ep *endpoint) isServiceEnabled() bool { |
|
317 | 316 |
ep.Lock() |
318 | 317 |
defer ep.Unlock() |
319 |
- if ep.serviceEnabled != state { |
|
320 |
- ep.serviceEnabled = state |
|
321 |
- return true |
|
322 |
- } |
|
323 |
- return false |
|
318 |
+ return ep.serviceEnabled |
|
319 |
+} |
|
320 |
+ |
|
321 |
+// enableService sets service enabled on the endpoint |
|
322 |
+func (ep *endpoint) enableService() { |
|
323 |
+ ep.Lock() |
|
324 |
+ defer ep.Unlock() |
|
325 |
+ ep.serviceEnabled = true |
|
326 |
+} |
|
327 |
+ |
|
328 |
+// disableService disables service on the endpoint |
|
329 |
+func (ep *endpoint) disableService() { |
|
330 |
+ ep.Lock() |
|
331 |
+ defer ep.Unlock() |
|
332 |
+ ep.serviceEnabled = false |
|
324 | 333 |
} |
325 | 334 |
|
326 | 335 |
func (ep *endpoint) needResolver() bool { |
... | ... |
@@ -759,10 +768,6 @@ func (ep *endpoint) sbLeave(sb *sandbox, force bool, options ...EndpointOption) |
759 | 759 |
return err |
760 | 760 |
} |
761 | 761 |
|
762 |
- if e := ep.deleteServiceInfoFromCluster(sb, "sbLeave"); e != nil { |
|
763 |
- logrus.Errorf("Could not delete service state for endpoint %s from cluster: %v", ep.Name(), e) |
|
764 |
- } |
|
765 |
- |
|
766 | 762 |
if e := ep.deleteDriverInfoFromCluster(); e != nil { |
767 | 763 |
logrus.Errorf("Could not delete endpoint state for endpoint %s from cluster: %v", ep.Name(), e) |
768 | 764 |
} |
... | ... |
@@ -674,24 +674,41 @@ func (sb *sandbox) SetKey(basePath string) error { |
674 | 674 |
return nil |
675 | 675 |
} |
676 | 676 |
|
677 |
-func (sb *sandbox) EnableService() error { |
|
677 |
+func (sb *sandbox) EnableService() (err error) { |
|
678 | 678 |
logrus.Debugf("EnableService %s START", sb.containerID) |
679 |
+ defer func() { |
|
680 |
+ if err != nil { |
|
681 |
+ sb.DisableService() |
|
682 |
+ } |
|
683 |
+ }() |
|
679 | 684 |
for _, ep := range sb.getConnectedEndpoints() { |
680 |
- if ep.enableService(true) { |
|
685 |
+ if !ep.isServiceEnabled() { |
|
681 | 686 |
if err := ep.addServiceInfoToCluster(sb); err != nil { |
682 |
- ep.enableService(false) |
|
683 | 687 |
return fmt.Errorf("could not update state for endpoint %s into cluster: %v", ep.Name(), err) |
684 | 688 |
} |
689 |
+ ep.enableService() |
|
685 | 690 |
} |
686 | 691 |
} |
687 | 692 |
logrus.Debugf("EnableService %s DONE", sb.containerID) |
688 | 693 |
return nil |
689 | 694 |
} |
690 | 695 |
|
691 |
-func (sb *sandbox) DisableService() error { |
|
696 |
+func (sb *sandbox) DisableService() (err error) { |
|
692 | 697 |
logrus.Debugf("DisableService %s START", sb.containerID) |
698 |
+ failedEps := []string{} |
|
699 |
+ defer func() { |
|
700 |
+ if len(failedEps) > 0 { |
|
701 |
+ err = fmt.Errorf("failed to disable service on sandbox:%s, for endpoints %s", sb.ID(), strings.Join(failedEps, ",")) |
|
702 |
+ } |
|
703 |
+ }() |
|
693 | 704 |
for _, ep := range sb.getConnectedEndpoints() { |
694 |
- ep.enableService(false) |
|
705 |
+ if ep.isServiceEnabled() { |
|
706 |
+ if err := ep.deleteServiceInfoFromCluster(sb, "DisableService"); err != nil { |
|
707 |
+ failedEps = append(failedEps, ep.Name()) |
|
708 |
+ logrus.Warnf("failed update state for endpoint %s into cluster: %v", ep.Name(), err) |
|
709 |
+ } |
|
710 |
+ ep.disableService() |
|
711 |
+ } |
|
695 | 712 |
} |
696 | 713 |
logrus.Debugf("DisableService %s DONE", sb.containerID) |
697 | 714 |
return nil |