diff options
author | baude <bbaude@redhat.com> | 2020-09-28 13:00:49 -0500 |
---|---|---|
committer | baude <bbaude@redhat.com> | 2020-09-28 13:28:07 -0500 |
commit | be88d45f5a0b23ad26859ec85e2825e818882365 (patch) | |
tree | d7896d6fc92f0887c600babf1046ef14d0ea89cd | |
parent | b0e70a6411d70d7ee7f1e9d6abedc2524b903609 (diff) | |
download | podman-be88d45f5a0b23ad26859ec85e2825e818882365.tar.gz podman-be88d45f5a0b23ad26859ec85e2825e818882365.tar.bz2 podman-be88d45f5a0b23ad26859ec85e2825e818882365.zip |
fix for compatibility volume creation
in the compatibility layer, creating a volume with a name that already does not result in an error. instead a 201 response with the existing volume's information is returned. while it seems like a bug on the part of docker and they agree, no attempt has been made to fix it in five years. See https://github.com/moby/moby/issues/16068
Fixes: #7740
Signed-off-by: baude <bbaude@redhat.com>
-rw-r--r-- | pkg/api/handlers/compat/volumes.go | 23 | ||||
-rw-r--r-- | pkg/api/server/register_volumes.go | 4 |
2 files changed, 26 insertions, 1 deletions
diff --git a/pkg/api/handlers/compat/volumes.go b/pkg/api/handlers/compat/volumes.go index 976c52acb..a45509fdb 100644 --- a/pkg/api/handlers/compat/volumes.go +++ b/pkg/api/handlers/compat/volumes.go @@ -93,6 +93,29 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) { return } + // See if the volume exists already + existingVolume, err := runtime.GetVolume(input.Name) + if err != nil && errors.Cause(err) != define.ErrNoSuchVolume { + utils.InternalServerError(w, err) + return + } + + // if using the compat layer and the volume already exists, we + // must return a 201 with the same information as create + if existingVolume != nil && !utils.IsLibpodRequest(r) { + response := docker_api_types.Volume{ + CreatedAt: existingVolume.CreatedTime().Format(time.RFC3339), + Driver: existingVolume.Driver(), + Labels: existingVolume.Labels(), + Mountpoint: existingVolume.MountPoint(), + Name: existingVolume.Name(), + Options: existingVolume.Options(), + Scope: existingVolume.Scope(), + } + utils.WriteResponse(w, http.StatusCreated, response) + return + } + if len(input.Name) > 0 { volumeOptions = append(volumeOptions, libpod.WithVolumeName(input.Name)) } diff --git a/pkg/api/server/register_volumes.go b/pkg/api/server/register_volumes.go index 22488b158..aa0f67604 100644 --- a/pkg/api/server/register_volumes.go +++ b/pkg/api/server/register_volumes.go @@ -154,7 +154,9 @@ func (s *APIServer) registerVolumeHandlers(r *mux.Router) error { // parameters: // - in: body // name: create - // description: attributes for creating a container + // description: | + // attributes for creating a container. + // Note: If a volume by the same name exists, a 201 response with that volume's information will be generated. // schema: // $ref: "#/definitions/DockerVolumeCreate" // produces: |