summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJhon Honce <jhonce@redhat.com>2019-05-08 16:45:12 -0700
committerJhon Honce <jhonce@redhat.com>2019-05-14 12:19:28 -0700
commitbd3154fcf6a48b37cfde5d9b1226900cd863c0d9 (patch)
treea898754ae35bdb97d52c359131ef5fff63d4b18b
parenta261b60cc8851c04efd191be6f6e2e4598439822 (diff)
downloadpodman-bd3154fcf6a48b37cfde5d9b1226900cd863c0d9.tar.gz
podman-bd3154fcf6a48b37cfde5d9b1226900cd863c0d9.tar.bz2
podman-bd3154fcf6a48b37cfde5d9b1226900cd863c0d9.zip
Add VarlinkCall.RequiresUpgrade() type and method
Type varlinkapi.VarlinkCall currently only used as receiver for RequiresUpgrade() future helpers could be added to this type. RequiresUpgrade() verifies caller has given correct options to the call for the given operation. Signed-off-by: Jhon Honce <jhonce@redhat.com>
-rw-r--r--pkg/varlinkapi/attach.go16
-rw-r--r--pkg/varlinkapi/config.go4
-rw-r--r--pkg/varlinkapi/transfers.go35
-rw-r--r--pkg/varlinkapi/util.go15
4 files changed, 47 insertions, 23 deletions
diff --git a/pkg/varlinkapi/attach.go b/pkg/varlinkapi/attach.go
index 2234899a5..f292bbbf8 100644
--- a/pkg/varlinkapi/attach.go
+++ b/pkg/varlinkapi/attach.go
@@ -45,22 +45,24 @@ func (i *LibpodAPI) Attach(call iopodman.VarlinkCall, name string, detachKeys st
var finalErr error
resize := make(chan remotecommand.TerminalSize)
errChan := make(chan error)
+ varlink := VarlinkCall{&call}
- if !call.WantsUpgrade() {
- return call.ReplyErrorOccurred("client must use upgraded connection to attach")
+ if err := varlink.RequiresUpgrade(); err != nil {
+ return varlink.ReplyErrorOccurred(err.Error())
}
+
ctr, err := i.Runtime.LookupContainer(name)
if err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ return varlink.ReplyErrorOccurred(err.Error())
}
state, err := ctr.State()
if err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ return varlink.ReplyErrorOccurred(err.Error())
}
if !start && state != libpod.ContainerStateRunning {
- return call.ReplyErrorOccurred("container must be running to attach")
+ return varlink.ReplyErrorOccurred("container must be running to attach")
}
- call.Reply(nil)
+
reader, writer, _, pw, streams := setupStreams(call)
go func() {
@@ -81,7 +83,7 @@ func (i *LibpodAPI) Attach(call iopodman.VarlinkCall, name string, detachKeys st
quitWriter := virtwriter.NewVirtWriteCloser(writer, virtwriter.Quit)
_, err = quitWriter.Write([]byte("HANG-UP"))
// TODO error handling is not quite right here yet
- return call.Writer.Flush()
+ return varlink.Writer.Flush()
}
func attach(ctr *libpod.Container, streams *libpod.AttachStreams, detachKeys string, resize chan remotecommand.TerminalSize, errChan chan error) error {
diff --git a/pkg/varlinkapi/config.go b/pkg/varlinkapi/config.go
index e75170547..9952c2be1 100644
--- a/pkg/varlinkapi/config.go
+++ b/pkg/varlinkapi/config.go
@@ -21,3 +21,7 @@ func New(cli *cliconfig.PodmanCommand, runtime *libpod.Runtime) *iopodman.Varlin
lp := LibpodAPI{Cli: cli.Command, Runtime: runtime}
return iopodman.VarlinkNew(&lp)
}
+
+type VarlinkCall struct {
+ *iopodman.VarlinkCall
+}
diff --git a/pkg/varlinkapi/transfers.go b/pkg/varlinkapi/transfers.go
index 96f76bcdc..7b38ec5e6 100644
--- a/pkg/varlinkapi/transfers.go
+++ b/pkg/varlinkapi/transfers.go
@@ -15,58 +15,61 @@ import (
// SendFile allows a client to send a file to the varlink server
func (i *LibpodAPI) SendFile(call iopodman.VarlinkCall, ftype string, length int64) error {
- if !call.WantsUpgrade() {
- return call.ReplyErrorOccurred("client must use upgraded connection to send files")
+ varlink := VarlinkCall{&call}
+ if err := varlink.RequiresUpgrade(); err != nil {
+ return varlink.ReplyErrorOccurred(err.Error())
}
outputFile, err := ioutil.TempFile("", "varlink_send")
if err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ return varlink.ReplyErrorOccurred(err.Error())
}
defer outputFile.Close()
- if err = call.ReplySendFile(outputFile.Name()); err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ if err = varlink.ReplySendFile(outputFile.Name()); err != nil {
+ return varlink.ReplyErrorOccurred(err.Error())
}
writer := bufio.NewWriter(outputFile)
defer writer.Flush()
- reader := call.Call.Reader
+ reader := varlink.Call.Reader
if _, err := io.CopyN(writer, reader, length); err != nil {
return err
}
logrus.Debugf("successfully received %s", outputFile.Name())
// Send an ACK to the client
- call.Call.Writer.WriteString(fmt.Sprintf("%s:", outputFile.Name()))
- call.Call.Writer.Flush()
+ varlink.Call.Writer.WriteString(fmt.Sprintf("%s:", outputFile.Name()))
+ varlink.Call.Writer.Flush()
return nil
}
// ReceiveFile allows the varlink server to send a file to a client
func (i *LibpodAPI) ReceiveFile(call iopodman.VarlinkCall, filepath string, delete bool) error {
- if !call.WantsUpgrade() {
- return call.ReplyErrorOccurred("client must use upgraded connection to send files")
+ varlink := VarlinkCall{&call}
+ if err := varlink.RequiresUpgrade(); err != nil {
+ return varlink.ReplyErrorOccurred(err.Error())
}
+
fs, err := os.Open(filepath)
if err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ return varlink.ReplyErrorOccurred(err.Error())
}
fileInfo, err := fs.Stat()
if err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ return varlink.ReplyErrorOccurred(err.Error())
}
// Send the file length down to client
// Varlink connection upraded
- if err = call.ReplyReceiveFile(fileInfo.Size()); err != nil {
- return call.ReplyErrorOccurred(err.Error())
+ if err = varlink.ReplyReceiveFile(fileInfo.Size()); err != nil {
+ return varlink.ReplyErrorOccurred(err.Error())
}
reader := bufio.NewReader(fs)
- _, err = reader.WriteTo(call.Writer)
+ _, err = reader.WriteTo(varlink.Writer)
if err != nil {
return err
}
@@ -75,5 +78,5 @@ func (i *LibpodAPI) ReceiveFile(call iopodman.VarlinkCall, filepath string, dele
return err
}
}
- return call.Writer.Flush()
+ return varlink.Writer.Flush()
}
diff --git a/pkg/varlinkapi/util.go b/pkg/varlinkapi/util.go
index 8716c963a..a9f1e20a1 100644
--- a/pkg/varlinkapi/util.go
+++ b/pkg/varlinkapi/util.go
@@ -13,6 +13,11 @@ import (
"github.com/containers/libpod/cmd/podman/varlink"
"github.com/containers/libpod/libpod"
"github.com/containers/storage/pkg/archive"
+ "github.com/pkg/errors"
+)
+
+var (
+ ErrUpgradedConnectionRequired = errors.New("peer must use upgraded connection for operation")
)
// getContext returns a non-nil, empty context
@@ -195,3 +200,13 @@ func makePsOpts(inOpts iopodman.PsOpts) shared.PsOptions {
Sync: derefBool(inOpts.Sync),
}
}
+
+// RequiresUpgrade tests if varlink connection has been marked for upgrade.
+func (v *VarlinkCall) RequiresUpgrade() error {
+ if v.WantsUpgrade() {
+ // A nil is sent to the peer as required by the varlink protocol.
+ return v.Reply(nil)
+ } else {
+ return ErrUpgradedConnectionRequired
+ }
+}