123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731 |
- /*
- Copyright 2017 The Kubernetes Authors.
- 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 csi
- import (
- "context"
- "errors"
- "io"
- "os"
- "path/filepath"
- "reflect"
- "testing"
- csipbv1 "github.com/container-storage-interface/spec/lib/go/csi"
- api "k8s.io/api/core/v1"
- "k8s.io/apimachinery/pkg/api/resource"
- utiltesting "k8s.io/client-go/util/testing"
- "k8s.io/kubernetes/pkg/volume"
- "k8s.io/kubernetes/pkg/volume/csi/fake"
- volumetypes "k8s.io/kubernetes/pkg/volume/util/types"
- )
- type fakeCsiDriverClient struct {
- t *testing.T
- nodeClient *fake.NodeClient
- }
- func newFakeCsiDriverClient(t *testing.T, stagingCapable bool) *fakeCsiDriverClient {
- return &fakeCsiDriverClient{
- t: t,
- nodeClient: fake.NewNodeClient(stagingCapable),
- }
- }
- func newFakeCsiDriverClientWithExpansion(t *testing.T, stagingCapable bool, expansionSet bool) *fakeCsiDriverClient {
- return &fakeCsiDriverClient{
- t: t,
- nodeClient: fake.NewNodeClientWithExpansion(stagingCapable, expansionSet),
- }
- }
- func newFakeCsiDriverClientWithVolumeStats(t *testing.T, volumeStatsSet bool) *fakeCsiDriverClient {
- return &fakeCsiDriverClient{
- t: t,
- nodeClient: fake.NewNodeClientWithVolumeStats(volumeStatsSet),
- }
- }
- func (c *fakeCsiDriverClient) NodeGetInfo(ctx context.Context) (
- nodeID string,
- maxVolumePerNode int64,
- accessibleTopology map[string]string,
- err error) {
- resp, err := c.nodeClient.NodeGetInfo(ctx, &csipbv1.NodeGetInfoRequest{})
- topology := resp.GetAccessibleTopology()
- if topology != nil {
- accessibleTopology = topology.Segments
- }
- return resp.GetNodeId(), resp.GetMaxVolumesPerNode(), accessibleTopology, err
- }
- func (c *fakeCsiDriverClient) NodeGetVolumeStats(ctx context.Context, volID string, targetPath string) (
- usageCountMap *volume.Metrics, err error) {
- c.t.Log("calling fake.NodeGetVolumeStats...")
- req := &csipbv1.NodeGetVolumeStatsRequest{
- VolumeId: volID,
- VolumePath: targetPath,
- }
- resp, err := c.nodeClient.NodeGetVolumeStats(ctx, req)
- usages := resp.GetUsage()
- metrics := &volume.Metrics{}
- if usages == nil {
- return nil, nil
- }
- for _, usage := range usages {
- if usage == nil {
- continue
- }
- unit := usage.GetUnit()
- switch unit {
- case csipbv1.VolumeUsage_BYTES:
- metrics.Available = resource.NewQuantity(usage.GetAvailable(), resource.BinarySI)
- metrics.Capacity = resource.NewQuantity(usage.GetTotal(), resource.BinarySI)
- metrics.Used = resource.NewQuantity(usage.GetUsed(), resource.BinarySI)
- case csipbv1.VolumeUsage_INODES:
- metrics.InodesFree = resource.NewQuantity(usage.GetAvailable(), resource.BinarySI)
- metrics.Inodes = resource.NewQuantity(usage.GetTotal(), resource.BinarySI)
- metrics.InodesUsed = resource.NewQuantity(usage.GetUsed(), resource.BinarySI)
- }
- }
- return metrics, nil
- }
- func (c *fakeCsiDriverClient) NodeSupportsVolumeStats(ctx context.Context) (bool, error) {
- c.t.Log("calling fake.NodeSupportsVolumeStats...")
- req := &csipbv1.NodeGetCapabilitiesRequest{}
- resp, err := c.nodeClient.NodeGetCapabilities(ctx, req)
- if err != nil {
- return false, err
- }
- capabilities := resp.GetCapabilities()
- if capabilities == nil {
- return false, nil
- }
- for _, capability := range capabilities {
- if capability.GetRpc().GetType() == csipbv1.NodeServiceCapability_RPC_GET_VOLUME_STATS {
- return true, nil
- }
- }
- return false, nil
- }
- func (c *fakeCsiDriverClient) NodePublishVolume(
- ctx context.Context,
- volID string,
- readOnly bool,
- stagingTargetPath string,
- targetPath string,
- accessMode api.PersistentVolumeAccessMode,
- publishContext map[string]string,
- volumeContext map[string]string,
- secrets map[string]string,
- fsType string,
- mountOptions []string,
- ) error {
- c.t.Log("calling fake.NodePublishVolume...")
- req := &csipbv1.NodePublishVolumeRequest{
- VolumeId: volID,
- TargetPath: targetPath,
- StagingTargetPath: stagingTargetPath,
- Readonly: readOnly,
- PublishContext: publishContext,
- VolumeContext: volumeContext,
- Secrets: secrets,
- VolumeCapability: &csipbv1.VolumeCapability{
- AccessMode: &csipbv1.VolumeCapability_AccessMode{
- Mode: asCSIAccessModeV1(accessMode),
- },
- },
- }
- if fsType == fsTypeBlockName {
- req.VolumeCapability.AccessType = &csipbv1.VolumeCapability_Block{
- Block: &csipbv1.VolumeCapability_BlockVolume{},
- }
- } else {
- req.VolumeCapability.AccessType = &csipbv1.VolumeCapability_Mount{
- Mount: &csipbv1.VolumeCapability_MountVolume{
- FsType: fsType,
- MountFlags: mountOptions,
- },
- }
- }
- _, err := c.nodeClient.NodePublishVolume(ctx, req)
- if err != nil && !isFinalError(err) {
- return volumetypes.NewUncertainProgressError(err.Error())
- }
- return err
- }
- func (c *fakeCsiDriverClient) NodeUnpublishVolume(ctx context.Context, volID string, targetPath string) error {
- c.t.Log("calling fake.NodeUnpublishVolume...")
- req := &csipbv1.NodeUnpublishVolumeRequest{
- VolumeId: volID,
- TargetPath: targetPath,
- }
- _, err := c.nodeClient.NodeUnpublishVolume(ctx, req)
- return err
- }
- func (c *fakeCsiDriverClient) NodeStageVolume(ctx context.Context,
- volID string,
- publishContext map[string]string,
- stagingTargetPath string,
- fsType string,
- accessMode api.PersistentVolumeAccessMode,
- secrets map[string]string,
- volumeContext map[string]string,
- mountOptions []string,
- ) error {
- c.t.Log("calling fake.NodeStageVolume...")
- req := &csipbv1.NodeStageVolumeRequest{
- VolumeId: volID,
- PublishContext: publishContext,
- StagingTargetPath: stagingTargetPath,
- VolumeCapability: &csipbv1.VolumeCapability{
- AccessMode: &csipbv1.VolumeCapability_AccessMode{
- Mode: asCSIAccessModeV1(accessMode),
- },
- },
- Secrets: secrets,
- VolumeContext: volumeContext,
- }
- if fsType == fsTypeBlockName {
- req.VolumeCapability.AccessType = &csipbv1.VolumeCapability_Block{
- Block: &csipbv1.VolumeCapability_BlockVolume{},
- }
- } else {
- req.VolumeCapability.AccessType = &csipbv1.VolumeCapability_Mount{
- Mount: &csipbv1.VolumeCapability_MountVolume{
- FsType: fsType,
- MountFlags: mountOptions,
- },
- }
- }
- _, err := c.nodeClient.NodeStageVolume(ctx, req)
- if err != nil && !isFinalError(err) {
- return volumetypes.NewUncertainProgressError(err.Error())
- }
- return err
- }
- func (c *fakeCsiDriverClient) NodeUnstageVolume(ctx context.Context, volID, stagingTargetPath string) error {
- c.t.Log("calling fake.NodeUnstageVolume...")
- req := &csipbv1.NodeUnstageVolumeRequest{
- VolumeId: volID,
- StagingTargetPath: stagingTargetPath,
- }
- _, err := c.nodeClient.NodeUnstageVolume(ctx, req)
- return err
- }
- func (c *fakeCsiDriverClient) NodeSupportsNodeExpand(ctx context.Context) (bool, error) {
- c.t.Log("calling fake.NodeSupportsNodeExpand...")
- req := &csipbv1.NodeGetCapabilitiesRequest{}
- resp, err := c.nodeClient.NodeGetCapabilities(ctx, req)
- if err != nil {
- return false, err
- }
- capabilities := resp.GetCapabilities()
- if capabilities == nil {
- return false, nil
- }
- for _, capability := range capabilities {
- if capability.GetRpc().GetType() == csipbv1.NodeServiceCapability_RPC_EXPAND_VOLUME {
- return true, nil
- }
- }
- return false, nil
- }
- func (c *fakeCsiDriverClient) NodeSupportsStageUnstage(ctx context.Context) (bool, error) {
- c.t.Log("calling fake.NodeGetCapabilities for NodeSupportsStageUnstage...")
- req := &csipbv1.NodeGetCapabilitiesRequest{}
- resp, err := c.nodeClient.NodeGetCapabilities(ctx, req)
- if err != nil {
- return false, err
- }
- capabilities := resp.GetCapabilities()
- stageUnstageSet := false
- if capabilities == nil {
- return false, nil
- }
- for _, capability := range capabilities {
- if capability.GetRpc().GetType() == csipbv1.NodeServiceCapability_RPC_STAGE_UNSTAGE_VOLUME {
- stageUnstageSet = true
- }
- }
- return stageUnstageSet, nil
- }
- func (c *fakeCsiDriverClient) NodeExpandVolume(ctx context.Context, volumeid, volumePath string, newSize resource.Quantity) (resource.Quantity, error) {
- c.t.Log("calling fake.NodeExpandVolume")
- req := &csipbv1.NodeExpandVolumeRequest{
- VolumeId: volumeid,
- VolumePath: volumePath,
- CapacityRange: &csipbv1.CapacityRange{RequiredBytes: newSize.Value()},
- }
- resp, err := c.nodeClient.NodeExpandVolume(ctx, req)
- if err != nil {
- return newSize, err
- }
- updatedQuantity := resource.NewQuantity(resp.CapacityBytes, resource.BinarySI)
- return *updatedQuantity, nil
- }
- func setupClient(t *testing.T, stageUnstageSet bool) csiClient {
- return newFakeCsiDriverClient(t, stageUnstageSet)
- }
- func setupClientWithExpansion(t *testing.T, stageUnstageSet bool, expansionSet bool) csiClient {
- return newFakeCsiDriverClientWithExpansion(t, stageUnstageSet, expansionSet)
- }
- func setupClientWithVolumeStats(t *testing.T, volumeStatsSet bool) csiClient {
- return newFakeCsiDriverClientWithVolumeStats(t, volumeStatsSet)
- }
- func checkErr(t *testing.T, expectedAnError bool, actualError error) {
- t.Helper()
- errOccurred := actualError != nil
- if expectedAnError && !errOccurred {
- t.Error("expected an error")
- }
- if !expectedAnError && errOccurred {
- t.Errorf("expected no error, got: %v", actualError)
- }
- }
- func TestClientNodeGetInfo(t *testing.T) {
- testCases := []struct {
- name string
- expectedNodeID string
- expectedMaxVolumePerNode int64
- expectedAccessibleTopology map[string]string
- mustFail bool
- err error
- }{
- {
- name: "test ok",
- expectedNodeID: "node1",
- expectedMaxVolumePerNode: 16,
- expectedAccessibleTopology: map[string]string{"com.example.csi-topology/zone": "zone1"},
- },
- {
- name: "grpc error",
- mustFail: true,
- err: errors.New("grpc error"),
- },
- }
- for _, tc := range testCases {
- t.Logf("test case: %s", tc.name)
- fakeCloser := fake.NewCloser(t)
- client := &csiDriverClient{
- driverName: "Fake Driver Name",
- nodeV1ClientCreator: func(addr csiAddr) (csipbv1.NodeClient, io.Closer, error) {
- nodeClient := fake.NewNodeClient(false /* stagingCapable */)
- nodeClient.SetNextError(tc.err)
- nodeClient.SetNodeGetInfoResp(&csipbv1.NodeGetInfoResponse{
- NodeId: tc.expectedNodeID,
- MaxVolumesPerNode: tc.expectedMaxVolumePerNode,
- AccessibleTopology: &csipbv1.Topology{
- Segments: tc.expectedAccessibleTopology,
- },
- })
- return nodeClient, fakeCloser, nil
- },
- }
- nodeID, maxVolumePerNode, accessibleTopology, err := client.NodeGetInfo(context.Background())
- checkErr(t, tc.mustFail, err)
- if nodeID != tc.expectedNodeID {
- t.Errorf("expected nodeID: %v; got: %v", tc.expectedNodeID, nodeID)
- }
- if maxVolumePerNode != tc.expectedMaxVolumePerNode {
- t.Errorf("expected maxVolumePerNode: %v; got: %v", tc.expectedMaxVolumePerNode, maxVolumePerNode)
- }
- if !reflect.DeepEqual(accessibleTopology, tc.expectedAccessibleTopology) {
- t.Errorf("expected accessibleTopology: %v; got: %v", tc.expectedAccessibleTopology, accessibleTopology)
- }
- if !tc.mustFail {
- fakeCloser.Check()
- }
- }
- }
- func TestClientNodePublishVolume(t *testing.T) {
- tmpDir, err := utiltesting.MkTmpdir("csi-test")
- if err != nil {
- t.Fatalf("can't create temp dir: %v", err)
- }
- defer os.RemoveAll(tmpDir)
- testPath := filepath.Join(tmpDir, "path")
- testCases := []struct {
- name string
- volID string
- targetPath string
- fsType string
- mustFail bool
- err error
- }{
- {name: "test ok", volID: "vol-test", targetPath: testPath},
- {name: "missing volID", targetPath: testPath, mustFail: true},
- {name: "missing target path", volID: "vol-test", mustFail: true},
- {name: "bad fs", volID: "vol-test", targetPath: testPath, fsType: "badfs", mustFail: true},
- {name: "grpc error", volID: "vol-test", targetPath: testPath, mustFail: true, err: errors.New("grpc error")},
- }
- for _, tc := range testCases {
- t.Logf("test case: %s", tc.name)
- fakeCloser := fake.NewCloser(t)
- client := &csiDriverClient{
- driverName: "Fake Driver Name",
- nodeV1ClientCreator: func(addr csiAddr) (csipbv1.NodeClient, io.Closer, error) {
- nodeClient := fake.NewNodeClient(false /* stagingCapable */)
- nodeClient.SetNextError(tc.err)
- return nodeClient, fakeCloser, nil
- },
- }
- err := client.NodePublishVolume(
- context.Background(),
- tc.volID,
- false,
- "",
- tc.targetPath,
- api.ReadWriteOnce,
- map[string]string{"device": "/dev/null"},
- map[string]string{"attr0": "val0"},
- map[string]string{},
- tc.fsType,
- []string{},
- )
- checkErr(t, tc.mustFail, err)
- if !tc.mustFail {
- fakeCloser.Check()
- }
- }
- }
- func TestClientNodeUnpublishVolume(t *testing.T) {
- tmpDir, err := utiltesting.MkTmpdir("csi-test")
- if err != nil {
- t.Fatalf("can't create temp dir: %v", err)
- }
- defer os.RemoveAll(tmpDir)
- testPath := filepath.Join(tmpDir, "path")
- testCases := []struct {
- name string
- volID string
- targetPath string
- mustFail bool
- err error
- }{
- {name: "test ok", volID: "vol-test", targetPath: testPath},
- {name: "missing volID", targetPath: testPath, mustFail: true},
- {name: "missing target path", volID: testPath, mustFail: true},
- {name: "grpc error", volID: "vol-test", targetPath: testPath, mustFail: true, err: errors.New("grpc error")},
- }
- for _, tc := range testCases {
- t.Logf("test case: %s", tc.name)
- fakeCloser := fake.NewCloser(t)
- client := &csiDriverClient{
- driverName: "Fake Driver Name",
- nodeV1ClientCreator: func(addr csiAddr) (csipbv1.NodeClient, io.Closer, error) {
- nodeClient := fake.NewNodeClient(false /* stagingCapable */)
- nodeClient.SetNextError(tc.err)
- return nodeClient, fakeCloser, nil
- },
- }
- err := client.NodeUnpublishVolume(context.Background(), tc.volID, tc.targetPath)
- checkErr(t, tc.mustFail, err)
- if !tc.mustFail {
- fakeCloser.Check()
- }
- }
- }
- func TestClientNodeStageVolume(t *testing.T) {
- tmpDir, err := utiltesting.MkTmpdir("csi-test")
- if err != nil {
- t.Fatalf("can't create temp dir: %v", err)
- }
- defer os.RemoveAll(tmpDir)
- testPath := filepath.Join(tmpDir, "/test/path")
- testCases := []struct {
- name string
- volID string
- stagingTargetPath string
- fsType string
- secrets map[string]string
- mountOptions []string
- mustFail bool
- err error
- }{
- {name: "test ok", volID: "vol-test", stagingTargetPath: testPath, fsType: "ext4", mountOptions: []string{"unvalidated"}},
- {name: "missing volID", stagingTargetPath: testPath, mustFail: true},
- {name: "missing target path", volID: "vol-test", mustFail: true},
- {name: "bad fs", volID: "vol-test", stagingTargetPath: testPath, fsType: "badfs", mustFail: true},
- {name: "grpc error", volID: "vol-test", stagingTargetPath: testPath, mustFail: true, err: errors.New("grpc error")},
- }
- for _, tc := range testCases {
- t.Logf("Running test case: %s", tc.name)
- fakeCloser := fake.NewCloser(t)
- client := &csiDriverClient{
- driverName: "Fake Driver Name",
- nodeV1ClientCreator: func(addr csiAddr) (csipbv1.NodeClient, io.Closer, error) {
- nodeClient := fake.NewNodeClient(false /* stagingCapable */)
- nodeClient.SetNextError(tc.err)
- return nodeClient, fakeCloser, nil
- },
- }
- err := client.NodeStageVolume(
- context.Background(),
- tc.volID,
- map[string]string{"device": "/dev/null"},
- tc.stagingTargetPath,
- tc.fsType,
- api.ReadWriteOnce,
- tc.secrets,
- map[string]string{"attr0": "val0"},
- tc.mountOptions,
- )
- checkErr(t, tc.mustFail, err)
- if !tc.mustFail {
- fakeCloser.Check()
- }
- }
- }
- func TestClientNodeUnstageVolume(t *testing.T) {
- tmpDir, err := utiltesting.MkTmpdir("csi-test")
- if err != nil {
- t.Fatalf("can't create temp dir: %v", err)
- }
- defer os.RemoveAll(tmpDir)
- testPath := filepath.Join(tmpDir, "/test/path")
- testCases := []struct {
- name string
- volID string
- stagingTargetPath string
- mustFail bool
- err error
- }{
- {name: "test ok", volID: "vol-test", stagingTargetPath: testPath},
- {name: "missing volID", stagingTargetPath: testPath, mustFail: true},
- {name: "missing target path", volID: "vol-test", mustFail: true},
- {name: "grpc error", volID: "vol-test", stagingTargetPath: testPath, mustFail: true, err: errors.New("grpc error")},
- }
- for _, tc := range testCases {
- t.Logf("Running test case: %s", tc.name)
- fakeCloser := fake.NewCloser(t)
- client := &csiDriverClient{
- driverName: "Fake Driver Name",
- nodeV1ClientCreator: func(addr csiAddr) (csipbv1.NodeClient, io.Closer, error) {
- nodeClient := fake.NewNodeClient(false /* stagingCapable */)
- nodeClient.SetNextError(tc.err)
- return nodeClient, fakeCloser, nil
- },
- }
- err := client.NodeUnstageVolume(
- context.Background(),
- tc.volID, tc.stagingTargetPath,
- )
- checkErr(t, tc.mustFail, err)
- if !tc.mustFail {
- fakeCloser.Check()
- }
- }
- }
- func TestNodeExpandVolume(t *testing.T) {
- testCases := []struct {
- name string
- volID string
- volumePath string
- newSize resource.Quantity
- mustFail bool
- err error
- }{
- {
- name: "with all correct values",
- volID: "vol-abcde",
- volumePath: "/foo/bar",
- newSize: resource.MustParse("10Gi"),
- mustFail: false,
- },
- {
- name: "with missing volume-id",
- volumePath: "/foo/bar",
- newSize: resource.MustParse("10Gi"),
- mustFail: true,
- },
- {
- name: "with missing volume path",
- volID: "vol-1234",
- newSize: resource.MustParse("10Gi"),
- mustFail: true,
- },
- {
- name: "with invalid quantity",
- volID: "vol-1234",
- volumePath: "/foo/bar",
- newSize: *resource.NewQuantity(-10, resource.DecimalSI),
- mustFail: true,
- },
- }
- for _, tc := range testCases {
- t.Logf("Running test cases : %s", tc.name)
- fakeCloser := fake.NewCloser(t)
- client := &csiDriverClient{
- driverName: "Fake Driver Name",
- nodeV1ClientCreator: func(addr csiAddr) (csipbv1.NodeClient, io.Closer, error) {
- nodeClient := fake.NewNodeClient(false /* stagingCapable */)
- nodeClient.SetNextError(tc.err)
- return nodeClient, fakeCloser, nil
- },
- }
- _, err := client.NodeExpandVolume(context.Background(), tc.volID, tc.volumePath, tc.newSize)
- checkErr(t, tc.mustFail, err)
- if !tc.mustFail {
- fakeCloser.Check()
- }
- }
- }
- type VolumeStatsOptions struct {
- VolumeSpec *volume.Spec
- // this just could be volumeID
- VolumeID string
- // DeviceMountPath location where device is mounted on the node. If volume type
- // is attachable - this would be global mount path otherwise
- // it would be location where volume was mounted for the pod
- DeviceMountPath string
- }
- func TestVolumeStats(t *testing.T) {
- spec := volume.NewSpecFromPersistentVolume(makeTestPV("test-pv", 10, "metrics", "test-vol"), false)
- tests := []struct {
- name string
- volumeStatsSet bool
- volumeData VolumeStatsOptions
- success bool
- }{
- {
- name: "when nodeVolumeStats=on, VolumeID=on, DeviceMountPath=on",
- volumeStatsSet: true,
- volumeData: VolumeStatsOptions{
- VolumeSpec: spec,
- VolumeID: "volume1",
- DeviceMountPath: "/foo/bar",
- },
- success: true,
- },
- {
- name: "when nodeVolumeStats=off, VolumeID=on, DeviceMountPath=on",
- volumeStatsSet: false,
- volumeData: VolumeStatsOptions{
- VolumeSpec: spec,
- VolumeID: "volume1",
- DeviceMountPath: "/foo/bar",
- },
- success: false,
- },
- {
- name: "when nodeVolumeStats=on, VolumeID=off, DeviceMountPath=on",
- volumeStatsSet: true,
- volumeData: VolumeStatsOptions{
- VolumeSpec: spec,
- VolumeID: "",
- DeviceMountPath: "/foo/bar",
- },
- success: false,
- },
- {
- name: "when nodeVolumeStats=on, VolumeID=on, DeviceMountPath=off",
- volumeStatsSet: true,
- volumeData: VolumeStatsOptions{
- VolumeSpec: spec,
- VolumeID: "volume1",
- DeviceMountPath: "",
- },
- success: false,
- },
- {
- name: "when nodeVolumeStats=on, VolumeID=on, DeviceMountPath=off",
- volumeStatsSet: true,
- volumeData: VolumeStatsOptions{
- VolumeSpec: spec,
- VolumeID: "",
- DeviceMountPath: "",
- },
- success: false,
- },
- }
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- ctx, cancel := context.WithTimeout(context.Background(), csiTimeout)
- defer cancel()
- csiSource, _ := getCSISourceFromSpec(tc.volumeData.VolumeSpec)
- csClient := setupClientWithVolumeStats(t, tc.volumeStatsSet)
- _, err := csClient.NodeGetVolumeStats(ctx, csiSource.VolumeHandle, tc.volumeData.DeviceMountPath)
- if err != nil && tc.success {
- t.Errorf("For %s : expected %v got %v", tc.name, tc.success, err)
- }
- })
- }
- }
|