From 4cf39ce07b69d80f81984d50f970577ed824a8f9 Mon Sep 17 00:00:00 2001 From: Robert Vasek Date: Wed, 26 Jan 2022 22:48:41 +0100 Subject: [PATCH] rados: implement binding for rados_write_op_setxattr This commit implements binding for rados_write_op_setxattr RADOS Write operation. Includes a unit test. Signed-off-by: Robert Vasek --- docs/api-status.json | 6 +++++ docs/api-status.md | 1 + rados/rados_write_op_setxattr.go | 34 +++++++++++++++++++++++++++ rados/rados_write_op_setxattr_test.go | 32 +++++++++++++++++++++++++ 4 files changed, 73 insertions(+) create mode 100644 rados/rados_write_op_setxattr.go create mode 100644 rados/rados_write_op_setxattr_test.go diff --git a/docs/api-status.json b/docs/api-status.json index c074feb..1610f74 100644 --- a/docs/api-status.json +++ b/docs/api-status.json @@ -970,6 +970,12 @@ "comment": "Ensure that the object exists and that its internal version number is equal\nto \"ver\" before writing. \"ver\" should be a version number previously\nobtained with IOContext.GetLastVersion().\n PREVIEW\n\nImplements:\n void rados_read_op_assert_version(rados_read_op_t read_op,\n uint64_t ver)\n", "added_in_version": "v0.14.0", "expected_stable_version": "v0.16.0" + }, + { + "name": "WriteOp.SetXattr", + "comment": "Set an xattr.\n PREVIEW\n\nImplements:\n void rados_write_op_setxattr(rados_write_op_t write_op,\n const char * name,\n const char * value,\n size_t value_len)\n", + "added_in_version": "v0.14.0", + "expected_stable_version": "v0.16.0" } ] }, diff --git a/docs/api-status.md b/docs/api-status.md index 56e8849..b2b6bcc 100644 --- a/docs/api-status.md +++ b/docs/api-status.md @@ -24,6 +24,7 @@ ReadOp.Read | v0.14.0 | v0.16.0 | WriteOp.Remove | v0.14.0 | v0.16.0 | ReadOp.AssertVersion | v0.14.0 | v0.16.0 | WriteOp.AssertVersion | v0.14.0 | v0.16.0 | +WriteOp.SetXattr | v0.14.0 | v0.16.0 | ## Package: rbd diff --git a/rados/rados_write_op_setxattr.go b/rados/rados_write_op_setxattr.go new file mode 100644 index 0000000..ebacb71 --- /dev/null +++ b/rados/rados_write_op_setxattr.go @@ -0,0 +1,34 @@ +//go:build ceph_preview +// +build ceph_preview + +package rados + +// #cgo LDFLAGS: -lrados +// #include +// #include +// +import "C" + +import ( + "unsafe" +) + +// SetXattr sets an xattr. +// PREVIEW +// +// Implements: +// void rados_write_op_setxattr(rados_write_op_t write_op, +// const char * name, +// const char * value, +// size_t value_len) +func (w *WriteOp) SetXattr(name string, value []byte) { + cName := C.CString(name) + defer C.free(unsafe.Pointer(cName)) + + C.rados_write_op_setxattr( + w.op, + cName, + (*C.char)(unsafe.Pointer(&value[0])), + C.size_t(len(value)), + ) +} diff --git a/rados/rados_write_op_setxattr_test.go b/rados/rados_write_op_setxattr_test.go new file mode 100644 index 0000000..670d5cd --- /dev/null +++ b/rados/rados_write_op_setxattr_test.go @@ -0,0 +1,32 @@ +//go:build ceph_preview +// +build ceph_preview + +package rados + +import ( + "github.com/stretchr/testify/assert" +) + +func (suite *RadosTestSuite) TestWriteOpSetXattr() { + suite.SetupConnection() + ta := assert.New(suite.T()) + + var ( + oid = "TestWriteOpSetXattr" + xattrName = "attrname" + xattrValue = []byte("attrvalue") + ) + + // Create an object and populate it with data. + op1 := CreateWriteOp() + defer op1.Release() + op1.Create(CreateIdempotent) + op1.SetXattr(xattrName, xattrValue) + err := op1.Operate(suite.ioctx, oid, OperationNoFlag) + ta.NoError(err) + + // Read object's xattrs and compare. + actualXattrs, err := suite.ioctx.ListXattrs(oid) + ta.NoError(err) + ta.Equal(map[string][]byte{xattrName: xattrValue}, actualXattrs) +}