mirror of https://github.com/k3s-io/k3s
218 lines
8.4 KiB
Go
218 lines
8.4 KiB
Go
package volume
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"github.com/libopenstorage/openstorage/api"
|
|
)
|
|
|
|
var (
|
|
// ErrAlreadyShutdown returned when driver is shutdown
|
|
ErrAlreadyShutdown = errors.New("VolumeDriverProvider already shutdown")
|
|
// ErrExit returned when driver already registered
|
|
ErrExist = errors.New("Already exists")
|
|
// ErrDriverNotFound returned when a driver is not registered
|
|
ErrDriverNotFound = errors.New("Driver implementation not found")
|
|
// ErrDriverInitializing returned when a driver is initializing
|
|
ErrDriverInitializing = errors.New("Driver is initializing")
|
|
// ErrEnoEnt returned when volume does not exist
|
|
ErrEnoEnt = errors.New("Volume does not exist.")
|
|
// ErrEnomem returned when we are out of memory
|
|
ErrEnomem = errors.New("Out of memory.")
|
|
// ErrEinval returned when an invalid input is provided
|
|
ErrEinval = errors.New("Invalid argument")
|
|
// ErrVolDetached returned when volume is in detached state
|
|
ErrVolDetached = errors.New("Volume is detached")
|
|
// ErrVolAttached returned when volume is in attached state
|
|
ErrVolAttached = errors.New("Volume is attached")
|
|
// ErrVolAttachedOnRemoteNode returned when volume is in attached on different node
|
|
ErrVolAttachedOnRemoteNode = errors.New("Volume is attached on another node")
|
|
// ErrVolAttachedScale returned when volume is attached and can be scaled
|
|
ErrVolAttachedScale = errors.New("Volume is attached on another node." +
|
|
" Increase scale factor to create more instances")
|
|
// ErrVolHasSnaps returned when volume has previous snapshots
|
|
ErrVolHasSnaps = errors.New("Volume has snapshots associated")
|
|
// ErrNotSupported returned when the operation is not supported
|
|
ErrNotSupported = errors.New("Operation not supported")
|
|
// ErrVolBusy returned when volume is in busy state
|
|
ErrVolBusy = errors.New("Volume is busy")
|
|
)
|
|
|
|
// Constants used by the VolumeDriver
|
|
const (
|
|
// APIVersion for the volume management apis
|
|
APIVersion = "v1"
|
|
// PluginAPIBase where the docker unix socket resides
|
|
PluginAPIBase = "/run/docker/plugins/"
|
|
// DriverAPIBase where the osd unix socket resides
|
|
DriverAPIBase = "/var/lib/osd/driver/"
|
|
// MountBase for osd mountpoints
|
|
MountBase = "/var/lib/osd/mounts/"
|
|
// VolumeBase for osd volumes
|
|
VolumeBase = "/var/lib/osd/"
|
|
)
|
|
|
|
const (
|
|
// LocationConstaint is a label that specifies data location constraint.
|
|
LocationConstraint = "LocationConstraint"
|
|
// LocalNode is an alias for this node - similar to localhost.
|
|
LocalNode = "LocalNode"
|
|
)
|
|
|
|
// AttachOptionsKey specifies a key type from a key-value pair
|
|
// that will be passed in to the Attach api
|
|
type AttachOptionsKey string
|
|
|
|
const (
|
|
AttachOptionsSecret = AttachOptionsKey("SECRET_KEY")
|
|
)
|
|
|
|
// Store defines the interface for basic volume store operations
|
|
type Store interface {
|
|
// Lock volume specified by volumeID.
|
|
Lock(volumeID string) (interface{}, error)
|
|
// Lock volume with token obtained from call to Lock.
|
|
Unlock(token interface{}) error
|
|
// CreateVol returns error if volume with the same ID already existe.
|
|
CreateVol(vol *api.Volume) error
|
|
// GetVol from volumeID.
|
|
GetVol(volumeID string) (*api.Volume, error)
|
|
// UpdateVol with vol
|
|
UpdateVol(vol *api.Volume) error
|
|
// DeleteVol. Returns error if volume does not exist.
|
|
DeleteVol(volumeID string) error
|
|
}
|
|
|
|
// VolumeDriver is the main interface to be implemented by any storage driver.
|
|
// Every driver must at minimum implement the ProtoDriver sub interface.
|
|
type VolumeDriver interface {
|
|
IODriver
|
|
ProtoDriver
|
|
BlockDriver
|
|
Enumerator
|
|
}
|
|
|
|
// IODriver interfaces applicable to object store interfaces.
|
|
type IODriver interface {
|
|
// Read sz bytes from specified volume at specified offset.
|
|
// Return number of bytes read and error.
|
|
Read(volumeID string, buf []byte, sz uint64, offset int64) (int64, error)
|
|
// Write sz bytes from specified volume at specified offset.
|
|
// Return number of bytes written and error.
|
|
Write(volumeID string, buf []byte, sz uint64, offset int64) (int64, error)
|
|
// Flush writes to stable storage.
|
|
// Return error.
|
|
Flush(volumeID string) error
|
|
}
|
|
|
|
// SnapshotDriver interfaces provides snapshot capability
|
|
type SnapshotDriver interface {
|
|
// Snapshot create volume snapshot.
|
|
// Errors ErrEnoEnt may be returned
|
|
Snapshot(volumeID string, readonly bool, locator *api.VolumeLocator) (string, error)
|
|
// Restore restores volume to specified snapshot.
|
|
Restore(volumeID string, snapshotID string) error
|
|
}
|
|
|
|
// StatsDriver interface provides stats features
|
|
type StatsDriver interface {
|
|
// Stats for specified volume.
|
|
// cumulative stats are /proc/diskstats style stats.
|
|
// nonCumulative stats are stats for specific duration.
|
|
// Errors ErrEnoEnt may be returned
|
|
Stats(volumeID string, cumulative bool) (*api.Stats, error)
|
|
// UsedSize returns currently used volume size.
|
|
// Errors ErrEnoEnt may be returned.
|
|
UsedSize(volumeID string) (uint64, error)
|
|
// GetActiveRequests get active requests
|
|
GetActiveRequests() (*api.ActiveRequests, error)
|
|
}
|
|
|
|
// ProtoDriver must be implemented by all volume drivers. It specifies the
|
|
// most basic functionality, such as creating and deleting volumes.
|
|
type ProtoDriver interface {
|
|
SnapshotDriver
|
|
StatsDriver
|
|
// Name returns the name of the driver.
|
|
Name() string
|
|
// Type of this driver
|
|
Type() api.DriverType
|
|
// Create a new Vol for the specific volume spec.
|
|
// It returns a system generated VolumeID that uniquely identifies the volume
|
|
Create(locator *api.VolumeLocator, Source *api.Source, spec *api.VolumeSpec) (string, error)
|
|
// Delete volume.
|
|
// Errors ErrEnoEnt, ErrVolHasSnaps may be returned.
|
|
Delete(volumeID string) error
|
|
// Mount volume at specified path
|
|
// Errors ErrEnoEnt, ErrVolDetached may be returned.
|
|
Mount(volumeID string, mountPath string) error
|
|
// MountedAt return volume mounted at specified mountpath.
|
|
MountedAt(mountPath string) string
|
|
// Unmount volume at specified path
|
|
// Errors ErrEnoEnt, ErrVolDetached may be returned.
|
|
Unmount(volumeID string, mountPath string) error
|
|
// Update not all fields of the spec are supported, ErrNotSupported will be thrown for unsupported
|
|
// updates.
|
|
Set(volumeID string, locator *api.VolumeLocator, spec *api.VolumeSpec) error
|
|
// Status returns a set of key-value pairs which give low
|
|
// level diagnostic status about this driver.
|
|
Status() [][2]string
|
|
// Shutdown and cleanup.
|
|
Shutdown()
|
|
}
|
|
|
|
// Enumerator provides a set of interfaces to get details on a set of volumes.
|
|
type Enumerator interface {
|
|
// Inspect specified volumes.
|
|
// Returns slice of volumes that were found.
|
|
Inspect(volumeIDs []string) ([]*api.Volume, error)
|
|
// Enumerate volumes that map to the volumeLocator. Locator fields may be regexp.
|
|
// If locator fields are left blank, this will return all volumes.
|
|
Enumerate(locator *api.VolumeLocator, labels map[string]string) ([]*api.Volume, error)
|
|
// Enumerate snaps for specified volumes
|
|
SnapEnumerate(volID []string, snapLabels map[string]string) ([]*api.Volume, error)
|
|
}
|
|
|
|
// StoreEnumerator combines Store and Enumerator capabilities
|
|
type StoreEnumerator interface {
|
|
Store
|
|
Enumerator
|
|
}
|
|
|
|
// BlockDriver needs to be implemented by block volume drivers. Filesystem volume
|
|
// drivers can ignore this interface and include the builtin DefaultBlockDriver.
|
|
type BlockDriver interface {
|
|
// Attach map device to the host.
|
|
// On success the devicePath specifies location where the device is exported
|
|
// Errors ErrEnoEnt, ErrVolAttached may be returned.
|
|
Attach(volumeID string, attachOptions map[string]string) (string, error)
|
|
// Detach device from the host.
|
|
// Errors ErrEnoEnt, ErrVolDetached may be returned.
|
|
Detach(volumeID string, unmountBeforeDetach bool) error
|
|
}
|
|
|
|
// VolumeDriverProvider provides VolumeDrivers.
|
|
type VolumeDriverProvider interface {
|
|
// Get gets the VolumeDriver for the given name.
|
|
// If a VolumeDriver was not created for the given name, the error ErrDriverNotFound is returned.
|
|
Get(name string) (VolumeDriver, error)
|
|
// Shutdown shuts down all volume drivers.
|
|
Shutdown() error
|
|
}
|
|
|
|
// VolumeDriverRegistry registers VolumeDrivers.
|
|
type VolumeDriverRegistry interface {
|
|
VolumeDriverProvider
|
|
// New creates the VolumeDriver for the given name.
|
|
// If a VolumeDriver was already created for the given name, the error ErrExist is returned.
|
|
Register(name string, params map[string]string) error
|
|
|
|
// Add inserts a new VolumeDriver provider with a well known name.
|
|
Add(name string, init func(map[string]string) (VolumeDriver, error)) error
|
|
}
|
|
|
|
// NewVolumeDriverRegistry constructs a new VolumeDriverRegistry.
|
|
func NewVolumeDriverRegistry(nameToInitFunc map[string]func(map[string]string) (VolumeDriver, error)) VolumeDriverRegistry {
|
|
return newVolumeDriverRegistry(nameToInitFunc)
|
|
}
|