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("dockerserver", DockerServer())
backends.Bind("orchard", Orchard()) backends.Bind("orchard", Orchard())
backends.Bind("aggregate", Aggregate()) backends.Bind("aggregate", Aggregate())
backends.Bind("shipyard", Shipyard())
return beam.Obj(backends) return beam.Obj(backends)
} }

View File

@ -1,69 +1,100 @@
package backends package backends
import ( import (
"encoding/json"
"fmt" "fmt"
"github.com/dotcloud/docker/engine" "github.com/docker/libswarm/beam"
"io/ioutil" "io/ioutil"
"log"
"net/http" "net/http"
"net/url" "net/url"
"strings" "strings"
"time"
) )
func Shipyard() engine.Installer { func Shipyard() beam.Sender {
return &shipyard{} 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 { type shipyard struct {
url, user, pass string url, user, pass string
*beam.Server
} }
func (s *shipyard) Install(eng *engine.Engine) error { func (c *shipyard) containers(ctx *beam.Message) error {
eng.Register("shipyard", func(job *engine.Job) engine.Status { out, err := c.gateway("GET", "containers", "")
if len(job.Args) != 3 { if err != nil {
return job.Errorf("usage: <shipyard url> <user> <pass>") 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 return nil
} }
func (c *shipyard) containers(job *engine.Job) engine.Status { type shipyardObjects struct {
var args string Objects []shipyardObject `json:"objects"`
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")))
}
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
} }
func (c *shipyard) container_inspect(job *engine.Job) engine.Status { type shipyardObject struct {
path := fmt.Sprintf("containers/details/%s", job.Args[0]) Id string `json:"container_id"`
}
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, "") out, err := c.gateway("GET", path, "")
if err != nil { if err != nil {
return job.Errorf("%s: get: %v", path, err) return err
} }
log.Printf("%s", out) var data shipyardObject
return engine.StatusOK 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) { 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) url, err := url.Parse(apiPath)
if err != nil { if err != nil {
return nil, err return nil, err