go-ceph/cephfs/admin/mirror_test.go

169 lines
4.2 KiB
Go

package admin
import (
"errors"
"testing"
"github.com/stretchr/testify/assert"
)
// sampleOldDaemonStatus1 and sampleOldDaemonStatus2 are examples of the json
// returned for daemon status before Ceph v16.2.5. It is not used by the tests
// as the code now only supports the format of v16.2.5 and later. This is
// retained for reference and the off chance that someone asks go-ceph to
// support the older format.
var sampleOldDaemonStatus1 = `
{"4157": {"1": {"name": "cephfs", "directory_count": 0, "peers": {}}}}
`
var sampleOldDaemonStatus2 = `
{
"4154": {
"1": {
"name": "cephfs",
"directory_count": 1,
"peers": {
"d284fccd-6110-4e94-843c-78ecda3aef38": {
"remote": {"client_name": "client.mirror_remote", "cluster_name": "ceph_b", "fs_name": "cephfs"},
"stats": {"failure_count": 1, "recovery_count": 0}
}
}
}
}
}
`
var sampleDaemonStatus1 = `
[
{
"daemon_id": 4115,
"filesystems": [
{
"filesystem_id": 1,
"name": "cephfs",
"directory_count": 0,
"peers": []
}
]
}
]
`
var sampleDaemonStatus2 = `
[
{
"daemon_id": 4143,
"filesystems": [
{
"filesystem_id": 1,
"name": "cephfs",
"directory_count": 1,
"peers": [
{
"uuid": "43c50942-9dba-4f66-8f9b-102378fa863e",
"remote": {
"client_name": "client.mirror_remote",
"cluster_name": "ceph_b",
"fs_name": "cephfs"
},
"stats": {
"failure_count": 1,
"recovery_count": 0
}
}
]
}
]
}
]
`
var samplePeerList1 = `
{
"f138660d-7b22-4036-95ba-0fda727bff40": {
"client_name": "client.mirror_remote",
"site_name": "ceph_b",
"fs_name": "cephfs",
"mon_host": "test_ceph_b"
}
}
`
func TestParseDaemonStatus(t *testing.T) {
t.Run("error", func(t *testing.T) {
r := newResponse(nil, "", errors.New("snark"))
_, err := parseDaemonStatus(r)
assert.Error(t, err)
assert.Equal(t, "snark", err.Error())
})
t.Run("statusSet", func(t *testing.T) {
r := newResponse(nil, "oopsie", nil)
_, err := parseDaemonStatus(r)
assert.Error(t, err)
})
t.Run("ok", func(t *testing.T) {
r := newResponse([]byte(sampleDaemonStatus1), "", nil)
ds, err := parseDaemonStatus(r)
assert.NoError(t, err)
if assert.NotNil(t, ds) && assert.Len(t, ds, 1) {
dsi := ds[0]
assert.Equal(t, DaemonID(4115), dsi.DaemonID)
if assert.Len(t, dsi.FileSystems, 1) {
fs := dsi.FileSystems[0]
assert.Len(t, fs.Peers, 0)
assert.Equal(t, "cephfs", fs.Name)
assert.Equal(t, int64(0), fs.DirectoryCount)
}
}
})
t.Run("ok2", func(t *testing.T) {
r := newResponse([]byte(sampleDaemonStatus2), "", nil)
ds, err := parseDaemonStatus(r)
assert.NoError(t, err)
if assert.NotNil(t, ds) && assert.Len(t, ds, 1) {
dsi := ds[0]
assert.Equal(t, DaemonID(4143), dsi.DaemonID)
if assert.Len(t, dsi.FileSystems, 1) {
fs := dsi.FileSystems[0]
assert.Equal(t, "cephfs", fs.Name)
assert.Equal(t, int64(1), fs.DirectoryCount)
if assert.Len(t, fs.Peers, 1) {
p := fs.Peers[0]
assert.Equal(t, "ceph_b", p.Remote.ClusterName)
assert.Equal(t, "cephfs", p.Remote.FSName)
assert.Equal(t, uint64(1), p.Stats.FailureCount)
assert.Equal(t, uint64(0), p.Stats.RecoveryCount)
}
}
}
})
}
func TestParsePeerList(t *testing.T) {
t.Run("error", func(t *testing.T) {
r := newResponse(nil, "", errors.New("snark"))
_, err := parsePeerList(r)
assert.Error(t, err)
assert.Equal(t, "snark", err.Error())
})
t.Run("statusSet", func(t *testing.T) {
r := newResponse(nil, "oopsie", nil)
_, err := parsePeerList(r)
assert.Error(t, err)
})
t.Run("ok", func(t *testing.T) {
r := newResponse([]byte(samplePeerList1), "", nil)
plr, err := parsePeerList(r)
assert.NoError(t, err)
if assert.NotNil(t, plr) && assert.Len(t, plr, 1) {
p, ok := plr[PeerUUID("f138660d-7b22-4036-95ba-0fda727bff40")]
assert.True(t, ok)
assert.Equal(t, "client.mirror_remote", p.ClientName)
assert.Equal(t, "ceph_b", p.SiteName)
assert.Equal(t, "cephfs", p.FSName)
assert.Equal(t, "test_ceph_b", p.MonHost)
}
})
}