hack/integration-cli-on-swarm/agent/worker/worker.go
28797019
 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")
b9aa04cf
 	keepExecutor := flag.Bool("keep-executor", false, "Do not auto-remove executor containers, which is used for running privileged programs on Swarm")
28797019
 	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)
 	}
b9aa04cf
 	executor := privilegedTestChunkExecutor(!*keepExecutor)
28797019
 	if *dryRun {
b9aa04cf
 		executor = dryTestChunkExecutor()
28797019
 	}
 	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,
 			}
 		}
94cefa21
 		elapsed := time.Since(begin)
28797019
 		log.Printf("Finished chunk %d, code=%d, elapsed=%v", args.ChunkID, code, elapsed)
 		return types.Result{
 			ChunkID: args.ChunkID,
 			Code:    int(code),
 			RawLog:  rawLog,
 		}
 	})
 }