kubernetes: k8s.io/kubernetes/test/e2e/storage/testsuites Index | Files

package testsuites

import "k8s.io/kubernetes/test/e2e/storage/testsuites"

Index

Package Files

base.go disruptive.go driveroperations.go ephemeral.go multivolume.go provisioning.go snapshottable.go subpath.go testdriver.go topology.go volume_expand.go volume_io.go volumelimits.go volumemode.go volumes.go

func CSIInlineVolumesEnabled Uses

func CSIInlineVolumesEnabled(c clientset.Interface, ns string) (bool, error)

CSIInlineVolumesEnabled checks whether the running cluster has the CSIInlineVolumes feature gate enabled. It does that by trying to create a pod that uses that feature.

func DefineTestSuite Uses

func DefineTestSuite(driver TestDriver, tsInits []func() TestSuite)

DefineTestSuite defines tests for all testpatterns and all testSuites for a driver

func ExpandPVCSize Uses

func ExpandPVCSize(origPVC *v1.PersistentVolumeClaim, size resource.Quantity, c clientset.Interface) (*v1.PersistentVolumeClaim, error)

ExpandPVCSize expands PVC size

func GetDriverNameWithFeatureTags Uses

func GetDriverNameWithFeatureTags(driver TestDriver) string

GetDriverNameWithFeatureTags returns driver name with feature tags For example)

- [Driver: nfs]
- [Driver: rbd][Feature:Volumes]

func GetSnapshotClass Uses

func GetSnapshotClass(
    snapshotter string,
    parameters map[string]string,
    ns string,
    suffix string,
) *unstructured.Unstructured

GetSnapshotClass constructs a new SnapshotClass instance with a unique name that is based on namespace + suffix.

func GetStorageClass Uses

func GetStorageClass(
    provisioner string,
    parameters map[string]string,
    bindingMode *storagev1.VolumeBindingMode,
    ns string,
    suffix string,
) *storagev1.StorageClass

GetStorageClass constructs a new StorageClass instance with a unique name that is based on namespace + suffix.

func PVMultiNodeCheck Uses

func PVMultiNodeCheck(client clientset.Interface, claim *v1.PersistentVolumeClaim, node e2epod.NodeSelection)

PVMultiNodeCheck checks that a PV retains data when moved between nodes.

It starts these pods: - The first pod writes 'hello word' to the /mnt/test (= the volume) on one node. - The second pod runs grep 'hello world' on /mnt/test on another node.

The first node is selected by Kubernetes when scheduling the first pod. The second pod uses the same criteria, except that a special anti-affinity for the first node gets added. This test can only pass if the cluster has more than one suitable node. The caller has to ensure that.

If all succeeds, Kubernetes actually allocated something that is persistent across pods and across nodes.

This is a common test that can be called from a StorageClassTest.PvCheck.

func PVWriteReadSingleNodeCheck Uses

func PVWriteReadSingleNodeCheck(client clientset.Interface, claim *v1.PersistentVolumeClaim, node e2epod.NodeSelection) *v1.PersistentVolume

PVWriteReadSingleNodeCheck checks that a PV retains data on a single node and returns the PV.

It starts two pods: - The first pod writes 'hello word' to the /mnt/test (= the volume) on one node. - The second pod runs grep 'hello world' on /mnt/test on the same node.

The node is selected by Kubernetes when scheduling the first pod. It's then selected via its name for the second pod.

If both succeed, Kubernetes actually allocated something that is persistent across pods.

This is a common test that can be called from a StorageClassTest.PvCheck.

func RunInPodWithVolume Uses

func RunInPodWithVolume(c clientset.Interface, ns, claimName, podName, command string, node e2epod.NodeSelection)

RunInPodWithVolume runs a command in a pod with given claim mounted to /mnt directory. It starts, checks, collects output and stops it.

func StartInPodWithInlineVolume Uses

