mirror of https://github.com/ceph/go-ceph
110 lines
2.8 KiB
Go
110 lines
2.8 KiB
Go
package admintest
|
|
|
|
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"
|
|
)
|
|
|
|
var errTimedOut = errors.New("timed out waiting for connect")
|
|
|
|
// DebugTraceEnabled returns true if the environment variable
|
|
// GO_CEPH_TEST_DEBUG_TRACE indicates that the JSON requests and responses
|
|
// should be traced (logged).
|
|
func DebugTraceEnabled() bool {
|
|
dt := os.Getenv("GO_CEPH_TEST_DEBUG_TRACE")
|
|
ok, err := strconv.ParseBool(dt)
|
|
return ok && err == nil
|
|
}
|
|
|
|
// NewConn return a new rados connection based on the default config.
|
|
func NewConn(t *testing.T) *rados.Conn {
|
|
return NewConnFromConfig(t, "")
|
|
}
|
|
|
|
// NewConnFromConfig returns a new rados connection based on the specified
|
|
// config file. If configFile is the empty string, the default config is
|
|
// used.
|
|
func NewConnFromConfig(t *testing.T, configFile string) *rados.Conn {
|
|
conn, err := rados.NewConn()
|
|
require.NoError(t, err)
|
|
require.NotNil(t, conn)
|
|
if configFile == "" {
|
|
err = conn.ReadDefaultConfigFile()
|
|
require.NoError(t, err)
|
|
} else {
|
|
err = conn.ReadConfigFile(configFile)
|
|
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 = errTimedOut
|
|
}
|
|
require.NoError(t, err)
|
|
|
|
return conn
|
|
}
|
|
|
|
// WrapConn wraps the given conn in as a "tracer" if so enabled in the
|
|
// environment.
|
|
func WrapConn(conn *rados.Conn) ccom.RadosCommander {
|
|
var c ccom.RadosCommander = conn
|
|
if DebugTraceEnabled() {
|
|
c = commands.NewTraceCommander(conn)
|
|
}
|
|
return c
|
|
}
|
|
|
|
// Connector is a caching and convenience type for rados connections.
|
|
// Typically it is instantiated as a global in a go _test.go file.
|
|
type Connector struct {
|
|
conn *rados.Conn
|
|
}
|
|
|
|
// NewConnector returns a new Connector.
|
|
func NewConnector() *Connector {
|
|
return &Connector{}
|
|
}
|
|
|
|
func (c *Connector) realConn(t *testing.T) *rados.Conn {
|
|
if c.conn == nil {
|
|
c.conn = NewConn(t)
|
|
}
|
|
return c.conn
|
|
}
|
|
|
|
// GetConn returns the underlying rados connection, either cached or
|
|
// newly created.
|
|
func (c *Connector) GetConn(t *testing.T) *rados.Conn {
|
|
conn := c.realConn(t)
|
|
// 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 conn
|
|
}
|
|
|
|
// Get returns a RadosCommander that may or may not be wrapped.
|
|
// Typically this is the one you want.
|
|
func (c *Connector) Get(t *testing.T) ccom.RadosCommander {
|
|
conn := WrapConn(c.realConn(t))
|
|
// 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 conn
|
|
}
|