integration-cli-on-swarm: make sure deferred function gets executed before os.Exit()
| ... | ... |
@@ -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 {
|