Skip to content

Commit

Permalink
Merge pull request containers#10868 from cdoern/untilLog
Browse files Browse the repository at this point in the history
Implemented Until Query Parameter for Containers/logs
  • Loading branch information
openshift-merge-robot authored Jul 10, 2021
2 parents 24a5eea + 4624142 commit bef1f03
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 9 deletions.
4 changes: 2 additions & 2 deletions libpod/container_log.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ func (c *Container) readFromLogFile(ctx context.Context, options *logs.LogOption
for _, nll := range tailLog {
nll.CID = c.ID()
nll.CName = c.Name()
if nll.Since(options.Since) {
if nll.Since(options.Since) && nll.Until(options.Until) {
logChannel <- nll
}
}
Expand Down Expand Up @@ -88,7 +88,7 @@ func (c *Container) readFromLogFile(ctx context.Context, options *logs.LogOption
}
nll.CID = c.ID()
nll.CName = c.Name()
if nll.Since(options.Since) {
if nll.Since(options.Since) && nll.Until(options.Until) {
logChannel <- nll
}
}
Expand Down
8 changes: 8 additions & 0 deletions libpod/container_log_linux.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
}
}()

beforeTimeStamp := true
afterTimeStamp := false // needed for options.Since
tailQueue := []*logs.LogLine{} // needed for options.Tail
doTail := options.Tail > 0
Expand Down Expand Up @@ -156,6 +157,13 @@ func (c *Container) readFromJournal(ctx context.Context, options *logs.LogOption
}
afterTimeStamp = true
}
if beforeTimeStamp {
entryTime := time.Unix(0, int64(entry.RealtimeTimestamp)*int64(time.Microsecond))
if entryTime.Before(options.Until) || !options.Until.IsZero() {
continue
}
beforeTimeStamp = false
}

// If we're reading an event and the container exited/died,
// then we're done and can return.
Expand Down
8 changes: 7 additions & 1 deletion libpod/logs/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ type LogOptions struct {
Details bool
Follow bool
Since time.Time
Until time.Time
Tail int64
Timestamps bool
Multi bool
Expand Down Expand Up @@ -184,7 +185,12 @@ func (l *LogLine) String(options *LogOptions) string {

// Since returns a bool as to whether a log line occurred after a given time
func (l *LogLine) Since(since time.Time) bool {
return l.Time.After(since)
return l.Time.After(since) || since.IsZero()
}

// Until returns a bool as to whether a log line occurred before a given time
func (l *LogLine) Until(until time.Time) bool {
return l.Time.Before(until) || until.IsZero()
}

// NewLogLine creates a logLine struct from a container log string
Expand Down
14 changes: 8 additions & 6 deletions pkg/api/handlers/compat/containers_logs.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,18 +72,20 @@ func LogsFromContainer(w http.ResponseWriter, r *http.Request) {

var until time.Time
if _, found := r.URL.Query()["until"]; found {
// FIXME: until != since but the logs backend does not yet support until.
since, err = util.ParseInputTime(query.Until)
if err != nil {
utils.BadRequest(w, "until", query.Until, err)
return
if query.Until != "0" {
until, err = util.ParseInputTime(query.Until)
if err != nil {
utils.BadRequest(w, "until", query.Until, err)
return
}
}
}

options := &logs.LogOptions{
Details: true,
Follow: query.Follow,
Since: since,
Until: until,
Tail: tail,
Timestamps: query.Timestamps,
}
Expand Down Expand Up @@ -119,7 +121,7 @@ func LogsFromContainer(w http.ResponseWriter, r *http.Request) {

for line := range logChannel {
if _, found := r.URL.Query()["until"]; found {
if line.Time.After(until) {
if line.Time.After(until) && !until.IsZero() {
break
}
}
Expand Down
13 changes: 13 additions & 0 deletions test/apiv2/python/rest_api/test_v2_0_0_container.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import random
import unittest
import json

import requests
from dateutil.parser import parse
Expand Down Expand Up @@ -97,6 +98,18 @@ def test_attach(self):
def test_logs(self):
r = requests.get(self.uri(self.resolve_container("/containers/{}/logs?stdout=true")))
self.assertEqual(r.status_code, 200, r.text)
r = requests.post(
self.podman_url + "/v1.40/containers/create?name=topcontainer",
json={"Cmd": ["top", "ls"], "Image": "alpine:latest"},
)
self.assertEqual(r.status_code, 201, r.text)
payload = r.json()
container_id = payload["Id"]
self.assertIsNotNone(container_id)
r = requests.get(self.podman_url + f"/v1.40/containers/{payload['Id']}/logs?follow=false&stdout=true&until=0")
self.assertEqual(r.status_code, 200, r.text)
r = requests.get(self.podman_url + f"/v1.40/containers/{payload['Id']}/logs?follow=false&stdout=true&until=1")
self.assertEqual(r.status_code, 200, r.text)

def test_commit(self):
r = requests.post(self.uri(self.resolve_container("/commit?container={}")))
Expand Down

0 comments on commit bef1f03

Please sign in to comment.