Implement wrappers around rbd_trash_* functions

Signed-off-by: Daniel Swarbrick <daniel.swarbrick@gmail.com>
This commit is contained in:
Daniel Swarbrick 2018-09-15 01:31:19 +02:00
parent 28db807c97
commit 4a88b5da12
No known key found for this signature in database
GPG Key ID: C346A9571DD986F5
1 changed files with 70 additions and 0 deletions

View File

@ -14,6 +14,7 @@ import (
"fmt" "fmt"
"github.com/ceph/go-ceph/rados" "github.com/ceph/go-ceph/rados"
"io" "io"
"time"
"unsafe" "unsafe"
) )
@ -96,6 +97,14 @@ type Snapshot struct {
name string name string
} }
// TrashInfo contains information about trashed RBDs.
type TrashInfo struct {
Id string // Id string, required to remove / restore trashed RBDs.
Name string // Original name of trashed RBD.
DeletionTime time.Time // Date / time at which the RBD was moved to the trash.
DefermentEndTime time.Time // Date / time after which the trashed RBD may be permanently deleted.
}
// //
func split(buf []byte) (values []string) { func split(buf []byte) (values []string) {
tmp := bytes.Split(buf[:len(buf)-1], []byte{0}) tmp := bytes.Split(buf[:len(buf)-1], []byte{0})
@ -243,6 +252,16 @@ func (image *Image) Remove() error {
return GetError(C.rbd_remove(C.rados_ioctx_t(image.ioctx.Pointer()), c_name)) return GetError(C.rbd_remove(C.rados_ioctx_t(image.ioctx.Pointer()), c_name))
} }
// Trash will move an image into the RBD trash, where it will be protected (i.e., salvageable) for
// at least the specified delay.
func (image *Image) Trash(delay time.Duration) error {
c_name := C.CString(image.name)
defer C.free(unsafe.Pointer(c_name))
return GetError(C.rbd_trash_move(C.rados_ioctx_t(image.ioctx.Pointer()), c_name,
C.uint64_t(delay.Seconds())))
}
// int rbd_rename(rados_ioctx_t src_io_ctx, const char *srcname, const char *destname); // int rbd_rename(rados_ioctx_t src_io_ctx, const char *srcname, const char *destname);
func (image *Image) Rename(destname string) error { func (image *Image) Rename(destname string) error {
var c_srcname *C.char = C.CString(image.name) var c_srcname *C.char = C.CString(image.name)
@ -922,3 +941,54 @@ func (snapshot *Snapshot) Set() error {
return GetError(C.rbd_snap_set(snapshot.image.image, c_snapname)) return GetError(C.rbd_snap_set(snapshot.image.image, c_snapname))
} }
// GetTrashList returns a slice of TrashInfo structs, containing information about all RBD images
// currently residing in the trash.
func GetTrashList(ioctx *rados.IOContext) ([]TrashInfo, error) {
var num_entries C.size_t
// Call rbd_trash_list with nil pointer to get number of trash entries.
if C.rbd_trash_list(C.rados_ioctx_t(ioctx.Pointer()), nil, &num_entries); num_entries == 0 {
return nil, nil
}
c_entries := make([]C.rbd_trash_image_info_t, num_entries)
trashList := make([]TrashInfo, num_entries)
if ret := C.rbd_trash_list(C.rados_ioctx_t(ioctx.Pointer()), &c_entries[0], &num_entries); ret < 0 {
return nil, RBDError(ret)
}
for i, ti := range c_entries {
trashList[i] = TrashInfo{
Id: C.GoString(ti.id),
Name: C.GoString(ti.name),
DeletionTime: time.Unix(int64(ti.deletion_time), 0),
DefermentEndTime: time.Unix(int64(ti.deferment_end_time), 0),
}
}
// Free rbd_trash_image_info_t pointers
C.rbd_trash_list_cleanup(&c_entries[0], num_entries)
return trashList, nil
}
// TrashRemove permanently deletes the trashed RBD with the specified id.
func TrashRemove(ioctx *rados.IOContext, id string, force bool) error {
c_id := C.CString(id)
defer C.free(unsafe.Pointer(c_id))
return GetError(C.rbd_trash_remove(C.rados_ioctx_t(ioctx.Pointer()), c_id, C.bool(force)))
}
// TrashRestore restores the trashed RBD with the specified id back to the pool from whence it
// came, with the specified new name.
func TrashRestore(ioctx *rados.IOContext, id, name string) error {
c_id := C.CString(id)
c_name := C.CString(name)
defer C.free(unsafe.Pointer(c_id))
defer C.free(unsafe.Pointer(c_name))
return GetError(C.rbd_trash_restore(C.rados_ioctx_t(ioctx.Pointer()), c_id, c_name))
}