From 5130f553879783f279c2de8fa505ff20d1a25f9e Mon Sep 17 00:00:00 2001 From: John Mulligan Date: Fri, 29 Jan 2021 11:24:09 -0500 Subject: [PATCH] cephfs admin: fix the json sent when flag RetainSnapshots is set The json key sent to retain snapshots on subvolume remove was misspelled and had a dash in it rather than an underscore. Fix the incorrect key and add a test, that needs to be able to run on version of cephfs w/o snapshot retention, and verifies that flag does the correct thing. Signed-off-by: John Mulligan --- cephfs/admin/flags.go | 2 +- cephfs/admin/subvolume_test.go | 60 ++++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/cephfs/admin/flags.go b/cephfs/admin/flags.go index 393ebe3..1ec994a 100644 --- a/cephfs/admin/flags.go +++ b/cephfs/admin/flags.go @@ -41,7 +41,7 @@ func (f SubVolRmFlags) flags() map[string]bool { o["force"] = true } if f.RetainSnapshots { - o["retain-snapshots"] = true + o["retain_snapshots"] = true } return o } diff --git a/cephfs/admin/subvolume_test.go b/cephfs/admin/subvolume_test.go index d6b6927..94fe19a 100644 --- a/cephfs/admin/subvolume_test.go +++ b/cephfs/admin/subvolume_test.go @@ -156,6 +156,66 @@ func TestRemoveSubVolume(t *testing.T) { return fsa.RemoveSubVolumeWithFlags(v, g, n, SubVolRmFlags{RetainSnapshots: true}) }) }) + t.Run("retainedSnapshotsTest", func(t *testing.T) { + subname := "retsnap1" + snapname := "s1" + err = fsa.CreateSubVolume(volume, NoGroup, subname, nil) + assert.NoError(t, err) + vinfo, err := fsa.SubVolumeInfo(volume, NoGroup, subname) + assert.NoError(t, err) + + canRetain := false + for _, f := range vinfo.Features { + if f == SnapshotRetentionFeature { + canRetain = true + } + } + if !canRetain { + err = fsa.RemoveSubVolumeWithFlags( + volume, NoGroup, subname, SubVolRmFlags{Force: true}) + assert.NoError(t, err) + t.Skipf("this rest of this test requires snapshot retention on the server side") + } + + lsv, err = fsa.ListSubVolumes(volume, NoGroup) + assert.NoError(t, err) + afterCount := len(lsv) + assert.Equal(t, beforeCount, afterCount-1) + err = fsa.CreateSubVolumeSnapshot(volume, NoGroup, subname, snapname) + + err = fsa.RemoveSubVolumeWithFlags( + volume, NoGroup, subname, SubVolRmFlags{Force: true}) + assert.Error(t, err) + + err = fsa.RemoveSubVolumeWithFlags( + volume, NoGroup, subname, SubVolRmFlags{RetainSnapshots: true}) + assert.NoError(t, err) + + delay() + _, err = fsa.SubVolumeInfo(volume, NoGroup, subname) + assert.NoError(t, err) + + err = fsa.RemoveSubVolumeSnapshot(volume, NoGroup, subname, snapname) + assert.NoError(t, err) + err = fsa.RemoveSubVolumeWithFlags( + volume, NoGroup, subname, SubVolRmFlags{Force: true}) + assert.NoError(t, err) + + // this seems to take longer than other removals. Try a few times to + // verify the subvolume is gone before asserting that the test failed + removed := false + for i := 0; i < 100; i++ { + delay() + lsv, err = fsa.ListSubVolumes(volume, NoGroup) + assert.NoError(t, err) + nowCount := len(lsv) + if nowCount == beforeCount { + removed = true + break + } + } + assert.True(t, removed, "volume count did not return to previous value") + }) } func TestResizeSubVolume(t *testing.T) {