Deprecate /containers/(id or name)/copy endpoint

This endpoint has been deprecated since 1.8. Return an error starting
from this API version (1.24) in order to make sure it's not used for the
next API version and so that we can remove it some times later.

Signed-off-by: Vincent Demeester <vincent@sbr.pm>
This commit is contained in:
Vincent Demeester 2016-06-03 19:38:03 +02:00
parent 020a86b3d9
commit 428328908d
No known key found for this signature in database
GPG key ID: 083CC6FD6EB699A3
6 changed files with 40 additions and 39 deletions

View file

@ -62,7 +62,7 @@ func (r *containerRouter) initRoutes() {
router.NewPostRoute("/containers/{name:.*}/wait", r.postContainersWait),
router.NewPostRoute("/containers/{name:.*}/resize", r.postContainersResize),
router.NewPostRoute("/containers/{name:.*}/attach", r.postContainersAttach),
router.NewPostRoute("/containers/{name:.*}/copy", r.postContainersCopy),
router.NewPostRoute("/containers/{name:.*}/copy", r.postContainersCopy), // Deprecated since 1.8, Errors out since 1.12
router.NewPostRoute("/containers/{name:.*}/exec", r.postContainerExecCreate),
router.NewPostRoute("/exec/{name:.*}/start", r.postContainerExecStart),
router.NewPostRoute("/exec/{name:.*}/resize", r.postContainerExecResize),

View file

@ -11,11 +11,18 @@ import (
"github.com/docker/docker/api/server/httputils"
"github.com/docker/engine-api/types"
"github.com/docker/engine-api/types/versions"
"golang.org/x/net/context"
)
// postContainersCopy is deprecated in favor of getContainersArchive.
func (s *containerRouter) postContainersCopy(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
// Deprecated since 1.8, Errors out since 1.12
version := httputils.VersionFromContext(ctx)
if versions.GreaterThanOrEqualTo(version, "1.24") {
w.WriteHeader(http.StatusNotFound)
return nil
}
if err := httputils.CheckForJSON(r); err != nil {
return err
}

View file

@ -28,6 +28,14 @@ The docker login command is removing the ability to automatically register for a
The flag `--security-opt` doesn't use the colon separator(`:`) anymore to divide keys and values, it uses the equal symbol(`=`) for consinstency with other similar flags, like `--storage-opt`.
### `/containers/(id or name)/copy` endpoint
**Deprecated In Release: v1.8**
**Removed In Release: v1.12.0**
The endpoint `/containers/(id or name)/copy` is deprecated in favor of `/containers/(id or name)/archive`.
### Ambiguous event fields in API
**Deprecated In Release: v1.10**

View file

@ -125,6 +125,7 @@ This section lists each version from latest to oldest. Each listing includes a
* `POST /containers/(id or name)/start` no longer accepts a `HostConfig`.
* `POST /images/(name)/tag` no longer has a `force` query parameter.
* `GET /images/search` now supports maximum returned search results `limit`.
* `POST /containers/{name:.*}/copy` is now removed and errors out starting from this API version.
### v1.23 API changes

View file

@ -1389,36 +1389,6 @@ Status Codes:
- **404** no such container
- **500** server error
### Copy files or folders from a container
`POST /containers/(id or name)/copy`
Copy files or folders of container `id`
**Deprecated** in favor of the `archive` endpoint below.
**Example request**:
POST /containers/4fa6e0f0c678/copy HTTP/1.1
Content-Type: application/json
{
"Resource": "test.txt"
}
**Example response**:
HTTP/1.1 200 OK
Content-Type: application/x-tar
{{ TAR STREAM }}
Status Codes:
- **200** no error
- **404** no such container
- **500** server error
### Retrieving information about files and folders in a container
`HEAD /containers/(id or name)/archive`

View file

@ -892,7 +892,7 @@ func (s *DockerSuite) TestContainerApiWait(c *check.C) {
c.Assert(waitres.StatusCode, checker.Equals, 0)
}
func (s *DockerSuite) TestContainerApiCopy(c *check.C) {
func (s *DockerSuite) TestContainerApiCopyNotExistsAnyMore(c *check.C) {
// TODO Windows to Windows CI. This can be ported.
testRequires(c, DaemonIsLinux)
name := "test-container-api-copy"
@ -902,7 +902,22 @@ func (s *DockerSuite) TestContainerApiCopy(c *check.C) {
Resource: "/test.txt",
}
status, body, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
status, _, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
c.Assert(err, checker.IsNil)
c.Assert(status, checker.Equals, http.StatusNotFound)
}
func (s *DockerSuite) TestContainerApiCopyPre124(c *check.C) {
// TODO Windows to Windows CI. This can be ported.
testRequires(c, DaemonIsLinux)
name := "test-container-api-copy"
dockerCmd(c, "run", "--name", name, "busybox", "touch", "/test.txt")
postData := types.CopyConfig{
Resource: "/test.txt",
}
status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData)
c.Assert(err, checker.IsNil)
c.Assert(status, checker.Equals, http.StatusOK)
@ -923,7 +938,7 @@ func (s *DockerSuite) TestContainerApiCopy(c *check.C) {
c.Assert(found, checker.True)
}
func (s *DockerSuite) TestContainerApiCopyResourcePathEmpty(c *check.C) {
func (s *DockerSuite) TestContainerApiCopyResourcePathEmptyPr124(c *check.C) {
// TODO Windows to Windows CI. This can be ported.
testRequires(c, DaemonIsLinux)
name := "test-container-api-copy-resource-empty"
@ -933,13 +948,13 @@ func (s *DockerSuite) TestContainerApiCopyResourcePathEmpty(c *check.C) {
Resource: "",
}
status, body, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData)
c.Assert(err, checker.IsNil)
c.Assert(status, checker.Equals, http.StatusInternalServerError)
c.Assert(string(body), checker.Matches, "Path cannot be empty\n")
}
func (s *DockerSuite) TestContainerApiCopyResourcePathNotFound(c *check.C) {
func (s *DockerSuite) TestContainerApiCopyResourcePathNotFoundPre124(c *check.C) {
// TODO Windows to Windows CI. This can be ported.
testRequires(c, DaemonIsLinux)
name := "test-container-api-copy-resource-not-found"
@ -949,18 +964,18 @@ func (s *DockerSuite) TestContainerApiCopyResourcePathNotFound(c *check.C) {
Resource: "/notexist",
}
status, body, err := sockRequest("POST", "/containers/"+name+"/copy", postData)
status, body, err := sockRequest("POST", "/v1.23/containers/"+name+"/copy", postData)
c.Assert(err, checker.IsNil)
c.Assert(status, checker.Equals, http.StatusInternalServerError)
c.Assert(string(body), checker.Matches, "Could not find the file /notexist in container "+name+"\n")
}
func (s *DockerSuite) TestContainerApiCopyContainerNotFound(c *check.C) {
func (s *DockerSuite) TestContainerApiCopyContainerNotFoundPr124(c *check.C) {
postData := types.CopyConfig{
Resource: "/something",
}
status, _, err := sockRequest("POST", "/containers/notexists/copy", postData)
status, _, err := sockRequest("POST", "/v1.23/containers/notexists/copy", postData)
c.Assert(err, checker.IsNil)
c.Assert(status, checker.Equals, http.StatusNotFound)
}