worker.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "log"
  6. "time"
  7. "github.com/bfirsh/funker-go"
  8. "github.com/docker/distribution/reference"
  9. "github.com/docker/docker/hack/integration-cli-on-swarm/agent/types"
  10. )
  11. func main() {
  12. if err := xmain(); err != nil {
  13. log.Fatalf("fatal error: %v", err)
  14. }
  15. }
  16. func validImageDigest(s string) bool {
  17. return reference.DigestRegexp.FindString(s) != ""
  18. }
  19. func xmain() error {
  20. workerImageDigest := flag.String("worker-image-digest", "", "Needs to be the digest of this worker image itself")
  21. dryRun := flag.Bool("dry-run", false, "Dry run")
  22. keepExecutor := flag.Bool("keep-executor", false, "Do not auto-remove executor containers, which is used for running privileged programs on Swarm")
  23. flag.Parse()
  24. if !validImageDigest(*workerImageDigest) {
  25. // Because of issue #29582.
  26. // `docker service create localregistry.example.com/blahblah:latest` pulls the image data to local, but not a tag.
  27. // So, `docker run localregistry.example.com/blahblah:latest` fails: `Unable to find image 'localregistry.example.com/blahblah:latest' locally`
  28. return fmt.Errorf("worker-image-digest must be a digest, got %q", *workerImageDigest)
  29. }
  30. executor := privilegedTestChunkExecutor(!*keepExecutor)
  31. if *dryRun {
  32. executor = dryTestChunkExecutor()
  33. }
  34. return handle(*workerImageDigest, executor)
  35. }
  36. func handle(workerImageDigest string, executor testChunkExecutor) error {
  37. log.Printf("Waiting for a funker request")
  38. return funker.Handle(func(args *types.Args) types.Result {
  39. log.Printf("Executing chunk %d, contains %d test filters",
  40. args.ChunkID, len(args.Tests))
  41. begin := time.Now()
  42. code, rawLog, err := executor(workerImageDigest, args.Tests)
  43. if err != nil {
  44. log.Printf("Error while executing chunk %d: %v", args.ChunkID, err)
  45. if code == 0 {
  46. // Make sure this is a failure
  47. code = 1
  48. }
  49. return types.Result{
  50. ChunkID: args.ChunkID,
  51. Code: int(code),
  52. RawLog: rawLog,
  53. }
  54. }
  55. elapsed := time.Since(begin)
  56. log.Printf("Finished chunk %d, code=%d, elapsed=%v", args.ChunkID, code, elapsed)
  57. return types.Result{
  58. ChunkID: args.ChunkID,
  59. Code: int(code),
  60. RawLog: rawLog,
  61. }
  62. })
  63. }