func StartInPodWithInlineVolume(c clientset.Interface, ns, podName, command string, csiVolumes []v1.CSIVolumeSource, readOnly bool, node e2epod.NodeSelection) *v1.Pod

StartInPodWithInlineVolume starts a command in a pod with given volume(s) mounted to /mnt/test-<number> directory. The caller is responsible for checking the pod and deleting it.

func StartInPodWithVolume Uses

func StartInPodWithVolume(c clientset.Interface, ns, claimName, podName, command string, node e2epod.NodeSelection) *v1.Pod

StartInPodWithVolume starts a command in a pod with given claim mounted to /mnt directory The caller is responsible for checking the pod and deleting it.

func StartPodLogs Uses

func StartPodLogs(f *framework.Framework) func()

StartPodLogs begins capturing log output and events from current and future pods running in the namespace of the framework. That ends when the returned cleanup function is called.

The output goes to log files (when using --report-dir, as in the CI) or the output stream (otherwise).

func StopPod Uses

func StopPod(c clientset.Interface, pod *v1.Pod)

StopPod first tries to log the output of the pod's container, then deletes the pod and waits for that to succeed.

func SubpathTestPod Uses

func SubpathTestPod(f *framework.Framework, subpath, volumeType string, source *v1.VolumeSource, privilegedSecurityContext bool) *v1.Pod

SubpathTestPod returns a pod spec for subpath tests

func TestAccessMultipleVolumesAcrossPodRecreation Uses

func TestAccessMultipleVolumesAcrossPodRecreation(f *framework.Framework, cs clientset.Interface, ns string,
    node e2epod.NodeSelection, pvcs []*v1.PersistentVolumeClaim, requiresSameNode bool)

TestAccessMultipleVolumesAcrossPodRecreation tests access to multiple volumes from single pod, then recreate pod on the same or different node depending on requiresSameNode, and recheck access to the volumes from the recreated pod

func TestBasicSubpath Uses

func TestBasicSubpath(f *framework.Framework, contents string, pod *v1.Pod)

TestBasicSubpath runs basic subpath test

func TestBasicSubpathFile Uses

func TestBasicSubpathFile(f *framework.Framework, contents string, pod *v1.Pod, filepath string)

TestBasicSubpathFile runs basic subpath file test

func TestConcurrentAccessToSingleVolume Uses

func TestConcurrentAccessToSingleVolume(f *framework.Framework, cs clientset.Interface, ns string,
    node e2epod.NodeSelection, pvc *v1.PersistentVolumeClaim, numPods int, requiresSameNode bool)

TestConcurrentAccessToSingleVolume tests access to a single volume from multiple pods, then delete the last pod, and recheck access to the volume after pod deletion to check if other pod deletion doesn't affect. Pods are deployed on the same node or different nodes depending on requiresSameNode. Read/write check are done across pod, by check reading both what pod{n-1} and pod{n} wrote from pod{n}.

func WaitForControllerVolumeResize Uses

func WaitForControllerVolumeResize(pvc *v1.PersistentVolumeClaim, c clientset.Interface, duration time.Duration) error

WaitForControllerVolumeResize waits for the controller resize to be finished

func WaitForFSResize Uses

func WaitForFSResize(pvc *v1.PersistentVolumeClaim, c clientset.Interface) (*v1.PersistentVolumeClaim, error)

WaitForFSResize waits for the filesystem in the pv to be resized

func WaitForResizingCondition Uses

func WaitForResizingCondition(pvc *v1.PersistentVolumeClaim, c clientset.Interface, duration time.Duration) error

WaitForResizingCondition waits for the pvc condition to be PersistentVolumeClaimResizing

func WaitForSnapshotReady Uses

func WaitForSnapshotReady(c dynamic.Interface, ns string, snapshotName string, Poll, timeout time.Duration) error

WaitForSnapshotReady waits for a VolumeSnapshot to be ready to use or until timeout occurs, whichever comes first.

