Browse code

integration-cli-on-swarm: make sure deferred function gets executed before os.Exit()

Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>

Akihiro Suda authored on 2017/03/09 17:52:31
Showing 1 changed files
... ...
@@ -25,13 +25,14 @@ const (
25 25
 )
26 26
 
27 27
 func main() {
28
-	if err := xmain(); err != nil {
28
+	rc, err := xmain()
29
+	if err != nil {
29 30
 		logrus.Fatalf("fatal error: %v", err)
30 31
 	}
32
+	os.Exit(rc)
31 33
 }
32 34
 
33
-// xmain can call os.Exit()
34
-func xmain() error {
35
+func xmain() (int, error) {
35 36
 	// Should we use cobra maybe?
36 37
 	replicas := flag.Int("replicas", 1, "Number of worker service replica")
37 38
 	chunks := flag.Int("chunks", 0, "Number of test chunks executed in batch (0 == replicas)")
... ...
@@ -50,7 +51,7 @@ func xmain() error {
50 50
 	}
51 51
 	cli, err := client.NewEnvClient()
52 52
 	if err != nil {
53
-		return err
53
+		return 1, err
54 54
 	}
55 55
 	if hasStack(cli, defaultStackName) {
56 56
 		logrus.Infof("Removing stack %s", defaultStackName)
... ...
@@ -61,13 +62,13 @@ func xmain() error {
61 61
 		removeVolume(cli, defaultVolumeName)
62 62
 	}
63 63
 	if err = ensureImages(cli, []string{defaultWorkerImageName, defaultMasterImageName}); err != nil {
64
-		return err
64
+		return 1, err
65 65
 	}
66 66
 	workerImageForStack := defaultWorkerImageName
67 67
 	if *pushWorkerImage != "" {
68 68
 		logrus.Infof("Pushing %s to %s", defaultWorkerImageName, *pushWorkerImage)
69 69
 		if err = pushImage(cli, *pushWorkerImage, defaultWorkerImageName); err != nil {
70
-			return err
70
+			return 1, err
71 71
 		}
72 72
 		workerImageForStack = *pushWorkerImage
73 73
 	}
... ...
@@ -82,18 +83,18 @@ func xmain() error {
82 82
 		DryRun:      *dryRun,
83 83
 	})
84 84
 	if err != nil {
85
-		return err
85
+		return 1, err
86 86
 	}
87 87
 	filters, err := filtersBytes(*filtersFile)
88 88
 	if err != nil {
89
-		return err
89
+		return 1, err
90 90
 	}
91 91
 	logrus.Infof("Creating volume %s with input data", defaultVolumeName)
92 92
 	if err = createVolumeWithData(cli,
93 93
 		defaultVolumeName,
94 94
 		map[string][]byte{"/input": filters},
95 95
 		defaultMasterImageName); err != nil {
96
-		return err
96
+		return 1, err
97 97
 	}
98 98
 	logrus.Infof("Deploying stack %s from %s", defaultStackName, compose)
99 99
 	defer func() {
... ...
@@ -105,22 +106,21 @@ func xmain() error {
105 105
 		logrus.Infof(" - Worker image: %s", workerImageForStack)
106 106
 	}()
107 107
 	if err = deployStack(cli, defaultStackName, compose); err != nil {
108
-		return err
108
+		return 1, err
109 109
 	}
110 110
 	logrus.Infof("The log will be displayed here after some duration."+
111 111
 		"You can watch the live status via `docker service logs %s_worker`",
112 112
 		defaultStackName)
113 113
 	masterContainerID, err := waitForMasterUp(cli, defaultStackName)
114 114
 	if err != nil {
115
-		return err
115
+		return 1, err
116 116
 	}
117 117
 	rc, err := waitForContainerCompletion(cli, os.Stdout, os.Stderr, masterContainerID)
118 118
 	if err != nil {
119
-		return err
119
+		return 1, err
120 120
 	}
121 121
 	logrus.Infof("Exit status: %d", rc)
122
-	os.Exit(int(rc))
123
-	return nil
122
+	return int(rc), nil
124 123
 }
125 124
 
126 125
 func ensureImages(cli *client.Client, images []string) error {