cmd/ejobs: add wait subcommand

ejobs wait JOB_ID will wait until the job is finished, then exit.

Change-Id: I4b729816779c74a154737716fc700e5197989d0a
Reviewed-on: https://go-review.googlesource.com/c/pkgsite-metrics/+/511075
Run-TryBot: Jonathan Amsterdam <jba@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Maceo Thompson <maceothompson@google.com>
diff --git a/cmd/ejobs/main.go b/cmd/ejobs/main.go
index 5feae48..a93ce5a 100644
--- a/cmd/ejobs/main.go
+++ b/cmd/ejobs/main.go
@@ -62,6 +62,9 @@
 	{"start", "-min [MIN_IMPORTERS] BINARY ARGS...",
 		"start a job",
 		doStart, startFlagSet},
+	{"wait", "JOBID",
+		"do not exit until JOBID is done",
+		doWait, nil},
 }
 
 type command struct {
@@ -190,6 +193,27 @@
 	return nil
 }
 
+func doWait(ctx context.Context, args []string) error {
+	ts, err := identityTokenSource(ctx)
+	if err != nil {
+		return err
+	}
+	jobID := args[0]
+	for {
+		job, err := requestJSON[jobs.Job](ctx, "jobs/describe?jobid="+jobID, ts)
+		if err != nil {
+			return err
+		}
+		done := job.NumSkipped + job.NumFailed + job.NumErrored + job.NumSucceeded
+		if done >= job.NumEnqueued {
+			break
+		}
+		time.Sleep(time.Second)
+	}
+	fmt.Printf("Job %s finished.\n", jobID)
+	return nil
+}
+
 func doStart(ctx context.Context, args []string) error {
 	// Validate arguments.
 	if err := startFlagSet.Parse(args); err != nil {