mirror of https://github.com/containers/podman.git
Volume create - fast exit when ignore is set and volume exists
Signed-off-by: Ygal Blum <ygal.blum@gmail.com>
This commit is contained in:
parent
cc8c28eb7c
commit
979c77f10e
|
@ -54,12 +54,18 @@ func (r *Runtime) newVolume(ctx context.Context, noCreatePluginVolume bool, opti
|
||||||
volume.config.CreatedTime = time.Now()
|
volume.config.CreatedTime = time.Now()
|
||||||
|
|
||||||
// Check if volume with given name exists.
|
// Check if volume with given name exists.
|
||||||
if !volume.ignoreIfExists {
|
exists, err := r.state.HasVolume(volume.config.Name)
|
||||||
exists, err := r.state.HasVolume(volume.config.Name)
|
if err != nil {
|
||||||
if err != nil {
|
return nil, fmt.Errorf("checking if volume with name %s exists: %w", volume.config.Name, err)
|
||||||
return nil, fmt.Errorf("checking if volume with name %s exists: %w", volume.config.Name, err)
|
}
|
||||||
}
|
if exists {
|
||||||
if exists {
|
if volume.ignoreIfExists {
|
||||||
|
existingVolume, err := r.state.Volume(volume.config.Name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("reading volume from state: %w", err)
|
||||||
|
}
|
||||||
|
return existingVolume, nil
|
||||||
|
} else {
|
||||||
return nil, fmt.Errorf("volume with name %s already exists: %w", volume.config.Name, define.ErrVolumeExists)
|
return nil, fmt.Errorf("volume with name %s already exists: %w", volume.config.Name, define.ErrVolumeExists)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -219,13 +225,6 @@ func (r *Runtime) newVolume(ctx context.Context, noCreatePluginVolume bool, opti
|
||||||
|
|
||||||
// Add the volume to state
|
// Add the volume to state
|
||||||
if err := r.state.AddVolume(volume); err != nil {
|
if err := r.state.AddVolume(volume); err != nil {
|
||||||
if volume.ignoreIfExists && errors.Is(err, define.ErrVolumeExists) {
|
|
||||||
existingVolume, err := r.state.Volume(volume.config.Name)
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("reading volume from state: %w", err)
|
|
||||||
}
|
|
||||||
return existingVolume, nil
|
|
||||||
}
|
|
||||||
return nil, fmt.Errorf("adding volume to state: %w", err)
|
return nil, fmt.Errorf("adding volume to state: %w", err)
|
||||||
}
|
}
|
||||||
defer volume.newVolumeEvent(events.Create)
|
defer volume.newVolumeEvent(events.Create)
|
||||||
|
|
|
@ -574,5 +574,30 @@ EOF
|
||||||
run_podman volume rm myvol --force
|
run_podman volume rm myvol --force
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@test "podman volume create --ignore - do not chown" {
|
||||||
|
local user_id=2000
|
||||||
|
local group_id=2000
|
||||||
|
local volume_name=$(random_string)
|
||||||
|
|
||||||
|
# Create a volume and get its mount point
|
||||||
|
run_podman volume create --ignore ${volume_name}
|
||||||
|
run_podman volume inspect --format '{{.Mountpoint}}' $volume_name
|
||||||
|
mountpoint="$output"
|
||||||
|
|
||||||
|
# Run a container with the volume mounted
|
||||||
|
run_podman run --rm --user ${group_id}:${user_id} -v ${volume_name}:/vol $IMAGE
|
||||||
|
|
||||||
|
# Podman chowns the mount point according to the user used in the previous command
|
||||||
|
local original_owner=$(stat --format %g:%u ${mountpoint})
|
||||||
|
|
||||||
|
# Creating an existing volume with ignore should be a noop
|
||||||
|
run_podman volume create --ignore ${volume_name}
|
||||||
|
|
||||||
|
# Verify that the mountpoint was not chowned
|
||||||
|
owner=$(stat --format %g:%u ${mountpoint})
|
||||||
|
is "$owner" "${original_owner}" "The volume was chowned by podman volume create"
|
||||||
|
|
||||||
|
run_podman volume rm $volume_name --force
|
||||||
|
}
|
||||||
|
|
||||||
# vim: filetype=sh
|
# vim: filetype=sh
|
||||||
|
|
Loading…
Reference in New Issue