Merge pull request #55 from cpuguy83/update_shipyard_to_use_beam

This commit is contained in:
Solomon Hykes 2014-06-08 15:35:01 -07:00
commit 7d339dedc5
2 changed files with 71 additions and 39 deletions

View File

@ -20,5 +20,6 @@ func New() *beam.Object {
backends.Bind("dockerserver", DockerServer())
backends.Bind("orchard", Orchard())
backends.Bind("aggregate", Aggregate())
backends.Bind("shipyard", Shipyard())
return beam.Obj(backends)
}

View File

@ -1,69 +1,100 @@
package backends
import (
"encoding/json"
"fmt"
"github.com/dotcloud/docker/engine"
"github.com/docker/libswarm/beam"
"io/ioutil"
"log"
"net/http"
"net/url"
"strings"
"time"
)
func Shipyard() engine.Installer {
return &shipyard{}
func Shipyard() beam.Sender {
backend := beam.NewServer()
backend.OnSpawn(beam.Handler(func(ctx *beam.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.OnAttach(beam.Handler(c.attach))
c.Server.OnStart(beam.Handler(c.start))
c.Server.OnLs(beam.Handler(c.containers))
c.OnGet(beam.Handler(c.containerInspect))
_, err := ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
return err
}))
return backend
}
func (c *shipyard) attach(ctx *beam.Message) error {
if ctx.Args[0] == "" {
ctx.Ret.Send(&beam.Message{Verb: beam.Ack, Ret: c.Server})
for {
time.Sleep(1 * time.Second)
}
}
return nil
}
func (c *shipyard) start(ctx *beam.Message) error {
ctx.Ret.Send(&beam.Message{Verb: beam.Ack})
return nil
}
type shipyard struct {
url, user, pass string
*beam.Server
}
func (s *shipyard) Install(eng *engine.Engine) error {
eng.Register("shipyard", func(job *engine.Job) engine.Status {
if len(job.Args) != 3 {
return job.Errorf("usage: <shipyard url> <user> <pass>")
func (c *shipyard) containers(ctx *beam.Message) error {
out, err := c.gateway("GET", "containers", "")
if err != nil {
return err
}
var data shipyardObjects
json.Unmarshal(out, &data)
var ids []string
for _, c := range data.Objects {
ids = append(ids, c.Id)
}
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: ids}); err != nil {
return err
}
s.url = job.Args[0]
s.user = job.Args[1]
s.pass = job.Args[2]
job.Eng.Register("containers", s.containers)
job.Eng.Register("container_inspect", s.container_inspect)
return engine.StatusOK
})
return nil
}
func (c *shipyard) containers(job *engine.Job) engine.Status {
var args string
if job.Getenv("limit") != "" {
args = fmt.Sprintf("%s&limit=%s", args, url.QueryEscape(job.Getenv("limit")))
}
if job.Getenv("offset") != "" {
args = fmt.Sprintf("%s&offset=%s", args, url.QueryEscape(job.Getenv("offset")))
type shipyardObjects struct {
Objects []shipyardObject `json:"objects"`
}
path := fmt.Sprintf("containers/?%s", args)
out, err := c.gateway("GET", path, "")
if err != nil {
return job.Errorf("%s: get: %v", path, err)
}
log.Printf("%s", out)
return engine.StatusOK
type shipyardObject struct {
Id string `json:"container_id"`
}
func (c *shipyard) container_inspect(job *engine.Job) engine.Status {
path := fmt.Sprintf("containers/details/%s", job.Args[0])
func (c *shipyard) containerInspect(ctx *beam.Message) error {
if len(ctx.Args) != 1 {
return fmt.Errorf("Expected 1 container id, got %s", len(ctx.Args))
}
path := fmt.Sprintf("containers/details/%s", ctx.Args[0])
out, err := c.gateway("GET", path, "")
if err != nil {
return job.Errorf("%s: get: %v", path, err)
return err
}
log.Printf("%s", out)
return engine.StatusOK
var data shipyardObject
json.Unmarshal(out, &data)
if _, err := ctx.Ret.Send(&beam.Message{Verb: beam.Set, Args: []string{"foo", "bar"}}); err != nil {
return err
}
return nil
}
func (c *shipyard) gateway(method, path, body string) ([]byte, error) {
apiPath := fmt.Sprintf("%s/api/v1/%s&format=json", c.url, path)
apiPath := fmt.Sprintf("%s/api/v1/%s/?format=json", c.url, path)
url, err := url.Parse(apiPath)
if err != nil {
return nil, err