18790: Enable follow mode with -f flag. 18790-log-client
authorTom Clegg <tom@curii.com>
Fri, 28 Apr 2023 15:29:01 +0000 (11:29 -0400)
committerTom Clegg <tom@curii.com>
Fri, 28 Apr 2023 15:29:01 +0000 (11:29 -0400)
Arvados-DCO-1.1-Signed-off-by: Tom Clegg <tom@curii.com>

cmd/arvados-client/container_gateway.go
cmd/arvados-client/container_gateway_test.go

index 94375075c0fd6b68425d49b8351cfe8f1a026b0a..7b52cc3a646e4612167b9bd9694213cb427f0c8a 100644 (file)
@@ -33,6 +33,7 @@ type logsCommand struct {
 
 func (lc logsCommand) RunCommand(prog string, args []string, stdin io.Reader, stdout, stderr io.Writer) int {
        f := flag.NewFlagSet(prog, flag.ContinueOnError)
+       follow := f.Bool("f", false, "follow: poll for new data until the container finishes")
        pollInterval := f.Duration("poll", time.Second*2, "minimum duration to wait before polling for new data")
        if ok, code := cmd.ParseFlags(f, prog, args, "container-request-uuid", stderr); !ok {
                return code
@@ -53,7 +54,7 @@ func (lc logsCommand) RunCommand(prog string, args []string, stdin io.Reader, st
                                InsecureSkipVerify: true}}
        }
 
-       err := lc.tailf(target, stdout, stderr, *pollInterval)
+       err := lc.tail(target, stdout, stderr, *follow, *pollInterval)
        if err != nil {
                fmt.Fprintln(stderr, err)
                return 1
@@ -61,7 +62,7 @@ func (lc logsCommand) RunCommand(prog string, args []string, stdin io.Reader, st
        return 0
 }
 
-func (lc *logsCommand) tailf(crUUID string, stdout, stderr io.Writer, pollInterval time.Duration) error {
+func (lc *logsCommand) tail(crUUID string, stdout, stderr io.Writer, follow bool, pollInterval time.Duration) error {
        ctx, cancel := context.WithCancel(context.Background())
        defer cancel()
 
@@ -157,7 +158,7 @@ poll:
                        displayingUUID = cr.ContainerUUID
                        delay = 0
                        continue
-               } else if cr.State == arvados.ContainerRequestStateFinal {
+               } else if cr.State == arvados.ContainerRequestStateFinal || !follow {
                        break
                } else if len(newData) > 0 {
                        delay = pollInterval
index 25c794e83d5e81df9e756dc641531579ff510db3..761a7c3ef50594484e5c44647661eddc971649b1 100644 (file)
@@ -230,7 +230,7 @@ func (s *ClientSuite) TestContainerRequestLog(c *check.C) {
 
        c.Log("running logs command on queued container")
        var stdout, stderr bytes.Buffer
-       cmd := exec.CommandContext(ctx, "go", "run", ".", "logs", "-poll=250ms", cr.UUID)
+       cmd := exec.CommandContext(ctx, "go", "run", ".", "logs", "-f", "-poll=250ms", cr.UUID)
        cmd.Env = append(cmd.Env, os.Environ()...)
        cmd.Env = append(cmd.Env, "ARVADOS_API_TOKEN="+arvadostest.SystemRootToken)
        cmd.Stdout = io.MultiWriter(&stdout, os.Stderr)
@@ -270,6 +270,18 @@ func (s *ClientSuite) TestContainerRequestLog(c *check.C) {
        c.Assert(err, check.IsNil)
        _, err = fmt.Fprintf(fStderr, "%s line 1 of stderr\n", time.Now().UTC().Format(rfc3339NanoFixed))
        c.Assert(err, check.IsNil)
+
+       {
+               // Without "-f", just show the existing logs and
+               // exit. Timeout needs to be long enough for "go run".
+               ctxNoFollow, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second*5))
+               defer cancel()
+               cmdNoFollow := exec.CommandContext(ctxNoFollow, "go", "run", ".", "logs", "-poll=250ms", cr.UUID)
+               buf, err := cmdNoFollow.CombinedOutput()
+               c.Check(err, check.IsNil)
+               c.Check(string(buf), check.Matches, `(?ms).*line 1 of stderr\n`)
+       }
+
        time.Sleep(time.Second * 2)
        _, err = fmt.Fprintf(fCrunchrun, "%s line 2 of crunch-run.txt", time.Now().UTC().Format(rfc3339NanoFixed))
        c.Assert(err, check.IsNil)
@@ -304,7 +316,7 @@ func (s *ClientSuite) TestContainerRequestLog(c *check.C) {
        {
                ctx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second*5))
                defer cancel()
-               cmd := exec.CommandContext(ctx, "go", "run", ".", "logs", cr.UUID)
+               cmd := exec.CommandContext(ctx, "go", "run", ".", "logs", "-f", cr.UUID)
                cmd.Env = append(cmd.Env, os.Environ()...)
                cmd.Env = append(cmd.Env, "ARVADOS_API_TOKEN="+arvadostest.SystemRootToken)
                buf, err := cmd.CombinedOutput()