type Capability Uses

type Capability string

Capability represents a feature that a volume plugin supports

const (
    CapPersistence        Capability = "persistence"        // data is persisted across pod restarts
    CapBlock              Capability = "block"              // raw block mode
    CapFsGroup            Capability = "fsGroup"            // volume ownership via fsGroup
    CapExec               Capability = "exec"               // exec a file in the volume
    CapSnapshotDataSource Capability = "snapshotDataSource" // support populate data from snapshot
    CapPVCDataSource      Capability = "pvcDataSource"      // support populate data from pvc

    // multiple pods on a node can use the same volume concurrently;
    // for CSI, see:
    // - https://github.com/container-storage-interface/spec/pull/150
    // - https://github.com/container-storage-interface/spec/issues/178
    // - NodeStageVolume in the spec
    CapMultiPODs Capability = "multipods"

    CapRWX                 Capability = "RWX"                 // support ReadWriteMany access modes
    CapControllerExpansion Capability = "controllerExpansion" // support volume expansion for controller
    CapNodeExpansion       Capability = "nodeExpansion"       // support volume expansion for node
    CapVolumeLimits        Capability = "volumeLimits"        // support volume limits (can be *very* slow)
    CapSingleNodeVolume    Capability = "singleNodeVolume"    // support volume that can run on single node (like hostpath)
    CapTopology            Capability = "topology"            // support topology
)

Constants related to capability

type DriverInfo Uses

type DriverInfo struct {
    // Internal name of the driver, this is used as a display name in the test
    // case and test objects
    Name string
    // Fully qualified plugin name as registered in Kubernetes of the in-tree
    // plugin if it exists and is empty if this DriverInfo represents a CSI
    // Driver
    InTreePluginName string
    FeatureTag       string // FeatureTag for the driver

    // Maximum single file size supported by this driver
    MaxFileSize int64
    // The range of disk size supported by this driver
    SupportedSizeRange volume.SizeRange
    // Map of string for supported fs type
    SupportedFsType sets.String
    // Map of string for supported mount option
    SupportedMountOption sets.String
    // [Optional] Map of string for required mount option
    RequiredMountOption sets.String
    // Map that represents plugin capabilities
    Capabilities map[Capability]bool
    // [Optional] List of access modes required for provisioning, defaults to
    // RWO if unset
    RequiredAccessModes []v1.PersistentVolumeAccessMode
    // [Optional] List of topology keys driver supports
    TopologyKeys []string
    // [Optional] Number of allowed topologies the driver requires.
    // Only relevant if TopologyKeys is set. Defaults to 1.
    // Example: multi-zonal disk requires at least 2 allowed topologies.
    NumAllowedTopologies int
}

DriverInfo represents static information about a TestDriver.

type DynamicPVTestDriver Uses

type DynamicPVTestDriver interface {
    TestDriver
    // GetDynamicProvisionStorageClass returns a StorageClass dynamic provision Persistent Volume.
    // The StorageClass must be created in the current test's namespace and have
    // a unique name inside that namespace because GetDynamicProvisionStorageClass might
    // be called more than once per test.
    // It will set fsType to the StorageClass, if TestDriver supports it.
    // It will return nil, if the TestDriver doesn't support it.
    GetDynamicProvisionStorageClass(config *PerTestConfig, fsType string) *storagev1.StorageClass
}

DynamicPVTestDriver represents an interface for a TestDriver that supports DynamicPV

type EphemeralTest Uses

