- Add argument to pool Export for history log string, hard force (ExportForce),
export and import tests, and overall tests fixes and improvements
This commit is contained in:
parent
39d6835ce3
commit
507abac683
|
@ -9,6 +9,10 @@ import (
|
||||||
|
|
||||||
func Test(t *testing.T) {
|
func Test(t *testing.T) {
|
||||||
zpoolTestPoolCreate(t)
|
zpoolTestPoolCreate(t)
|
||||||
|
zpoolTestExport(t)
|
||||||
|
zpoolTestImport(t)
|
||||||
|
zpoolTestExportForce(t)
|
||||||
|
zpoolTestImport(t)
|
||||||
zpoolTestPoolOpenAll(t)
|
zpoolTestPoolOpenAll(t)
|
||||||
zpoolTestFailPoolOpen(t)
|
zpoolTestFailPoolOpen(t)
|
||||||
|
|
||||||
|
@ -20,4 +24,6 @@ func Test(t *testing.T) {
|
||||||
zfsTestDatasetDestroy(t)
|
zfsTestDatasetDestroy(t)
|
||||||
|
|
||||||
zpoolTestPoolDestroy(t)
|
zpoolTestPoolDestroy(t)
|
||||||
|
|
||||||
|
cleanupVDisks()
|
||||||
}
|
}
|
||||||
|
|
27
zfs_test.go
27
zfs_test.go
|
@ -23,8 +23,7 @@ func printDatasets(ds []zfs.Dataset) error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fmt.Printf(" %30s | %10s\n", path,
|
fmt.Printf(" %30s | %10s\n", path, p.Value)
|
||||||
p.Value)
|
|
||||||
if len(d.Children) > 0 {
|
if len(d.Children) > 0 {
|
||||||
printDatasets(d.Children)
|
printDatasets(d.Children)
|
||||||
}
|
}
|
||||||
|
@ -159,13 +158,33 @@ func ExampleDatasetOpen() {
|
||||||
d, err := zfs.DatasetOpen("TESTPOOL/DATASET1")
|
d, err := zfs.DatasetOpen("TESTPOOL/DATASET1")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err.Error())
|
panic(err.Error())
|
||||||
return
|
|
||||||
}
|
}
|
||||||
defer d.Close()
|
defer d.Close()
|
||||||
var p zfs.Property
|
var p zfs.Property
|
||||||
if p, err = d.GetProperty(zfs.ZFSPropAvailable); err != nil {
|
if p, err = d.GetProperty(zfs.ZFSPropAvailable); err != nil {
|
||||||
panic(err.Error())
|
panic(err.Error())
|
||||||
return
|
|
||||||
}
|
}
|
||||||
println(d.PropertyToName(zfs.ZFSPropAvailable), " = ", p.Value)
|
println(d.PropertyToName(zfs.ZFSPropAvailable), " = ", p.Value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleDatasetOpenAll() {
|
||||||
|
datasets, err := zfs.DatasetOpenAll()
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
defer zfs.DatasetCloseAll(datasets)
|
||||||
|
|
||||||
|
// Print out path and type of root datasets
|
||||||
|
for _, d := range datasets {
|
||||||
|
path, err := d.Path()
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
p, err := d.GetProperty(zfs.ZFSPropType)
|
||||||
|
if err != nil {
|
||||||
|
panic(err.Error())
|
||||||
|
}
|
||||||
|
fmt.Printf("%30s | %10s\n", path, p.Value)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
13
zpool.go
13
zpool.go
|
@ -549,13 +549,20 @@ func (pool *Pool) Destroy(logStr string) (err error) {
|
||||||
// Before exporting the pool, all datasets within the pool are unmounted.
|
// Before exporting the pool, all datasets within the pool are unmounted.
|
||||||
// A pool can not be exported if it has a shared spare that is currently
|
// A pool can not be exported if it has a shared spare that is currently
|
||||||
// being used.
|
// being used.
|
||||||
func (pool *Pool) Export(force bool) (err error) {
|
func (pool *Pool) Export(force bool, log string) (err error) {
|
||||||
var force_t C.boolean_t = 0
|
var force_t C.boolean_t = 0
|
||||||
if force {
|
if force {
|
||||||
force_t = 1
|
force_t = 1
|
||||||
}
|
}
|
||||||
retcode := C.zpool_export(pool.list.zph, force_t, nil)
|
if rc := C.zpool_export(pool.list.zph, force_t, C.CString(log)); rc != 0 {
|
||||||
if retcode != 0 {
|
err = LastError()
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Hard force
|
||||||
|
func (pool *Pool) ExportForce(log string) (err error) {
|
||||||
|
if rc := C.zpool_export_force(pool.list.zph, C.CString(log)); rc != 0 {
|
||||||
err = LastError()
|
err = LastError()
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
|
|
|
@ -26,6 +26,36 @@ func CreateTmpSparse(prefix string, size int64) (path string, err error) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var s1path, s2path, s3path string
|
||||||
|
|
||||||
|
// This will create sparse files in tmp directory,
|
||||||
|
// for purpose of creating test pool.
|
||||||
|
func createTestpoolVdisks() (err error) {
|
||||||
|
if s1path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if s2path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
|
||||||
|
// try cleanup
|
||||||
|
os.Remove(s1path)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if s3path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
|
||||||
|
// try cleanup
|
||||||
|
os.Remove(s1path)
|
||||||
|
os.Remove(s2path)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cleanup sparse files used for tests
|
||||||
|
func cleanupVDisks() {
|
||||||
|
// try cleanup
|
||||||
|
os.Remove(s1path)
|
||||||
|
os.Remove(s2path)
|
||||||
|
os.Remove(s3path)
|
||||||
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
// TESTS:
|
// TESTS:
|
||||||
|
|
||||||
|
@ -43,26 +73,13 @@ func zpoolTestPoolCreate(t *testing.T) {
|
||||||
p.Close()
|
p.Close()
|
||||||
TST_POOL_NAME += "0"
|
TST_POOL_NAME += "0"
|
||||||
}
|
}
|
||||||
|
|
||||||
var s1path, s2path, s3path string
|
|
||||||
var err error
|
var err error
|
||||||
if s1path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
|
|
||||||
t.Error(err)
|
if err = createTestpoolVdisks(); err != nil {
|
||||||
return
|
|
||||||
}
|
|
||||||
if s2path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
|
|
||||||
// try cleanup
|
|
||||||
os.Remove(s1path)
|
|
||||||
t.Error(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if s3path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
|
|
||||||
// try cleanup
|
|
||||||
os.Remove(s1path)
|
|
||||||
os.Remove(s2path)
|
|
||||||
t.Error(err)
|
t.Error(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
disks := [2]string{s1path, s2path}
|
disks := [2]string{s1path, s2path}
|
||||||
|
|
||||||
var vdevs, mdevs, sdevs []zfs.VDevSpec
|
var vdevs, mdevs, sdevs []zfs.VDevSpec
|
||||||
|
@ -95,10 +112,7 @@ func zpoolTestPoolCreate(t *testing.T) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer pool.Close()
|
defer pool.Close()
|
||||||
// try cleanup
|
|
||||||
os.Remove(s1path)
|
|
||||||
os.Remove(s2path)
|
|
||||||
os.Remove(s3path)
|
|
||||||
println("PASS\n")
|
println("PASS\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -159,6 +173,44 @@ func zpoolTestFailPoolOpen(t *testing.T) {
|
||||||
p.Close()
|
p.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func zpoolTestExport(t *testing.T) {
|
||||||
|
println("TEST POOL Export( ", TST_POOL_NAME, " ) ... ")
|
||||||
|
p, err := zfs.PoolOpen(TST_POOL_NAME)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.Export(false, "Test exporting pool")
|
||||||
|
defer p.Close()
|
||||||
|
println("PASS\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func zpoolTestExportForce(t *testing.T) {
|
||||||
|
println("TEST POOL ExportForce( ", TST_POOL_NAME, " ) ... ")
|
||||||
|
p, err := zfs.PoolOpen(TST_POOL_NAME)
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
p.ExportForce("Test force exporting pool")
|
||||||
|
defer p.Close()
|
||||||
|
println("PASS\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func zpoolTestImport(t *testing.T) {
|
||||||
|
println("TEST POOL Import( ", TST_POOL_NAME, " ) ... ")
|
||||||
|
p, err := zfs.PoolImport(TST_POOL_NAME, []string{"/tmp"})
|
||||||
|
if err != nil {
|
||||||
|
t.Error(err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer p.Close()
|
||||||
|
println("PASS\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------------------------- */
|
||||||
|
// EXAMPLES:
|
||||||
|
|
||||||
func ExamplePoolProp() {
|
func ExamplePoolProp() {
|
||||||
if pool, err := zfs.PoolOpen("SSD"); err == nil {
|
if pool, err := zfs.PoolOpen("SSD"); err == nil {
|
||||||
print("Pool size is: ", pool.Properties[zfs.PoolPropSize].Value)
|
print("Pool size is: ", pool.Properties[zfs.PoolPropSize].Value)
|
||||||
|
@ -169,9 +221,6 @@ func ExamplePoolProp() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
|
||||||
// EXAMPLES:
|
|
||||||
|
|
||||||
// Open and list all pools on system with them properties
|
// Open and list all pools on system with them properties
|
||||||
func ExamplePoolOpenAll() {
|
func ExamplePoolOpenAll() {
|
||||||
// Lets open handles to all active pools on system
|
// Lets open handles to all active pools on system
|
||||||
|
|
Loading…
Reference in New Issue