- 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) {
 | 
			
		||||
	zpoolTestPoolCreate(t)
 | 
			
		||||
	zpoolTestExport(t)
 | 
			
		||||
	zpoolTestImport(t)
 | 
			
		||||
	zpoolTestExportForce(t)
 | 
			
		||||
	zpoolTestImport(t)
 | 
			
		||||
	zpoolTestPoolOpenAll(t)
 | 
			
		||||
	zpoolTestFailPoolOpen(t)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -20,4 +24,6 @@ func Test(t *testing.T) {
 | 
			
		|||
	zfsTestDatasetDestroy(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 {
 | 
			
		||||
			return err
 | 
			
		||||
		}
 | 
			
		||||
		fmt.Printf(" %30s | %10s\n", path,
 | 
			
		||||
			p.Value)
 | 
			
		||||
		fmt.Printf(" %30s | %10s\n", path, p.Value)
 | 
			
		||||
		if len(d.Children) > 0 {
 | 
			
		||||
			printDatasets(d.Children)
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			@ -159,13 +158,33 @@ func ExampleDatasetOpen() {
 | 
			
		|||
	d, err := zfs.DatasetOpen("TESTPOOL/DATASET1")
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		panic(err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer d.Close()
 | 
			
		||||
	var p zfs.Property
 | 
			
		||||
	if p, err = d.GetProperty(zfs.ZFSPropAvailable); err != nil {
 | 
			
		||||
		panic(err.Error())
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
	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.
 | 
			
		||||
// A pool can not be exported if it has a shared spare that is currently
 | 
			
		||||
// 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
 | 
			
		||||
	if force {
 | 
			
		||||
		force_t = 1
 | 
			
		||||
	}
 | 
			
		||||
	retcode := C.zpool_export(pool.list.zph, force_t, nil)
 | 
			
		||||
	if retcode != 0 {
 | 
			
		||||
	if rc := C.zpool_export(pool.list.zph, force_t, C.CString(log)); rc != 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()
 | 
			
		||||
	}
 | 
			
		||||
	return
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,6 +26,36 @@ func CreateTmpSparse(prefix string, size int64) (path string, err error) {
 | 
			
		|||
	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:
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -43,26 +73,13 @@ func zpoolTestPoolCreate(t *testing.T) {
 | 
			
		|||
		p.Close()
 | 
			
		||||
		TST_POOL_NAME += "0"
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var s1path, s2path, s3path string
 | 
			
		||||
	var err error
 | 
			
		||||
	if s1path, err = CreateTmpSparse("zfs_test_", 0x140000000); err != nil {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
		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)
 | 
			
		||||
 | 
			
		||||
	if err = createTestpoolVdisks(); err != nil {
 | 
			
		||||
		t.Error(err)
 | 
			
		||||
		return
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	disks := [2]string{s1path, s2path}
 | 
			
		||||
 | 
			
		||||
	var vdevs, mdevs, sdevs []zfs.VDevSpec
 | 
			
		||||
| 
						 | 
				
			
			@ -95,10 +112,7 @@ func zpoolTestPoolCreate(t *testing.T) {
 | 
			
		|||
		return
 | 
			
		||||
	}
 | 
			
		||||
	defer pool.Close()
 | 
			
		||||
	// try cleanup
 | 
			
		||||
	os.Remove(s1path)
 | 
			
		||||
	os.Remove(s2path)
 | 
			
		||||
	os.Remove(s3path)
 | 
			
		||||
 | 
			
		||||
	println("PASS\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -159,6 +173,44 @@ func zpoolTestFailPoolOpen(t *testing.T) {
 | 
			
		|||
	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() {
 | 
			
		||||
	if pool, err := zfs.PoolOpen("SSD"); err == nil {
 | 
			
		||||
		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
 | 
			
		||||
func ExamplePoolOpenAll() {
 | 
			
		||||
	// Lets open handles to all active pools on system
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue