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>
This commit is contained in:
baude
2020-09-28 13:00:49 -05:00
parent b0e70a6411
commit be88d45f5a
2 changed files with 26 additions and 1 deletions

View File

@ -93,6 +93,29 @@ func CreateVolume(w http.ResponseWriter, r *http.Request) {
return 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 { if len(input.Name) > 0 {
volumeOptions = append(volumeOptions, libpod.WithVolumeName(input.Name)) volumeOptions = append(volumeOptions, libpod.WithVolumeName(input.Name))
} }

View File

@ -154,7 +154,9 @@ func (s *APIServer) registerVolumeHandlers(r *mux.Router) error {
// parameters: // parameters:
// - in: body // - in: body
// name: create // 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: // schema:
// $ref: "#/definitions/DockerVolumeCreate" // $ref: "#/definitions/DockerVolumeCreate"
// produces: // produces: