2014-11-23 15:47:25 +00:00
|
|
|
/*
|
2015-05-01 16:19:44 +00:00
|
|
|
Copyright 2014 The Kubernetes Authors All rights reserved.
|
2014-11-23 15:47:25 +00:00
|
|
|
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
you may not use this file except in compliance with the License.
|
|
|
|
You may obtain a copy of the License at
|
|
|
|
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
See the License for the specific language governing permissions and
|
|
|
|
limitations under the License.
|
|
|
|
*/
|
|
|
|
|
|
|
|
package volume
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path"
|
2016-04-29 19:29:59 +00:00
|
|
|
"time"
|
2016-01-15 05:00:58 +00:00
|
|
|
|
|
|
|
"k8s.io/kubernetes/pkg/api"
|
|
|
|
"k8s.io/kubernetes/pkg/api/resource"
|
2016-04-29 19:29:59 +00:00
|
|
|
"k8s.io/kubernetes/pkg/util/mount"
|
2014-11-23 15:47:25 +00:00
|
|
|
)
|
|
|
|
|
2015-03-19 05:18:31 +00:00
|
|
|
// Volume represents a directory used by pods or hosts on a node.
|
2014-11-23 15:47:25 +00:00
|
|
|
// All method implementations of methods in the volume interface must be idempotent.
|
2015-03-19 05:18:31 +00:00
|
|
|
type Volume interface {
|
2016-04-29 19:29:59 +00:00
|
|
|
// GetPath returns the path to which the volume should be
|
|
|
|
// mounted for the pod.
|
2014-11-23 15:47:25 +00:00
|
|
|
GetPath() string
|
2015-12-04 20:40:01 +00:00
|
|
|
|
|
|
|
// MetricsProvider embeds methods for exposing metrics (e.g. used,available space).
|
|
|
|
MetricsProvider
|
|
|
|
}
|
|
|
|
|
|
|
|
// MetricsProvider exposes metrics (e.g. used,available space) related to a Volume.
|
|
|
|
type MetricsProvider interface {
|
|
|
|
// GetMetrics returns the Metrics for the Volume. Maybe expensive for some implementations.
|
|
|
|
GetMetrics() (*Metrics, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Metrics represents the used and available bytes of the Volume.
|
|
|
|
type Metrics struct {
|
|
|
|
// Used represents the total bytes used by the Volume.
|
|
|
|
// Note: For block devices this maybe more than the total size of the files.
|
|
|
|
Used *resource.Quantity
|
|
|
|
|
|
|
|
// Capacity represents the total capacity (bytes) of the volume's underlying storage.
|
|
|
|
// For Volumes that share a filesystem with the host (e.g. emptydir, hostpath) this is the size
|
|
|
|
// of the underlying storage, and will not equal Used + Available as the fs is shared.
|
|
|
|
Capacity *resource.Quantity
|
|
|
|
|
|
|
|
// Available represents the storage space available (bytes) for the Volume.
|
|
|
|
// For Volumes that share a filesystem with the host (e.g. emptydir, hostpath), this is the available
|
|
|
|
// space on the underlying storage, and is shared with host processes and other Volumes.
|
|
|
|
Available *resource.Quantity
|
2014-11-23 15:47:25 +00:00
|
|
|
}
|
|
|
|
|
2016-03-23 05:12:21 +00:00
|
|
|
// Attributes represents the attributes of this mounter.
|
2015-10-30 20:25:36 +00:00
|
|
|
type Attributes struct {
|
2016-01-11 16:10:55 +00:00
|
|
|
ReadOnly bool
|
|
|
|
Managed bool
|
|
|
|
SupportsSELinux bool
|
2015-10-30 20:25:36 +00:00
|
|
|
}
|
|
|
|
|
2016-03-23 05:12:21 +00:00
|
|
|
// Mounter interface provides methods to set up/mount the volume.
|
|
|
|
type Mounter interface {
|
2014-11-23 15:47:25 +00:00
|
|
|
// Uses Interface to provide the path for Docker binds.
|
2015-03-19 05:18:31 +00:00
|
|
|
Volume
|
2015-12-18 15:55:11 +00:00
|
|
|
// SetUp prepares and mounts/unpacks the volume to a
|
|
|
|
// self-determined directory path. The mount point and its
|
|
|
|
// content should be owned by 'fsGroup' so that it can be
|
|
|
|
// accessed by the pod. This may be called more than once, so
|
2015-03-07 21:38:50 +00:00
|
|
|
// implementations must be idempotent.
|
2015-12-18 15:55:11 +00:00
|
|
|
SetUp(fsGroup *int64) error
|
|
|
|
// SetUpAt prepares and mounts/unpacks the volume to the
|
|
|
|
// specified directory path, which may or may not exist yet.
|
|
|
|
// The mount point and its content should be owned by
|
|
|
|
// 'fsGroup' so that it can be accessed by the pod. This may
|
|
|
|
// be called more than once, so implementations must be
|
|
|
|
// idempotent.
|
2016-02-02 20:39:33 +00:00
|
|
|
SetUpAt(dir string, fsGroup *int64) error
|
2016-03-23 05:12:21 +00:00
|
|
|
// GetAttributes returns the attributes of the mounter.
|
2015-10-30 20:25:36 +00:00
|
|
|
GetAttributes() Attributes
|
2014-11-23 15:47:25 +00:00
|
|
|
}
|
|
|
|
|
2016-03-23 05:12:21 +00:00
|
|
|
// Unmounter interface provides methods to cleanup/unmount the volumes.
|
|
|
|
type Unmounter interface {
|
2015-03-19 05:18:31 +00:00
|
|
|
Volume
|
2015-03-07 21:38:50 +00:00
|
|
|
// TearDown unmounts the volume from a self-determined directory and
|
|
|
|
// removes traces of the SetUp procedure.
|
2014-11-23 15:47:25 +00:00
|
|
|
TearDown() error
|
2015-03-07 21:38:50 +00:00
|
|
|
// TearDown unmounts the volume from the specified directory and
|
|
|
|
// removes traces of the SetUp procedure.
|
|
|
|
TearDownAt(dir string) error
|
2014-11-23 15:47:25 +00:00
|
|
|
}
|
|
|
|
|
2015-05-29 20:32:44 +00:00
|
|
|
// Recycler provides methods to reclaim the volume resource.
|
|
|
|
type Recycler interface {
|
|
|
|
Volume
|
|
|
|
// Recycle reclaims the resource. Calls to this method should block until the recycling task is complete.
|
|
|
|
// Any error returned indicates the volume has failed to be reclaimed. A nil return indicates success.
|
|
|
|
Recycle() error
|
|
|
|
}
|
|
|
|
|
2015-10-12 18:27:49 +00:00
|
|
|
// Provisioner is an interface that creates templates for PersistentVolumes and can create the volume
|
|
|
|
// as a new resource in the infrastructure provider.
|
|
|
|
type Provisioner interface {
|
|
|
|
// Provision creates the resource by allocating the underlying volume in a storage system.
|
|
|
|
// This method should block until completion.
|
|
|
|
Provision(*api.PersistentVolume) error
|
|
|
|
// NewPersistentVolumeTemplate creates a new PersistentVolume to be used as a template before saving.
|
|
|
|
// The provisioner will want to tweak its properties, assign correct annotations, etc.
|
|
|
|
// This func should *NOT* persist the PV in the API. That is left to the caller.
|
|
|
|
NewPersistentVolumeTemplate() (*api.PersistentVolume, error)
|
2015-09-07 19:55:28 +00:00
|
|
|
}
|
|
|
|
|
2016-01-11 21:23:28 +00:00
|
|
|
// Deleter removes the resource from the underlying storage provider. Calls to this method should block until
|
2015-09-07 16:11:37 +00:00
|
|
|
// the deletion is complete. Any error returned indicates the volume has failed to be reclaimed.
|
|
|
|
// A nil return indicates success.
|
|
|
|
type Deleter interface {
|
|
|
|
Volume
|
2015-10-12 18:27:49 +00:00
|
|
|
// This method should block until completion.
|
2015-09-07 16:11:37 +00:00
|
|
|
Delete() error
|
|
|
|
}
|
|
|
|
|
2016-01-11 21:23:28 +00:00
|
|
|
// Attacher can attach a volume to a node.
|
|
|
|
type Attacher interface {
|
|
|
|
Volume
|
2016-04-29 19:29:59 +00:00
|
|
|
|
|
|
|
// Attach the volume specified by the given spec to the given host
|
|
|
|
Attach(spec *Spec, hostName string) error
|
|
|
|
|
|
|
|
// WaitForAttach blocks until the device is attached to this
|
|
|
|
// node. If it successfully attaches, the path to the device
|
|
|
|
// is returned. Otherwise, if the device does not attach after
|
|
|
|
// the given timeout period, an error will be returned.
|
|
|
|
WaitForAttach(spec *Spec, timeout time.Duration) (string, error)
|
|
|
|
|
|
|
|
// GetDeviceMountPath returns a path where the device should
|
|
|
|
// be mounted after it is attached. This is a global mount
|
|
|
|
// point which should be bind mounted for individual volumes.
|
|
|
|
GetDeviceMountPath(spec *Spec) string
|
|
|
|
|
|
|
|
// MountDevice mounts the disk to a global path which
|
|
|
|
// individual pods can then bind mount
|
|
|
|
MountDevice(devicePath string, deviceMountPath string, mounter mount.Interface) error
|
2016-01-11 21:23:28 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// Detacher can detach a volume from a node.
|
|
|
|
type Detacher interface {
|
2016-04-29 19:29:59 +00:00
|
|
|
|
|
|
|
// Detach the given volume from the given host.
|
|
|
|
Detach(deviceMountPath string, hostName string) error
|
|
|
|
|
|
|
|
// WaitForDetach blocks until the device is detached from this
|
|
|
|
// node. If the device does not detach within the given timout
|
|
|
|
// period an error is returned.
|
|
|
|
WaitForDetach(devicePath string, timout time.Duration) error
|
|
|
|
|
|
|
|
// UnmountDevice unmounts the global mount of the disk. This
|
|
|
|
// should only be called once all bind mounts have been
|
|
|
|
// unmounted.
|
|
|
|
UnmountDevice(globalMountPath string, mounter mount.Interface) error
|
2016-01-11 21:23:28 +00:00
|
|
|
}
|
|
|
|
|
2014-11-23 15:47:25 +00:00
|
|
|
func RenameDirectory(oldPath, newName string) (string, error) {
|
|
|
|
newPath, err := ioutil.TempDir(path.Dir(oldPath), newName)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
err = os.Rename(oldPath, newPath)
|
|
|
|
if err != nil {
|
|
|
|
return "", err
|
|
|
|
}
|
|
|
|
return newPath, nil
|
|
|
|
}
|