From c2f2fc038589fb2fef9cd4e0cb5eed401a93ef88 Mon Sep 17 00:00:00 2001 From: cpuguy83 Date: Sat, 7 Jun 2014 21:26:51 -0700 Subject: [PATCH 1/2] Update shipyard backend to use beam --- backends/backends.go | 1 + backends/shipyard.go | 109 +++++++++++++++++++++++++++---------------- 2 files changed, 71 insertions(+), 39 deletions(-) diff --git a/backends/backends.go b/backends/backends.go index 21434abb32..f3eaccf3c2 100644 --- a/backends/backends.go +++ b/backends/backends.go @@ -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) } diff --git a/backends/shipyard.go b/backends/shipyard.go index 14f3b41ec9..11b0bb2855 100644 --- a/backends/shipyard.go +++ b/backends/shipyard.go @@ -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 ") + } + + 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: ") - } - 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 - }) - +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 + } 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"))) - } - - 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 shipyardObjects struct { + Objects []shipyardObject `json:"objects"` } -func (c *shipyard) container_inspect(job *engine.Job) engine.Status { - path := fmt.Sprintf("containers/details/%s", job.Args[0]) +type shipyardObject struct { + 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, "") 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 From 84798081a404b7dd25c1e4fa139dfb7e5a93ce86 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Mon, 2 Jun 2014 11:27:53 +0000 Subject: [PATCH 2/2] Add contribution guidelines Signed-off-by: Solomon Hykes --- CONTRIBUTING.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..6c89d9d199 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,13 @@ +# Contributing to libswarm + +Want to hack on libswarm? Awesome! Here are instructions to get you +started. + +Libswarm is a part of the [Docker](https://docker.io) project, and follows +the same rules and principles. If you're already familiar with the way +Docker does things, you'll feel right at home. + +Otherwise, go read +[Docker's contributions guidelines](https://github.com/dotcloud/docker/blob/master/CONTRIBUTING.md). + +Happy hacking!