mirror of
https://github.com/docker/docs.git
synced 2026-04-12 14:25:46 +07:00
Rearrange transport code
- Core types/functions moved from 'beam' to 'libswarm' top-level - Helper types/functions moved from 'beam' to 'util' Signed-off-by: Aanand Prasad <aanand.prasad@gmail.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
package backends
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/flynn/go-shlex"
|
||||
|
||||
"fmt"
|
||||
@@ -9,11 +9,11 @@ import (
|
||||
"sync"
|
||||
)
|
||||
|
||||
func Aggregate() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnSpawn(func(cmd ...string) (beam.Sender, error) {
|
||||
func Aggregate() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnSpawn(func(cmd ...string) (libswarm.Sender, error) {
|
||||
allBackends := New()
|
||||
instance := beam.NewServer()
|
||||
instance := libswarm.NewServer()
|
||||
|
||||
a, err := newAggregator(allBackends, instance, cmd)
|
||||
if err != nil {
|
||||
@@ -30,11 +30,11 @@ func Aggregate() beam.Sender {
|
||||
}
|
||||
|
||||
type aggregator struct {
|
||||
backends []*beam.Object
|
||||
server *beam.Server
|
||||
backends []*libswarm.Object
|
||||
server *libswarm.Server
|
||||
}
|
||||
|
||||
func newAggregator(allBackends *beam.Object, server *beam.Server, args []string) (*aggregator, error) {
|
||||
func newAggregator(allBackends *libswarm.Object, server *libswarm.Server, args []string) (*aggregator, error) {
|
||||
a := &aggregator{server: server}
|
||||
|
||||
for _, argString := range args {
|
||||
@@ -60,13 +60,13 @@ func newAggregator(allBackends *beam.Object, server *beam.Server, args []string)
|
||||
return a, nil
|
||||
}
|
||||
|
||||
func (a *aggregator) attach(name string, ret beam.Sender) error {
|
||||
func (a *aggregator) attach(name string, ret libswarm.Sender) error {
|
||||
if name != "" {
|
||||
// TODO: implement this?
|
||||
return fmt.Errorf("attaching to a child is not implemented")
|
||||
}
|
||||
|
||||
if _, err := ret.Send(&beam.Message{Verb: beam.Ack, Ret: a.server}); err != nil {
|
||||
if _, err := ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: a.server}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ func (a *aggregator) attach(name string, ret beam.Sender) error {
|
||||
copies.Add(1)
|
||||
go func() {
|
||||
log.Printf("copying output from %#v\n", b)
|
||||
beam.Copy(ret, r)
|
||||
libswarm.Copy(ret, r)
|
||||
log.Printf("finished output from %#v\n", b)
|
||||
copies.Done()
|
||||
}()
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
package backends
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/docker/libswarm/debug"
|
||||
"github.com/docker/libswarm/utils"
|
||||
)
|
||||
|
||||
// New returns a new engine, with all backends
|
||||
@@ -11,8 +12,8 @@ import (
|
||||
// engine, named after the desired backend.
|
||||
//
|
||||
// Example: `New().Job("debug").Run()`
|
||||
func New() *beam.Object {
|
||||
backends := beam.NewTree()
|
||||
func New() *libswarm.Object {
|
||||
backends := utils.NewTree()
|
||||
backends.Bind("simulator", Simulator())
|
||||
backends.Bind("debug", debug.Debug())
|
||||
backends.Bind("fakeclient", FakeClient())
|
||||
@@ -24,5 +25,5 @@ func New() *beam.Object {
|
||||
backends.Bind("shipyard", Shipyard())
|
||||
backends.Bind("ec2", Ec2())
|
||||
backends.Bind("tutum", Tutum())
|
||||
return beam.Obj(backends)
|
||||
return libswarm.Obj(backends)
|
||||
}
|
||||
|
||||
@@ -4,9 +4,10 @@ import (
|
||||
"crypto/tls"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/docker/libswarm/utils"
|
||||
"github.com/dotcloud/docker/engine"
|
||||
"github.com/dotcloud/docker/utils"
|
||||
dockerutils "github.com/dotcloud/docker/utils"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
"net"
|
||||
@@ -22,16 +23,16 @@ type DockerClientConfig struct {
|
||||
TLSClientConfig *tls.Config
|
||||
}
|
||||
|
||||
func DockerClient() beam.Sender {
|
||||
func DockerClient() libswarm.Sender {
|
||||
return DockerClientWithConfig(&DockerClientConfig{
|
||||
Scheme: "http",
|
||||
URLHost: "dummy.host",
|
||||
})
|
||||
}
|
||||
|
||||
func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnSpawn(func(cmd ...string) (beam.Sender, error) {
|
||||
func DockerClientWithConfig(config *DockerClientConfig) libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnSpawn(func(cmd ...string) (libswarm.Sender, error) {
|
||||
if len(cmd) != 1 {
|
||||
return nil, fmt.Errorf("dockerclient: spawn takes exactly 1 argument, got %d", len(cmd))
|
||||
}
|
||||
@@ -42,7 +43,7 @@ func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
|
||||
client.setURL(cmd[0])
|
||||
b := &dockerClientBackend{
|
||||
client: client,
|
||||
Server: beam.NewServer(),
|
||||
Server: libswarm.NewServer(),
|
||||
}
|
||||
b.Server.OnAttach(b.attach)
|
||||
b.Server.OnStart(b.start)
|
||||
@@ -55,12 +56,12 @@ func DockerClientWithConfig(config *DockerClientConfig) beam.Sender {
|
||||
|
||||
type dockerClientBackend struct {
|
||||
client *client
|
||||
*beam.Server
|
||||
*libswarm.Server
|
||||
}
|
||||
|
||||
func (b *dockerClientBackend) attach(name string, ret beam.Sender) error {
|
||||
func (b *dockerClientBackend) attach(name string, ret libswarm.Sender) error {
|
||||
if name == "" {
|
||||
ret.Send(&beam.Message{Verb: beam.Ack, Ret: b.Server})
|
||||
ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: b.Server})
|
||||
<-make(chan struct{})
|
||||
} else {
|
||||
path := fmt.Sprintf("/containers/%s/json", name)
|
||||
@@ -76,7 +77,7 @@ func (b *dockerClientBackend) attach(name string, ret beam.Sender) error {
|
||||
return fmt.Errorf("%s", respBody)
|
||||
}
|
||||
c := b.newContainer(name)
|
||||
ret.Send(&beam.Message{Verb: beam.Ack, Ret: c})
|
||||
ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -106,7 +107,7 @@ func (b *dockerClientBackend) ls() ([]string, error) {
|
||||
return names, nil
|
||||
}
|
||||
|
||||
func (b *dockerClientBackend) spawn(cmd ...string) (beam.Sender, error) {
|
||||
func (b *dockerClientBackend) spawn(cmd ...string) (libswarm.Sender, error) {
|
||||
if len(cmd) != 1 {
|
||||
return nil, fmt.Errorf("dockerclient: spawn takes exactly 1 argument, got %d", len(cmd))
|
||||
}
|
||||
@@ -128,9 +129,9 @@ func (b *dockerClientBackend) spawn(cmd ...string) (beam.Sender, error) {
|
||||
return b.newContainer(respJson.Id), nil
|
||||
}
|
||||
|
||||
func (b *dockerClientBackend) newContainer(id string) beam.Sender {
|
||||
func (b *dockerClientBackend) newContainer(id string) libswarm.Sender {
|
||||
c := &container{backend: b, id: id}
|
||||
instance := beam.NewServer()
|
||||
instance := libswarm.NewServer()
|
||||
instance.OnAttach(c.attach)
|
||||
instance.OnStart(c.start)
|
||||
instance.OnStop(c.stop)
|
||||
@@ -143,8 +144,8 @@ type container struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (c *container) attach(name string, ret beam.Sender) error {
|
||||
if _, err := ret.Send(&beam.Message{Verb: beam.Ack}); err != nil {
|
||||
func (c *container) attach(name string, ret libswarm.Sender) error {
|
||||
if _, err := ret.Send(&libswarm.Message{Verb: libswarm.Ack}); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -152,8 +153,8 @@ func (c *container) attach(name string, ret beam.Sender) error {
|
||||
|
||||
stdoutR, stdoutW := io.Pipe()
|
||||
stderrR, stderrW := io.Pipe()
|
||||
go beam.EncodeStream(ret, stdoutR, "stdout")
|
||||
go beam.EncodeStream(ret, stderrR, "stderr")
|
||||
go utils.EncodeStream(ret, stdoutR, "stdout")
|
||||
go utils.EncodeStream(ret, stderrR, "stderr")
|
||||
c.backend.client.hijack("POST", path, nil, stdoutW, stderrW)
|
||||
|
||||
return nil
|
||||
@@ -270,40 +271,40 @@ func (c *client) hijack(method, path string, in io.ReadCloser, stdout, stderr io
|
||||
rwc, br := clientconn.Hijack()
|
||||
defer rwc.Close()
|
||||
|
||||
receiveStdout := utils.Go(func() (err error) {
|
||||
receiveStdout := dockerutils.Go(func() (err error) {
|
||||
defer func() {
|
||||
if in != nil {
|
||||
in.Close()
|
||||
}
|
||||
}()
|
||||
_, err = utils.StdCopy(stdout, stderr, br)
|
||||
utils.Debugf("[hijack] End of stdout")
|
||||
_, err = dockerutils.StdCopy(stdout, stderr, br)
|
||||
dockerutils.Debugf("[hijack] End of stdout")
|
||||
return err
|
||||
})
|
||||
sendStdin := utils.Go(func() error {
|
||||
sendStdin := dockerutils.Go(func() error {
|
||||
if in != nil {
|
||||
io.Copy(rwc, in)
|
||||
utils.Debugf("[hijack] End of stdin")
|
||||
dockerutils.Debugf("[hijack] End of stdin")
|
||||
}
|
||||
if tcpc, ok := rwc.(*net.TCPConn); ok {
|
||||
if err := tcpc.CloseWrite(); err != nil {
|
||||
utils.Debugf("Couldn't send EOF: %s", err)
|
||||
dockerutils.Debugf("Couldn't send EOF: %s", err)
|
||||
}
|
||||
} else if unixc, ok := rwc.(*net.UnixConn); ok {
|
||||
if err := unixc.CloseWrite(); err != nil {
|
||||
utils.Debugf("Couldn't send EOF: %s", err)
|
||||
dockerutils.Debugf("Couldn't send EOF: %s", err)
|
||||
}
|
||||
}
|
||||
// Discard errors due to pipe interruption
|
||||
return nil
|
||||
})
|
||||
if err := <-receiveStdout; err != nil {
|
||||
utils.Debugf("Error receiveStdout: %s", err)
|
||||
dockerutils.Debugf("Error receiveStdout: %s", err)
|
||||
return err
|
||||
}
|
||||
|
||||
if err := <-sendStdin; err != nil {
|
||||
utils.Debugf("Error sendStdin: %s", err)
|
||||
dockerutils.Debugf("Error sendStdin: %s", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package backends
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
@@ -240,21 +240,21 @@ func (s *stubServer) AllSummaries() []string {
|
||||
return summaries
|
||||
}
|
||||
|
||||
func instance(t *testing.T, server *stubServer) *beam.Object {
|
||||
func instance(t *testing.T, server *stubServer) *libswarm.Object {
|
||||
url := "tcp://localhost:4243"
|
||||
if server != nil {
|
||||
url = strings.Replace(server.URL, "http://", "tcp://", 1)
|
||||
}
|
||||
|
||||
backend := DockerClient()
|
||||
instance, err := beam.Obj(backend).Spawn(url)
|
||||
instance, err := libswarm.Obj(backend).Spawn(url)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return instance
|
||||
}
|
||||
|
||||
func child(t *testing.T, server *stubServer, i *beam.Object, name string) *beam.Object {
|
||||
func child(t *testing.T, server *stubServer, i *libswarm.Object, name string) *libswarm.Object {
|
||||
_, child, err := i.Attach(name)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
|
||||
@@ -3,11 +3,12 @@ package backends
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/docker/libswarm/utils"
|
||||
"github.com/dotcloud/docker/api"
|
||||
"github.com/dotcloud/docker/pkg/version"
|
||||
dockerContainerConfig "github.com/dotcloud/docker/runconfig"
|
||||
"github.com/dotcloud/docker/utils"
|
||||
dockerutils "github.com/dotcloud/docker/utils"
|
||||
"github.com/gorilla/mux"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
@@ -20,10 +21,10 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func DockerServer() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
||||
instance := beam.Task(func(in beam.Receiver, out beam.Sender) {
|
||||
func DockerServer() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Message) error {
|
||||
instance := utils.Task(func(in libswarm.Receiver, out libswarm.Sender) {
|
||||
url := "tcp://localhost:4243"
|
||||
if len(ctx.Args) > 0 {
|
||||
url = ctx.Args[0]
|
||||
@@ -33,15 +34,15 @@ func DockerServer() beam.Sender {
|
||||
fmt.Printf("listenAndServe: %v", err)
|
||||
}
|
||||
})
|
||||
_, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: instance})
|
||||
_, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: instance})
|
||||
return err
|
||||
}))
|
||||
return backend
|
||||
}
|
||||
|
||||
type HttpApiFunc func(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error
|
||||
type HttpApiFunc func(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error
|
||||
|
||||
func listenAndServe(urlStr string, out beam.Sender) error {
|
||||
func listenAndServe(urlStr string, out libswarm.Sender) error {
|
||||
fmt.Println("Starting Docker server...")
|
||||
r, err := createRouter(out)
|
||||
if err != nil {
|
||||
@@ -69,7 +70,7 @@ func listenAndServe(urlStr string, out beam.Sender) error {
|
||||
return httpSrv.Serve(l)
|
||||
}
|
||||
|
||||
func ping(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func ping(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
_, err := w.Write([]byte{'O', 'K'})
|
||||
return err
|
||||
}
|
||||
@@ -107,14 +108,14 @@ type containerJson struct {
|
||||
VolumesRW map[string]bool
|
||||
}
|
||||
|
||||
func getContainerJson(out beam.Sender, containerID string) (containerJson, error) {
|
||||
o := beam.Obj(out)
|
||||
func getContainerJson(out libswarm.Sender, containerID string) (containerJson, error) {
|
||||
o := libswarm.Obj(out)
|
||||
|
||||
_, containerOut, err := o.Attach(containerID)
|
||||
if err != nil {
|
||||
return containerJson{}, err
|
||||
}
|
||||
container := beam.Obj(containerOut)
|
||||
container := libswarm.Obj(containerOut)
|
||||
responseJson, err := container.Get()
|
||||
if err != nil {
|
||||
return containerJson{}, err
|
||||
@@ -128,7 +129,7 @@ func getContainerJson(out beam.Sender, containerID string) (containerJson, error
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func getContainerInfo(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func getContainerInfo(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
container, err := getContainerJson(out, vars["name"])
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -136,12 +137,12 @@ func getContainerInfo(out beam.Sender, version version.Version, w http.ResponseW
|
||||
return writeJSON(w, http.StatusOK, container)
|
||||
}
|
||||
|
||||
func getContainersJSON(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func getContainersJSON(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if err := r.ParseForm(); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
o := beam.Obj(out)
|
||||
o := libswarm.Obj(out)
|
||||
names, err := o.Ls()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -214,7 +215,7 @@ func getContainersJSON(out beam.Sender, version version.Version, w http.Response
|
||||
return writeJSON(w, http.StatusOK, responses)
|
||||
}
|
||||
|
||||
func postContainersCreate(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func postContainersCreate(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if err := r.ParseForm(); err != nil {
|
||||
return nil
|
||||
}
|
||||
@@ -224,7 +225,7 @@ func postContainersCreate(out beam.Sender, version version.Version, w http.Respo
|
||||
return err
|
||||
}
|
||||
|
||||
container, err := beam.Obj(out).Spawn(string(body))
|
||||
container, err := libswarm.Obj(out).Spawn(string(body))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -241,7 +242,7 @@ func postContainersCreate(out beam.Sender, version version.Version, w http.Respo
|
||||
return writeJSON(w, http.StatusCreated, response)
|
||||
}
|
||||
|
||||
func postContainersStart(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func postContainersStart(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if vars == nil {
|
||||
return fmt.Errorf("Missing parameter")
|
||||
}
|
||||
@@ -249,8 +250,8 @@ func postContainersStart(out beam.Sender, version version.Version, w http.Respon
|
||||
// TODO: r.Body
|
||||
|
||||
name := vars["name"]
|
||||
_, containerOut, err := beam.Obj(out).Attach(name)
|
||||
container := beam.Obj(containerOut)
|
||||
_, containerOut, err := libswarm.Obj(out).Attach(name)
|
||||
container := libswarm.Obj(containerOut)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -262,14 +263,14 @@ func postContainersStart(out beam.Sender, version version.Version, w http.Respon
|
||||
return nil
|
||||
}
|
||||
|
||||
func postContainersStop(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func postContainersStop(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if vars == nil {
|
||||
return fmt.Errorf("Missing parameter")
|
||||
}
|
||||
|
||||
name := vars["name"]
|
||||
_, containerOut, err := beam.Obj(out).Attach(name)
|
||||
container := beam.Obj(containerOut)
|
||||
_, containerOut, err := libswarm.Obj(out).Attach(name)
|
||||
container := libswarm.Obj(containerOut)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -291,7 +292,7 @@ func hijackServer(w http.ResponseWriter) (io.ReadCloser, io.Writer, error) {
|
||||
return conn, conn, nil
|
||||
}
|
||||
|
||||
func postContainersAttach(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func postContainersAttach(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if err := r.ParseForm(); err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -321,20 +322,20 @@ func postContainersAttach(out beam.Sender, version version.Version, w http.Respo
|
||||
fmt.Fprintf(outStream, "HTTP/1.1 200 OK\r\nContent-Type: application/vnd.docker.raw-stream\r\n\r\n")
|
||||
|
||||
// TODO: if a TTY, then no multiplexing is done
|
||||
errStream := utils.NewStdWriter(outStream, utils.Stderr)
|
||||
outStream = utils.NewStdWriter(outStream, utils.Stdout)
|
||||
errStream := dockerutils.NewStdWriter(outStream, dockerutils.Stderr)
|
||||
outStream = dockerutils.NewStdWriter(outStream, dockerutils.Stdout)
|
||||
|
||||
_, containerOut, err := beam.Obj(out).Attach(vars["name"])
|
||||
_, containerOut, err := libswarm.Obj(out).Attach(vars["name"])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
container := beam.Obj(containerOut)
|
||||
container := libswarm.Obj(containerOut)
|
||||
|
||||
containerR, _, err := container.Attach("")
|
||||
var tasks sync.WaitGroup
|
||||
go func() {
|
||||
defer tasks.Done()
|
||||
err := beam.DecodeStream(outStream, containerR, "stdout")
|
||||
err := utils.DecodeStream(outStream, containerR, "stdout")
|
||||
if err != nil {
|
||||
fmt.Printf("decodestream: %v\n", err)
|
||||
}
|
||||
@@ -342,7 +343,7 @@ func postContainersAttach(out beam.Sender, version version.Version, w http.Respo
|
||||
tasks.Add(1)
|
||||
go func() {
|
||||
defer tasks.Done()
|
||||
err := beam.DecodeStream(errStream, containerR, "stderr")
|
||||
err := utils.DecodeStream(errStream, containerR, "stderr")
|
||||
if err != nil {
|
||||
fmt.Printf("decodestream: %v\n", err)
|
||||
}
|
||||
@@ -353,7 +354,7 @@ func postContainersAttach(out beam.Sender, version version.Version, w http.Respo
|
||||
return nil
|
||||
}
|
||||
|
||||
func postContainersWait(out beam.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
func postContainersWait(out libswarm.Sender, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
|
||||
if vars == nil {
|
||||
return fmt.Errorf("Missing parameter")
|
||||
}
|
||||
@@ -365,7 +366,7 @@ func postContainersWait(out beam.Sender, version version.Version, w http.Respons
|
||||
})
|
||||
}
|
||||
|
||||
func createRouter(out beam.Sender) (*mux.Router, error) {
|
||||
func createRouter(out libswarm.Sender) (*mux.Router, error) {
|
||||
r := mux.NewRouter()
|
||||
m := map[string]map[string]HttpApiFunc{
|
||||
"GET": {
|
||||
@@ -405,7 +406,7 @@ func createRouter(out beam.Sender) (*mux.Router, error) {
|
||||
return r, nil
|
||||
}
|
||||
|
||||
func makeHttpHandler(out beam.Sender, localMethod string, localRoute string, handlerFunc HttpApiFunc, dockerVersion version.Version) http.HandlerFunc {
|
||||
func makeHttpHandler(out libswarm.Sender, localMethod string, localRoute string, handlerFunc HttpApiFunc, dockerVersion version.Version) http.HandlerFunc {
|
||||
return func(w http.ResponseWriter, r *http.Request) {
|
||||
// log the request
|
||||
fmt.Printf("Calling %s %s\n", localMethod, localRoute)
|
||||
|
||||
@@ -3,7 +3,7 @@ package backends
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"net"
|
||||
"net/http"
|
||||
"os"
|
||||
@@ -36,22 +36,22 @@ type ec2Config struct {
|
||||
type ec2Client struct {
|
||||
config *ec2Config
|
||||
ec2Conn *ec2.EC2
|
||||
Server *beam.Server
|
||||
Server *libswarm.Server
|
||||
instance *ec2.Instance
|
||||
sshTunnel *os.Process
|
||||
dockerInstance *beam.Object
|
||||
dockerInstance *libswarm.Object
|
||||
}
|
||||
|
||||
func (c *ec2Client) get(ctx *beam.Message) error {
|
||||
func (c *ec2Client) get(ctx *libswarm.Message) error {
|
||||
output, err := c.dockerInstance.Get()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{output}})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Set, Args: []string{output}})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ec2Client) start(ctx *beam.Message) error {
|
||||
func (c *ec2Client) start(ctx *libswarm.Message) error {
|
||||
if instance, err := c.findInstance(); err != nil {
|
||||
return err
|
||||
} else if instance != nil {
|
||||
@@ -73,44 +73,44 @@ func (c *ec2Client) start(ctx *beam.Message) error {
|
||||
c.waitForDockerDaemon()
|
||||
fmt.Printf("ec2 service up and running: region: %s zone: %s\n",
|
||||
c.config.region.Name, c.config.zone)
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c.Server})
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ec2Client) spawn(ctx *beam.Message) error {
|
||||
func (c *ec2Client) spawn(ctx *libswarm.Message) error {
|
||||
out, err := c.dockerInstance.Spawn(ctx.Args...)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: out})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: out})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ec2Client) ls(ctx *beam.Message) error {
|
||||
func (c *ec2Client) ls(ctx *libswarm.Message) error {
|
||||
output, err := c.dockerInstance.Ls()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: output})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Set, Args: output})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ec2Client) stop(ctx *beam.Message) error {
|
||||
func (c *ec2Client) stop(ctx *libswarm.Message) error {
|
||||
c.dockerInstance.Stop()
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *ec2Client) attach(ctx *beam.Message) error {
|
||||
func (c *ec2Client) attach(ctx *libswarm.Message) error {
|
||||
if ctx.Args[0] == "" {
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c.Server})
|
||||
<-make(chan struct{})
|
||||
} else {
|
||||
_, out, err := c.dockerInstance.Attach(ctx.Args[0])
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: out})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: out})
|
||||
}
|
||||
|
||||
return nil
|
||||
@@ -281,7 +281,7 @@ func (c *ec2Client) initDockerClientInstance(instance *ec2.Instance) error {
|
||||
URLHost: "localhost",
|
||||
})
|
||||
|
||||
dockerBackend := beam.Obj(dockerClient)
|
||||
dockerBackend := libswarm.Obj(dockerClient)
|
||||
url := fmt.Sprintf("tcp://localhost:%s", c.config.sshLocalPort)
|
||||
dockerInstance, err := dockerBackend.Spawn(url)
|
||||
c.dockerInstance = dockerInstance
|
||||
@@ -341,9 +341,9 @@ func signalHandler(client *ec2Client) {
|
||||
}()
|
||||
}
|
||||
|
||||
func Ec2() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
||||
func Ec2() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Message) error {
|
||||
var config, err = newConfig(ctx.Args)
|
||||
|
||||
if err != nil {
|
||||
@@ -355,16 +355,16 @@ func Ec2() beam.Sender {
|
||||
return err
|
||||
}
|
||||
|
||||
client := &ec2Client{config, ec2Conn, beam.NewServer(), nil, nil, nil}
|
||||
client.Server.OnVerb(beam.Spawn, beam.Handler(client.spawn))
|
||||
client.Server.OnVerb(beam.Start, beam.Handler(client.start))
|
||||
client.Server.OnVerb(beam.Stop, beam.Handler(client.stop))
|
||||
client.Server.OnVerb(beam.Attach, beam.Handler(client.attach))
|
||||
client.Server.OnVerb(beam.Ls, beam.Handler(client.ls))
|
||||
client.Server.OnVerb(beam.Get, beam.Handler(client.get))
|
||||
client := &ec2Client{config, ec2Conn, libswarm.NewServer(), nil, nil, nil}
|
||||
client.Server.OnVerb(libswarm.Spawn, libswarm.Handler(client.spawn))
|
||||
client.Server.OnVerb(libswarm.Start, libswarm.Handler(client.start))
|
||||
client.Server.OnVerb(libswarm.Stop, libswarm.Handler(client.stop))
|
||||
client.Server.OnVerb(libswarm.Attach, libswarm.Handler(client.attach))
|
||||
client.Server.OnVerb(libswarm.Ls, libswarm.Handler(client.ls))
|
||||
client.Server.OnVerb(libswarm.Get, libswarm.Handler(client.get))
|
||||
|
||||
signalHandler(client)
|
||||
_, err = ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: client.Server})
|
||||
_, err = ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: client.Server})
|
||||
|
||||
return err
|
||||
}))
|
||||
|
||||
@@ -9,12 +9,12 @@ import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
)
|
||||
|
||||
func Exec() beam.Sender {
|
||||
e := beam.NewServer()
|
||||
e.OnVerb(beam.Spawn, beam.Handler(func(msg *beam.Message) error {
|
||||
func Exec() libswarm.Sender {
|
||||
e := libswarm.NewServer()
|
||||
e.OnVerb(libswarm.Spawn, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
if len(msg.Args) < 1 {
|
||||
return fmt.Errorf("usage: SPAWN exec|... <config>")
|
||||
}
|
||||
@@ -31,9 +31,9 @@ func Exec() beam.Sender {
|
||||
}
|
||||
cmd := &command{
|
||||
Cmd: exec.Command(config.Path, config.Args...),
|
||||
Server: beam.NewServer(),
|
||||
Server: libswarm.NewServer(),
|
||||
}
|
||||
cmd.OnVerb(beam.Attach, beam.Handler(func(msg *beam.Message) error {
|
||||
cmd.OnVerb(libswarm.Attach, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
stdout, err := cmd.StdoutPipe()
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -42,11 +42,11 @@ func Exec() beam.Sender {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
inR, inW := beam.Pipe()
|
||||
if _, err := msg.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: inW}); err != nil {
|
||||
inR, inW := libswarm.Pipe()
|
||||
if _, err := msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: inW}); err != nil {
|
||||
return err
|
||||
}
|
||||
out := beam.Obj(msg.Ret)
|
||||
out := libswarm.Obj(msg.Ret)
|
||||
go func() {
|
||||
defer stdin.Close()
|
||||
for {
|
||||
@@ -54,7 +54,7 @@ func Exec() beam.Sender {
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
if msg.Verb == beam.Log && len(msg.Args) > 0 {
|
||||
if msg.Verb == libswarm.Log && len(msg.Args) > 0 {
|
||||
fmt.Fprintf(stdin, "%s\n", strings.TrimRight(msg.Args[0], "\r\n"))
|
||||
}
|
||||
}
|
||||
@@ -76,7 +76,7 @@ func Exec() beam.Sender {
|
||||
cmd.tasks.Wait()
|
||||
return nil
|
||||
}))
|
||||
cmd.OnVerb(beam.Start, beam.Handler(func(msg *beam.Message) error {
|
||||
cmd.OnVerb(libswarm.Start, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
cmd.tasks.Add(1)
|
||||
if err := cmd.Cmd.Start(); err != nil {
|
||||
return err
|
||||
@@ -84,13 +84,13 @@ func Exec() beam.Sender {
|
||||
go func() {
|
||||
defer cmd.tasks.Done()
|
||||
if err := cmd.Cmd.Wait(); err != nil {
|
||||
beam.Obj(msg.Ret).Log("%s exited status=%v", cmd.Cmd.Path, err)
|
||||
libswarm.Obj(msg.Ret).Log("%s exited status=%v", cmd.Cmd.Path, err)
|
||||
}
|
||||
}()
|
||||
msg.Ret.Send(&beam.Message{Verb: beam.Ack})
|
||||
msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack})
|
||||
return nil
|
||||
}))
|
||||
if _, err := msg.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: cmd}); err != nil {
|
||||
if _, err := msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: cmd}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -100,6 +100,6 @@ func Exec() beam.Sender {
|
||||
|
||||
type command struct {
|
||||
*exec.Cmd
|
||||
*beam.Server
|
||||
*libswarm.Server
|
||||
tasks sync.WaitGroup
|
||||
}
|
||||
|
||||
@@ -4,17 +4,18 @@ import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/docker/libswarm/utils"
|
||||
)
|
||||
|
||||
func FakeClient() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
||||
func FakeClient() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Message) error {
|
||||
// Instantiate a new fakeclient instance
|
||||
instance := beam.Task(func(in beam.Receiver, out beam.Sender) {
|
||||
instance := utils.Task(func(in libswarm.Receiver, out libswarm.Sender) {
|
||||
fmt.Printf("fake client!\n")
|
||||
defer fmt.Printf("end of fake client!\n")
|
||||
o := beam.Obj(out)
|
||||
o := libswarm.Obj(out)
|
||||
o.Log("fake client starting")
|
||||
defer o.Log("fake client terminating")
|
||||
for {
|
||||
@@ -22,7 +23,7 @@ func FakeClient() beam.Sender {
|
||||
o.Log("fake client heartbeat!")
|
||||
}
|
||||
})
|
||||
_, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: instance})
|
||||
_, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: instance})
|
||||
return err
|
||||
}))
|
||||
return backend
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
package backends
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/orchardup/go-orchard/api"
|
||||
|
||||
"crypto/tls"
|
||||
@@ -11,9 +11,9 @@ import (
|
||||
"os"
|
||||
)
|
||||
|
||||
func Orchard() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnSpawn(func(cmd ...string) (beam.Sender, error) {
|
||||
func Orchard() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnSpawn(func(cmd ...string) (libswarm.Sender, error) {
|
||||
if len(cmd) != 2 {
|
||||
return nil, fmt.Errorf("orchard: spawn expects 2 arguments: API token and name of host")
|
||||
}
|
||||
@@ -40,7 +40,7 @@ func Orchard() beam.Sender {
|
||||
URLHost: host.IPAddress,
|
||||
TLSClientConfig: tlsConfig,
|
||||
})
|
||||
forwardBackend := beam.Obj(backend)
|
||||
forwardBackend := libswarm.Obj(backend)
|
||||
forwardInstance, err := forwardBackend.Spawn(url)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
||||
@@ -3,7 +3,7 @@ package backends
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"net/url"
|
||||
@@ -11,29 +11,29 @@ import (
|
||||
"time"
|
||||
)
|
||||
|
||||
func Shipyard() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
||||
func Shipyard() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Message) error {
|
||||
if len(ctx.Args) != 3 {
|
||||
return fmt.Errorf("Shipyard: Usage <shipyard URL> <user> <pass>")
|
||||
}
|
||||
|
||||
c := &shipyard{url: ctx.Args[0], user: ctx.Args[1], pass: ctx.Args[2]}
|
||||
|
||||
c.Server = beam.NewServer()
|
||||
c.Server.OnVerb(beam.Attach, beam.Handler(c.attach))
|
||||
c.Server.OnVerb(beam.Start, beam.Handler(c.start))
|
||||
c.Server.OnVerb(beam.Ls, beam.Handler(c.containers))
|
||||
c.OnVerb(beam.Get, beam.Handler(c.containerInspect))
|
||||
_, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
|
||||
c.Server = libswarm.NewServer()
|
||||
c.Server.OnVerb(libswarm.Attach, libswarm.Handler(c.attach))
|
||||
c.Server.OnVerb(libswarm.Start, libswarm.Handler(c.start))
|
||||
c.Server.OnVerb(libswarm.Ls, libswarm.Handler(c.containers))
|
||||
c.OnVerb(libswarm.Get, libswarm.Handler(c.containerInspect))
|
||||
_, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c.Server})
|
||||
return err
|
||||
}))
|
||||
return backend
|
||||
}
|
||||
|
||||
func (c *shipyard) attach(ctx *beam.Message) error {
|
||||
func (c *shipyard) attach(ctx *libswarm.Message) error {
|
||||
if ctx.Args[0] == "" {
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c.Server})
|
||||
for {
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
@@ -41,17 +41,17 @@ func (c *shipyard) attach(ctx *beam.Message) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *shipyard) start(ctx *beam.Message) error {
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack})
|
||||
func (c *shipyard) start(ctx *libswarm.Message) error {
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack})
|
||||
return nil
|
||||
}
|
||||
|
||||
type shipyard struct {
|
||||
url, user, pass string
|
||||
*beam.Server
|
||||
*libswarm.Server
|
||||
}
|
||||
|
||||
func (c *shipyard) containers(ctx *beam.Message) error {
|
||||
func (c *shipyard) containers(ctx *libswarm.Message) error {
|
||||
out, err := c.gateway("GET", "containers", "")
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -62,7 +62,7 @@ func (c *shipyard) containers(ctx *beam.Message) error {
|
||||
for _, c := range data.Objects {
|
||||
ids = append(ids, c.Id)
|
||||
}
|
||||
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: ids}); err != nil {
|
||||
if _, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Set, Args: ids}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
@@ -76,7 +76,7 @@ type shipyardObject struct {
|
||||
Id string `json:"container_id"`
|
||||
}
|
||||
|
||||
func (c *shipyard) containerInspect(ctx *beam.Message) error {
|
||||
func (c *shipyard) containerInspect(ctx *libswarm.Message) error {
|
||||
if len(ctx.Args) != 1 {
|
||||
return fmt.Errorf("Expected 1 container id, got %s", len(ctx.Args))
|
||||
}
|
||||
@@ -87,7 +87,7 @@ func (c *shipyard) containerInspect(ctx *beam.Message) error {
|
||||
}
|
||||
var data shipyardObject
|
||||
json.Unmarshal(out, &data)
|
||||
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{"foo", "bar"}}); err != nil {
|
||||
if _, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Set, Args: []string{"foo", "bar"}}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
@@ -1,24 +1,25 @@
|
||||
package backends
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/docker/libswarm/utils"
|
||||
)
|
||||
|
||||
func Simulator() beam.Sender {
|
||||
s := beam.NewServer()
|
||||
s.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
||||
func Simulator() libswarm.Sender {
|
||||
s := libswarm.NewServer()
|
||||
s.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Message) error {
|
||||
containers := ctx.Args
|
||||
instance := beam.Task(func(in beam.Receiver, out beam.Sender) {
|
||||
beam.Obj(out).Log("[simulator] starting\n")
|
||||
s := beam.NewServer()
|
||||
s.OnVerb(beam.Ls, beam.Handler(func(msg *beam.Message) error {
|
||||
beam.Obj(out).Log("[simulator] generating fake list of objects...\n")
|
||||
beam.Obj(msg.Ret).Set(containers...)
|
||||
instance := utils.Task(func(in libswarm.Receiver, out libswarm.Sender) {
|
||||
libswarm.Obj(out).Log("[simulator] starting\n")
|
||||
s := libswarm.NewServer()
|
||||
s.OnVerb(libswarm.Ls, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
libswarm.Obj(out).Log("[simulator] generating fake list of objects...\n")
|
||||
libswarm.Obj(msg.Ret).Set(containers...)
|
||||
return nil
|
||||
}))
|
||||
beam.Copy(s, in)
|
||||
libswarm.Copy(s, in)
|
||||
})
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: instance})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: instance})
|
||||
return nil
|
||||
}))
|
||||
return s
|
||||
|
||||
@@ -3,7 +3,7 @@ package backends
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/dotcloud/docker/engine"
|
||||
"github.com/tutumcloud/go-tutum"
|
||||
"io/ioutil"
|
||||
@@ -18,9 +18,9 @@ var (
|
||||
tutumConnectorVersion = "v1.11"
|
||||
)
|
||||
|
||||
func Tutum() beam.Sender {
|
||||
backend := beam.NewServer()
|
||||
backend.OnVerb(beam.Spawn, beam.Handler(func(ctx *beam.Message) error {
|
||||
func Tutum() libswarm.Sender {
|
||||
backend := libswarm.NewServer()
|
||||
backend.OnVerb(libswarm.Spawn, libswarm.Handler(func(ctx *libswarm.Message) error {
|
||||
if len(ctx.Args) == 2 {
|
||||
tutum.User = ctx.Args[0]
|
||||
tutum.ApiKey = ctx.Args[1]
|
||||
@@ -34,13 +34,13 @@ func Tutum() beam.Sender {
|
||||
}
|
||||
t := &tutumBackend{
|
||||
tutumDockerConnector: tutumDockerConnector,
|
||||
Server: beam.NewServer(),
|
||||
Server: libswarm.NewServer(),
|
||||
}
|
||||
t.Server.OnVerb(beam.Attach, beam.Handler(t.attach))
|
||||
t.Server.OnVerb(beam.Start, beam.Handler(t.ack))
|
||||
t.Server.OnVerb(beam.Ls, beam.Handler(t.ls))
|
||||
t.Server.OnVerb(beam.Spawn, beam.Handler(t.spawn))
|
||||
_, err = ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: t.Server})
|
||||
t.Server.OnVerb(libswarm.Attach, libswarm.Handler(t.attach))
|
||||
t.Server.OnVerb(libswarm.Start, libswarm.Handler(t.ack))
|
||||
t.Server.OnVerb(libswarm.Ls, libswarm.Handler(t.ls))
|
||||
t.Server.OnVerb(libswarm.Spawn, libswarm.Handler(t.spawn))
|
||||
_, err = ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: t.Server})
|
||||
return err
|
||||
}))
|
||||
return backend
|
||||
@@ -48,28 +48,28 @@ func Tutum() beam.Sender {
|
||||
|
||||
type tutumBackend struct {
|
||||
tutumDockerConnector *tutumDockerConnector
|
||||
*beam.Server
|
||||
*libswarm.Server
|
||||
}
|
||||
|
||||
func (t *tutumBackend) attach(ctx *beam.Message) error {
|
||||
func (t *tutumBackend) attach(ctx *libswarm.Message) error {
|
||||
if ctx.Args[0] == "" {
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: t.Server})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: t.Server})
|
||||
for {
|
||||
time.Sleep(1 * time.Second)
|
||||
}
|
||||
} else {
|
||||
c := t.newContainer(ctx.Args[0])
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c})
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *tutumBackend) ack(ctx *beam.Message) error {
|
||||
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: t.Server})
|
||||
func (t *tutumBackend) ack(ctx *libswarm.Message) error {
|
||||
ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: t.Server})
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *tutumBackend) ls(ctx *beam.Message) error {
|
||||
func (t *tutumBackend) ls(ctx *libswarm.Message) error {
|
||||
resp, err := t.tutumDockerConnector.call("GET", "/containers/json", "")
|
||||
if err != nil {
|
||||
return fmt.Errorf("%s: get: %v", t.tutumDockerConnector.URL.String(), err)
|
||||
@@ -86,13 +86,13 @@ func (t *tutumBackend) ls(ctx *beam.Message) error {
|
||||
for _, env := range c.Data {
|
||||
ids = append(ids, env.GetList("Id")[0])
|
||||
}
|
||||
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: ids}); err != nil {
|
||||
if _, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Set, Args: ids}); err != nil {
|
||||
return fmt.Errorf("%s: send response: %v", t.tutumDockerConnector.URL.String(), err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *tutumBackend) spawn(ctx *beam.Message) error {
|
||||
func (t *tutumBackend) spawn(ctx *libswarm.Message) error {
|
||||
if len(ctx.Args) != 1 {
|
||||
return fmt.Errorf("tutum: spawn takes exactly 1 argument, got %d", len(ctx.Args))
|
||||
}
|
||||
@@ -112,18 +112,18 @@ func (t *tutumBackend) spawn(ctx *beam.Message) error {
|
||||
return err
|
||||
}
|
||||
c := t.newContainer(respJson.Id)
|
||||
if _, err = ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c}); err != nil {
|
||||
if _, err = ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: c}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *tutumBackend) newContainer(id string) beam.Sender {
|
||||
func (t *tutumBackend) newContainer(id string) libswarm.Sender {
|
||||
c := &tutumContainer{tutumBackend: t, id: id}
|
||||
instance := beam.NewServer()
|
||||
instance.OnVerb(beam.Get, beam.Handler(c.get))
|
||||
instance.OnVerb(beam.Start, beam.Handler(c.start))
|
||||
instance.OnVerb(beam.Stop, beam.Handler(c.stop))
|
||||
instance := libswarm.NewServer()
|
||||
instance.OnVerb(libswarm.Get, libswarm.Handler(c.get))
|
||||
instance.OnVerb(libswarm.Start, libswarm.Handler(c.start))
|
||||
instance.OnVerb(libswarm.Stop, libswarm.Handler(c.stop))
|
||||
return instance
|
||||
}
|
||||
|
||||
@@ -132,7 +132,7 @@ type tutumContainer struct {
|
||||
id string
|
||||
}
|
||||
|
||||
func (c *tutumContainer) get(ctx *beam.Message) error {
|
||||
func (c *tutumContainer) get(ctx *libswarm.Message) error {
|
||||
path := fmt.Sprintf("/containers/%s/json", c.id)
|
||||
resp, err := c.tutumBackend.tutumDockerConnector.call("GET", path, "")
|
||||
if err != nil {
|
||||
@@ -146,13 +146,13 @@ func (c *tutumContainer) get(ctx *beam.Message) error {
|
||||
if resp.StatusCode != 200 {
|
||||
return fmt.Errorf("%s", respBody)
|
||||
}
|
||||
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{string(respBody)}}); err != nil {
|
||||
if _, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Set, Args: []string{string(respBody)}}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *tutumContainer) start(ctx *beam.Message) error {
|
||||
func (c *tutumContainer) start(ctx *libswarm.Message) error {
|
||||
path := fmt.Sprintf("/containers/%s/start", c.id)
|
||||
resp, err := c.tutumBackend.tutumDockerConnector.call("POST", path, "")
|
||||
if err != nil {
|
||||
@@ -165,13 +165,13 @@ func (c *tutumContainer) start(ctx *beam.Message) error {
|
||||
if resp.StatusCode != 204 {
|
||||
return fmt.Errorf("expected status code 204, got %d:\n%s", resp.StatusCode, respBody)
|
||||
}
|
||||
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack}); err != nil {
|
||||
if _, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *tutumContainer) stop(ctx *beam.Message) error {
|
||||
func (c *tutumContainer) stop(ctx *libswarm.Message) error {
|
||||
path := fmt.Sprintf("/containers/%s/stop", c.id)
|
||||
resp, err := c.tutumBackend.tutumDockerConnector.call("POST", path, "")
|
||||
if err != nil {
|
||||
@@ -184,7 +184,7 @@ func (c *tutumContainer) stop(ctx *beam.Message) error {
|
||||
if resp.StatusCode != 204 {
|
||||
return fmt.Errorf("expected status code 204, got %d:\n%s", resp.StatusCode, respBody)
|
||||
}
|
||||
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack}); err != nil {
|
||||
if _, err := ctx.Ret.Send(&libswarm.Message{Verb: libswarm.Ack}); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
|
||||
36
beam/task.go
36
beam/task.go
@@ -1,36 +0,0 @@
|
||||
package beam
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func Task(f func(in Receiver, out Sender)) Sender {
|
||||
var running bool
|
||||
var l sync.RWMutex
|
||||
inR, inW := Pipe()
|
||||
outR, outW := Pipe()
|
||||
obj := NewServer()
|
||||
obj.OnVerb(Attach, Handler(func(msg *Message) error {
|
||||
msg.Ret.Send(&Message{Verb: Ack, Ret: inW})
|
||||
fmt.Printf("copying task output from %#v to %#v\n", outR, msg.Ret)
|
||||
defer fmt.Printf("(DONE) copying task output from %#v to %#v\n", outR, msg.Ret)
|
||||
Copy(msg.Ret, outR)
|
||||
return nil
|
||||
}))
|
||||
obj.OnVerb(Start, Handler(func(msg *Message) error {
|
||||
l.RLock()
|
||||
r := running
|
||||
l.RUnlock()
|
||||
if r {
|
||||
return fmt.Errorf("already running")
|
||||
}
|
||||
l.Lock()
|
||||
go f(inR, outW)
|
||||
running = true
|
||||
l.Unlock()
|
||||
msg.Ret.Send(&Message{Verb: Ack})
|
||||
return nil
|
||||
}))
|
||||
return obj
|
||||
}
|
||||
44
beam/tree.go
44
beam/tree.go
@@ -1,44 +0,0 @@
|
||||
package beam
|
||||
|
||||
import (
|
||||
"sort"
|
||||
)
|
||||
|
||||
type Tree struct {
|
||||
*Server
|
||||
children map[string]Sender
|
||||
}
|
||||
|
||||
func NewTree() *Tree {
|
||||
t := &Tree{
|
||||
Server: NewServer(),
|
||||
children: make(map[string]Sender),
|
||||
}
|
||||
t.OnVerb(Attach, Handler(func(msg *Message) error {
|
||||
if len(msg.Args) == 0 || msg.Args[0] == "" {
|
||||
msg.Ret.Send(&Message{Verb: Ack, Ret: t})
|
||||
return nil
|
||||
}
|
||||
if child, exists := t.children[msg.Args[0]]; exists {
|
||||
msg.Ret.Send(&Message{Verb: Ack, Ret: child})
|
||||
return nil
|
||||
}
|
||||
Obj(msg.Ret).Error("not found")
|
||||
return nil
|
||||
}))
|
||||
t.OnVerb(Ls, Handler(func(msg *Message) error {
|
||||
names := make([]string, 0, len(t.children))
|
||||
for name := range t.children {
|
||||
names = append(names, name)
|
||||
}
|
||||
sort.Strings(names)
|
||||
Obj(msg.Ret).Set(names...)
|
||||
return nil
|
||||
}))
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *Tree) Bind(name string, dst Sender) *Tree {
|
||||
t.children[name] = dst
|
||||
return t
|
||||
}
|
||||
@@ -5,46 +5,47 @@ import (
|
||||
"io"
|
||||
"log"
|
||||
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
"github.com/docker/libswarm/utils"
|
||||
)
|
||||
|
||||
// The Debug service is an example of intercepting messages between a receiver and a sender.
|
||||
// The service also exposes messages passing through it for debug purposes.
|
||||
func Debug() beam.Sender {
|
||||
func Debug() libswarm.Sender {
|
||||
dbgInstance := &debug{
|
||||
service: beam.NewServer(),
|
||||
service: libswarm.NewServer(),
|
||||
}
|
||||
|
||||
sender := beam.NewServer()
|
||||
sender.OnVerb(beam.Spawn, beam.Handler(dbgInstance.spawn))
|
||||
sender := libswarm.NewServer()
|
||||
sender.OnVerb(libswarm.Spawn, libswarm.Handler(dbgInstance.spawn))
|
||||
return sender
|
||||
}
|
||||
|
||||
// Debug service type
|
||||
type debug struct {
|
||||
service *beam.Server
|
||||
out beam.Sender
|
||||
service *libswarm.Server
|
||||
out libswarm.Sender
|
||||
}
|
||||
|
||||
// Spawn will return a new instance as the Ret channel of the message sent back
|
||||
func (dbg *debug) spawn(msg *beam.Message) (err error) {
|
||||
// By sending back a task, beam will run the function with the in and out arguments
|
||||
func (dbg *debug) spawn(msg *libswarm.Message) (err error) {
|
||||
// By sending back a task, libswarm will run the function with the in and out arguments
|
||||
// set to the services present before and after this one in the pipeline.
|
||||
instance := beam.Task(func(in beam.Receiver, out beam.Sender) {
|
||||
instance := utils.Task(func(in libswarm.Receiver, out libswarm.Sender) {
|
||||
// Setup our channels
|
||||
dbg.out = out
|
||||
|
||||
// Set up the debug interceptor
|
||||
dbg.service.Catchall(beam.Handler(dbg.catchall))
|
||||
dbg.service.Catchall(libswarm.Handler(dbg.catchall))
|
||||
|
||||
// Copy everything from the receiver to our service. By copying like this in the task
|
||||
// we can use the catchall handler instead of handling the message here.
|
||||
beam.Copy(dbg.service, in)
|
||||
libswarm.Copy(dbg.service, in)
|
||||
})
|
||||
|
||||
// Inform the system of our new instance
|
||||
msg.Ret.Send(&beam.Message{
|
||||
Verb: beam.Ack,
|
||||
msg.Ret.Send(&libswarm.Message{
|
||||
Verb: libswarm.Ack,
|
||||
Ret: instance,
|
||||
})
|
||||
|
||||
@@ -52,7 +53,7 @@ func (dbg *debug) spawn(msg *beam.Message) (err error) {
|
||||
}
|
||||
|
||||
// Catches all messages sent to the service
|
||||
func (dbg *debug) catchall(msg *beam.Message) (err error) {
|
||||
func (dbg *debug) catchall(msg *libswarm.Message) (err error) {
|
||||
log.Printf("[debug] ---> Outbound Message ---> { Verb: %s, Args: %v }\n", msg.Verb, msg.Args)
|
||||
|
||||
// If there's no output after us then we'll just reply with an error
|
||||
@@ -61,13 +62,13 @@ func (dbg *debug) catchall(msg *beam.Message) (err error) {
|
||||
return fmt.Errorf("[debug] Verb: %s is not implemented.", msg.Verb)
|
||||
}
|
||||
|
||||
// We forward the message with a special Ret value of "beam.RetPipe" - this
|
||||
// We forward the message with a special Ret value of "libswarm.RetPipe" - this
|
||||
// asks libchan to open a new pipe so that we can read replies from upstream
|
||||
forwardedMsg := &beam.Message{
|
||||
forwardedMsg := &libswarm.Message{
|
||||
Verb: msg.Verb,
|
||||
Args: msg.Args,
|
||||
Att: msg.Att,
|
||||
Ret: beam.RetPipe,
|
||||
Ret: libswarm.RetPipe,
|
||||
}
|
||||
|
||||
// Send the forwarded message
|
||||
@@ -78,7 +79,7 @@ func (dbg *debug) catchall(msg *beam.Message) (err error) {
|
||||
} else {
|
||||
for {
|
||||
// Relay all messages returned until the inbound channel is empty (EOF)
|
||||
var reply *beam.Message
|
||||
var reply *libswarm.Message
|
||||
if reply, err = inbound.Receive(0); err != nil {
|
||||
if err == io.EOF {
|
||||
// EOF is expected
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
package beam
|
||||
package libswarm
|
||||
|
||||
import (
|
||||
"github.com/docker/libchan"
|
||||
@@ -1,4 +1,4 @@
|
||||
package beam
|
||||
package libswarm
|
||||
|
||||
import (
|
||||
"io/ioutil"
|
||||
@@ -1,4 +1,4 @@
|
||||
package beam
|
||||
package libswarm
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@@ -1,4 +1,4 @@
|
||||
package beam
|
||||
package libswarm
|
||||
|
||||
import (
|
||||
"github.com/docker/libchan"
|
||||
@@ -4,7 +4,7 @@ import (
|
||||
"fmt"
|
||||
"github.com/codegangsta/cli"
|
||||
"github.com/docker/libswarm/backends"
|
||||
"github.com/docker/libswarm/beam"
|
||||
"github.com/docker/libswarm"
|
||||
_ "github.com/dotcloud/docker/api/server"
|
||||
"github.com/flynn/go-shlex"
|
||||
"io"
|
||||
@@ -24,7 +24,7 @@ func main() {
|
||||
}
|
||||
|
||||
func cmdDaemon(c *cli.Context) {
|
||||
app := beam.NewServer()
|
||||
app := libswarm.NewServer()
|
||||
app.OnLog(func(args ...string) error {
|
||||
log.Printf("%s\n", strings.Join(args, " "))
|
||||
return nil
|
||||
@@ -42,7 +42,7 @@ func cmdDaemon(c *cli.Context) {
|
||||
fmt.Println(strings.Join(names, "\n"))
|
||||
return
|
||||
}
|
||||
var previousInstanceR beam.Receiver
|
||||
var previousInstanceR libswarm.Receiver
|
||||
// FIXME: refactor into a Pipeline
|
||||
for idx, backendArg := range c.Args() {
|
||||
bName, bArgs, err := parseCmd(backendArg)
|
||||
@@ -61,9 +61,9 @@ func cmdDaemon(c *cli.Context) {
|
||||
if err != nil {
|
||||
Fatalf("attach: %v", err)
|
||||
}
|
||||
go func(r beam.Receiver, w beam.Sender, idx int) {
|
||||
go func(r libswarm.Receiver, w libswarm.Sender, idx int) {
|
||||
if r != nil {
|
||||
beam.Copy(w, r)
|
||||
libswarm.Copy(w, r)
|
||||
}
|
||||
w.Close()
|
||||
}(previousInstanceR, instanceW, idx)
|
||||
@@ -72,7 +72,7 @@ func cmdDaemon(c *cli.Context) {
|
||||
}
|
||||
previousInstanceR = instanceR
|
||||
}
|
||||
_, err := beam.Copy(app, previousInstanceR)
|
||||
_, err := libswarm.Copy(app, previousInstanceR)
|
||||
if err != nil {
|
||||
Fatalf("copy: %v", err)
|
||||
}
|
||||
|
||||
@@ -1,13 +1,15 @@
|
||||
package beam
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/docker/libchan"
|
||||
"github.com/docker/libswarm"
|
||||
|
||||
"io"
|
||||
)
|
||||
|
||||
type NopSender struct{}
|
||||
|
||||
func (s NopSender) Send(msg *Message) (Receiver, error) {
|
||||
func (s NopSender) Send(msg *libswarm.Message) (libswarm.Receiver, error) {
|
||||
return NopReceiver{}, nil
|
||||
}
|
||||
|
||||
@@ -21,7 +23,7 @@ func (s NopSender) Unwrap() libchan.Sender {
|
||||
|
||||
type NopReceiver struct{}
|
||||
|
||||
func (r NopReceiver) Receive(mode int) (*Message, error) {
|
||||
func (r NopReceiver) Receive(mode int) (*libswarm.Message, error) {
|
||||
return nil, io.EOF
|
||||
}
|
||||
|
||||
@@ -1,28 +1,30 @@
|
||||
package beam
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm"
|
||||
|
||||
"fmt"
|
||||
"io"
|
||||
)
|
||||
|
||||
func EncodeStream(sender Sender, reader io.Reader, tag string) {
|
||||
func EncodeStream(sender libswarm.Sender, reader io.Reader, tag string) {
|
||||
chunk := make([]byte, 4096)
|
||||
for {
|
||||
n, err := reader.Read(chunk)
|
||||
if n > 0 {
|
||||
sender.Send(&Message{Verb: Log, Args: []string{tag, string(chunk[0:n])}})
|
||||
sender.Send(&libswarm.Message{Verb: libswarm.Log, Args: []string{tag, string(chunk[0:n])}})
|
||||
}
|
||||
if err != nil {
|
||||
message := fmt.Sprintf("Error reading from stream: %v", err)
|
||||
sender.Send(&Message{Verb: Error, Args: []string{message}})
|
||||
sender.Send(&libswarm.Message{Verb: libswarm.Error, Args: []string{message}})
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func DecodeStream(dst io.Writer, src Receiver, tag string) error {
|
||||
func DecodeStream(dst io.Writer, src libswarm.Receiver, tag string) error {
|
||||
for {
|
||||
msg, err := src.Receive(Ret)
|
||||
msg, err := src.Receive(libswarm.Ret)
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
38
utils/task.go
Normal file
38
utils/task.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm"
|
||||
|
||||
"fmt"
|
||||
"sync"
|
||||
)
|
||||
|
||||
func Task(f func(in libswarm.Receiver, out libswarm.Sender)) libswarm.Sender {
|
||||
var running bool
|
||||
var l sync.RWMutex
|
||||
inR, inW := libswarm.Pipe()
|
||||
outR, outW := libswarm.Pipe()
|
||||
obj := libswarm.NewServer()
|
||||
obj.OnVerb(libswarm.Attach, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: inW})
|
||||
fmt.Printf("copying task output from %#v to %#v\n", outR, msg.Ret)
|
||||
defer fmt.Printf("(DONE) copying task output from %#v to %#v\n", outR, msg.Ret)
|
||||
libswarm.Copy(msg.Ret, outR)
|
||||
return nil
|
||||
}))
|
||||
obj.OnVerb(libswarm.Start, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
l.RLock()
|
||||
r := running
|
||||
l.RUnlock()
|
||||
if r {
|
||||
return fmt.Errorf("already running")
|
||||
}
|
||||
l.Lock()
|
||||
go f(inR, outW)
|
||||
running = true
|
||||
l.Unlock()
|
||||
msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack})
|
||||
return nil
|
||||
}))
|
||||
return obj
|
||||
}
|
||||
46
utils/tree.go
Normal file
46
utils/tree.go
Normal file
@@ -0,0 +1,46 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"github.com/docker/libswarm"
|
||||
|
||||
"sort"
|
||||
)
|
||||
|
||||
type Tree struct {
|
||||
*libswarm.Server
|
||||
children map[string]libswarm.Sender
|
||||
}
|
||||
|
||||
func NewTree() *Tree {
|
||||
t := &Tree{
|
||||
Server: libswarm.NewServer(),
|
||||
children: make(map[string]libswarm.Sender),
|
||||
}
|
||||
t.OnVerb(libswarm.Attach, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
if len(msg.Args) == 0 || msg.Args[0] == "" {
|
||||
msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: t})
|
||||
return nil
|
||||
}
|
||||
if child, exists := t.children[msg.Args[0]]; exists {
|
||||
msg.Ret.Send(&libswarm.Message{Verb: libswarm.Ack, Ret: child})
|
||||
return nil
|
||||
}
|
||||
libswarm.Obj(msg.Ret).Error("not found")
|
||||
return nil
|
||||
}))
|
||||
t.OnVerb(libswarm.Ls, libswarm.Handler(func(msg *libswarm.Message) error {
|
||||
names := make([]string, 0, len(t.children))
|
||||
for name := range t.children {
|
||||
names = append(names, name)
|
||||
}
|
||||
sort.Strings(names)
|
||||
libswarm.Obj(msg.Ret).Set(names...)
|
||||
return nil
|
||||
}))
|
||||
return t
|
||||
}
|
||||
|
||||
func (t *Tree) Bind(name string, dst libswarm.Sender) *Tree {
|
||||
t.children[name] = dst
|
||||
return t
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package beam
|
||||
package libswarm
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
Reference in New Issue
Block a user