Skip to content

Commit dd86e42

Browse files
committed
fix: respect ReadOnly AccessMode in volume mount
fix
1 parent d7e076b commit dd86e42

File tree

3 files changed

+71
-0
lines changed

3 files changed

+71
-0
lines changed

pkg/blob/blob.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1099,3 +1099,12 @@ func isSupportedFSGroupChangePolicy(policy string) bool {
10991099
}
11001100
return false
11011101
}
1102+
1103+
func isReadOnlyFromCapability(vc *csi.VolumeCapability) bool {
1104+
if vc.GetAccessMode() == nil {
1105+
return false
1106+
}
1107+
mode := vc.GetAccessMode().GetMode()
1108+
return (mode == csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY ||
1109+
mode == csi.VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY)
1110+
}

pkg/blob/blob_test.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"time"
3030

3131
"github.com/Azure/azure-sdk-for-go/services/storage/mgmt/2021-09-01/storage"
32+
"github.com/container-storage-interface/spec/lib/go/csi"
3233
"github.com/stretchr/testify/assert"
3334
"go.uber.org/mock/gomock"
3435
"golang.org/x/sync/errgroup"
@@ -1822,3 +1823,59 @@ func TestIsSupportedFSGroupChangePolicy(t *testing.T) {
18221823
}
18231824
}
18241825
}
1826+
1827+
func TestIsReadOnlyFromCapability(t *testing.T) {
1828+
testCases := []struct {
1829+
name string
1830+
vc *csi.VolumeCapability
1831+
expectedResult bool
1832+
}{
1833+
{
1834+
name: "false with empty capabilities",
1835+
vc: &csi.VolumeCapability{},
1836+
expectedResult: false,
1837+
},
1838+
{
1839+
name: "fail with capabilities no access mode",
1840+
vc: &csi.VolumeCapability{
1841+
AccessType: &csi.VolumeCapability_Mount{
1842+
Mount: &csi.VolumeCapability_MountVolume{},
1843+
},
1844+
},
1845+
},
1846+
{
1847+
name: "false with SINGLE_NODE_WRITER capabilities",
1848+
vc: &csi.VolumeCapability{
1849+
AccessMode: &csi.VolumeCapability_AccessMode{
1850+
Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_WRITER,
1851+
},
1852+
},
1853+
expectedResult: false,
1854+
},
1855+
{
1856+
name: "true with MULTI_NODE_READER_ONLY capabilities",
1857+
vc: &csi.VolumeCapability{
1858+
AccessMode: &csi.VolumeCapability_AccessMode{
1859+
Mode: csi.VolumeCapability_AccessMode_MULTI_NODE_READER_ONLY,
1860+
},
1861+
},
1862+
expectedResult: true,
1863+
},
1864+
{
1865+
name: "true with SINGLE_NODE_READER_ONLY capabilities",
1866+
vc: &csi.VolumeCapability{
1867+
AccessMode: &csi.VolumeCapability_AccessMode{
1868+
Mode: csi.VolumeCapability_AccessMode_SINGLE_NODE_READER_ONLY,
1869+
},
1870+
},
1871+
expectedResult: true,
1872+
},
1873+
}
1874+
1875+
for _, test := range testCases {
1876+
result := isReadOnlyFromCapability(test.vc)
1877+
if result != test.expectedResult {
1878+
t.Errorf("case(%s): isReadOnlyFromCapability returned with %v, not equal to %v", test.name, result, test.expectedResult)
1879+
}
1880+
}
1881+
}

pkg/blob/nodeserver.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,11 @@ func (d *Driver) NodeStageVolume(ctx context.Context, req *csi.NodeStageVolumeRe
248248
defer d.volumeLocks.Release(lockKey)
249249

250250
mountFlags := req.GetVolumeCapability().GetMount().GetMountFlags()
251+
if isReadOnlyFromCapability(volumeCapability) {
252+
mountFlags = append(mountFlags, "ro")
253+
klog.V(2).Infof("CSI volume is read-only, mounting with extra option ro")
254+
}
255+
251256
volumeMountGroup := req.GetVolumeCapability().GetMount().GetVolumeMountGroup()
252257
attrib := req.GetVolumeContext()
253258
secrets := req.GetSecrets()

0 commit comments

Comments
 (0)