mirror of https://github.com/ceph/go-ceph
rbd: move snapshot related functions to a snapshot.go file
No functionality change. Move various snapshot related functions to their own file. This helps logically group these related funcs in one place. Signed-off-by: John Mulligan <jmulligan@redhat.com>
This commit is contained in:
parent
9841283344
commit
f0dba686df
130
rbd/rbd.go
130
rbd/rbd.go
|
@ -93,12 +93,6 @@ type Image struct {
|
||||||
image C.rbd_image_t
|
image C.rbd_image_t
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
type Snapshot struct {
|
|
||||||
image *Image
|
|
||||||
name string
|
|
||||||
}
|
|
||||||
|
|
||||||
// TrashInfo contains information about trashed RBDs.
|
// TrashInfo contains information about trashed RBDs.
|
||||||
type TrashInfo struct {
|
type TrashInfo struct {
|
||||||
Id string // Id string, required to remove / restore trashed RBDs.
|
Id string // Id string, required to remove / restore trashed RBDs.
|
||||||
|
@ -138,19 +132,6 @@ func (image *Image) validate(req uint32) error {
|
||||||
return nil
|
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 {
|
func (e RBDError) Error() string {
|
||||||
errno, s := errutil.FormatErrno(int(e))
|
errno, s := errutil.FormatErrno(int(e))
|
||||||
if s == "" {
|
if s == "" {
|
||||||
|
@ -892,34 +873,6 @@ func (image *Image) GetSnapshotNames() (snaps []SnapInfo, err error) {
|
||||||
return snaps[:len(snaps)-1], nil
|
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)
|
// int rbd_metadata_get(rbd_image_t image, const char *key, char *value, size_t *vallen)
|
||||||
func (image *Image) GetMetadata(key string) (string, error) {
|
func (image *Image) GetMetadata(key string) (string, error) {
|
||||||
if err := image.validate(imageIsOpen); err != nil {
|
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
|
// GetTrashList returns a slice of TrashInfo structs, containing information about all RBD images
|
||||||
// currently residing in the trash.
|
// currently residing in the trash.
|
||||||
func GetTrashList(ioctx *rados.IOContext) ([]TrashInfo, error) {
|
func GetTrashList(ioctx *rados.IOContext) ([]TrashInfo, error) {
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
package rbd
|
||||||
|
|
||||||
|
// #cgo LDFLAGS: -lrbd
|
||||||
|
// #include <stdlib.h>
|
||||||
|
// #include <rbd/librbd.h>
|
||||||
|
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))
|
||||||
|
}
|
Loading…
Reference in New Issue