2021-10-01 15:39:45 +00:00
|
|
|
//go:build !nautilus
|
2021-03-03 19:44:17 +00:00
|
|
|
// +build !nautilus
|
|
|
|
|
|
|
|
package admin
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
|
|
|
"os"
|
|
|
|
"strconv"
|
|
|
|
"testing"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
|
|
|
ccom "github.com/ceph/go-ceph/common/commands"
|
|
|
|
"github.com/ceph/go-ceph/internal/commands"
|
|
|
|
"github.com/ceph/go-ceph/rados"
|
|
|
|
"github.com/ceph/go-ceph/rbd"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
defaultPoolName = "rbd"
|
|
|
|
testImageSize = uint64(1 << 22)
|
|
|
|
testImageOrder = 22
|
|
|
|
alreadyExists = -0x11
|
|
|
|
|
|
|
|
cachedRadosConn *rados.Conn
|
|
|
|
cachedRBDAdmin *RBDAdmin
|
|
|
|
debugTrace bool
|
|
|
|
)
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
dt := os.Getenv("GO_CEPH_TEST_DEBUG_TRACE")
|
|
|
|
if ok, err := strconv.ParseBool(dt); ok && err == nil {
|
|
|
|
debugTrace = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func getConn(t *testing.T) *rados.Conn {
|
|
|
|
if cachedRadosConn != nil {
|
|
|
|
return cachedRadosConn
|
|
|
|
}
|
|
|
|
|
|
|
|
conn, err := rados.NewConn()
|
|
|
|
require.NoError(t, err)
|
|
|
|
require.NotNil(t, conn)
|
|
|
|
err = conn.ReadDefaultConfigFile()
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
timeout := time.After(time.Second * 5)
|
|
|
|
ch := make(chan error)
|
|
|
|
go func(conn *rados.Conn) {
|
|
|
|
ch <- conn.Connect()
|
|
|
|
}(conn)
|
|
|
|
select {
|
|
|
|
case err = <-ch:
|
|
|
|
case <-timeout:
|
|
|
|
err = errors.New("timed out waiting for connect")
|
|
|
|
}
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
cachedRadosConn = conn
|
|
|
|
return cachedRadosConn
|
|
|
|
}
|
|
|
|
|
|
|
|
func getAdmin(t *testing.T) *RBDAdmin {
|
|
|
|
if cachedRBDAdmin != nil {
|
|
|
|
return cachedRBDAdmin
|
|
|
|
}
|
|
|
|
|
|
|
|
var c ccom.RadosCommander = getConn(t)
|
|
|
|
if debugTrace {
|
|
|
|
c = commands.NewTraceCommander(c)
|
|
|
|
}
|
|
|
|
cachedRBDAdmin := NewFromConn(c)
|
|
|
|
require.NotNil(t, cachedRBDAdmin)
|
|
|
|
// We sleep briefly before returning in order to ensure we have a mgr map
|
|
|
|
// before we start executing the tests.
|
|
|
|
time.Sleep(50 * time.Millisecond)
|
|
|
|
return cachedRBDAdmin
|
|
|
|
}
|
|
|
|
|
|
|
|
func ensureDefaultPool(t *testing.T) {
|
|
|
|
t.Helper()
|
|
|
|
conn := getConn(t)
|
|
|
|
err := conn.MakePool(defaultPoolName)
|
|
|
|
if err == nil {
|
|
|
|
t.Logf("created pool: %s", defaultPoolName)
|
|
|
|
ioctx, err := conn.OpenIOContext(defaultPoolName)
|
|
|
|
require.NoError(t, err)
|
|
|
|
defer ioctx.Destroy()
|
|
|
|
// initialize rbd for the pool. if this is not done all mirror
|
|
|
|
// schedules can not be used on the pool or images in the pool
|
|
|
|
err = rbd.PoolInit(ioctx, false)
|
|
|
|
require.NoError(t, err)
|
|
|
|
// enable per image mirroring for the new pool
|
|
|
|
err = rbd.SetMirrorMode(ioctx, rbd.MirrorModeImage)
|
|
|
|
require.NoError(t, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
ec, ok := err.(interface{ ErrorCode() int })
|
|
|
|
if ok && ec.ErrorCode() == alreadyExists {
|
|
|
|
t.Logf("pool already exists: %s", defaultPoolName)
|
|
|
|
} else {
|
|
|
|
t.Logf("failed to create pool: %s", defaultPoolName)
|
|
|
|
t.FailNow()
|
|
|
|
}
|
|
|
|
}
|