mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
![Akihiro Suda](/assets/img/avatar_default.png)
This commit adds contrib/integration-cli-on-swarm/integration-cli-on-swarm.sh, which enables IT to be running in parallel, using Swarm-mode and Funker. Please refer to contrib/integration-cli-on-swarm/README.md The test takes almost 5 to 6 minutes, with 10 n1-standard-4 GCE instances. $ ./contrib/integration-cli-on-swarm/integration-cli-on-swarm.sh --push-worker-image example.gcr.io/foo/bar --replicas 30 --shuffle 2016/12/29 08:32:15 Loaded 1618 tests (30 chunks) 2016/12/29 08:32:15 Executing 30 chunks in parallel, against "integration-cli-worker" 2016/12/29 08:32:15 Executing chunk 0 (contains 54 test filters) .. 2016/12/29 08:34:34 Finished chunk 28 [1/30] with 54 test filters in 2m19.098068003s, code=0. 2016/12/29 08:34:38 Finished chunk 12 [2/30] with 54 test filters in 2m23.088569511s, code=0. 2016/12/29 08:34:48 Finished chunk 10 [3/30] with 54 test filters in 2m33.880679079s, code=0. 2016/12/29 08:34:54 Finished chunk 20 [4/30] with 54 test filters in 2m39.973747028s, code=0. 2016/12/29 08:35:11 Finished chunk 18 [5/30] with 54 test filters in 2m56.28384361s, code=0. 2016/12/29 08:35:11 Finished chunk 29 [6/30] with 52 test filters in 2m56.54047088s, code=0. 2016/12/29 08:35:15 Finished chunk 1 [7/30] with 54 test filters in 3m0.285044426s, code=0. 2016/12/29 08:35:22 Finished chunk 6 [8/30] with 54 test filters in 3m7.211775338s, code=0. 2016/12/29 08:35:24 Finished chunk 25 [9/30] with 54 test filters in 3m9.938413009s, code=0. 2016/12/29 08:35:30 Finished chunk 27 [10/30] with 54 test filters in 3m15.219834368s, code=0. 2016/12/29 08:35:36 Finished chunk 9 [11/30] with 54 test filters in 3m21.615434162s, code=0. 2016/12/29 08:35:41 Finished chunk 13 [12/30] with 54 test filters in 3m26.576907401s, code=0. 2016/12/29 08:35:45 Finished chunk 17 [13/30] with 54 test filters in 3m30.290752537s, code=0. 2016/12/29 08:35:53 Finished chunk 2 [14/30] with 54 test filters in 3m38.148423321s, code=0. 2016/12/29 08:35:55 Finished chunk 24 [15/30] with 54 test filters in 3m40.09669137s, code=0. 2016/12/29 08:35:57 Finished chunk 8 [16/30] with 54 test filters in 3m42.299945108s, code=0. 2016/12/29 08:35:57 Finished chunk 22 [17/30] with 54 test filters in 3m42.946558809s, code=0. 2016/12/29 08:35:59 Finished chunk 23 [18/30] with 54 test filters in 3m44.232557165s, code=0. 2016/12/29 08:36:02 Finished chunk 3 [19/30] with 54 test filters in 3m47.112051358s, code=0. 2016/12/29 08:36:11 Finished chunk 15 [20/30] with 54 test filters in 3m56.340656645s, code=0. 2016/12/29 08:36:11 Finished chunk 11 [21/30] with 54 test filters in 3m56.882401231s, code=0. 2016/12/29 08:36:22 Finished chunk 19 [22/30] with 54 test filters in 4m7.551093516s, code=0. 2016/12/29 08:36:23 Finished chunk 21 [23/30] with 54 test filters in 4m8.221093446s, code=0. 2016/12/29 08:36:25 Finished chunk 16 [24/30] with 54 test filters in 4m10.450451705s, code=0. 2016/12/29 08:36:27 Finished chunk 5 [25/30] with 54 test filters in 4m12.162272692s, code=0. 2016/12/29 08:36:28 Finished chunk 14 [26/30] with 54 test filters in 4m13.977801031s, code=0. 2016/12/29 08:36:29 Finished chunk 0 [27/30] with 54 test filters in 4m14.34086812s, code=0. 2016/12/29 08:36:49 Finished chunk 26 [28/30] with 54 test filters in 4m34.437085539s, code=0. 2016/12/29 08:37:14 Finished chunk 7 [29/30] with 54 test filters in 4m59.22902721s, code=0. 2016/12/29 08:37:20 Finished chunk 4 [30/30] with 54 test filters in 5m5.103469214s, code=0. 2016/12/29 08:37:20 Executed 30 chunks in 5m5.104379119s. PASS: 30, FAIL: 0. Signed-off-by: Akihiro Suda <suda.akihiro@lab.ntt.co.jp>
121 lines
3 KiB
Go
121 lines
3 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"io/ioutil"
|
|
"os"
|
|
"path/filepath"
|
|
"text/template"
|
|
|
|
"github.com/docker/docker/client"
|
|
)
|
|
|
|
const composeTemplate = `# generated by integration-cli-on-swarm
|
|
version: "3"
|
|
|
|
services:
|
|
worker:
|
|
image: "{{.WorkerImage}}"
|
|
command: ["-worker-image-digest={{.WorkerImageDigest}}", "-dry-run={{.DryRun}}"]
|
|
networks:
|
|
- net
|
|
volumes:
|
|
# Bind-mount the API socket so that we can invoke "docker run --privileged" within the service containers
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
environment:
|
|
- DOCKER_GRAPHDRIVER={{.EnvDockerGraphDriver}}
|
|
- DOCKER_EXPERIMENTAL={{.EnvDockerExperimental}}
|
|
deploy:
|
|
mode: replicated
|
|
replicas: {{.Replicas}}
|
|
restart_policy:
|
|
# The restart condition needs to be any for funker function
|
|
condition: any
|
|
|
|
master:
|
|
image: "{{.MasterImage}}"
|
|
command: ["-worker-service=worker", "-input=/mnt/input", "-chunks={{.Chunks}}", "-shuffle={{.Shuffle}}", "-rand-seed={{.RandSeed}}"]
|
|
networks:
|
|
- net
|
|
volumes:
|
|
- {{.Volume}}:/mnt
|
|
deploy:
|
|
mode: replicated
|
|
replicas: 1
|
|
restart_policy:
|
|
condition: none
|
|
placement:
|
|
# Make sure the master can access the volume
|
|
constraints: [node.id == {{.SelfNodeID}}]
|
|
|
|
networks:
|
|
net:
|
|
|
|
volumes:
|
|
{{.Volume}}:
|
|
external: true
|
|
`
|
|
|
|
type composeOptions struct {
|
|
Replicas int
|
|
Chunks int
|
|
MasterImage string
|
|
WorkerImage string
|
|
Volume string
|
|
Shuffle bool
|
|
RandSeed int64
|
|
DryRun bool
|
|
}
|
|
|
|
type composeTemplateOptions struct {
|
|
composeOptions
|
|
WorkerImageDigest string
|
|
SelfNodeID string
|
|
EnvDockerGraphDriver string
|
|
EnvDockerExperimental string
|
|
}
|
|
|
|
// createCompose creates "dir/docker-compose.yml".
|
|
// If dir is empty, TempDir() is used.
|
|
func createCompose(dir string, cli *client.Client, opts composeOptions) (string, error) {
|
|
if dir == "" {
|
|
var err error
|
|
dir, err = ioutil.TempDir("", "integration-cli-on-swarm-")
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
}
|
|
resolved := composeTemplateOptions{}
|
|
resolved.composeOptions = opts
|
|
workerImageInspect, _, err := cli.ImageInspectWithRaw(context.Background(), defaultWorkerImageName)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
if len(workerImageInspect.RepoDigests) > 0 {
|
|
resolved.WorkerImageDigest = workerImageInspect.RepoDigests[0]
|
|
} else {
|
|
// fall back for non-pushed image
|
|
resolved.WorkerImageDigest = workerImageInspect.ID
|
|
}
|
|
info, err := cli.Info(context.Background())
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
resolved.SelfNodeID = info.Swarm.NodeID
|
|
resolved.EnvDockerGraphDriver = os.Getenv("DOCKER_GRAPHDRIVER")
|
|
resolved.EnvDockerExperimental = os.Getenv("DOCKER_EXPERIMENTAL")
|
|
composeFilePath := filepath.Join(dir, "docker-compose.yml")
|
|
tmpl, err := template.New("").Parse(composeTemplate)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
f, err := os.Create(composeFilePath)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
defer f.Close()
|
|
if err = tmpl.Execute(f, resolved); err != nil {
|
|
return "", err
|
|
}
|
|
return composeFilePath, nil
|
|
}
|