mirror of https://github.com/docker/docs.git
77 lines
2.1 KiB
Go
77 lines
2.1 KiB
Go
package backends
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/docker/libswarm/beam"
|
|
beamutils "github.com/docker/libswarm/beam/utils"
|
|
"io"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
// New returns a new engine, with all backends
|
|
// registered but not activated.
|
|
// To activate a backend, call a job on the resulting
|
|
// engine, named after the desired backend.
|
|
//
|
|
// Example: `New().Job("debug").Run()`
|
|
func New() beam.Sender {
|
|
backends := beamutils.NewHub()
|
|
backends.RegisterName("cd", func(msg *beam.Message, out beam.Sender) (bool, error) {
|
|
return false, fmt.Errorf("no such backend: %s\n", strings.Join(msg.Args, " "))
|
|
})
|
|
backends.RegisterName("cd", func(msg *beam.Message, out beam.Sender) (bool, error) {
|
|
if len(msg.Args) > 0 && msg.Args[0] == "debug" {
|
|
debug, err := out.Send(&beam.Message{Name: "register", Ret: beam.RetPipe})
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
// Spawn the debug object
|
|
go func() {
|
|
for {
|
|
msg, err := debug.Receive(beam.Ret)
|
|
if err == io.EOF {
|
|
return
|
|
}
|
|
if err != nil {
|
|
return
|
|
}
|
|
fmt.Printf("[DEBUG] %s %s\n", msg.Name, strings.Join(msg.Args, " "))
|
|
if _, err := out.Send(msg); err != nil {
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
return false, nil
|
|
}
|
|
return true, nil
|
|
})
|
|
backends.RegisterName("cd", func(msg *beam.Message, out beam.Sender) (bool, error) {
|
|
if len(msg.Args) > 0 && msg.Args[0] == "fakeclient" {
|
|
_, err := out.Send(&beam.Message{Name: "register", Ret: beam.NopSender{}})
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
// Spawm the fakeclient task
|
|
// FIXME: only do this after started?
|
|
go func() {
|
|
out.Send(&beam.Message{Name: "log", Args: []string{"fake client starting"}})
|
|
defer out.Send(&beam.Message{Name: "log", Args: []string{"fake client terminating"}})
|
|
for {
|
|
time.Sleep(1 * time.Second)
|
|
_, err := out.Send(&beam.Message{Name: "log", Args: []string{"fake client reporting for duty"}})
|
|
if err != nil {
|
|
return
|
|
}
|
|
if _, err := out.Send(&beam.Message{Name: "children", Ret: beam.NopSender{}}); err != nil {
|
|
return
|
|
}
|
|
}
|
|
}()
|
|
return false, nil
|
|
}
|
|
return true, nil
|
|
})
|
|
return backends
|
|
}
|