Skip to content

Commit 25ef8c9

Browse files
authored
Unable to mount a PVC based on a snapshot of an XFS filesystem PVC on the same node
1 parent 3b5719c commit 25ef8c9

File tree

4 files changed

+118
-0
lines changed

4 files changed

+118
-0
lines changed

storage_drivers/ontap/ontap_asa_nvme.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,6 +915,11 @@ func (d *ASANVMeStorageDriver) Publish(
915915

916916
publishInfo.VolumeAccessInfo.NVMeTargetIPs = d.ips
917917

918+
// xfs volumes are always mounted with '-o nouuid' to allow clones to be mounted to the same node as the source
919+
if publishInfo.FilesystemType == filesystem.Xfs {
920+
publishInfo.MountOptions = drivers.EnsureMountOption(publishInfo.MountOptions, drivers.MountOptionNoUUID)
921+
}
922+
918923
// Fill in the volume config fields as well
919924
volConfig.AccessInfo = publishInfo.VolumeAccessInfo
920925

storage_drivers/ontap/ontap_asa_nvme_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1628,6 +1628,60 @@ func TestPublishASANVMe(t *testing.T) {
16281628
err = driver.Publish(ctx, volConfig, publishInfo)
16291629

16301630
assert.NoError(t, err, "expected no error when adding host NQN to subsystem, got one")
1631+
1632+
// case: XFS filesystem should add nouuid mount option
1633+
volConfig.FileSystem = filesystem.Xfs
1634+
publishInfo.MountOptions = ""
1635+
mockAPI.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1636+
mockAPI.EXPECT().NVMeSubsystemCreate(ctx, "an_fakeHostName_fakeUUID", "an_fakeHostName_fakeUUID").Return(subsystem, nil).Times(1)
1637+
mockAPI.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1638+
mockAPI.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1639+
1640+
err = driver.Publish(ctx, volConfig, publishInfo)
1641+
1642+
assert.NoError(t, err)
1643+
assert.Contains(t, publishInfo.MountOptions, "nouuid", "XFS volumes should have nouuid mount option")
1644+
1645+
// case: XFS filesystem with existing mount options should preserve them and add nouuid
1646+
volConfig.FileSystem = filesystem.Xfs
1647+
publishInfo.MountOptions = "rw,relatime"
1648+
mockAPI.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1649+
mockAPI.EXPECT().NVMeSubsystemCreate(ctx, "an_fakeHostName_fakeUUID", "an_fakeHostName_fakeUUID").Return(subsystem, nil).Times(1)
1650+
mockAPI.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1651+
mockAPI.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1652+
1653+
err = driver.Publish(ctx, volConfig, publishInfo)
1654+
1655+
assert.NoError(t, err)
1656+
assert.Contains(t, publishInfo.MountOptions, "rw,relatime", "Existing mount options should be preserved")
1657+
assert.Contains(t, publishInfo.MountOptions, "nouuid", "XFS volumes should have nouuid mount option added")
1658+
assert.Equal(t, "rw,relatime,nouuid", publishInfo.MountOptions, "Mount options should be properly formatted")
1659+
1660+
// case: Non-XFS filesystem should not add nouuid mount option
1661+
volConfig.FileSystem = filesystem.Ext4
1662+
publishInfo.MountOptions = ""
1663+
mockAPI.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1664+
mockAPI.EXPECT().NVMeSubsystemCreate(ctx, "an_fakeHostName_fakeUUID", "an_fakeHostName_fakeUUID").Return(subsystem, nil).Times(1)
1665+
mockAPI.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1666+
mockAPI.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1667+
1668+
err = driver.Publish(ctx, volConfig, publishInfo)
1669+
1670+
assert.NoError(t, err)
1671+
assert.NotContains(t, publishInfo.MountOptions, "nouuid", "Non-XFS volumes should not have nouuid mount option")
1672+
1673+
// case: XFS filesystem with nouuid already present should not duplicate it
1674+
volConfig.FileSystem = filesystem.Xfs
1675+
publishInfo.MountOptions = "rw,nouuid,relatime"
1676+
mockAPI.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1677+
mockAPI.EXPECT().NVMeSubsystemCreate(ctx, "an_fakeHostName_fakeUUID", "an_fakeHostName_fakeUUID").Return(subsystem, nil).Times(1)
1678+
mockAPI.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1679+
mockAPI.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1680+
1681+
err = driver.Publish(ctx, volConfig, publishInfo)
1682+
1683+
assert.NoError(t, err)
1684+
assert.Equal(t, "rw,nouuid,relatime", publishInfo.MountOptions, "Mount options should not duplicate nouuid")
16311685
}
16321686

16331687
func TestUnpublishASANVMe(t *testing.T) {

storage_drivers/ontap/ontap_san_nvme.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -947,6 +947,11 @@ func (d *NVMeStorageDriver) Publish(
947947

948948
publishInfo.VolumeAccessInfo.NVMeTargetIPs = d.ips
949949

950+
// xfs volumes are always mounted with '-o nouuid' to allow clones to be mounted to the same node as the source
951+
if publishInfo.FilesystemType == filesystem.Xfs {
952+
publishInfo.MountOptions = drivers.EnsureMountOption(publishInfo.MountOptions, drivers.MountOptionNoUUID)
953+
}
954+
950955
// Fill in the volume config fields as well
951956
volConfig.AccessInfo = publishInfo.VolumeAccessInfo
952957

storage_drivers/ontap/ontap_san_nvme_test.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1632,6 +1632,60 @@ func TestPublish(t *testing.T) {
16321632
err = d.Publish(ctx, volConfig, publishInfo)
16331633

16341634
assert.NoError(t, err)
1635+
1636+
// case 11: XFS filesystem should add nouuid mount option
1637+
volConfig.FileSystem = filesystem.Xfs
1638+
publishInfo.MountOptions = ""
1639+
mock.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1640+
mock.EXPECT().NVMeSubsystemCreate(ctx, "fakeHostName-fakeUUID", "fakeHostName-fakeUUID").Return(subsystem, nil).Times(1)
1641+
mock.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1642+
mock.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1643+
1644+
err = d.Publish(ctx, volConfig, publishInfo)
1645+
1646+
assert.NoError(t, err)
1647+
assert.Contains(t, publishInfo.MountOptions, "nouuid", "XFS volumes should have nouuid mount option")
1648+
1649+
// case 12: XFS filesystem with existing mount options should preserve them and add nouuid
1650+
volConfig.FileSystem = filesystem.Xfs
1651+
publishInfo.MountOptions = "rw,relatime"
1652+
mock.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1653+
mock.EXPECT().NVMeSubsystemCreate(ctx, "fakeHostName-fakeUUID", "fakeHostName-fakeUUID").Return(subsystem, nil).Times(1)
1654+
mock.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1655+
mock.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1656+
1657+
err = d.Publish(ctx, volConfig, publishInfo)
1658+
1659+
assert.NoError(t, err)
1660+
assert.Contains(t, publishInfo.MountOptions, "rw,relatime", "Existing mount options should be preserved")
1661+
assert.Contains(t, publishInfo.MountOptions, "nouuid", "XFS volumes should have nouuid mount option added")
1662+
assert.Equal(t, "rw,relatime,nouuid", publishInfo.MountOptions, "Mount options should be properly formatted")
1663+
1664+
// case 13: Non-XFS filesystem should not add nouuid mount option
1665+
volConfig.FileSystem = filesystem.Ext4
1666+
publishInfo.MountOptions = ""
1667+
mock.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1668+
mock.EXPECT().NVMeSubsystemCreate(ctx, "fakeHostName-fakeUUID", "fakeHostName-fakeUUID").Return(subsystem, nil).Times(1)
1669+
mock.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1670+
mock.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1671+
1672+
err = d.Publish(ctx, volConfig, publishInfo)
1673+
1674+
assert.NoError(t, err)
1675+
assert.NotContains(t, publishInfo.MountOptions, "nouuid", "Non-XFS volumes should not have nouuid mount option")
1676+
1677+
// case 14: XFS filesystem with nouuid already present should not duplicate it
1678+
volConfig.FileSystem = filesystem.Xfs
1679+
publishInfo.MountOptions = "rw,nouuid,relatime"
1680+
mock.EXPECT().VolumeInfo(ctx, volConfig.InternalName).Return(flexVol, nil).Times(1)
1681+
mock.EXPECT().NVMeSubsystemCreate(ctx, "fakeHostName-fakeUUID", "fakeHostName-fakeUUID").Return(subsystem, nil).Times(1)
1682+
mock.EXPECT().NVMeAddHostToSubsystem(ctx, publishInfo.HostNQN, subsystem.UUID).Return(nil).Times(1)
1683+
mock.EXPECT().NVMeEnsureNamespaceMapped(ctx, gomock.Any(), gomock.Any()).Return(nil).Times(1)
1684+
1685+
err = d.Publish(ctx, volConfig, publishInfo)
1686+
1687+
assert.NoError(t, err)
1688+
assert.Equal(t, "rw,nouuid,relatime", publishInfo.MountOptions, "Mount options should not duplicate nouuid")
16351689
}
16361690

16371691
func TestUnpublish(t *testing.T) {

0 commit comments

Comments
 (0)