123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- 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)
- }
|