Files
podman/pkg/domain/entities/volumes.go
Matthew Heon b53cb57680 Initial implementation of volume plugins
This implements support for mounting and unmounting volumes
backed by volume plugins. Support for actually retrieving
plugins requires a pull request to land in containers.conf and
then that to be vendored, and as such is not yet ready. Given
this, this code is only compile tested. However, the code for
everything past retrieving the plugin has been written - there is
support for creating, removing, mounting, and unmounting volumes,
which should allow full functionality once the c/common PR is
merged.

A major change is the signature of the MountPoint function for
volumes, which now, by necessity, returns an error. Named volumes
managed by a plugin do not have a mountpoint we control; instead,
it is managed entirely by the plugin. As such, we need to cache
the path in the DB, and calls to retrieve it now need to access
the DB (and may fail as such).

Notably absent is support for SELinux relabelling and chowning
these volumes. Given that we don't manage the mountpoint for
these volumes, I am extremely reluctant to try and modify it - we
could easily break the plugin trying to chown or relabel it.

Also, we had no less than *5* separate implementations of
inspecting a volume floating around in pkg/infra/abi and
pkg/api/handlers/libpod. And none of them used volume.Inspect(),
the only correct way of inspecting volumes. Remove them all and
consolidate to using the correct way. Compat API is likely still
doing things the wrong way, but that is an issue for another day.

Fixes #4304

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
2021-01-14 15:35:33 -05:00

135 lines
2.9 KiB
Go

package entities
import (
"net/url"
"github.com/containers/podman/v2/libpod/define"
docker_api_types "github.com/docker/docker/api/types"
docker_api_types_volume "github.com/docker/docker/api/types/volume"
)
// swagger:model VolumeCreate
type VolumeCreateOptions struct {
// New volume's name. Can be left blank
Name string `schema:"name"`
// Volume driver to use
Driver string `schema:"driver"`
// User-defined key/value metadata.
Label map[string]string `schema:"label"`
// Mapping of driver options and values.
Options map[string]string `schema:"opts"`
}
type IDOrNameResponse struct {
// The Id or Name of an object
IDOrName string
}
type VolumeConfigResponse struct {
define.InspectVolumeData
}
// VolumeInfo Volume list response
// swagger:model VolumeInfo
type VolumeInfo struct {
// Date/Time the volume was created.
CreatedAt string `json:"CreatedAt,omitempty"`
// Name of the volume driver used by the volume. Only supports local driver
// Required: true
Driver string `json:"Driver"`
// User-defined key/value metadata.
// Always included
Labels map[string]string `json:"Labels"`
// Mount path of the volume on the host.
// Required: true
Mountpoint string `json:"Mountpoint"`
// Name of the volume.
// Required: true
Name string `json:"Name"`
// The driver specific options used when creating the volume.
// Required: true
Options map[string]string `json:"Options"`
// The level at which the volume exists.
// Libpod does not implement volume scoping, and this is provided solely for
// Docker compatibility. The value is only "local".
// Required: true
Scope string `json:"Scope"`
// TODO: We don't include the volume `Status` for now
}
type VolumeRmOptions struct {
All bool
Force bool
}
type VolumeRmReport struct {
Err error
Id string //nolint
}
type VolumeInspectReport struct {
*VolumeConfigResponse
}
// VolumePruneOptions describes the options needed
// to prune a volume from the CLI
type VolumePruneOptions struct {
Filters url.Values `json:"filters" schema:"filters"`
}
type VolumeListOptions struct {
Filter map[string][]string
}
type VolumeListReport struct {
VolumeConfigResponse
}
// VolumeListBody Volume list response
// swagger:model VolumeListBody
type VolumeListBody struct {
Volumes []*VolumeInfo
}
// Volume list response
// swagger:response VolumeListResponse
type SwagVolumeListResponse struct {
// in:body
Body struct {
VolumeListBody
}
}
/*
* Docker API compatibility types
*/
// swagger:model DockerVolumeCreate
type DockerVolumeCreate docker_api_types_volume.VolumeCreateBody
// This response definition is used for both the create and inspect endpoints
// swagger:response DockerVolumeInfoResponse
type SwagDockerVolumeInfoResponse struct {
// in:body
Body struct {
docker_api_types.Volume
}
}
// Volume prune response
// swagger:response DockerVolumePruneResponse
type SwagDockerVolumePruneResponse struct {
// in:body
Body struct {
docker_api_types.VolumesPruneReport
}
}