type EphemeralTest struct {
    Client     clientset.Interface
    Namespace  string
    DriverName string
    Node       e2epod.NodeSelection

    // GetVolume returns the volume attributes for a
    // certain inline ephemeral volume, enumerated starting with
    // #0. Some tests might require more than one volume. They can
    // all be the same or different, depending what the driver supports
    // and/or wants to test.
    //
    // For each volume, the test driver can specify the
    // attributes, whether two pods using those attributes will
    // end up sharing the same backend storage (i.e. changes made
    // in one pod will be visible in the other), and whether
    // the volume can be mounted read/write or only read-only.
    GetVolume func(volumeNumber int) (attributes map[string]string, shared bool, readOnly bool)

    // RunningPodCheck is invoked while a pod using an inline volume is running.
    // It can execute additional checks on the pod and its volume(s). Any data
    // returned by it is passed to StoppedPodCheck.
    RunningPodCheck func(pod *v1.Pod) interface{}

    // StoppedPodCheck is invoked after ensuring that the pod is gone.
    // It is passed the data gather by RunningPodCheck or nil if that
    // isn't defined and then can do additional checks on the node,
    // like for example verifying that the ephemeral volume was really
    // removed. How to do such a check is driver-specific and not
    // covered by the generic storage test suite.
    StoppedPodCheck func(nodeName string, runningPodData interface{})

    // NumInlineVolumes sets the number of ephemeral inline volumes per pod.
    // Unset (= zero) is the same as one.
    NumInlineVolumes int

    // ReadOnly limits mounting to read-only.
    ReadOnly bool
}

EphemeralTest represents parameters to be used by tests for inline volumes. Not all parameters are used by all tests.

func (EphemeralTest) TestEphemeral Uses

func (t EphemeralTest) TestEphemeral()

TestEphemeral tests pod creation with one ephemeral volume.

type EphemeralTestDriver Uses

type EphemeralTestDriver interface {
    TestDriver

    // GetVolume returns the volume attributes for a certain
    // inline ephemeral volume, enumerated starting with #0. Some
    // tests might require more than one volume. They can all be
    // the same or different, depending what the driver supports
    // and/or wants to test.
    //
    // For each volume, the test driver can return volume attributes,
    // whether the resulting volume is shared between different pods (i.e.
    // changes made in one pod are visible in another), and whether the
    // volume can be mounted read/write or only read-only.
    GetVolume(config *PerTestConfig, volumeNumber int) (attributes map[string]string, shared bool, readOnly bool)

    // GetCSIDriverName returns the name that was used when registering with
    // kubelet. Depending on how the driver was deployed, this can be different
    // from DriverInfo.Name. Starting with Kubernetes 1.16, there must also
    // be a CSIDriver object under the same name with a "mode" field that enables
    // usage of the driver for ephemeral inline volumes.
    GetCSIDriverName(config *PerTestConfig) string
}

EphemeralTestDriver represents an interface for a TestDriver that supports ephemeral inline volumes.

type InlineVolumeTestDriver Uses

type InlineVolumeTestDriver interface {
    PreprovisionedVolumeTestDriver

    // GetVolumeSource returns a volumeSource for inline volume.
    // It will set readOnly and fsType to the volumeSource, if TestDriver supports both of them.
    // It will return nil, if the TestDriver doesn't support either of the parameters.
    GetVolumeSource(readOnly bool, fsType string, testVolume TestVolume) *v1.VolumeSource
}

InlineVolumeTestDriver represents an interface for a TestDriver that supports InlineVolume

type PerTestConfig Uses

type PerTestConfig struct {
    // The test driver for the test.
    Driver TestDriver

    // Some short word that gets inserted into dynamically
    // generated entities (pods, paths) as first part of the name
    // to make debugging easier. Can be the same for different
    // tests inside the test suite.
    Prefix string

    // The framework instance allocated for the current test.
    Framework *framework.Framework

    // If non-empty, then pods using a volume will be scheduled
    // onto the node with this name. Otherwise Kubernetes will
    // pick a node.
    ClientNodeName string

    // Some tests also support scheduling pods onto nodes with
    // these label/value pairs. As not all tests use this field,
    // a driver that absolutely needs the pods on a specific
    // node must use ClientNodeName.
    ClientNodeSelector map[string]string

    // Some test drivers initialize a storage server. This is
    // the configuration that then has to be used to run tests.
    // The values above are ignored for such tests.
    ServerConfig *volume.TestConfig
}

