diff --git a/rbd/rbd.go b/rbd/rbd.go index 948f232..cb5c7ad 100644 --- a/rbd/rbd.go +++ b/rbd/rbd.go @@ -93,12 +93,6 @@ type Image struct { image C.rbd_image_t } -// -type Snapshot struct { - image *Image - name string -} - // TrashInfo contains information about trashed RBDs. type TrashInfo struct { Id string // Id string, required to remove / restore trashed RBDs. @@ -138,19 +132,6 @@ func (image *Image) validate(req uint32) error { return nil } -// validate the attributes listed in the req bitmask, and return an error in -// case the attribute is not set -// Calls snapshot.image.validate(req) to validate the image attributes. -func (snapshot *Snapshot) validate(req uint32) error { - if hasBit(req, snapshotNeedsName) && snapshot.name == "" { - return ErrSnapshotNoName - } else if snapshot.image != nil { - return snapshot.image.validate(req) - } - - return nil -} - func (e RBDError) Error() string { errno, s := errutil.FormatErrno(int(e)) if s == "" { @@ -892,34 +873,6 @@ func (image *Image) GetSnapshotNames() (snaps []SnapInfo, err error) { return snaps[:len(snaps)-1], nil } -// int rbd_snap_create(rbd_image_t image, const char *snapname); -func (image *Image) CreateSnapshot(snapname string) (*Snapshot, error) { - if err := image.validate(imageIsOpen); err != nil { - return nil, err - } - - c_snapname := C.CString(snapname) - defer C.free(unsafe.Pointer(c_snapname)) - - ret := C.rbd_snap_create(image.image, c_snapname) - if ret < 0 { - return nil, RBDError(ret) - } - - return &Snapshot{ - image: image, - name: snapname, - }, nil -} - -// -func (image *Image) GetSnapshot(snapname string) *Snapshot { - return &Snapshot{ - image: image, - name: snapname, - } -} - // int rbd_metadata_get(rbd_image_t image, const char *key, char *value, size_t *vallen) func (image *Image) GetMetadata(key string) (string, error) { if err := image.validate(imageIsOpen); err != nil { @@ -1009,89 +962,6 @@ func (image *Image) GetId() (string, error) { } } -// int rbd_snap_remove(rbd_image_t image, const char *snapname); -func (snapshot *Snapshot) Remove() error { - if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { - return err - } - - c_snapname := C.CString(snapshot.name) - defer C.free(unsafe.Pointer(c_snapname)) - - return getError(C.rbd_snap_remove(snapshot.image.image, c_snapname)) -} - -// int rbd_snap_rollback(rbd_image_t image, const char *snapname); -// int rbd_snap_rollback_with_progress(rbd_image_t image, const char *snapname, -// librbd_progress_fn_t cb, void *cbdata); -func (snapshot *Snapshot) Rollback() error { - if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { - return err - } - - c_snapname := C.CString(snapshot.name) - defer C.free(unsafe.Pointer(c_snapname)) - - return getError(C.rbd_snap_rollback(snapshot.image.image, c_snapname)) -} - -// int rbd_snap_protect(rbd_image_t image, const char *snap_name); -func (snapshot *Snapshot) Protect() error { - if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { - return err - } - - c_snapname := C.CString(snapshot.name) - defer C.free(unsafe.Pointer(c_snapname)) - - return getError(C.rbd_snap_protect(snapshot.image.image, c_snapname)) -} - -// int rbd_snap_unprotect(rbd_image_t image, const char *snap_name); -func (snapshot *Snapshot) Unprotect() error { - if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { - return err - } - - c_snapname := C.CString(snapshot.name) - defer C.free(unsafe.Pointer(c_snapname)) - - return getError(C.rbd_snap_unprotect(snapshot.image.image, c_snapname)) -} - -// int rbd_snap_is_protected(rbd_image_t image, const char *snap_name, -// int *is_protected); -func (snapshot *Snapshot) IsProtected() (bool, error) { - if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { - return false, err - } - - var c_is_protected C.int - - c_snapname := C.CString(snapshot.name) - defer C.free(unsafe.Pointer(c_snapname)) - - ret := C.rbd_snap_is_protected(snapshot.image.image, c_snapname, - &c_is_protected) - if ret < 0 { - return false, RBDError(ret) - } - - return c_is_protected != 0, nil -} - -// int rbd_snap_set(rbd_image_t image, const char *snapname); -func (snapshot *Snapshot) Set() error { - if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { - return err - } - - c_snapname := C.CString(snapshot.name) - defer C.free(unsafe.Pointer(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) { diff --git a/rbd/snapshot.go b/rbd/snapshot.go new file mode 100644 index 0000000..bbedb06 --- /dev/null +++ b/rbd/snapshot.go @@ -0,0 +1,140 @@ +package rbd + +// #cgo LDFLAGS: -lrbd +// #include +// #include +import "C" + +import ( + "unsafe" +) + +// +type Snapshot struct { + image *Image + name string +} + +// int rbd_snap_create(rbd_image_t image, const char *snapname); +func (image *Image) CreateSnapshot(snapname string) (*Snapshot, error) { + if err := image.validate(imageIsOpen); err != nil { + return nil, err + } + + c_snapname := C.CString(snapname) + defer C.free(unsafe.Pointer(c_snapname)) + + ret := C.rbd_snap_create(image.image, c_snapname) + if ret < 0 { + return nil, RBDError(ret) + } + + return &Snapshot{ + image: image, + name: snapname, + }, nil +} + +// validate the attributes listed in the req bitmask, and return an error in +// case the attribute is not set +// Calls snapshot.image.validate(req) to validate the image attributes. +func (snapshot *Snapshot) validate(req uint32) error { + if hasBit(req, snapshotNeedsName) && snapshot.name == "" { + return ErrSnapshotNoName + } else if snapshot.image != nil { + return snapshot.image.validate(req) + } + + return nil +} + +// +func (image *Image) GetSnapshot(snapname string) *Snapshot { + return &Snapshot{ + image: image, + name: snapname, + } +} + +// int rbd_snap_remove(rbd_image_t image, const char *snapname); +func (snapshot *Snapshot) Remove() error { + if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { + return err + } + + c_snapname := C.CString(snapshot.name) + defer C.free(unsafe.Pointer(c_snapname)) + + return getError(C.rbd_snap_remove(snapshot.image.image, c_snapname)) +} + +// int rbd_snap_rollback(rbd_image_t image, const char *snapname); +// int rbd_snap_rollback_with_progress(rbd_image_t image, const char *snapname, +// librbd_progress_fn_t cb, void *cbdata); +func (snapshot *Snapshot) Rollback() error { + if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { + return err + } + + c_snapname := C.CString(snapshot.name) + defer C.free(unsafe.Pointer(c_snapname)) + + return getError(C.rbd_snap_rollback(snapshot.image.image, c_snapname)) +} + +// int rbd_snap_protect(rbd_image_t image, const char *snap_name); +func (snapshot *Snapshot) Protect() error { + if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { + return err + } + + c_snapname := C.CString(snapshot.name) + defer C.free(unsafe.Pointer(c_snapname)) + + return getError(C.rbd_snap_protect(snapshot.image.image, c_snapname)) +} + +// int rbd_snap_unprotect(rbd_image_t image, const char *snap_name); +func (snapshot *Snapshot) Unprotect() error { + if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { + return err + } + + c_snapname := C.CString(snapshot.name) + defer C.free(unsafe.Pointer(c_snapname)) + + return getError(C.rbd_snap_unprotect(snapshot.image.image, c_snapname)) +} + +// int rbd_snap_is_protected(rbd_image_t image, const char *snap_name, +// int *is_protected); +func (snapshot *Snapshot) IsProtected() (bool, error) { + if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { + return false, err + } + + var c_is_protected C.int + + c_snapname := C.CString(snapshot.name) + defer C.free(unsafe.Pointer(c_snapname)) + + ret := C.rbd_snap_is_protected(snapshot.image.image, c_snapname, + &c_is_protected) + if ret < 0 { + return false, RBDError(ret) + } + + return c_is_protected != 0, nil +} + +// int rbd_snap_set(rbd_image_t image, const char *snapname); +func (snapshot *Snapshot) Set() error { + if err := snapshot.validate(snapshotNeedsName | imageIsOpen); err != nil { + return err + } + + c_snapname := C.CString(snapshot.name) + defer C.free(unsafe.Pointer(c_snapname)) + + return getError(C.rbd_snap_set(snapshot.image.image, c_snapname)) +}