diff --git a/backends/backends.go b/backends/backends.go index 1ddeeb2520..5ecf28a3cf 100644 --- a/backends/backends.go +++ b/backends/backends.go @@ -19,5 +19,6 @@ func New() *engine.Engine { Forward().Install(back) CloudBackend().Install(back) Tutum().Install(back) + Shipyard().Install(back) return back } diff --git a/backends/shipyard.go b/backends/shipyard.go new file mode 100644 index 0000000000..14f3b41ec9 --- /dev/null +++ b/backends/shipyard.go @@ -0,0 +1,93 @@ +package backends + +import ( + "fmt" + "github.com/dotcloud/docker/engine" + "io/ioutil" + "log" + "net/http" + "net/url" + "strings" +) + +func Shipyard() engine.Installer { + return &shipyard{} +} + +type shipyard struct { + url, user, pass string +} + +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 + }) + + 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 +} + +func (c *shipyard) container_inspect(job *engine.Job) engine.Status { + path := fmt.Sprintf("containers/details/%s", job.Args[0]) + 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) gateway(method, path, body string) ([]byte, error) { + apiPath := fmt.Sprintf("%s/api/v1/%s&format=json", c.url, path) + url, err := url.Parse(apiPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest(method, url.String(), strings.NewReader(body)) + if err != nil { + return nil, err + } + + req.Header.Set("Authorization", "ApiKey "+c.api_key()) + resp, err := http.DefaultClient.Do(req) + defer resp.Body.Close() + if err != nil { + return nil, err + } + + out, err := ioutil.ReadAll(resp.Body) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *shipyard) api_key() string { + return c.user + ":" + c.pass +}