func (devices *RbdSet) setupBaseImage() error { //check base image is exist oldInfo, err := devices.lookupDevice("") if err != nil { return err } // base image is exist if oldInfo != nil { if oldInfo.Initialized { return nil } else { log.Debugf("Removing uninitialized base image") if err = devices.deleteImage(oldInfo); err != nil { return err } } } // base image is not exist, create it baseName := devices.getRbdImageName("") log.Debugf("Create base rbd image %s", baseName) // create initial image _, err = rbd.Create(devices.ioctx, baseName, devices.baseImageSize, rbd.RbdFeatureLayering) if err != nil { log.Errorf("Rbd create image %s failed: %v", baseName, err) return err } // register it devInfo, err := devices.registerDevice("", "", devices.baseImageSize) // map it err = devices.mapImageToRbdDevice(devInfo) if err != nil { log.Errorf("Rbd map image %s failed: %v", baseName, err) return err } // unmap it at last defer devices.unmapImageFromRbdDevice(devInfo) log.Debugf("Rbd map image %s to %s", baseName, devInfo.Device) // create filesystem if err = devices.createFilesystem(devInfo); err != nil { log.Errorf("Rbd create filesystem for image %s failed: %v", baseName, err) return err } devInfo.Initialized = true if err = devices.saveMetadata(devInfo); err != nil { devInfo.Initialized = false return err } return nil }
func TestCreateSnapshot(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() img, err := rbd.Create(ioctx, name, 1<<22) assert.NoError(t, err) err = img.Open() assert.NoError(t, err) snapshot, err := img.CreateSnapshot("mysnap") assert.NoError(t, err) err = img.Close() err = img.Open("mysnap") assert.NoError(t, err) snapshot.Remove() assert.NoError(t, err) err = img.Close() assert.NoError(t, err) img.Remove() assert.NoError(t, err) ioctx.Destroy() conn.DeletePool(poolname) conn.Shutdown() }
func TestGetImageNames(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) createdList := []string{} for i := 0; i < 10; i++ { name := GetUUID() _, err := rbd.Create(ioctx, name, 1<<22) assert.NoError(t, err) createdList = append(createdList, name) } imageNames, err := rbd.GetImageNames(ioctx) assert.NoError(t, err) sort.Strings(createdList) sort.Strings(imageNames) assert.Equal(t, createdList, imageNames) for _, name := range createdList { img := rbd.GetImage(ioctx, name) err := img.Remove() assert.NoError(t, err) } ioctx.Destroy() conn.DeletePool(poolname) conn.Shutdown() }
func TestIOReaderWriter(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() img, err := rbd.Create(ioctx, name, 1<<22) assert.NoError(t, err) err = img.Open() assert.NoError(t, err) stats, err := img.Stat() assert.NoError(t, err) encoder := json.NewEncoder(img) encoder.Encode(stats) err = img.Flush() assert.NoError(t, err) _, err = img.Seek(0, 0) assert.NoError(t, err) var stats2 *rbd.ImageInfo decoder := json.NewDecoder(img) decoder.Decode(&stats2) assert.Equal(t, &stats, &stats2) _, err = img.Seek(0, 0) bytes_in := []byte("input data") _, err = img.Write(bytes_in) assert.NoError(t, err) _, err = img.Seek(0, 0) assert.NoError(t, err) bytes_out := make([]byte, len(bytes_in)) n_out, err := img.Read(bytes_out) assert.Equal(t, n_out, len(bytes_in)) assert.Equal(t, bytes_in, bytes_out) err = img.Close() assert.NoError(t, err) img.Remove() assert.NoError(t, err) ioctx.Destroy() conn.DeletePool(poolname) conn.Shutdown() }
func TestParentInfo(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 := "parent" img, err := rbd.Create(ioctx, name, 1<<22, 1) assert.NoError(t, err) err = img.Open() assert.NoError(t, err) snapshot, err := img.CreateSnapshot("mysnap") assert.NoError(t, err) err = snapshot.Protect() assert.NoError(t, err) imgNew, err := img.Clone("mysnap", ioctx, "child", 1) assert.NoError(t, err) err = imgNew.Open() assert.NoError(t, err) parentPool := make([]byte, 128) parentName := make([]byte, 128) parentSnapname := make([]byte, 128) err = imgNew.GetParentInfo(parentPool, parentName, parentSnapname) assert.NoError(t, err) n := bytes.Index(parentName, []byte{0}) pName := string(parentName[:n]) n = bytes.Index(parentSnapname, []byte{0}) pSnapname := string(parentSnapname[:n]) assert.Equal(t, pName, "parent", "they should be equal") assert.Equal(t, pSnapname, "mysnap", "they should be equal") err = imgNew.Close() assert.NoError(t, err) err = imgNew.Remove() assert.NoError(t, err) err = snapshot.Unprotect() assert.NoError(t, err) err = snapshot.Remove() assert.NoError(t, err) err = img.Close() assert.NoError(t, err) err = img.Remove() assert.NoError(t, err) ioctx.Destroy() conn.DeletePool(poolname) conn.Shutdown() }