diff --git a/hack/vendor.sh b/hack/vendor.sh index 5467f2e1aa..5d1c61cc6a 100755 --- a/hack/vendor.sh +++ b/hack/vendor.sh @@ -25,7 +25,7 @@ clone git golang.org/x/net 78cb2c067747f08b343f20614155233ab4ea2ad3 https://gith clone git golang.org/x/sys eb2c74142fd19a79b3f237334c7384d5167b1b46 https://github.com/golang/sys.git clone git github.com/docker/go-units 651fc226e7441360384da338d0fd37f2440ffbe3 clone git github.com/docker/go-connections v0.2.0 -clone git github.com/docker/engine-api 8924d6900370b4c7e7984be5adc61f50a80d7537 +clone git github.com/docker/engine-api a6dca654f28f26b648115649f6382252ada81119 clone git github.com/RackSec/srslog 259aed10dfa74ea2961eddd1d9847619f6e98837 clone git github.com/imdario/mergo 0.2.1 diff --git a/vendor/src/github.com/docker/engine-api/client/client.go b/vendor/src/github.com/docker/engine-api/client/client.go index 0716667b3a..f91d235be4 100644 --- a/vendor/src/github.com/docker/engine-api/client/client.go +++ b/vendor/src/github.com/docker/engine-api/client/client.go @@ -114,6 +114,12 @@ func (cli *Client) ClientVersion() string { return cli.version } +// UpdateClientVersion updates the version string associated with this +// instance of the Client. +func (cli *Client) UpdateClientVersion(v string) { + cli.version = v +} + // ParseHost verifies that the given host strings is valid. func ParseHost(host string) (string, string, string, error) { protoAddrParts := strings.SplitN(host, "://", 2) diff --git a/vendor/src/github.com/docker/engine-api/client/container_attach.go b/vendor/src/github.com/docker/engine-api/client/container_attach.go index d87fc655c2..1b616bf038 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_attach.go +++ b/vendor/src/github.com/docker/engine-api/client/container_attach.go @@ -11,7 +11,7 @@ import ( // It returns a types.HijackedConnection with the hijacked connection // and the a reader to get output. It's up to the called to close // the hijacked connection by calling types.HijackedResponse.Close. -func (cli *Client) ContainerAttach(ctx context.Context, options types.ContainerAttachOptions) (types.HijackedResponse, error) { +func (cli *Client) ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) { query := url.Values{} if options.Stream { query.Set("stream", "1") @@ -30,5 +30,5 @@ func (cli *Client) ContainerAttach(ctx context.Context, options types.ContainerA } headers := map[string][]string{"Content-Type": {"text/plain"}} - return cli.postHijacked(ctx, "/containers/"+options.ContainerID+"/attach", query, nil, headers) + return cli.postHijacked(ctx, "/containers/"+container+"/attach", query, nil, headers) } diff --git a/vendor/src/github.com/docker/engine-api/client/container_commit.go b/vendor/src/github.com/docker/engine-api/client/container_commit.go index 8a6c89935a..d5c4749906 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_commit.go +++ b/vendor/src/github.com/docker/engine-api/client/container_commit.go @@ -2,18 +2,36 @@ package client import ( "encoding/json" + "errors" "net/url" + distreference "github.com/docker/distribution/reference" "github.com/docker/engine-api/types" + "github.com/docker/engine-api/types/reference" "golang.org/x/net/context" ) // ContainerCommit applies changes into a container and creates a new tagged image. -func (cli *Client) ContainerCommit(ctx context.Context, options types.ContainerCommitOptions) (types.ContainerCommitResponse, error) { +func (cli *Client) ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.ContainerCommitResponse, error) { + var repository, tag string + if options.Reference != "" { + distributionRef, err := distreference.ParseNamed(options.Reference) + if err != nil { + return types.ContainerCommitResponse{}, err + } + + if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { + return types.ContainerCommitResponse{}, errors.New("refusing to create a tag with a digest reference") + } + + tag = reference.GetTagFromNamedRef(distributionRef) + repository = distributionRef.Name() + } + query := url.Values{} - query.Set("container", options.ContainerID) - query.Set("repo", options.RepositoryName) - query.Set("tag", options.Tag) + query.Set("container", container) + query.Set("repo", repository) + query.Set("tag", tag) query.Set("comment", options.Comment) query.Set("author", options.Author) for _, change := range options.Changes { diff --git a/vendor/src/github.com/docker/engine-api/client/container_exec.go b/vendor/src/github.com/docker/engine-api/client/container_exec.go index 3119679397..ff7e1a9d05 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_exec.go +++ b/vendor/src/github.com/docker/engine-api/client/container_exec.go @@ -8,9 +8,9 @@ import ( ) // ContainerExecCreate creates a new exec configuration to run an exec process. -func (cli *Client) ContainerExecCreate(ctx context.Context, config types.ExecConfig) (types.ContainerExecCreateResponse, error) { +func (cli *Client) ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.ContainerExecCreateResponse, error) { var response types.ContainerExecCreateResponse - resp, err := cli.post(ctx, "/containers/"+config.Container+"/exec", nil, config, nil) + resp, err := cli.post(ctx, "/containers/"+container+"/exec", nil, config, nil) if err != nil { return response, err } diff --git a/vendor/src/github.com/docker/engine-api/client/container_list.go b/vendor/src/github.com/docker/engine-api/client/container_list.go index 573f41d5c6..87f7333dc7 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_list.go +++ b/vendor/src/github.com/docker/engine-api/client/container_list.go @@ -35,7 +35,8 @@ func (cli *Client) ContainerList(ctx context.Context, options types.ContainerLis } if options.Filter.Len() > 0 { - filterJSON, err := filters.ToParam(options.Filter) + filterJSON, err := filters.ToParamWithVersion(cli.version, options.Filter) + if err != nil { return nil, err } diff --git a/vendor/src/github.com/docker/engine-api/client/container_logs.go b/vendor/src/github.com/docker/engine-api/client/container_logs.go index 47c60ee3c4..9699ac7dde 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_logs.go +++ b/vendor/src/github.com/docker/engine-api/client/container_logs.go @@ -13,7 +13,7 @@ import ( // ContainerLogs returns the logs generated by a container in an io.ReadCloser. // It's up to the caller to close the stream. -func (cli *Client) ContainerLogs(ctx context.Context, options types.ContainerLogsOptions) (io.ReadCloser, error) { +func (cli *Client) ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) { query := url.Values{} if options.ShowStdout { query.Set("stdout", "1") @@ -40,7 +40,7 @@ func (cli *Client) ContainerLogs(ctx context.Context, options types.ContainerLog } query.Set("tail", options.Tail) - resp, err := cli.get(ctx, "/containers/"+options.ContainerID+"/logs", query, nil) + resp, err := cli.get(ctx, "/containers/"+container+"/logs", query, nil) if err != nil { return nil, err } diff --git a/vendor/src/github.com/docker/engine-api/client/container_remove.go b/vendor/src/github.com/docker/engine-api/client/container_remove.go index 56796231f4..cef4b81220 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_remove.go +++ b/vendor/src/github.com/docker/engine-api/client/container_remove.go @@ -8,7 +8,7 @@ import ( ) // ContainerRemove kills and removes a container from the docker host. -func (cli *Client) ContainerRemove(ctx context.Context, options types.ContainerRemoveOptions) error { +func (cli *Client) ContainerRemove(ctx context.Context, containerID string, options types.ContainerRemoveOptions) error { query := url.Values{} if options.RemoveVolumes { query.Set("v", "1") @@ -21,7 +21,7 @@ func (cli *Client) ContainerRemove(ctx context.Context, options types.ContainerR query.Set("force", "1") } - resp, err := cli.delete(ctx, "/containers/"+options.ContainerID, query, nil) + resp, err := cli.delete(ctx, "/containers/"+containerID, query, nil) ensureReaderClosed(resp) return err } diff --git a/vendor/src/github.com/docker/engine-api/client/container_resize.go b/vendor/src/github.com/docker/engine-api/client/container_resize.go index 0782017497..b95d26b335 100644 --- a/vendor/src/github.com/docker/engine-api/client/container_resize.go +++ b/vendor/src/github.com/docker/engine-api/client/container_resize.go @@ -9,13 +9,13 @@ import ( ) // ContainerResize changes the size of the tty for a container. -func (cli *Client) ContainerResize(ctx context.Context, options types.ResizeOptions) error { - return cli.resize(ctx, "/containers/"+options.ID, options.Height, options.Width) +func (cli *Client) ContainerResize(ctx context.Context, containerID string, options types.ResizeOptions) error { + return cli.resize(ctx, "/containers/"+containerID, options.Height, options.Width) } // ContainerExecResize changes the size of the tty for an exec process running inside a container. -func (cli *Client) ContainerExecResize(ctx context.Context, options types.ResizeOptions) error { - return cli.resize(ctx, "/exec/"+options.ID, options.Height, options.Width) +func (cli *Client) ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error { + return cli.resize(ctx, "/exec/"+execID, options.Height, options.Width) } func (cli *Client) resize(ctx context.Context, basePath string, height, width int) error { diff --git a/vendor/src/github.com/docker/engine-api/client/image_build.go b/vendor/src/github.com/docker/engine-api/client/image_build.go index 1612c6a1b8..4165c4e9a8 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_build.go +++ b/vendor/src/github.com/docker/engine-api/client/image_build.go @@ -3,6 +3,7 @@ package client import ( "encoding/base64" "encoding/json" + "io" "net/http" "net/url" "regexp" @@ -20,7 +21,7 @@ var headerRegexp = regexp.MustCompile(`\ADocker/.+\s\((.+)\)\z`) // ImageBuild sends request to the daemon to build images. // The Body in the response implement an io.ReadCloser and it's up to the caller to // close it. -func (cli *Client) ImageBuild(ctx context.Context, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { +func (cli *Client) ImageBuild(ctx context.Context, buildContext io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) { query, err := imageBuildOptionsToQuery(options) if err != nil { return types.ImageBuildResponse{}, err @@ -34,7 +35,7 @@ func (cli *Client) ImageBuild(ctx context.Context, options types.ImageBuildOptio headers.Add("X-Registry-Config", base64.URLEncoding.EncodeToString(buf)) headers.Set("Content-Type", "application/tar") - serverResp, err := cli.postRaw(ctx, "/build", query, options.Context, headers) + serverResp, err := cli.postRaw(ctx, "/build", query, buildContext, headers) if err != nil { return types.ImageBuildResponse{}, err } diff --git a/vendor/src/github.com/docker/engine-api/client/image_create.go b/vendor/src/github.com/docker/engine-api/client/image_create.go index 1ec1f9d09b..6dfc0391c0 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_create.go +++ b/vendor/src/github.com/docker/engine-api/client/image_create.go @@ -7,14 +7,20 @@ import ( "golang.org/x/net/context" "github.com/docker/engine-api/types" + "github.com/docker/engine-api/types/reference" ) // ImageCreate creates a new image based in the parent options. // It returns the JSON content in the response body. -func (cli *Client) ImageCreate(ctx context.Context, options types.ImageCreateOptions) (io.ReadCloser, error) { +func (cli *Client) ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) { + repository, tag, err := reference.Parse(parentReference) + if err != nil { + return nil, err + } + query := url.Values{} - query.Set("fromImage", options.Parent) - query.Set("tag", options.Tag) + query.Set("fromImage", repository) + query.Set("tag", tag) resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) if err != nil { return nil, err diff --git a/vendor/src/github.com/docker/engine-api/client/image_import.go b/vendor/src/github.com/docker/engine-api/client/image_import.go index 48e2c951a4..4e8749a01d 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_import.go +++ b/vendor/src/github.com/docker/engine-api/client/image_import.go @@ -6,22 +6,30 @@ import ( "golang.org/x/net/context" + "github.com/docker/distribution/reference" "github.com/docker/engine-api/types" ) // ImageImport creates a new image based in the source options. // It returns the JSON content in the response body. -func (cli *Client) ImageImport(ctx context.Context, options types.ImageImportOptions) (io.ReadCloser, error) { +func (cli *Client) ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) { + if ref != "" { + //Check if the given image name can be resolved + if _, err := reference.ParseNamed(ref); err != nil { + return nil, err + } + } + query := url.Values{} - query.Set("fromSrc", options.SourceName) - query.Set("repo", options.RepositoryName) + query.Set("fromSrc", source.SourceName) + query.Set("repo", ref) query.Set("tag", options.Tag) query.Set("message", options.Message) for _, change := range options.Changes { query.Add("changes", change) } - resp, err := cli.postRaw(ctx, "/images/create", query, options.Source, nil) + resp, err := cli.postRaw(ctx, "/images/create", query, source.Source, nil) if err != nil { return nil, err } diff --git a/vendor/src/github.com/docker/engine-api/client/image_pull.go b/vendor/src/github.com/docker/engine-api/client/image_pull.go index 4c045173a5..0584f00bd4 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_pull.go +++ b/vendor/src/github.com/docker/engine-api/client/image_pull.go @@ -8,22 +8,32 @@ import ( "golang.org/x/net/context" "github.com/docker/engine-api/types" + "github.com/docker/engine-api/types/reference" ) // ImagePull requests the docker host to pull an image from a remote registry. // It executes the privileged function if the operation is unauthorized // and it tries one more time. // It's up to the caller to handle the io.ReadCloser and close it properly. -func (cli *Client) ImagePull(ctx context.Context, options types.ImagePullOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) { +// +// FIXME(vdemeester): there is currently used in a few way in docker/docker +// - if not in trusted content, ref is used to pass the whole reference, and tag is empty +// - if in trusted content, ref is used to pass the reference name, and tag for the digest +func (cli *Client) ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) { + repository, tag, err := reference.Parse(ref) + if err != nil { + return nil, err + } + query := url.Values{} - query.Set("fromImage", options.ImageID) - if options.Tag != "" { - query.Set("tag", options.Tag) + query.Set("fromImage", repository) + if tag != "" { + query.Set("tag", tag) } resp, err := cli.tryImageCreate(ctx, query, options.RegistryAuth) if resp.statusCode == http.StatusUnauthorized { - newAuthHeader, privilegeErr := privilegeFunc() + newAuthHeader, privilegeErr := options.PrivilegeFunc() if privilegeErr != nil { return nil, privilegeErr } diff --git a/vendor/src/github.com/docker/engine-api/client/image_push.go b/vendor/src/github.com/docker/engine-api/client/image_push.go index 0b09362f49..8134f8018c 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_push.go +++ b/vendor/src/github.com/docker/engine-api/client/image_push.go @@ -1,30 +1,44 @@ package client import ( + "errors" "io" "net/http" "net/url" "golang.org/x/net/context" + distreference "github.com/docker/distribution/reference" "github.com/docker/engine-api/types" + "github.com/docker/engine-api/types/reference" ) // ImagePush requests the docker host to push an image to a remote registry. // It executes the privileged function if the operation is unauthorized // and it tries one more time. // It's up to the caller to handle the io.ReadCloser and close it properly. -func (cli *Client) ImagePush(ctx context.Context, options types.ImagePushOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) { - query := url.Values{} - query.Set("tag", options.Tag) +func (cli *Client) ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error) { + distributionRef, err := distreference.ParseNamed(ref) + if err != nil { + return nil, err + } - resp, err := cli.tryImagePush(ctx, options.ImageID, query, options.RegistryAuth) + if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { + return nil, errors.New("cannot push a digest reference") + } + + tag := reference.GetTagFromNamedRef(distributionRef) + + query := url.Values{} + query.Set("tag", tag) + + resp, err := cli.tryImagePush(ctx, distributionRef.Name(), query, options.RegistryAuth) if resp.statusCode == http.StatusUnauthorized { - newAuthHeader, privilegeErr := privilegeFunc() + newAuthHeader, privilegeErr := options.PrivilegeFunc() if privilegeErr != nil { return nil, privilegeErr } - resp, err = cli.tryImagePush(ctx, options.ImageID, query, newAuthHeader) + resp, err = cli.tryImagePush(ctx, distributionRef.Name(), query, newAuthHeader) } if err != nil { return nil, err diff --git a/vendor/src/github.com/docker/engine-api/client/image_remove.go b/vendor/src/github.com/docker/engine-api/client/image_remove.go index d7e71c89ce..47224326e0 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_remove.go +++ b/vendor/src/github.com/docker/engine-api/client/image_remove.go @@ -9,7 +9,7 @@ import ( ) // ImageRemove removes an image from the docker host. -func (cli *Client) ImageRemove(ctx context.Context, options types.ImageRemoveOptions) ([]types.ImageDelete, error) { +func (cli *Client) ImageRemove(ctx context.Context, imageID string, options types.ImageRemoveOptions) ([]types.ImageDelete, error) { query := url.Values{} if options.Force { @@ -19,7 +19,7 @@ func (cli *Client) ImageRemove(ctx context.Context, options types.ImageRemoveOpt query.Set("noprune", "1") } - resp, err := cli.delete(ctx, "/images/"+options.ImageID, query, nil) + resp, err := cli.delete(ctx, "/images/"+imageID, query, nil) if err != nil { return nil, err } diff --git a/vendor/src/github.com/docker/engine-api/client/image_search.go b/vendor/src/github.com/docker/engine-api/client/image_search.go index ebe9dc0b6e..3528bda6bd 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_search.go +++ b/vendor/src/github.com/docker/engine-api/client/image_search.go @@ -12,14 +12,14 @@ import ( // ImageSearch makes the docker host to search by a term in a remote registry. // The list of results is not sorted in any fashion. -func (cli *Client) ImageSearch(ctx context.Context, options types.ImageSearchOptions, privilegeFunc RequestPrivilegeFunc) ([]registry.SearchResult, error) { +func (cli *Client) ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) { var results []registry.SearchResult query := url.Values{} - query.Set("term", options.Term) + query.Set("term", term) resp, err := cli.tryImageSearch(ctx, query, options.RegistryAuth) if resp.statusCode == http.StatusUnauthorized { - newAuthHeader, privilegeErr := privilegeFunc() + newAuthHeader, privilegeErr := options.PrivilegeFunc() if privilegeErr != nil { return results, privilegeErr } diff --git a/vendor/src/github.com/docker/engine-api/client/image_tag.go b/vendor/src/github.com/docker/engine-api/client/image_tag.go index 20feda38c1..490de4e5fe 100644 --- a/vendor/src/github.com/docker/engine-api/client/image_tag.go +++ b/vendor/src/github.com/docker/engine-api/client/image_tag.go @@ -1,22 +1,38 @@ package client import ( + "errors" + "fmt" "net/url" - "github.com/docker/engine-api/types" "golang.org/x/net/context" + + distreference "github.com/docker/distribution/reference" + "github.com/docker/engine-api/types" + "github.com/docker/engine-api/types/reference" ) // ImageTag tags an image in the docker host -func (cli *Client) ImageTag(ctx context.Context, options types.ImageTagOptions) error { +func (cli *Client) ImageTag(ctx context.Context, imageID, ref string, options types.ImageTagOptions) error { + distributionRef, err := distreference.ParseNamed(ref) + if err != nil { + return fmt.Errorf("Error parsing reference: %q is not a valid repository/tag", ref) + } + + if _, isCanonical := distributionRef.(distreference.Canonical); isCanonical { + return errors.New("refusing to create a tag with a digest reference") + } + + tag := reference.GetTagFromNamedRef(distributionRef) + query := url.Values{} - query.Set("repo", options.RepositoryName) - query.Set("tag", options.Tag) + query.Set("repo", distributionRef.Name()) + query.Set("tag", tag) if options.Force { query.Set("force", "1") } - resp, err := cli.post(ctx, "/images/"+options.ImageID+"/tag", query, nil, nil) + resp, err := cli.post(ctx, "/images/"+imageID+"/tag", query, nil, nil) ensureReaderClosed(resp) return err } diff --git a/vendor/src/github.com/docker/engine-api/client/interface.go b/vendor/src/github.com/docker/engine-api/client/interface.go index e95ed55567..6c15c5bf98 100644 --- a/vendor/src/github.com/docker/engine-api/client/interface.go +++ b/vendor/src/github.com/docker/engine-api/client/interface.go @@ -15,59 +15,60 @@ import ( // APIClient is an interface that clients that talk with a docker server must implement. type APIClient interface { ClientVersion() string - ContainerAttach(ctx context.Context, options types.ContainerAttachOptions) (types.HijackedResponse, error) - ContainerCommit(ctx context.Context, options types.ContainerCommitOptions) (types.ContainerCommitResponse, error) + ContainerAttach(ctx context.Context, container string, options types.ContainerAttachOptions) (types.HijackedResponse, error) + ContainerCommit(ctx context.Context, container string, options types.ContainerCommitOptions) (types.ContainerCommitResponse, error) ContainerCreate(ctx context.Context, config *container.Config, hostConfig *container.HostConfig, networkingConfig *network.NetworkingConfig, containerName string) (types.ContainerCreateResponse, error) - ContainerDiff(ctx context.Context, ontainerID string) ([]types.ContainerChange, error) + ContainerDiff(ctx context.Context, container string) ([]types.ContainerChange, error) ContainerExecAttach(ctx context.Context, execID string, config types.ExecConfig) (types.HijackedResponse, error) - ContainerExecCreate(ctx context.Context, config types.ExecConfig) (types.ContainerExecCreateResponse, error) + ContainerExecCreate(ctx context.Context, container string, config types.ExecConfig) (types.ContainerExecCreateResponse, error) ContainerExecInspect(ctx context.Context, execID string) (types.ContainerExecInspect, error) - ContainerExecResize(ctx context.Context, options types.ResizeOptions) error + ContainerExecResize(ctx context.Context, execID string, options types.ResizeOptions) error ContainerExecStart(ctx context.Context, execID string, config types.ExecStartCheck) error - ContainerExport(ctx context.Context, containerID string) (io.ReadCloser, error) - ContainerInspect(ctx context.Context, containerID string) (types.ContainerJSON, error) - ContainerInspectWithRaw(ctx context.Context, containerID string, getSize bool) (types.ContainerJSON, []byte, error) - ContainerKill(ctx context.Context, containerID, signal string) error + ContainerExport(ctx context.Context, container string) (io.ReadCloser, error) + ContainerInspect(ctx context.Context, container string) (types.ContainerJSON, error) + ContainerInspectWithRaw(ctx context.Context, container string, getSize bool) (types.ContainerJSON, []byte, error) + ContainerKill(ctx context.Context, container, signal string) error ContainerList(ctx context.Context, options types.ContainerListOptions) ([]types.Container, error) - ContainerLogs(ctx context.Context, options types.ContainerLogsOptions) (io.ReadCloser, error) - ContainerPause(ctx context.Context, containerID string) error - ContainerRemove(ctx context.Context, options types.ContainerRemoveOptions) error - ContainerRename(ctx context.Context, containerID, newContainerName string) error - ContainerResize(ctx context.Context, options types.ResizeOptions) error - ContainerRestart(ctx context.Context, containerID string, timeout int) error - ContainerStatPath(ctx context.Context, containerID, path string) (types.ContainerPathStat, error) - ContainerStats(ctx context.Context, containerID string, stream bool) (io.ReadCloser, error) - ContainerStart(ctx context.Context, containerID string) error - ContainerStop(ctx context.Context, containerID string, timeout int) error - ContainerTop(ctx context.Context, containerID string, arguments []string) (types.ContainerProcessList, error) - ContainerUnpause(ctx context.Context, containerID string) error - ContainerUpdate(ctx context.Context, containerID string, updateConfig container.UpdateConfig) error - ContainerWait(ctx context.Context, containerID string) (int, error) - CopyFromContainer(ctx context.Context, containerID, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) + ContainerLogs(ctx context.Context, container string, options types.ContainerLogsOptions) (io.ReadCloser, error) + ContainerPause(ctx context.Context, container string) error + ContainerRemove(ctx context.Context, container string, options types.ContainerRemoveOptions) error + ContainerRename(ctx context.Context, container, newContainerName string) error + ContainerResize(ctx context.Context, container string, options types.ResizeOptions) error + ContainerRestart(ctx context.Context, container string, timeout int) error + ContainerStatPath(ctx context.Context, container, path string) (types.ContainerPathStat, error) + ContainerStats(ctx context.Context, container string, stream bool) (io.ReadCloser, error) + ContainerStart(ctx context.Context, container string) error + ContainerStop(ctx context.Context, container string, timeout int) error + ContainerTop(ctx context.Context, container string, arguments []string) (types.ContainerProcessList, error) + ContainerUnpause(ctx context.Context, container string) error + ContainerUpdate(ctx context.Context, container string, updateConfig container.UpdateConfig) error + ContainerWait(ctx context.Context, container string) (int, error) + CopyFromContainer(ctx context.Context, container, srcPath string) (io.ReadCloser, types.ContainerPathStat, error) CopyToContainer(ctx context.Context, options types.CopyToContainerOptions) error Events(ctx context.Context, options types.EventsOptions) (io.ReadCloser, error) - ImageBuild(ctx context.Context, options types.ImageBuildOptions) (types.ImageBuildResponse, error) - ImageCreate(ctx context.Context, options types.ImageCreateOptions) (io.ReadCloser, error) - ImageHistory(ctx context.Context, imageID string) ([]types.ImageHistory, error) - ImageImport(ctx context.Context, options types.ImageImportOptions) (io.ReadCloser, error) - ImageInspectWithRaw(ctx context.Context, imageID string, getSize bool) (types.ImageInspect, []byte, error) + ImageBuild(ctx context.Context, context io.Reader, options types.ImageBuildOptions) (types.ImageBuildResponse, error) + ImageCreate(ctx context.Context, parentReference string, options types.ImageCreateOptions) (io.ReadCloser, error) + ImageHistory(ctx context.Context, image string) ([]types.ImageHistory, error) + ImageImport(ctx context.Context, source types.ImageImportSource, ref string, options types.ImageImportOptions) (io.ReadCloser, error) + ImageInspectWithRaw(ctx context.Context, image string, getSize bool) (types.ImageInspect, []byte, error) ImageList(ctx context.Context, options types.ImageListOptions) ([]types.Image, error) ImageLoad(ctx context.Context, input io.Reader, quiet bool) (types.ImageLoadResponse, error) - ImagePull(ctx context.Context, options types.ImagePullOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) - ImagePush(ctx context.Context, options types.ImagePushOptions, privilegeFunc RequestPrivilegeFunc) (io.ReadCloser, error) - ImageRemove(ctx context.Context, options types.ImageRemoveOptions) ([]types.ImageDelete, error) - ImageSearch(ctx context.Context, options types.ImageSearchOptions, privilegeFunc RequestPrivilegeFunc) ([]registry.SearchResult, error) - ImageSave(ctx context.Context, imageIDs []string) (io.ReadCloser, error) - ImageTag(ctx context.Context, options types.ImageTagOptions) error + ImagePull(ctx context.Context, ref string, options types.ImagePullOptions) (io.ReadCloser, error) + ImagePush(ctx context.Context, ref string, options types.ImagePushOptions) (io.ReadCloser, error) + ImageRemove(ctx context.Context, image string, options types.ImageRemoveOptions) ([]types.ImageDelete, error) + ImageSearch(ctx context.Context, term string, options types.ImageSearchOptions) ([]registry.SearchResult, error) + ImageSave(ctx context.Context, images []string) (io.ReadCloser, error) + ImageTag(ctx context.Context, image, ref string, options types.ImageTagOptions) error Info(ctx context.Context) (types.Info, error) - NetworkConnect(ctx context.Context, networkID, containerID string, config *network.EndpointSettings) error - NetworkCreate(ctx context.Context, options types.NetworkCreate) (types.NetworkCreateResponse, error) - NetworkDisconnect(ctx context.Context, networkID, containerID string, force bool) error + NetworkConnect(ctx context.Context, networkID, container string, config *network.EndpointSettings) error + NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) + NetworkDisconnect(ctx context.Context, networkID, container string, force bool) error NetworkInspect(ctx context.Context, networkID string) (types.NetworkResource, error) NetworkList(ctx context.Context, options types.NetworkListOptions) ([]types.NetworkResource, error) NetworkRemove(ctx context.Context, networkID string) error RegistryLogin(ctx context.Context, auth types.AuthConfig) (types.AuthResponse, error) ServerVersion(ctx context.Context) (types.Version, error) + UpdateClientVersion(v string) VolumeCreate(ctx context.Context, options types.VolumeCreateRequest) (types.Volume, error) VolumeInspect(ctx context.Context, volumeID string) (types.Volume, error) VolumeList(ctx context.Context, filter filters.Args) (types.VolumesListResponse, error) diff --git a/vendor/src/github.com/docker/engine-api/client/network_create.go b/vendor/src/github.com/docker/engine-api/client/network_create.go index 2c41ad7ec4..c9c0b9fde7 100644 --- a/vendor/src/github.com/docker/engine-api/client/network_create.go +++ b/vendor/src/github.com/docker/engine-api/client/network_create.go @@ -8,9 +8,13 @@ import ( ) // NetworkCreate creates a new network in the docker host. -func (cli *Client) NetworkCreate(ctx context.Context, options types.NetworkCreate) (types.NetworkCreateResponse, error) { +func (cli *Client) NetworkCreate(ctx context.Context, name string, options types.NetworkCreate) (types.NetworkCreateResponse, error) { + networkCreateRequest := types.NetworkCreateRequest{ + NetworkCreate: options, + Name: name, + } var response types.NetworkCreateResponse - serverResp, err := cli.post(ctx, "/networks/create", nil, options, nil) + serverResp, err := cli.post(ctx, "/networks/create", nil, networkCreateRequest, nil) if err != nil { return response, err } diff --git a/vendor/src/github.com/docker/engine-api/client/privileged.go b/vendor/src/github.com/docker/engine-api/client/privileged.go index 945f18cef5..da13c8ef3c 100644 --- a/vendor/src/github.com/docker/engine-api/client/privileged.go +++ b/vendor/src/github.com/docker/engine-api/client/privileged.go @@ -1,9 +1 @@ package client - -// RequestPrivilegeFunc is a function interface that -// clients can supply to retry operations after -// getting an authorization error. -// This function returns the registry authentication -// header value in base 64 format, or an error -// if the privilege request fails. -type RequestPrivilegeFunc func() (string, error) diff --git a/vendor/src/github.com/docker/engine-api/client/request.go b/vendor/src/github.com/docker/engine-api/client/request.go index f45182399c..4ad2d24b88 100644 --- a/vendor/src/github.com/docker/engine-api/client/request.go +++ b/vendor/src/github.com/docker/engine-api/client/request.go @@ -56,12 +56,14 @@ func (cli *Client) delete(ctx context.Context, path string, query url.Values, he } func (cli *Client) sendRequest(ctx context.Context, method, path string, query url.Values, obj interface{}, headers map[string][]string) (*serverResponse, error) { - body, err := encodeData(obj) - if err != nil { - return nil, err - } + var body io.Reader - if body != nil { + if obj != nil { + var err error + body, err = encodeData(obj) + if err != nil { + return nil, err + } if headers == nil { headers = make(map[string][]string) } diff --git a/vendor/src/github.com/docker/engine-api/types/client.go b/vendor/src/github.com/docker/engine-api/types/client.go index 975a5bb639..c7067f01c5 100644 --- a/vendor/src/github.com/docker/engine-api/types/client.go +++ b/vendor/src/github.com/docker/engine-api/types/client.go @@ -12,24 +12,21 @@ import ( // ContainerAttachOptions holds parameters to attach to a container. type ContainerAttachOptions struct { - ContainerID string - Stream bool - Stdin bool - Stdout bool - Stderr bool - DetachKeys string + Stream bool + Stdin bool + Stdout bool + Stderr bool + DetachKeys string } // ContainerCommitOptions holds parameters to commit changes into a container. type ContainerCommitOptions struct { - ContainerID string - RepositoryName string - Tag string - Comment string - Author string - Changes []string - Pause bool - Config *container.Config + Reference string + Comment string + Author string + Changes []string + Pause bool + Config *container.Config } // ContainerExecInspect holds information returned by exec inspect. @@ -54,18 +51,16 @@ type ContainerListOptions struct { // ContainerLogsOptions holds parameters to filter logs with. type ContainerLogsOptions struct { - ContainerID string - ShowStdout bool - ShowStderr bool - Since string - Timestamps bool - Follow bool - Tail string + ShowStdout bool + ShowStderr bool + Since string + Timestamps bool + Follow bool + Tail string } // ContainerRemoveOptions holds parameters to remove containers. type ContainerRemoveOptions struct { - ContainerID string RemoveVolumes bool RemoveLinks bool Force bool @@ -155,19 +150,20 @@ type ImageBuildResponse struct { // ImageCreateOptions holds information to create images. type ImageCreateOptions struct { - Parent string // Parent is the name of the image to pull - Tag string // Tag is the name to tag this image with RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry } +// ImageImportSource holds source information for ImageImport +type ImageImportSource struct { + Source io.Reader // Source is the data to send to the server to create this image from (mutually exclusive with SourceName) + SourceName string // SourceName is the name of the image to pull (mutually exclusive with Source) +} + // ImageImportOptions holds information to import images from the client host. type ImageImportOptions struct { - Source io.Reader // Source is the data to send to the server to create this image from (mutually exclusive with SourceName) - SourceName string // SourceName is the name of the image to pull (mutually exclusive with Source) - RepositoryName string // RepositoryName is the name of the repository to import this image into - Message string // Message is the message to tag the image with - Tag string // Tag is the name to tag this image with - Changes []string // Changes are the raw changes to apply to this image + Tag string // Tag is the name to tag this image with. This attribute is deprecated. + Message string // Message is the message to tag the image with + Changes []string // Changes are the raw changes to apply to this image } // ImageListOptions holds parameters to filter the list of images with. @@ -185,40 +181,42 @@ type ImageLoadResponse struct { // ImagePullOptions holds information to pull images. type ImagePullOptions struct { - ImageID string // ImageID is the name of the image to pull - Tag string // Tag is the name of the tag to be pulled - RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + RegistryAuth string // RegistryAuth is the base64 encoded credentials for the registry + PrivilegeFunc RequestPrivilegeFunc } +// RequestPrivilegeFunc is a function interface that +// clients can supply to retry operations after +// getting an authorization error. +// This function returns the registry authentication +// header value in base 64 format, or an error +// if the privilege request fails. +type RequestPrivilegeFunc func() (string, error) + //ImagePushOptions holds information to push images. type ImagePushOptions ImagePullOptions // ImageRemoveOptions holds parameters to remove images. type ImageRemoveOptions struct { - ImageID string Force bool PruneChildren bool } // ImageSearchOptions holds parameters to search images with. type ImageSearchOptions struct { - Term string - RegistryAuth string + RegistryAuth string + PrivilegeFunc RequestPrivilegeFunc } // ImageTagOptions holds parameters to tag an image type ImageTagOptions struct { - ImageID string - RepositoryName string - Tag string - Force bool + Force bool } // ResizeOptions holds parameters to resize a tty. // It can be used to resize container ttys and // exec process ttys too. type ResizeOptions struct { - ID string Height int Width int } diff --git a/vendor/src/github.com/docker/engine-api/types/configs.go b/vendor/src/github.com/docker/engine-api/types/configs.go index 6874a037df..fc840e3f2d 100644 --- a/vendor/src/github.com/docker/engine-api/types/configs.go +++ b/vendor/src/github.com/docker/engine-api/types/configs.go @@ -44,7 +44,6 @@ type ExecConfig struct { User string // User that will run the command Privileged bool // Is the container in privileged mode Tty bool // Attach standard streams to a tty. - Container string // Name of the container (to execute in) AttachStdin bool // Attach the standard input, makes possible user interaction AttachStderr bool // Attach the standard output AttachStdout bool // Attach the standard error diff --git a/vendor/src/github.com/docker/engine-api/types/container/config.go b/vendor/src/github.com/docker/engine-api/types/container/config.go index b8747a5087..1dfc408348 100644 --- a/vendor/src/github.com/docker/engine-api/types/container/config.go +++ b/vendor/src/github.com/docker/engine-api/types/container/config.go @@ -19,7 +19,6 @@ type Config struct { AttachStdout bool // Attach the standard output AttachStderr bool // Attach the standard error ExposedPorts map[nat.Port]struct{} `json:",omitempty"` // List of exposed ports - PublishService string `json:",omitempty"` // Name of the network service exposed by the container Tty bool // Attach standard streams to a tty, including stdin if it is not closed. OpenStdin bool // Open stdin StdinOnce bool // If true, close stdin after the 1 attached client disconnects. diff --git a/vendor/src/github.com/docker/engine-api/types/container/host_config.go b/vendor/src/github.com/docker/engine-api/types/container/host_config.go index 7ad634b6da..cd3a9f6725 100644 --- a/vendor/src/github.com/docker/engine-api/types/container/host_config.go +++ b/vendor/src/github.com/docker/engine-api/types/container/host_config.go @@ -92,11 +92,13 @@ func (n UsernsMode) Valid() bool { // CgroupSpec represents the cgroup to use for the container. type CgroupSpec string +// IsContainer indicates whether the container is using another container cgroup func (c CgroupSpec) IsContainer() bool { parts := strings.SplitN(string(c), ":", 2) return len(parts) > 1 && parts[0] == "container" } +// Valid indicates whether the cgroup spec is valid. func (c CgroupSpec) Valid() bool { return c.IsContainer() || c == "" } diff --git a/vendor/src/github.com/docker/engine-api/types/filters/parse.go b/vendor/src/github.com/docker/engine-api/types/filters/parse.go index da2a089297..82c18845dd 100644 --- a/vendor/src/github.com/docker/engine-api/types/filters/parse.go +++ b/vendor/src/github.com/docker/engine-api/types/filters/parse.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "regexp" + "strconv" "strings" ) @@ -68,6 +69,28 @@ func ToParam(a Args) (string, error) { return string(buf), nil } +// ToParamWithVersion packs the Args into a string for easy transport from client to server. +// The generated string will depend on the specified version (corresponding to the API version). +func ToParamWithVersion(version string, a Args) (string, error) { + // this way we don't URL encode {}, just empty space + if a.Len() == 0 { + return "", nil + } + + // for daemons older than v1.10, filter must be of the form map[string][]string + buf := []byte{} + err := errors.New("") + if version != "" && compareTo(version, "1.22") == -1 { + buf, err = json.Marshal(convertArgsToSlice(a.fields)) + } else { + buf, err = json.Marshal(a.fields) + } + if err != nil { + return "", err + } + return string(buf), nil +} + // FromParam unpacks the filter Args. func FromParam(p string) (Args, error) { if len(p) == 0 { @@ -255,3 +278,48 @@ func deprecatedArgs(d map[string][]string) map[string]map[string]bool { } return m } + +func convertArgsToSlice(f map[string]map[string]bool) map[string][]string { + m := map[string][]string{} + for k, v := range f { + values := []string{} + for kk := range v { + if v[kk] { + values = append(values, kk) + } + } + m[k] = values + } + return m +} + +// compareTo compares two version strings +// returns -1 if v1 < v2, 1 if v1 > v2, 0 otherwise +func compareTo(v1, v2 string) int { + var ( + currTab = strings.Split(v1, ".") + otherTab = strings.Split(v2, ".") + ) + + max := len(currTab) + if len(otherTab) > max { + max = len(otherTab) + } + for i := 0; i < max; i++ { + var currInt, otherInt int + + if len(currTab) > i { + currInt, _ = strconv.Atoi(currTab[i]) + } + if len(otherTab) > i { + otherInt, _ = strconv.Atoi(otherTab[i]) + } + if currInt > otherInt { + return 1 + } + if otherInt > currInt { + return -1 + } + } + return 0 +} diff --git a/vendor/src/github.com/docker/engine-api/types/reference/image_reference.go b/vendor/src/github.com/docker/engine-api/types/reference/image_reference.go new file mode 100644 index 0000000000..6bfb2f99bf --- /dev/null +++ b/vendor/src/github.com/docker/engine-api/types/reference/image_reference.go @@ -0,0 +1,32 @@ +package reference + +import ( + distreference "github.com/docker/distribution/reference" +) + +// Parse parses the given references and return the repository and +// tag (if present) from it. If there is an error during parsing, it will +// return an error. +func Parse(ref string) (string, string, error) { + distributionRef, err := distreference.ParseNamed(ref) + if err != nil { + return "", "", err + } + + tag := GetTagFromNamedRef(distributionRef) + return distributionRef.Name(), tag, nil +} + +// GetTagFromNamedRef returns a tag from the specified reference. +// This function is necessary as long as the docker "server" api make the distinction between repository +// and tags. +func GetTagFromNamedRef(ref distreference.Named) string { + var tag string + switch x := ref.(type) { + case distreference.Digested: + tag = x.Digest().String() + case distreference.NamedTagged: + tag = x.Tag() + } + return tag +} diff --git a/vendor/src/github.com/docker/engine-api/types/stats.go b/vendor/src/github.com/docker/engine-api/types/stats.go index 1434033410..b420ebe7f6 100644 --- a/vendor/src/github.com/docker/engine-api/types/stats.go +++ b/vendor/src/github.com/docker/engine-api/types/stats.go @@ -91,6 +91,9 @@ type NetworkStats struct { type PidsStats struct { // Current is the number of pids in the cgroup Current uint64 `json:"current,omitempty"` + // Limit is the hard limit on the number of pids in the cgroup. + // A "Limit" of 0 means that there is no limit. + Limit uint64 `json:"limit,omitempty"` } // Stats is Ultimate struct aggregating all types of stats of one container diff --git a/vendor/src/github.com/docker/engine-api/types/types.go b/vendor/src/github.com/docker/engine-api/types/types.go index e691c3f1dd..406b561a6e 100644 --- a/vendor/src/github.com/docker/engine-api/types/types.go +++ b/vendor/src/github.com/docker/engine-api/types/types.go @@ -290,7 +290,7 @@ type ContainerState struct { FinishedAt string } -// NodeData stores information about the node that a container +// ContainerNode stores information about the node that a container // is running on. It's only available in Docker Swarm type ContainerNode struct { ID string @@ -438,7 +438,6 @@ type EndpointResource struct { // NetworkCreate is the expected body of the "create network" http request message type NetworkCreate struct { - Name string CheckDuplicate bool Driver string EnableIPv6 bool @@ -448,6 +447,12 @@ type NetworkCreate struct { Labels map[string]string } +// NetworkCreateRequest is the request message sent to the server for network create call. +type NetworkCreateRequest struct { + NetworkCreate + Name string +} + // NetworkCreateResponse is the response message sent by the server for network create call type NetworkCreateResponse struct { ID string `json:"Id"`