diff --git a/backends/backends.go b/backends/backends.go index 10047d1b17..a812f5704b 100644 --- a/backends/backends.go +++ b/backends/backends.go @@ -16,5 +16,6 @@ func New() *engine.Engine { // Register all backends here Debug().Install(back) Simulator().Install(back) + Forward().Install(back) return back } diff --git a/backends/forward.go b/backends/forward.go new file mode 100644 index 0000000000..f9271a595f --- /dev/null +++ b/backends/forward.go @@ -0,0 +1,87 @@ +package backends + +import ( + "fmt" + "github.com/dotcloud/docker/engine" + "io/ioutil" + "net/http" + "net/url" + "strings" +) + +func Forward() engine.Installer { + return &forwarder{} +} + +type forwarder struct { +} + +func (f *forwarder) Install(eng *engine.Engine) error { + eng.Register("forward", func(job *engine.Job) engine.Status { + if len(job.Args) != 1 { + return job.Errorf("usage: %s ://", job.Name) + } + client, err := newClient(job.Args[0], "v0.10") + if err != nil { + return job.Errorf("%v", err) + } + job.Eng.Register("containers", func(job *engine.Job) engine.Status { + resp, err := client.call("GET", "/containers/json?all=1", "") + if err != nil { + return job.Errorf("%s: get: %v", client.URL.String(), err) + } + // FIXME: check for response error + c := engine.NewTable("Created", 0) + body, err := ioutil.ReadAll(resp.Body) + if err != nil { + return job.Errorf("%s: read body: %v", client.URL.String(), err) + } + fmt.Printf("---> '%s'\n", body) + if _, err := c.ReadListFrom(body); err != nil { + return job.Errorf("%s: readlist: %v", client.URL.String(), err) + } + c.WriteListTo(job.Stdout) + return engine.StatusOK + }) + return engine.StatusOK + }) + return nil +} + +type client struct { + URL *url.URL + proto string + addr string + version string +} + +func newClient(peer, version string) (*client, error) { + u, err := url.Parse(peer) + if err != nil { + return nil, err + } + c := &client{ + URL: u, + version: version, + } + c.URL.Scheme = "http" + return c, nil +} + +func (c *client) call(method, path, body string) (*http.Response, error) { + u, err := url.Parse(path) + if err != nil { + return nil, err + } + u.Host = c.URL.Host + u.Scheme = c.URL.Scheme + req, err := http.NewRequest(method, u.String(), strings.NewReader(body)) + if err != nil { + return nil, err + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, err + } + return resp, nil +}