rbd: add GetGroup implementing rbd_get_group

This method is useful to determine what group an image is part of.

Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
John Mulligan 2021-01-22 11:09:17 -05:00 committed by mergify[bot]
parent cbf2a51698
commit 0b4ed9dbe8
2 changed files with 96 additions and 0 deletions

View File

@ -223,3 +223,36 @@ func GroupImageList(ioctx *rados.IOContext, name string) ([]GroupImageInfo, erro
cSize)
return images, getError(ret)
}
// GroupInfo contains the name and pool id of a RBD group.
type GroupInfo struct {
Name string
PoolID int64
}
// GetGroup returns group info for the group this image is part of.
//
// Implements:
// int rbd_get_group(rbd_image_t image, rbd_group_info_t *group_info,
// size_t group_info_size);
func (image *Image) GetGroup() (GroupInfo, error) {
if err := image.validate(imageIsOpen); err != nil {
return GroupInfo{}, err
}
var cgi C.rbd_group_info_t
ret := C.rbd_get_group(
image.image,
&cgi,
C.sizeof_rbd_group_info_t)
if err := getErrorIfNegative(ret); err != nil {
return GroupInfo{}, err
}
gi := GroupInfo{
Name: C.GoString(cgi.name),
PoolID: int64(cgi.pool),
}
ret = C.rbd_group_info_cleanup(&cgi, C.sizeof_rbd_group_info_t)
return gi, getError(ret)
}

View File

@ -312,3 +312,66 @@ func TestGroupImageList(t *testing.T) {
GroupImageList(nil, "foo")
})
}
func TestGroupImageGetGroup(t *testing.T) {
conn := radosConnect(t)
require.NotNil(t, conn)
defer conn.Shutdown()
poolname := GetUUID()
err := conn.MakePool(poolname)
require.NoError(t, err)
defer conn.DeletePool(poolname)
ioctx, err := conn.OpenIOContext(poolname)
require.NoError(t, err)
defer ioctx.Destroy()
options := NewRbdImageOptions()
assert.NoError(t,
options.SetUint64(ImageOptionOrder, uint64(testImageOrder)))
name1 := GetUUID()
err = CreateImage(ioctx, name1, testImageSize, options)
require.NoError(t, err)
name2 := GetUUID()
err = CreateImage(ioctx, name2, testImageSize, options)
require.NoError(t, err)
err = GroupCreate(ioctx, "grone")
assert.NoError(t, err)
err = GroupImageAdd(ioctx, "grone", ioctx, name1)
assert.NoError(t, err)
img1, err := OpenImage(ioctx, name1, NoSnapshot)
assert.NoError(t, err)
defer func() {
assert.NoError(t, img1.Close())
}()
gi1, err := img1.GetGroup()
assert.NoError(t, err)
assert.Equal(t, "grone", gi1.Name)
img2, err := OpenImage(ioctx, name2, NoSnapshot)
assert.NoError(t, err)
defer func() {
assert.NoError(t, img2.Close())
}()
gi2, err := img2.GetGroup()
assert.NoError(t, err)
assert.Equal(t, "", gi2.Name)
t.Run("invalidImage", func(t *testing.T) {
x := &Image{}
_, err := x.GetGroup()
assert.Error(t, err)
assert.Panics(t, func() {
var x *Image
x.GetGroup()
})
})
}