mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
94cefa2145
Signed-off-by: wgliang <liangcszzu@163.com>
69 lines
2.1 KiB
Go
69 lines
2.1 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")
|
|
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,
|
|
}
|
|
})
|
|
}
|