Browse code

Merge pull request #35960 from abhi/service

Disable service on release network

Brian Goff authored on 2018/01/19 01:19:47
Showing 4 changed files
... ...
@@ -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