From 5ed023ae9c8de0c76c285aac3d06cc5e340e897d Mon Sep 17 00:00:00 2001 From: Kyle Date: Thu, 1 Oct 2015 01:00:12 +0000 Subject: [PATCH] add PushImage() --- dockerclient.go | 31 +++++++++++++++++++++++++++++++ interface.go | 1 + mockclient/mock.go | 5 +++++ 3 files changed, 37 insertions(+) diff --git a/dockerclient.go b/dockerclient.go index 81428b3..ef8f377 100644 --- a/dockerclient.go +++ b/dockerclient.go @@ -525,6 +525,37 @@ func (client *DockerClient) Version() (*Version, error) { return version, nil } +func (client *DockerClient) PushImage(name string, tag string, auth *AuthConfig) error { + v := url.Values{} + if tag != "" { + v.Set("tag", tag) + } + uri := fmt.Sprintf("/%s/images/%s/push?%s", APIVersion, url.QueryEscape(name), v.Encode()) + req, err := http.NewRequest("POST", client.URL.String()+uri, nil) + if auth != nil { + if encodedAuth, err := auth.encode(); err != nil { + return err + } else { + req.Header.Add("X-Registry-Auth", encodedAuth) + } + } + resp, err := client.HTTPClient.Do(req) + if err != nil { + return err + } + defer resp.Body.Close() + var finalObj map[string]interface{} + for decoder := json.NewDecoder(resp.Body); err == nil; err = decoder.Decode(&finalObj) { + } + if err != io.EOF { + return err + } + if err, ok := finalObj["error"]; ok { + return fmt.Errorf("%v", err) + } + return nil +} + func (client *DockerClient) PullImage(name string, auth *AuthConfig) error { v := url.Values{} v.Set("fromImage", name) diff --git a/interface.go b/interface.go index b173fc1..5773bb0 100644 --- a/interface.go +++ b/interface.go @@ -36,6 +36,7 @@ type Client interface { TagImage(nameOrID string, repo string, tag string, force bool) error Version() (*Version, error) PullImage(name string, auth *AuthConfig) error + PushImage(name string, tag string, auth *AuthConfig) error LoadImage(reader io.Reader) error RemoveContainer(id string, force, volumes bool) error ListImages(all bool) ([]*Image, error) diff --git a/mockclient/mock.go b/mockclient/mock.go index b12195d..e559812 100644 --- a/mockclient/mock.go +++ b/mockclient/mock.go @@ -111,6 +111,11 @@ func (client *MockClient) PullImage(name string, auth *dockerclient.AuthConfig) return args.Error(0) } +func (client *MockClient) PushImage(name string, tag string, auth *AuthConfig) error { + args := client.Mock.Called(name, tag, auth) + return args.Error(0) +} + func (client *MockClient) LoadImage(reader io.Reader) error { args := client.Mock.Called(reader) return args.Error(0)