summaryrefslogtreecommitdiff
path: root/pkg/varlinkapi/containers.go
diff options
context:
space:
mode:
authorPeter Hunt <pehunt@redhat.com>2019-06-25 13:50:30 -0400
committerPeter Hunt <pehunt@redhat.com>2019-07-23 13:29:33 -0400
commit2a474c88c9ffc7221b09513ad4db8720ca7661cb (patch)
treedf3802398f27575953802069af857ee9270e8c96 /pkg/varlinkapi/containers.go
parentbb253af3fdc9928388bab1fb2063e7d0b79a5e4b (diff)
downloadpodman-2a474c88c9ffc7221b09513ad4db8720ca7661cb.tar.gz
podman-2a474c88c9ffc7221b09513ad4db8720ca7661cb.tar.bz2
podman-2a474c88c9ffc7221b09513ad4db8720ca7661cb.zip
Finish up remote exec implementation
Signed-off-by: Peter Hunt <pehunt@redhat.com>
Diffstat (limited to 'pkg/varlinkapi/containers.go')
-rw-r--r--pkg/varlinkapi/containers.go52
1 files changed, 31 insertions, 21 deletions
diff --git a/pkg/varlinkapi/containers.go b/pkg/varlinkapi/containers.go
index 19a8bfd2e..4714f3fa0 100644
--- a/pkg/varlinkapi/containers.go
+++ b/pkg/varlinkapi/containers.go
@@ -796,45 +796,55 @@ func (i *LibpodAPI) ExecContainer(call iopodman.VarlinkCall, opts iopodman.ExecO
if opts.Workdir != nil {
workDir = *opts.Workdir
}
+ // ACK the client upgrade request
+ call.ReplyExecContainer()
resizeChan := make(chan remotecommand.TerminalSize)
errChan := make(chan error)
reader, writer, _, pipeWriter, streams := setupStreams(call)
+ //reader, _, _, pipeWriter, streams := setupStreams(call)
+ ecChan := make(chan uint32, 1)
go func() {
fmt.Printf("ExecContainer Start Reader\n")
- if err := virtwriter.Reader(reader, nil, nil, pipeWriter, resizeChan); err != nil {
- fmt.Printf("ExecContainer Reader err %s, %s\n", err.Error(), errors.Cause(err).Error())
- errChan <- err
+ if err := virtwriter.Reader(reader, nil, nil, pipeWriter, resizeChan, nil); err != nil {
+ //fmt.Printf("ExecContainer Reader err %s, %s\n", err.Error(), errors.Cause(err).Error())
+ errChan <- errors.Wrapf(err, "error")
}
}()
- // Debugging...
- time.Sleep(5 * time.Second)
-
+ fmt.Printf("ExecContainer Start ctr.Exec\n")
+ // TODO detach keys and resize
+ // TODO add handling for exit code
+ // TODO capture exit code and return to main thread
go func() {
- fmt.Printf("ExecContainer Start ctr.Exec\n")
- // TODO detach keys and resize
- // TODO add handling for exit code
- // TODO capture exit code and return to main thread
- _, err := ctr.Exec(opts.Tty, opts.Privileged, envs, opts.Cmd, user, workDir, streams, 0, nil, "")
+ ec, err := ctr.Exec(opts.Tty, opts.Privileged, envs, opts.Cmd, user, workDir, streams, 0, resizeChan, "")
if err != nil {
- fmt.Printf("ExecContainer Exec err %s, %s\n", err.Error(), errors.Cause(err).Error())
- errChan <- errors.Wrapf(err, "ExecContainer failed for container %s", ctr.ID())
+ logrus.Errorf("ExecContainer Exec err %s, %s\n", err.Error(), errors.Cause(err).Error())
+ errChan <-err
}
- }()
+ ecChan <-uint32(ec)
- execErr := <-errChan
+ }()
- if execErr != nil && errors.Cause(execErr) != io.EOF {
- fmt.Printf("ExecContainer err: %s\n", execErr.Error())
- return call.ReplyErrorOccurred(execErr.Error())
+ ec := uint32(125)
+ var execErr error
+ select {
+ case execErr = <-errChan:
+ fmt.Println(execErr.Error())
+ case ec = <-ecChan:
+ fmt.Println("found", ec)
}
- if err = virtwriter.HangUp(writer); err != nil {
- fmt.Printf("ExecContainer hangup err: %s\n", err.Error())
+ // TODO FIXME prevent all of vthese conversions
+ if err = virtwriter.HangUp(writer, int(ec)); err != nil {
logrus.Errorf("ExecContainer failed to HANG-UP on %s: %s", ctr.ID(), err.Error())
}
- return call.Writer.Flush()
+ defer fmt.Println("Succeeded in exec'ing")
+ if err := call.Writer.Flush(); err != nil {
+ logrus.Errorf("Exec Container err: %s", err.Error())
+ }
+
+ return execErr
}