diff options
author | baude <bbaude@redhat.com> | 2019-06-18 13:56:18 -0500 |
---|---|---|
committer | baude <bbaude@redhat.com> | 2019-07-10 08:50:05 -0500 |
commit | 780b05610ecf9ea107ec69c913dd074d69c1dc88 (patch) | |
tree | 1231b5de06f6a6368926edb225a8aaf91775dcdb /pkg/varlinkapi/util.go | |
parent | 81e722d08617ee19235bf57de6d86124e6b4574a (diff) | |
download | podman-780b05610ecf9ea107ec69c913dd074d69c1dc88.tar.gz podman-780b05610ecf9ea107ec69c913dd074d69c1dc88.tar.bz2 podman-780b05610ecf9ea107ec69c913dd074d69c1dc88.zip |
account for varlink calls that dont use more
the commit and pull varlink endpoints were not working correctly when
'more' was not being specified.
Fixes: #3317
Fixes: #3318
Fixes: #3526
Signed-off-by: baude <bbaude@redhat.com>
Diffstat (limited to 'pkg/varlinkapi/util.go')
-rw-r--r-- | pkg/varlinkapi/util.go | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/pkg/varlinkapi/util.go b/pkg/varlinkapi/util.go index a74105795..e8f74e6aa 100644 --- a/pkg/varlinkapi/util.go +++ b/pkg/varlinkapi/util.go @@ -13,6 +13,7 @@ import ( "github.com/containers/libpod/cmd/podman/varlink" "github.com/containers/libpod/libpod" "github.com/containers/libpod/libpod/define" + "github.com/containers/libpod/pkg/channelwriter" "github.com/containers/storage/pkg/archive" ) @@ -196,3 +197,42 @@ func makePsOpts(inOpts iopodman.PsOpts) shared.PsOptions { Sync: derefBool(inOpts.Sync), } } + +// forwardOutput is a helper method for varlink endpoints that employ both more and without +// more. it is capable of sending updates as the output writer gets them or append them +// all to a log. the chan error is the error from the libpod call so we can honor +// and error event in that case. +func forwardOutput(log []string, c chan error, wantsMore bool, output *channelwriter.Writer, reply func(br iopodman.MoreResponse) error) ([]string, error) { + done := false + for { + select { + // We need to check if the libpod func being called has returned an + // error yet + case err := <-c: + if err != nil { + return nil, err + } + done = true + // if no error is found, we pull what we can from the log writer and + // append it to log string slice + case line := <-output.ByteChannel: + log = append(log, string(line)) + // If the end point is being used in more mode, send what we have + if wantsMore { + br := iopodman.MoreResponse{ + Logs: log, + } + if err := reply(br); err != nil { + return nil, err + } + // "reset" the log to empty because we are sending what we + // get as we get it + log = []string{} + } + } + if done { + break + } + } + return log, nil +} |