mirror of https://github.com/docker/docs.git
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:
parent
6fedd8c7ab
commit
c9a7897773
2
beam.go
2
beam.go
|
@ -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 (
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in New Issue