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> Upstream-commit: 28797019b3f0eb288c4b201237cb992ec148dd4c Component: engine
69 lines
2.0 KiB
Go
69 lines
2.0 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"time"
|
|
|
|
"github.com/bfirsh/funker-go"
|
|
"github.com/docker/distribution/reference"
|
|
"github.com/docker/docker/hack/integration-cli-on-swarm/agent/types"
|
|
)
|
|
|
|
func main() {
|
|
if err := xmain(); err != nil {
|
|
log.Fatalf("fatal error: %v", err)
|
|
}
|
|
}
|
|
|
|
func validImageDigest(s string) bool {
|
|
return reference.DigestRegexp.FindString(s) != ""
|
|
}
|
|
|
|
func xmain() error {
|
|
workerImageDigest := flag.String("worker-image-digest", "", "Needs to be the digest of this worker image itself")
|
|
dryRun := flag.Bool("dry-run", false, "Dry run")
|
|
flag.Parse()
|
|
if !validImageDigest(*workerImageDigest) {
|
|
// Because of issue #29582.
|
|
// `docker service create localregistry.example.com/blahblah:latest` pulls the image data to local, but not a tag.
|
|
// So, `docker run localregistry.example.com/blahblah:latest` fails: `Unable to find image 'localregistry.example.com/blahblah:latest' locally`
|
|
return fmt.Errorf("worker-image-digest must be a digest, got %q", *workerImageDigest)
|
|
}
|
|
executor := privilegedTestChunkExecutor
|
|
if *dryRun {
|
|
executor = dryTestChunkExecutor
|
|
}
|
|
return handle(*workerImageDigest, executor)
|
|
}
|
|
|
|
func handle(workerImageDigest string, executor testChunkExecutor) error {
|
|
log.Printf("Waiting for a funker request")
|
|
return funker.Handle(func(args *types.Args) types.Result {
|
|
log.Printf("Executing chunk %d, contains %d test filters",
|
|
args.ChunkID, len(args.Tests))
|
|
begin := time.Now()
|
|
code, rawLog, err := executor(workerImageDigest, args.Tests)
|
|
if err != nil {
|
|
log.Printf("Error while executing chunk %d: %v", args.ChunkID, err)
|
|
if code == 0 {
|
|
// Make sure this is a failure
|
|
code = 1
|
|
}
|
|
return types.Result{
|
|
ChunkID: args.ChunkID,
|
|
Code: int(code),
|
|
RawLog: rawLog,
|
|
}
|
|
}
|
|
elapsed := time.Now().Sub(begin)
|
|
log.Printf("Finished chunk %d, code=%d, elapsed=%v", args.ChunkID, code, elapsed)
|
|
return types.Result{
|
|
ChunkID: args.ChunkID,
|
|
Code: int(code),
|
|
RawLog: rawLog,
|
|
}
|
|
})
|
|
}
|