util

package
v1.9.0-beta.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 29, 2017 License: Apache-2.0 Imports: 26 Imported by: 0

Documentation

Overview

Contains utility code for use by volume plugins.

Index

Constants

View Source
const (
	ErrDeviceNotFound     = "device not found"
	ErrDeviceNotSupported = "device not supported"
	ErrNotAvailable       = "not available"
)
View Source
const (
	// Name of finalizer on PVCs that have a running pod.
	PVCProtectionFinalizer = "kubernetes.io/pvc-protection"
)

Variables

This section is empty.

Functions

func AddProtectionFinalizer added in v1.9.0

func AddProtectionFinalizer(pvc *v1.PersistentVolumeClaim)

AddProtectionFinalizer adds PVCProtectionFinalizer to pvc. It expects that pvc is writable (i.e. is not informer's cached copy.)

func CheckNodeAffinity added in v1.7.0

func CheckNodeAffinity(pv *v1.PersistentVolume, nodeLabels map[string]string) error

CheckNodeAffinity looks at the PV node affinity, and checks if the node has the same corresponding labels This ensures that we don't mount a volume that doesn't belong to this node

func Du added in v1.2.0

func Du(path string) (*resource.Quantity, error)

func Find added in v1.5.0

func Find(path string) (int64, error)

Find uses the equivalent of the command `find <path> -dev -printf '.' | wc -c` to count files and directories. While this is not an exact measure of inodes used, it is a very good approximation.

func FsInfo added in v1.2.0

func FsInfo(path string) (int64, int64, int64, int64, int64, int64, error)

FSInfo linux returns (available bytes, byte capacity, byte usage, total inodes, inodes free, inode usage, error) for the filesystem that path resides upon.

func GetClassForVolume added in v1.5.0

func GetClassForVolume(kubeClient clientset.Interface, pv *v1.PersistentVolume) (*storage.StorageClass, error)

func GetSecretForPV added in v1.5.0

func GetSecretForPV(secretNamespace, secretName, volumePluginName string, kubeClient clientset.Interface) (map[string]string, error)

GetSecretForPV locates secret by name and namespace, verifies the secret type, and returns secret map

func GetSecretForPod added in v1.5.0

func GetSecretForPod(pod *v1.Pod, secretName string, kubeClient clientset.Interface) (map[string]string, error)

GetSecretForPod locates secret by name in the pod's namespace and returns secret map

func IsPVCBeingDeleted added in v1.9.0

func IsPVCBeingDeleted(pvc *v1.PersistentVolumeClaim) bool

IsPVCBeingDeleted returns: true: in case PVC is being deleted, i.e. ObjectMeta.DeletionTimestamp is set false: in case PVC is not being deleted, i.e. ObjectMeta.DeletionTimestamp is nil

func IsProtectionFinalizerPresent added in v1.9.0

func IsProtectionFinalizerPresent(pvc *v1.PersistentVolumeClaim) bool

IsProtectionFinalizerPresent returns true in case PVCProtectionFinalizer is present among the pvc.Finalizers

func IsReady

func IsReady(dir string) bool

IsReady checks for the existence of a regular file called 'ready' in the given directory and returns true if that file exists.

func LabelZonesToSet added in v1.8.0

func LabelZonesToSet(labelZonesValue string) (sets.String, error)

LabelZonesToSet converts a PV label value from string containing a delimited list of zones to set

func LoadPodFromFile added in v1.8.0

func LoadPodFromFile(filePath string) (*v1.Pod, error)

LoadPodFromFile will read, decode, and return a Pod from a file.

func NewDanglingError added in v1.9.0

func NewDanglingError(msg string, node k8stypes.NodeName, devicePath string) error

func OperationCompleteHook added in v1.8.0

func OperationCompleteHook(plugin, operationName string) func(error)

OperationCompleteHook returns a hook to call when an operation is completed

func PathExists added in v1.3.6

func PathExists(path string) (bool, error)

PathExists returns true if the specified path exists.

func RemoveProtectionFinalizer added in v1.9.0

func RemoveProtectionFinalizer(pvc *v1.PersistentVolumeClaim)

RemoveProtectionFinalizer returns pvc without PVCProtectionFinalizer in case it's present in pvc.Finalizers. It expects that pvc is writable (i.e. is not informer's cached copy.)

func SetReady

func SetReady(dir string)

SetReady creates a file called 'ready' in the given directory. It logs an error if the file cannot be created.

func UnmountMountPoint added in v1.7.2

func UnmountMountPoint(mountPath string, mounter mount.Interface, extensiveMountPointCheck bool) error

UnmountMountPoint is a common unmount routine that unmounts the given path and deletes the remaining directory if successful. if extensiveMountPointCheck is true IsNotMountPoint will be called instead of IsLikelyNotMountPoint. IsNotMountPoint is more expensive but properly handles bind mounts.

