diff --git a/rbd/rbd.go b/rbd/rbd.go index 8e3fd81..d4f839a 100644 --- a/rbd/rbd.go +++ b/rbd/rbd.go @@ -152,7 +152,7 @@ func Create(ioctx *rados.IOContext, name string, size uint64, order int, defer C.free(unsafe.Pointer(c_name)) switch len(args) { - case 2: + case 3: ret = C.rbd_create3(C.rados_ioctx_t(ioctx.Pointer()), c_name, C.uint64_t(size), C.uint64_t(args[0]), &c_order, diff --git a/rbd/rbd_test.go b/rbd/rbd_test.go index ce67b28..18f6121 100644 --- a/rbd/rbd_test.go +++ b/rbd/rbd_test.go @@ -11,6 +11,10 @@ import ( "testing" ) +//Rdb feature +var RbdFeatureLayering = uint64(1 << 0) +var RbdFeatureStripingV2 = uint64(1 << 1) + func GetUUID() string { out, _ := exec.Command("uuidgen").Output() return string(out[:36]) @@ -23,6 +27,43 @@ func TestVersion(t *testing.T) { assert.False(t, patch < 0 || patch > 1000, "invalid patch") } +func TestCreateImage(t *testing.T) { + conn, _ := rados.NewConn() + conn.ReadDefaultConfigFile() + conn.Connect() + + poolname := GetUUID() + err := conn.MakePool(poolname) + assert.NoError(t, err) + + ioctx, err := conn.OpenIOContext(poolname) + assert.NoError(t, err) + + name := GetUUID() + image, err := rbd.Create(ioctx, name, 1<<22, 22) + assert.NoError(t, err) + err = image.Remove() + assert.NoError(t, err) + + name = GetUUID() + image, err = rbd.Create(ioctx, name, 1<<22, 22, + RbdFeatureLayering|RbdFeatureStripingV2) + assert.NoError(t, err) + err = image.Remove() + assert.NoError(t, err) + + name = GetUUID() + image, err = rbd.Create(ioctx, name, 1<<22, 22, + RbdFeatureLayering|RbdFeatureStripingV2, 4096, 2) + assert.NoError(t, err) + err = image.Remove() + assert.NoError(t, err) + + ioctx.Destroy() + conn.DeletePool(poolname) + conn.Shutdown() +} + func TestGetImageNames(t *testing.T) { conn, _ := rados.NewConn() conn.ReadDefaultConfigFile()