| 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") |
| keepExecutor := flag.Bool("keep-executor", false, "Do not auto-remove executor containers, which is used for running privileged programs on Swarm") |
| 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(!*keepExecutor) |
| 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.Since(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, |
| } |
| }) |
| } |