func UnmountPath added in v1.3.6

func UnmountPath(mountPath string, mounter mount.Interface) error

UnmountPath is a common unmount routine that unmounts the given path and deletes the remaining directory if successful.

func ZonesSetToLabelValue added in v1.8.0

func ZonesSetToLabelValue(strSet sets.String) string

func ZonesToSet added in v1.8.0

func ZonesToSet(zonesString string) (sets.String, error)

ZonesToSet converts a string containing a comma separated list of zones to set

Types

type AtomicWriter added in v1.2.0

type AtomicWriter struct {
	// contains filtered or unexported fields
}

AtomicWriter handles atomically projecting content for a set of files into a target directory.

Note:

  1. AtomicWriter reserves the set of pathnames starting with `..`.
  2. AtomicWriter offers no concurrency guarantees and must be synchronized by the caller.

The visible files in this volume are symlinks to files in the writer's data directory. Actual files are stored in a hidden timestamped directory which is symlinked to by the data directory. The timestamped directory and data directory symlink are created in the writer's target dir.  This scheme allows the files to be atomically updated by changing the target of the data directory symlink.

Consumers of the target directory can monitor the ..data symlink using inotify or fanotify to receive events when the content in the volume is updated.

func NewAtomicWriter added in v1.2.0

func NewAtomicWriter(targetDir string, logContext string) (*AtomicWriter, error)

NewAtomicWriter creates a new AtomicWriter configured to write to the given target directory, or returns an error if the target directory does not exist.

func (*AtomicWriter) Write added in v1.2.0

func (w *AtomicWriter) Write(payload map[string]FileProjection) error

Write does an atomic projection of the given payload into the writer's target directory. Input paths must not begin with '..'.

The Write algorithm is:

  1. The payload is validated; if the payload is invalid, the function returns

  2. The user-visible portion of the volume is walked to determine whether any portion of the payload was deleted and is still present on disk. If the payload is already present on disk and there are no deleted files, the function returns

  3. A check is made to determine whether data present in the payload has changed 4.  A new timestamped dir is created

  4. The payload is written to the new timestamped directory 6.  Symlinks and directory for new user-visible files are created (if needed).

    For example, consider the files: <target-dir>/podName <target-dir>/user/labels <target-dir>/k8s/annotations

    The user visible files are symbolic links into the internal data directory: <target-dir>/podName -> ..data/podName <target-dir>/usr/labels -> ../..data/usr/labels <target-dir>/k8s/annotations -> ../..data/k8s/annotations

    Relative links are created into the data directory for files in subdirectories.

    The data directory itself is a link to a timestamped directory with the real data: <target-dir>/..data -> ..2016_02_01_15_04_05.12345678/ 7.  The current timestamped directory is detected by reading the data directory symlink 8.  A symlink to the new timestamped directory ..data_tmp is created that will become the new data directory 9.  The new data directory symlink is renamed to the data directory; rename is atomic

10. Old paths are removed from the user-visible portion of the target directory 11.  The previous timestamped directory is removed, if it exists

type BlockVolumePathHandler added in v1.9.0

type BlockVolumePathHandler interface {
	// MapDevice creates a symbolic link to block device under specified map path
	MapDevice(devicePath string, mapPath string, linkName string) error
	// UnmapDevice removes a symbolic link to block device under specified map path
	UnmapDevice(mapPath string, linkName string) error
	// RemovePath removes a file or directory on specified map path
	RemoveMapPath(mapPath string) error
	// IsSymlinkExist retruns true if specified symbolic link exists
	IsSymlinkExist(mapPath string) (bool, error)
	// GetDeviceSymlinkRefs searches symbolic links under global map path
	GetDeviceSymlinkRefs(devPath string, mapPath string) ([]string, error)
	// FindGlobalMapPathUUIDFromPod finds {pod uuid} symbolic link under globalMapPath
	// corresponding to map path symlink, and then return global map path with pod uuid.
	FindGlobalMapPathUUIDFromPod(pluginDir, mapPath string, podUID types.UID) (string, error)
	// AttachFileDevice takes a path to a regular file and makes it available as an
	// attached block device.
	AttachFileDevice(path string) (string, error)
	// GetLoopDevice returns the full path to the loop device associated with the given path.
	GetLoopDevice(path string) (string, error)
	// RemoveLoopDevice removes specified loopback device
	RemoveLoopDevice(device string) error
}

BlockVolumePathHandler defines a set of operations for handling block volume-related operations

func NewBlockVolumePathHandler added in v1.9.0

func NewBlockVolumePathHandler() BlockVolumePathHandler

NewBlockVolumePathHandler returns a new instance of BlockVolumeHandler.

type DanglingAttachError added in v1.9.0

