summaryrefslogtreecommitdiff
path: root/pkg/varlinkapi/containers.go
diff options
context:
space:
mode:
authorbaude <bbaude@redhat.com>2018-05-04 10:39:34 -0500
committerAtomic Bot <atomic-devel@projectatomic.io>2018-05-08 15:44:38 +0000
commit21ebdb558cb939176d862e12bec99f34a1e5d4ba (patch)
tree537d4aef6fade4a1f436589caec9b72527436243 /pkg/varlinkapi/containers.go
parentbb2d5759d444a15952955564596aa0ba2201b5c6 (diff)
downloadpodman-21ebdb558cb939176d862e12bec99f34a1e5d4ba.tar.gz
podman-21ebdb558cb939176d862e12bec99f34a1e5d4ba.tar.bz2
podman-21ebdb558cb939176d862e12bec99f34a1e5d4ba.zip
Allow streaming on some varlink container methods
The following methods should support streaming requests from the client: * GetContainerLogs A reference for a python stream implementation can be found here: https://github.com/varlink/python/blob/master/varlink/tests/test_orgexamplemore.py#L29-L42 Signed-off-by: baude <bbaude@redhat.com> Closes: #724 Approved by: mheon
Diffstat (limited to 'pkg/varlinkapi/containers.go')
-rw-r--r--pkg/varlinkapi/containers.go33
1 files changed, 30 insertions, 3 deletions
diff --git a/pkg/varlinkapi/containers.go b/pkg/varlinkapi/containers.go
index ece33556b..79eea4aa7 100644
--- a/pkg/varlinkapi/containers.go
+++ b/pkg/varlinkapi/containers.go
@@ -4,8 +4,10 @@ import (
"bufio"
"encoding/json"
"fmt"
+ "io"
"os"
"syscall"
+ "time"
"github.com/pkg/errors"
"github.com/projectatomic/libpod/cmd/podman/batchcontainer"
@@ -117,6 +119,7 @@ func (i *LibpodAPI) ListContainerProcesses(call ioprojectatomicpodman.VarlinkCal
if err != nil {
return call.ReplyErrorOccurred(err.Error())
}
+
return call.ReplyListContainerProcesses(psOutput)
}
@@ -148,12 +151,36 @@ func (i *LibpodAPI) GetContainerLogs(call ioprojectatomicpodman.VarlinkCall, nam
}
defer file.Close()
reader := bufio.NewReader(file)
+ if call.WantsMore() {
+ call.Continues = true
+ }
for {
line, err := reader.ReadString('\n')
- if err != nil {
- break
+ // We've read the entire file
+ if err == io.EOF {
+ if !call.WantsMore() {
+ // If this is a non-following log request, we return what we have
+ break
+ } else {
+ // If we want to follow, return what we have, wipe the slice, and make
+ // sure the container is still running before iterating.
+ call.ReplyGetContainerLogs(logs)
+ logs = []string{}
+ time.Sleep(1 * time.Second)
+ state, err := ctr.State()
+ if err != nil {
+ return call.ReplyErrorOccurred(err.Error())
+ }
+ if state != libpod.ContainerStateRunning && state != libpod.ContainerStatePaused {
+ return call.ReplyErrorOccurred(fmt.Sprintf("%s is no longer running", ctr.ID()))
+ }
+
+ }
+ } else if err != nil {
+ return call.ReplyErrorOccurred(err.Error())
+ } else {
+ logs = append(logs, line)
}
- logs = append(logs, line)
}
return call.ReplyGetContainerLogs(logs)
}