PerTestConfig represents parameters that control test execution. One instance gets allocated for each test and is then passed via pointer to functions involved in the test.

func (*PerTestConfig) GetUniqueDriverName Uses

func (config *PerTestConfig) GetUniqueDriverName() string

GetUniqueDriverName returns unique driver name that can be used parallelly in tests

type PreprovisionedPVTestDriver Uses

type PreprovisionedPVTestDriver interface {
    PreprovisionedVolumeTestDriver
    // GetPersistentVolumeSource returns a PersistentVolumeSource with volume node affinity for pre-provisioned Persistent Volume.
    // It will set readOnly and fsType to the PersistentVolumeSource, if TestDriver supports both of them.
    // It will return nil, if the TestDriver doesn't support either of the parameters.
    GetPersistentVolumeSource(readOnly bool, fsType string, testVolume TestVolume) (*v1.PersistentVolumeSource, *v1.VolumeNodeAffinity)
}

PreprovisionedPVTestDriver represents an interface for a TestDriver that supports PreprovisionedPV

type PreprovisionedVolumeTestDriver Uses

type PreprovisionedVolumeTestDriver interface {
    TestDriver
    // CreateVolume creates a pre-provisioned volume of the desired volume type.
    CreateVolume(config *PerTestConfig, volumeType testpatterns.TestVolType) TestVolume
}

PreprovisionedVolumeTestDriver represents an interface for a TestDriver that has pre-provisioned volume

type SnapshottableTestDriver Uses

type SnapshottableTestDriver interface {
    TestDriver
    // GetSnapshotClass returns a SnapshotClass to create snapshot.
    // It will return nil, if the TestDriver doesn't support it.
    GetSnapshotClass(config *PerTestConfig) *unstructured.Unstructured
}

SnapshottableTestDriver represents an interface for a TestDriver that supports DynamicSnapshot

type StorageClassTest Uses

type StorageClassTest struct {
    Client               clientset.Interface
    Claim                *v1.PersistentVolumeClaim
    SourceClaim          *v1.PersistentVolumeClaim
    Class                *storagev1.StorageClass
    Name                 string
    CloudProviders       []string
    Provisioner          string
    StorageClassName     string
    Parameters           map[string]string
    DelayBinding         bool
    ClaimSize            string
    ExpectedSize         string
    PvCheck              func(claim *v1.PersistentVolumeClaim)
    VolumeMode           v1.PersistentVolumeMode
    AllowVolumeExpansion bool
}

StorageClassTest represents parameters to be used by provisioning tests. Not all parameters are used by all tests.