type DanglingAttachError struct {
	CurrentNode k8stypes.NodeName
	DevicePath  string
	// contains filtered or unexported fields
}

This error on attach indicates volume is attached to a different node than we expected.

func (*DanglingAttachError) Error added in v1.9.0

func (err *DanglingAttachError) Error() string

type DeviceUtil added in v1.3.0

type DeviceUtil interface {
	FindMultipathDeviceForDevice(disk string) string
}

DeviceUtil is a util for common device methods

func NewDeviceHandler added in v1.3.0

func NewDeviceHandler(io IoUtil) DeviceUtil

NewDeviceHandler Create a new IoHandler implementation

type FileProjection added in v1.4.0

type FileProjection struct {
	Data []byte
	Mode int32
}

type IoUtil added in v1.3.0

type IoUtil interface {
	ReadDir(dirname string) ([]os.FileInfo, error)
	Lstat(name string) (os.FileInfo, error)
	EvalSymlinks(path string) (string, error)
}

IoUtil is a mockable util for common IO operations

func NewIOHandler added in v1.3.0

func NewIOHandler() IoUtil

NewIOHandler Create a new IoHandler implementation

type VolumePathHandler added in v1.9.0

type VolumePathHandler struct {
}

VolumePathHandler is path related operation handlers for block volume

func (VolumePathHandler) AttachFileDevice added in v1.9.0

func (v VolumePathHandler) AttachFileDevice(path string) (string, error)

AttachFileDevice takes a path to a regular file and makes it available as an attached block device.

func (VolumePathHandler) FindGlobalMapPathUUIDFromPod added in v1.9.0

func (v VolumePathHandler) FindGlobalMapPathUUIDFromPod(pluginDir, mapPath string, podUID types.UID) (string, error)

FindGlobalMapPathUUIDFromPod finds {pod uuid} symbolic link under globalMapPath corresponding to map path symlink, and then return global map path with pod uuid. ex. mapPath symlink: pods/{podUid}}/{DefaultKubeletVolumeDevicesDirName}/{escapeQualifiedPluginName}/{volumeName} -> /dev/sdX

globalMapPath/{pod uuid}: plugins/kubernetes.io/{PluginName}/{DefaultKubeletVolumeDevicesDirName}/{volumePluginDependentPath}/{pod uuid} -> /dev/sdX

func (VolumePathHandler) GetDeviceSymlinkRefs added in v1.9.0

func (v VolumePathHandler) GetDeviceSymlinkRefs(devPath string, mapPath string) ([]string, error)

GetDeviceSymlinkRefs searches symbolic links under global map path

func (VolumePathHandler) GetLoopDevice added in v1.9.0

func (v VolumePathHandler) GetLoopDevice(path string) (string, error)

GetLoopDevice returns the full path to the loop device associated with the given path.

func (VolumePathHandler) IsSymlinkExist added in v1.9.0

func (v VolumePathHandler) IsSymlinkExist(mapPath string) (bool, error)

IsSymlinkExist returns true if specified file exists and the type is symbolik link. If file doesn't exist, or file exists but not symbolick link, return false with no error. On other cases, return false with error from Lstat().

func (VolumePathHandler) MapDevice added in v1.9.0

func (v VolumePathHandler) MapDevice(devicePath string, mapPath string, linkName string) error

MapDevice creates a symbolic link to block device under specified map path

func (VolumePathHandler) RemoveLoopDevice added in v1.9.0

func (v VolumePathHandler) RemoveLoopDevice(device string) error

RemoveLoopDevice removes specified loopback device

func (VolumePathHandler) RemoveMapPath added in v1.9.0

func (v VolumePathHandler) RemoveMapPath(mapPath string) error

RemoveMapPath removes a file or directory on specified map path

func (VolumePathHandler) UnmapDevice added in v1.9.0

func (v VolumePathHandler) UnmapDevice(mapPath string, linkName string) error

UnmapDevice removes a symbolic link associated to block device under specified map path

Directories

Path Synopsis
Package nestedpendingoperations is a modified implementation of pkg/util/goroutinemap.
Package nestedpendingoperations is a modified implementation of pkg/util/goroutinemap.
Package operationexecutor implements interfaces that enable execution of attach, detach, mount, and unmount operations with a nestedpendingoperations so that more than one operation is never triggered on the same volume for the same pod.
Package operationexecutor implements interfaces that enable execution of attach, detach, mount, and unmount operations with a nestedpendingoperations so that more than one operation is never triggered on the same volume for the same pod.
Package types defines types used only by volume components
Package types defines types used only by volume components
Package volumehelper contains consts and helper methods used by various volume components (attach/detach controller, kubelet, etc.).
Package volumehelper contains consts and helper methods used by various volume components (attach/detach controller, kubelet, etc.).

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL