mirror of https://github.com/ceph/go-ceph
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:
parent
cbf2a51698
commit
0b4ed9dbe8
33
rbd/group.go
33
rbd/group.go
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue