mirror of https://github.com/ceph/go-ceph
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:
parent
5a05449609
commit
e78058504d
|
@ -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.
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue