mirror of
https://github.com/containers/podman.git
synced 2026-03-13 08:01:19 +08:00
Add "podman volume" command
Add support for podman volume and its subcommands. The commands supported are: podman volume create podman volume inspect podman volume ls podman volume rm podman volume prune This is a tool to manage volumes used by podman. For now it only handle named volumes, but eventually it will handle all volumes used by podman. Signed-off-by: umohnani8 <umohnani@redhat.com>
This commit is contained in:
committed by
Urvashi Mohnani
parent
75b19ca8ab
commit
4c70b8a94b
107
libpod/runtime_volume.go
Normal file
107
libpod/runtime_volume.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package libpod
|
||||
|
||||
import (
|
||||
"context"
|
||||
)
|
||||
|
||||
// Contains the public Runtime API for volumes
|
||||
|
||||
// A VolumeCreateOption is a functional option which alters the Volume created by
|
||||
// NewVolume
|
||||
type VolumeCreateOption func(*Volume) error
|
||||
|
||||
// VolumeFilter is a function to determine whether a volume is included in command
|
||||
// output. Volumes to be outputted are tested using the function. a true return will
|
||||
// include the volume, a false return will exclude it.
|
||||
type VolumeFilter func(*Volume) bool
|
||||
|
||||
// RemoveVolume removes a volumes
|
||||
func (r *Runtime) RemoveVolume(ctx context.Context, v *Volume, force, prune bool) error {
|
||||
r.lock.Lock()
|
||||
defer r.lock.Unlock()
|
||||
|
||||
if !r.valid {
|
||||
return ErrRuntimeStopped
|
||||
}
|
||||
|
||||
if !v.valid {
|
||||
if ok, _ := r.state.HasVolume(v.Name()); !ok {
|
||||
// Volume probably already removed
|
||||
// Or was never in the runtime to begin with
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
v.lock.Lock()
|
||||
defer v.lock.Unlock()
|
||||
|
||||
return r.removeVolume(ctx, v, force, prune)
|
||||
}
|
||||
|
||||
// GetVolume retrieves a volume by its name
|
||||
func (r *Runtime) GetVolume(name string) (*Volume, error) {
|
||||
r.lock.RLock()
|
||||
defer r.lock.RUnlock()
|
||||
|
||||
if !r.valid {
|
||||
return nil, ErrRuntimeStopped
|
||||
}
|
||||
|
||||
return r.state.Volume(name)
|
||||
}
|
||||
|
||||
// HasVolume checks to see if a volume with the given name exists
|
||||
func (r *Runtime) HasVolume(name string) (bool, error) {
|
||||
r.lock.RLock()
|
||||
defer r.lock.RUnlock()
|
||||
|
||||
if !r.valid {
|
||||
return false, ErrRuntimeStopped
|
||||
}
|
||||
|
||||
return r.state.HasVolume(name)
|
||||
}
|
||||
|
||||
// Volumes retrieves all volumes
|
||||
// Filters can be provided which will determine which volumes are included in the
|
||||
// output. Multiple filters are handled by ANDing their output, so only volumes
|
||||
// matching all filters are returned
|
||||
func (r *Runtime) Volumes(filters ...VolumeFilter) ([]*Volume, error) {
|
||||
r.lock.RLock()
|
||||
defer r.lock.RUnlock()
|
||||
|
||||
if !r.valid {
|
||||
return nil, ErrRuntimeStopped
|
||||
}
|
||||
|
||||
vols, err := r.state.AllVolumes()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
volsFiltered := make([]*Volume, 0, len(vols))
|
||||
for _, vol := range vols {
|
||||
include := true
|
||||
for _, filter := range filters {
|
||||
include = include && filter(vol)
|
||||
}
|
||||
|
||||
if include {
|
||||
volsFiltered = append(volsFiltered, vol)
|
||||
}
|
||||
}
|
||||
|
||||
return volsFiltered, nil
|
||||
}
|
||||
|
||||
// GetAllVolumes retrieves all the volumes
|
||||
func (r *Runtime) GetAllVolumes() ([]*Volume, error) {
|
||||
r.lock.RLock()
|
||||
defer r.lock.RUnlock()
|
||||
|
||||
if !r.valid {
|
||||
return nil, ErrRuntimeStopped
|
||||
}
|
||||
|
||||
return r.state.AllVolumes()
|
||||
}
|
||||
Reference in New Issue
Block a user