rbd admin: add a test to cover the Status function

This is a complex test as it requires the pool and an image before it
will return any (non empty) data.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
John Mulligan 2021-03-03 14:44:17 -05:00 committed by mergify[bot]
parent 5a05449609
commit e78058504d
1 changed files with 77 additions and 0 deletions

View File

@ -0,0 +1,77 @@
// +build !nautilus
package admin
import (
"testing"
"time"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/ceph/go-ceph/rbd"
)
func TestMirrorSnapshotScheduleStatus(t *testing.T) {
// note: the status function doesn't return anything "useful" unless
// there's an image in the pool. thus we require an image first.
ensureDefaultPool(t)
conn := getConn(t)
ioctx, err := conn.OpenIOContext(defaultPoolName)
require.NoError(t, err)
defer ioctx.Destroy()
imgName := "img1"
options := rbd.NewRbdImageOptions()
assert.NoError(t,
options.SetUint64(rbd.ImageOptionOrder, uint64(testImageOrder)))
err = rbd.CreateImage(ioctx, imgName, testImageSize, options)
assert.NoError(t, err)
defer func() {
assert.NoError(t, rbd.RemoveImage(ioctx, imgName))
}()
img, err := rbd.OpenImage(ioctx, imgName, rbd.NoSnapshot)
assert.NoError(t, err)
err = img.MirrorEnable(rbd.ImageMirrorModeSnapshot)
assert.NoError(t, err)
assert.NoError(t, img.Close())
ra := getAdmin(t)
scheduler := ra.MirrorSnashotSchedule()
err = scheduler.Add(
NewLevelSpec(defaultPoolName, "", imgName),
Interval("1d"),
NoStartTime)
assert.NoError(t, err)
defer func() {
err = scheduler.Remove(
NewLevelSpec(defaultPoolName, "", imgName),
Interval("1d"),
NoStartTime)
assert.NoError(t, err)
}()
// This is one of those calls that depends on something async inside ceph
// and doesn't return the "expected result" immediately after the schedule
// is added. Loop on it for a while checking for the desired condition to
// become true.
// Unfortunately, this particular case is quite slow and doesn't
// seem to be ready until around a minute(!).
var status []ScheduledImage
for i := 0; i < 100; i++ {
status, err = scheduler.Status(
NewLevelSpec(defaultPoolName, "", imgName))
assert.NoError(t, err)
if len(status) == 1 {
break
}
time.Sleep(1 * time.Second)
}
if assert.Len(t, status, 1) {
assert.Equal(t, "rbd/img1", status[0].Image)
// we don't bother asserting the ScheduleTime value because
// it changes - and it's not worth messing with the system
// clock just for this kind of test.
}
}