Beam messages can attach arbitrary file descriptors.

Each transport is responsible for implementing file passing using the
best available method.

Current state of implementation:

* inmem: full
* unix: not yet implemented
This commit is contained in:
Solomon Hykes 2014-05-19 14:21:45 -07:00
parent 6fedd8c7ab
commit c9a7897773
3 changed files with 47 additions and 0 deletions

View File

@ -2,6 +2,7 @@ package beam
import (
"errors"
"os"
)
type Sender interface {
@ -16,6 +17,7 @@ type Receiver interface {
type Message struct {
Name string
Args []string
Att *os.File
}
const (

View File

@ -1,8 +1,11 @@
package inmem
import (
"fmt"
"github.com/docker/beam"
"github.com/dotcloud/docker/pkg/testutils"
"io/ioutil"
"os"
"testing"
)
@ -141,3 +144,42 @@ func TestSendNested(t *testing.T) {
}
})
}
func TestSendFile(t *testing.T) {
r, w := Pipe()
defer r.Close()
defer w.Close()
tmp, err := ioutil.TempFile("", "beam-test-")
if err != nil {
t.Fatal(err)
}
defer os.RemoveAll(tmp.Name())
fmt.Fprintf(tmp, "hello world\n")
tmp.Sync()
tmp.Seek(0, 0)
testutils.Timeout(t, func() {
go func() {
_, _, err := w.Send(&beam.Message{"file", []string{"path=" + tmp.Name()}, tmp}, 0)
if err != nil {
t.Fatal(err)
}
}()
msg, _, _, err := r.Receive(0)
if err != nil {
t.Fatal(err)
}
if msg.Name != "file" {
t.Fatalf("%#v", msg)
}
if msg.Args[0] != "path="+tmp.Name() {
t.Fatalf("%#v", msg)
}
txt, err := ioutil.ReadAll(msg.Att)
if err != nil {
t.Fatal(err)
}
if string(txt) != "hello world\n" {
t.Fatalf("%s\n", txt)
}
})
}

View File

@ -51,6 +51,9 @@ func (c *Conn) Close() error {
}
func (c *Conn) Send(msg *beam.Message, mode int) (beam.Receiver, beam.Sender, error) {
if msg.Att != nil {
return nil, nil, fmt.Errorf("file attachment not yet implemented in unix transport")
}
parts := []string{msg.Name}
parts = append(parts, msg.Args...)
b := []byte(data.EncodeList(parts))