platformtest: add zfsGet bookmark handling & replicationCursor tests

This encodes the observation made in issue #230 :
In the ZFS version shipped in Ubuntu 16.04 where
`zfs get someprop a#bookmark` does not work.
This commit is contained in:
Christian Schwarz 2019-10-14 17:46:14 +02:00
parent 0ba4b5eda6
commit b9933f6cb2
4 changed files with 77 additions and 1 deletions

View File

@ -48,4 +48,17 @@ func GetNonexistent(ctx *platformtest.Context) {
panic(err) panic(err)
} }
// test nonexistent bookmark
nonexistent = fmt.Sprintf("%s/foo bar#non existent", ctx.RootDataset)
props, err = zfs.ZFSGetRawAnySource(nonexistent, []string{"name"})
if err == nil {
panic(props)
}
dsne, ok = err.(*zfs.DatasetDoesNotExist)
if !ok {
panic(err)
} else if dsne.Path != nonexistent {
panic(err)
}
} }

View File

@ -0,0 +1,62 @@
package tests
import (
"fmt"
"github.com/zrepl/zrepl/platformtest"
"github.com/zrepl/zrepl/zfs"
)
func ReplicationCursor(ctx *platformtest.Context) {
platformtest.Run(ctx, platformtest.PanicErr, ctx.RootDataset, `
CREATEROOT
+ "foo bar"
+ "foo bar@1 with space"
`)
ds, err := zfs.NewDatasetPath(ctx.RootDataset + "/foo bar")
if err != nil {
panic(err)
}
guid, err := zfs.ZFSSetReplicationCursor(ds, "1 with space")
if err != nil {
panic(err)
}
snapProps, err := zfs.ZFSGetCreateTXGAndGuid(ds.ToString() + "@1 with space")
if err != nil {
panic(err)
}
if guid != snapProps.Guid {
panic(fmt.Sprintf("guids to not match: %v != %v", guid, snapProps.Guid))
}
bm, err := zfs.ZFSGetReplicationCursor(ds)
if err != nil {
panic(err)
}
if bm.CreateTXG != snapProps.CreateTXG {
panic(fmt.Sprintf("createtxgs do not match: %v != %v", bm.CreateTXG, snapProps.CreateTXG))
}
if bm.Guid != snapProps.Guid {
panic(fmt.Sprintf("guids do not match: %v != %v", bm.Guid, snapProps.Guid))
}
if bm.Guid != guid {
panic(fmt.Sprintf("guids do not match: %v != %v", bm.Guid, guid))
}
// test nonexistent
err = zfs.ZFSDestroyFilesystemVersion(ds, bm)
if err != nil {
panic(err)
}
bm2, err := zfs.ZFSGetReplicationCursor(ds)
if bm2 != nil {
panic(fmt.Sprintf("expecting no replication cursor after deleting it, got %v", bm))
}
if err != nil {
panic(fmt.Sprintf("expecting no error for getting nonexistent replication cursor, bot %v", err))
}
// TODO test moving the replication cursor
}

View File

@ -17,4 +17,5 @@ var Cases = []Case{
BatchDestroy, BatchDestroy,
UndestroyableSnapshotParsing, UndestroyableSnapshotParsing,
GetNonexistent, GetNonexistent,
ReplicationCursor,
} }

View File

@ -929,7 +929,7 @@ func ZFSGetRawAnySource(path string, props []string) (*ZFSProperties, error) {
return zfsGet(path, props, sourceAny) return zfsGet(path, props, sourceAny)
} }
var zfsGetDatasetDoesNotExistRegexp = regexp.MustCompile(`^cannot open '([^)]+)': (dataset does not exist|no such pool or dataset)`) // TODO verify this works var zfsGetDatasetDoesNotExistRegexp = regexp.MustCompile(`^cannot open '([^)]+)': (dataset does not exist|no such pool or dataset)`) // verified in platformtest
type DatasetDoesNotExist struct { type DatasetDoesNotExist struct {
Path string Path string