worker.go 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. flag.Parse()
  23. if !validImageDigest(*workerImageDigest) {
  24. // Because of issue #29582.
  25. // `docker service create localregistry.example.com/blahblah:latest` pulls the image data to local, but not a tag.
  26. // So, `docker run localregistry.example.com/blahblah:latest` fails: `Unable to find image 'localregistry.example.com/blahblah:latest' locally`
  27. return fmt.Errorf("worker-image-digest must be a digest, got %q", *workerImageDigest)
  28. }
  29. executor := privilegedTestChunkExecutor
  30. if *dryRun {
  31. executor = dryTestChunkExecutor
  32. }
  33. return handle(*workerImageDigest, executor)
  34. }
  35. func handle(workerImageDigest string, executor testChunkExecutor) error {
  36. log.Printf("Waiting for a funker request")
  37. return funker.Handle(func(args *types.Args) types.Result {
  38. log.Printf("Executing chunk %d, contains %d test filters",
  39. args.ChunkID, len(args.Tests))
  40. begin := time.Now()
  41. code, rawLog, err := executor(workerImageDigest, args.Tests)
  42. if err != nil {
  43. log.Printf("Error while executing chunk %d: %v", args.ChunkID, err)
  44. if code == 0 {
  45. // Make sure this is a failure
  46. code = 1
  47. }
  48. return types.Result{
  49. ChunkID: args.ChunkID,
  50. Code: int(code),
  51. RawLog: rawLog,
  52. }
  53. }
  54. elapsed := time.Now().Sub(begin)
  55. log.Printf("Finished chunk %d, code=%d, elapsed=%v", args.ChunkID, code, elapsed)
  56. return types.Result{
  57. ChunkID: args.ChunkID,
  58. Code: int(code),
  59. RawLog: rawLog,
  60. }
  61. })
  62. }