func (StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC Uses

func (t StorageClassTest) TestBindingWaitForFirstConsumerMultiPVC(claims []*v1.PersistentVolumeClaim, nodeSelector map[string]string, expectUnschedulable bool) ([]*v1.PersistentVolume, *v1.Node)

TestBindingWaitForFirstConsumerMultiPVC tests the binding with WaitForFirstConsumer mode

func (StorageClassTest) TestDynamicProvisioning Uses

func (t StorageClassTest) TestDynamicProvisioning() *v1.PersistentVolume

TestDynamicProvisioning tests dynamic provisioning with specified StorageClassTest

type TestDriver Uses

type TestDriver interface {
    // GetDriverInfo returns DriverInfo for the TestDriver. This must be static
    // information.
    GetDriverInfo() *DriverInfo

    // SkipUnsupportedTest skips test if Testpattern is not
    // suitable to test with the TestDriver. It gets called after
    // parsing parameters of the test suite and before the
    // framework is initialized. Cheap tests that just check
    // parameters like the cloud provider can and should be
    // done in SkipUnsupportedTest to avoid setting up more
    // expensive resources like framework.Framework. Tests that
    // depend on a connection to the cluster can be done in
    // PrepareTest once the framework is ready.
    SkipUnsupportedTest(testpatterns.TestPattern)

    // PrepareTest is called at test execution time each time a new test case is about to start.
    // It sets up all necessary resources and returns the per-test configuration
    // plus a cleanup function that frees all allocated resources.
    PrepareTest(f *framework.Framework) (*PerTestConfig, func())
}

TestDriver represents an interface for a driver to be tested in TestSuite. Except for GetDriverInfo, all methods will be called at test runtime and thus can use framework.Skipf, framework.Fatal, Gomega assertions, etc.

type TestResource Uses

type TestResource interface {
    // contains filtered or unexported methods
}

TestResource represents an interface for resources that is used by TestSuite

type TestSuite Uses

type TestSuite interface {
    // contains filtered or unexported methods
}

TestSuite represents an interface for a set of tests which works with TestDriver

func InitDisruptiveTestSuite Uses

func InitDisruptiveTestSuite() TestSuite

InitDisruptiveTestSuite returns subPathTestSuite that implements TestSuite interface

func InitEphemeralTestSuite Uses

func InitEphemeralTestSuite() TestSuite

InitEphemeralTestSuite returns ephemeralTestSuite that implements TestSuite interface

func InitMultiVolumeTestSuite Uses

func InitMultiVolumeTestSuite() TestSuite

InitMultiVolumeTestSuite returns multiVolumeTestSuite that implements TestSuite interface

func InitProvisioningTestSuite Uses

func InitProvisioningTestSuite() TestSuite

InitProvisioningTestSuite returns provisioningTestSuite that implements TestSuite interface

func InitSnapshottableTestSuite Uses

func InitSnapshottableTestSuite() TestSuite

InitSnapshottableTestSuite returns snapshottableTestSuite that implements TestSuite interface

func InitSubPathTestSuite Uses

func InitSubPathTestSuite() TestSuite

InitSubPathTestSuite returns subPathTestSuite that implements TestSuite interface

func InitTopologyTestSuite Uses

func InitTopologyTestSuite() TestSuite

InitTopologyTestSuite returns topologyTestSuite that implements TestSuite interface

func InitVolumeExpandTestSuite Uses

func InitVolumeExpandTestSuite() TestSuite

InitVolumeExpandTestSuite returns volumeExpandTestSuite that implements TestSuite interface

func InitVolumeIOTestSuite Uses

func InitVolumeIOTestSuite() TestSuite

InitVolumeIOTestSuite returns volumeIOTestSuite that implements TestSuite interface

func InitVolumeLimitsTestSuite Uses

func InitVolumeLimitsTestSuite() TestSuite

InitVolumeLimitsTestSuite returns volumeLimitsTestSuite that implements TestSuite interface

func InitVolumeModeTestSuite Uses

func InitVolumeModeTestSuite() TestSuite

InitVolumeModeTestSuite returns volumeModeTestSuite that implements TestSuite interface

func InitVolumesTestSuite Uses

func InitVolumesTestSuite() TestSuite

InitVolumesTestSuite returns volumesTestSuite that implements TestSuite interface

type TestSuiteInfo Uses

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

TestSuiteInfo represents a set of parameters for TestSuite

type TestVolume Uses

type TestVolume interface {
    DeleteVolume()
}

TestVolume is the result of PreprovisionedVolumeTestDriver.CreateVolume. The only common functionality is to delete it. Individual driver interfaces have additional methods that work with volumes created by them.

func CreateVolume Uses

func CreateVolume(driver TestDriver, config *PerTestConfig, volType testpatterns.TestVolType) TestVolume

CreateVolume creates volume for test unless dynamicPV test

Package testsuites imports 45 packages (graph) and is imported by 60 packages. Updated 2019-11-12. Refresh now. Tools for package owners.