mirror of https://github.com/ceph/go-ceph
rbd: add function to fetch mirror status of a RBD image.
Add GetMirrorImageInfo() to fetch the mirror status of a RBD image. Signed-off-by: Mudit Agarwal <muagarwa@redhat.com>
This commit is contained in:
parent
25a5086184
commit
6ff40f828f
|
@ -165,3 +165,57 @@ func (image *Image) MirrorInstanceID() (string, error) {
|
|||
}
|
||||
return string(buf[:cSize]), nil
|
||||
}
|
||||
|
||||
// MirrorImageState represents the mirroring state of a RBD image.
|
||||
type MirrorImageState C.rbd_mirror_image_state_t
|
||||
|
||||
const (
|
||||
// MirrorImageDisabling is the representation of
|
||||
// RBD_MIRROR_IMAGE_DISABLING from librbd.
|
||||
MirrorImageDisabling = MirrorImageState(C.RBD_MIRROR_IMAGE_DISABLING)
|
||||
// MirrorImageEnabled is the representation of
|
||||
// RBD_MIRROR_IMAGE_ENABLED from librbd.
|
||||
MirrorImageEnabled = MirrorImageState(C.RBD_MIRROR_IMAGE_ENABLED)
|
||||
// MirrorImageDisabled is the representation of
|
||||
// RBD_MIRROR_IMAGE_DISABLED from librbd.
|
||||
MirrorImageDisabled = MirrorImageState(C.RBD_MIRROR_IMAGE_DISABLED)
|
||||
)
|
||||
|
||||
// MirrorImageInfo represents the mirroring status information of a RBD image.
|
||||
type MirrorImageInfo struct {
|
||||
GlobalID string
|
||||
State MirrorImageState
|
||||
Primary bool
|
||||
}
|
||||
|
||||
// GetMirrorImageInfo fetches the mirroring status information of a RBD image.
|
||||
//
|
||||
// Implements:
|
||||
// int rbd_mirror_image_get_info(rbd_image_t image,
|
||||
// rbd_mirror_image_info_t *mirror_image_info,
|
||||
// size_t info_size)
|
||||
func (image *Image) GetMirrorImageInfo() (*MirrorImageInfo, error) {
|
||||
if err := image.validate(imageIsOpen); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var cInfo C.rbd_mirror_image_info_t
|
||||
|
||||
ret := C.rbd_mirror_image_get_info(
|
||||
image.image,
|
||||
&cInfo,
|
||||
C.sizeof_rbd_mirror_image_info_t)
|
||||
if ret < 0 {
|
||||
return nil, getError(ret)
|
||||
}
|
||||
|
||||
mii := MirrorImageInfo{
|
||||
GlobalID: C.GoString(cInfo.global_id),
|
||||
State: MirrorImageState(cInfo.state),
|
||||
Primary: bool(cInfo.primary),
|
||||
}
|
||||
|
||||
// free C memory allocated by C.rbd_mirror_image_get_info call
|
||||
C.rbd_mirror_image_get_info_cleanup(&cInfo)
|
||||
return &mii, nil
|
||||
}
|
||||
|
|
|
@ -182,3 +182,53 @@ func TestMirroring(t *testing.T) {
|
|||
assert.Error(t, err)
|
||||
})
|
||||
}
|
||||
|
||||
func TestGetMirrorImageInfo(t *testing.T) {
|
||||
conn := radosConnect(t)
|
||||
poolName := GetUUID()
|
||||
err := conn.MakePool(poolName)
|
||||
require.NoError(t, err)
|
||||
defer func() {
|
||||
assert.NoError(t, conn.DeletePool(poolName))
|
||||
conn.Shutdown()
|
||||
}()
|
||||
|
||||
ioctx, err := conn.OpenIOContext(poolName)
|
||||
assert.NoError(t, err)
|
||||
defer func() {
|
||||
ioctx.Destroy()
|
||||
}()
|
||||
|
||||
// enable per-image mirroring for this pool
|
||||
err = SetMirrorMode(ioctx, MirrorModeImage)
|
||||
require.NoError(t, err)
|
||||
|
||||
imgName := GetUUID()
|
||||
options := NewRbdImageOptions()
|
||||
assert.NoError(t, options.SetUint64(ImageOptionOrder, uint64(testImageOrder)))
|
||||
err = CreateImage(ioctx, imgName, testImageSize, options)
|
||||
require.NoError(t, err)
|
||||
|
||||
t.Run("closedImage", func(t *testing.T) {
|
||||
img := GetImage(ioctx, imgName)
|
||||
_, err = img.GetMirrorImageInfo()
|
||||
assert.Error(t, err)
|
||||
})
|
||||
|
||||
t.Run("getInfo", func(t *testing.T) {
|
||||
// open image, enable, mirroring.
|
||||
img, err := OpenImage(ioctx, imgName, NoSnapshot)
|
||||
assert.NoError(t, err)
|
||||
defer func() {
|
||||
assert.NoError(t, img.Close())
|
||||
}()
|
||||
|
||||
err = img.MirrorEnable(ImageMirrorModeSnapshot)
|
||||
assert.NoError(t, err)
|
||||
mii, err := img.GetMirrorImageInfo()
|
||||
assert.NoError(t, err)
|
||||
assert.NotNil(t, mii.GlobalID)
|
||||
assert.Equal(t, mii.State, MirrorImageEnabled)
|
||||
assert.Equal(t, mii.Primary, true)
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue