mirror of https://github.com/ceph/go-ceph
rbd: add wrapper for rbd_namespace_list() function.
Added wrapper for rbd_namespace_list() function which returns the names of all the namespaces present for a given IOContext. Signed-off-by: Mudit Agarwal muagarwa@redhat.com
This commit is contained in:
parent
08536b9d93
commit
5b6c599176
|
@ -1,7 +1,7 @@
|
||||||
// +build !luminous,!mimic
|
// +build !luminous,!mimic
|
||||||
//
|
//
|
||||||
// Ceph Nautilus is the first release that includes rbd_namespace_create(),
|
// Ceph Nautilus is the first release that includes rbd_namespace_create(),
|
||||||
// rbd_namespace_remove(), rbd_namespace_exists().
|
// rbd_namespace_remove(), rbd_namespace_exists() and rbd_namespace_list().
|
||||||
|
|
||||||
package rbd
|
package rbd
|
||||||
|
|
||||||
|
@ -13,8 +13,10 @@ package rbd
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
|
"github.com/ceph/go-ceph/internal/retry"
|
||||||
"github.com/ceph/go-ceph/rados"
|
"github.com/ceph/go-ceph/rados"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -72,3 +74,38 @@ func NamespaceExists(ioctx *rados.IOContext, namespaceName string) (bool, error)
|
||||||
ret := C.rbd_namespace_exists(cephIoctx(ioctx), cNamespaceName, &exists)
|
ret := C.rbd_namespace_exists(cephIoctx(ioctx), cNamespaceName, &exists)
|
||||||
return bool(exists), getErrorIfNegative(ret)
|
return bool(exists), getErrorIfNegative(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NamespaceList returns a slice containing the names of existing rbd namespaces.
|
||||||
|
//
|
||||||
|
// Implements:
|
||||||
|
// int rbd_namespace_list(rados_ioctx_t io, char *namespace_names, size_t *size);
|
||||||
|
func NamespaceList(ioctx *rados.IOContext) (names []string, err error) {
|
||||||
|
if ioctx == nil {
|
||||||
|
return nil, ErrNoIOContext
|
||||||
|
}
|
||||||
|
var (
|
||||||
|
buf []byte
|
||||||
|
cSize C.size_t
|
||||||
|
)
|
||||||
|
retry.WithSizes(4096, 262144, func(size int) retry.Hint {
|
||||||
|
cSize = C.size_t(size)
|
||||||
|
buf = make([]byte, cSize)
|
||||||
|
ret := C.rbd_namespace_list(cephIoctx(ioctx),
|
||||||
|
(*C.char)(unsafe.Pointer(&buf[0])),
|
||||||
|
&cSize)
|
||||||
|
err = getErrorIfNegative(ret)
|
||||||
|
return retry.Size(int(cSize)).If(err == errRange)
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
tmpList := bytes.Split(buf[:cSize-1], []byte{0})
|
||||||
|
for _, s := range tmpList {
|
||||||
|
if len(s) > 0 {
|
||||||
|
name := C.GoString((*C.char)(unsafe.Pointer(&s[0])))
|
||||||
|
names = append(names, name)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return names, nil
|
||||||
|
}
|
||||||
|
|
|
@ -42,6 +42,10 @@ func TestNamespace(t *testing.T) {
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
_, err = NamespaceExists(ioctx, "")
|
_, err = NamespaceExists(ioctx, "")
|
||||||
assert.Error(t, err)
|
assert.Error(t, err)
|
||||||
|
|
||||||
|
// NamespaceList.
|
||||||
|
_, err = NamespaceList(nil)
|
||||||
|
assert.Error(t, err)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("CreateNamespace", func(t *testing.T) {
|
t.Run("CreateNamespace", func(t *testing.T) {
|
||||||
|
@ -73,4 +77,32 @@ func TestNamespace(t *testing.T) {
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
assert.Equal(t, val, false)
|
assert.Equal(t, val, false)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("NamespaceList", func(t *testing.T) {
|
||||||
|
var (
|
||||||
|
name1 = "name1"
|
||||||
|
name2 = "name2"
|
||||||
|
name3 = "name3"
|
||||||
|
)
|
||||||
|
err := NamespaceCreate(ioctx, name1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
err = NamespaceCreate(ioctx, name2)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
err = NamespaceCreate(ioctx, name3)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
defer func() {
|
||||||
|
assert.NoError(t, NamespaceRemove(ioctx, name1))
|
||||||
|
assert.NoError(t, NamespaceRemove(ioctx, name2))
|
||||||
|
assert.NoError(t, NamespaceRemove(ioctx, name3))
|
||||||
|
}()
|
||||||
|
|
||||||
|
eval, err := NamespaceExists(ioctx, name1)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Equal(t, eval, true)
|
||||||
|
nList, err := NamespaceList(ioctx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assert.Contains(t, nList, name1)
|
||||||
|
assert.Contains(t, nList, name2)
|
||||||
|
assert.Contains(t, nList, name3)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue