mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-24 17:35:01 +01:00
b9b9ad10cf
This PR adds a new field optional field `timestamp_location` that allows the user to specify a timezone different than the default UTC for use in the snapshot suffix. I took @mjasnik 's PR https://github.com/zrepl/zrepl/pull/785 and refactored+extended it as follows: * move all formatting logic into its own package * disallow `dense` and `human` with formats != UTC to protect users from stupidity * document behavior more clearly * regression test for existing users
179 lines
4.3 KiB
Go
179 lines
4.3 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestSnapshotting(t *testing.T) {
|
|
tmpl := `
|
|
jobs:
|
|
- name: foo
|
|
type: push
|
|
connect:
|
|
type: local
|
|
listener_name: foo
|
|
client_identity: bar
|
|
filesystems: {"<": true}
|
|
%s
|
|
pruning:
|
|
keep_sender:
|
|
- type: last_n
|
|
count: 10
|
|
keep_receiver:
|
|
- type: last_n
|
|
count: 10
|
|
`
|
|
manual := `
|
|
snapshotting:
|
|
type: manual
|
|
`
|
|
periodic := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
timestamp_format: dense
|
|
interval: 10m
|
|
`
|
|
cron := `
|
|
snapshotting:
|
|
type: cron
|
|
prefix: zrepl_
|
|
timestamp_format: human
|
|
cron: "10 * * * *"
|
|
`
|
|
|
|
periodicDaily := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
interval: 1d
|
|
`
|
|
|
|
hooks := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
interval: 10m
|
|
hooks:
|
|
- type: command
|
|
path: /tmp/path/to/command
|
|
- type: command
|
|
path: /tmp/path/to/command
|
|
filesystems: { "zroot<": true, "<": false }
|
|
- type: postgres-checkpoint
|
|
dsn: "host=localhost port=5432 user=postgres sslmode=disable"
|
|
filesystems: {
|
|
"tank/postgres/data11": true
|
|
}
|
|
- type: mysql-lock-tables
|
|
dsn: "root@tcp(localhost)/"
|
|
filesystems: {
|
|
"tank/mysql": true
|
|
}
|
|
`
|
|
|
|
fillSnapshotting := func(s string) string { return fmt.Sprintf(tmpl, s) }
|
|
var c *Config
|
|
|
|
t.Run("manual", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(manual))
|
|
snm := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingManual)
|
|
assert.Equal(t, "manual", snm.Type)
|
|
})
|
|
|
|
t.Run("periodic", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(periodic))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic)
|
|
assert.Equal(t, "periodic", snp.Type)
|
|
assert.Equal(t, 10*time.Minute, snp.Interval.Duration())
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
})
|
|
|
|
t.Run("periodicDaily", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(periodicDaily))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic)
|
|
assert.Equal(t, "periodic", snp.Type)
|
|
assert.Equal(t, 24*time.Hour, snp.Interval.Duration())
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, "dense", snp.TimestampFormat)
|
|
})
|
|
|
|
t.Run("cron", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(cron))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingCron)
|
|
assert.Equal(t, "cron", snp.Type)
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, "human", snp.TimestampFormat)
|
|
})
|
|
|
|
t.Run("hooks", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(hooks))
|
|
hs := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic).Hooks
|
|
assert.Equal(t, hs[0].Ret.(*HookCommand).Filesystems["<"], true)
|
|
assert.Equal(t, hs[1].Ret.(*HookCommand).Filesystems["zroot<"], true)
|
|
assert.Equal(t, hs[2].Ret.(*HookPostgresCheckpoint).Filesystems["tank/postgres/data11"], true)
|
|
assert.Equal(t, hs[3].Ret.(*HookMySQLLockTables).Filesystems["tank/mysql"], true)
|
|
})
|
|
|
|
}
|
|
|
|
func TestSnapshottingTimestampDefaults(t *testing.T) {
|
|
tmpl := `
|
|
jobs:
|
|
- name: foo
|
|
type: push
|
|
connect:
|
|
type: local
|
|
listener_name: foo
|
|
client_identity: bar
|
|
filesystems: {"<": true}
|
|
%s
|
|
pruning:
|
|
keep_sender:
|
|
- type: last_n
|
|
count: 10
|
|
keep_receiver:
|
|
- type: last_n
|
|
count: 10
|
|
`
|
|
|
|
periodic := `
|
|
snapshotting:
|
|
type: periodic
|
|
prefix: zrepl_
|
|
interval: 10m
|
|
`
|
|
cron := `
|
|
snapshotting:
|
|
type: cron
|
|
prefix: zrepl_
|
|
cron: "10 * * * *"
|
|
`
|
|
|
|
fillSnapshotting := func(s string) string { return fmt.Sprintf(tmpl, s) }
|
|
var c *Config
|
|
|
|
t.Run("periodic", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(periodic))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingPeriodic)
|
|
assert.Equal(t, "periodic", snp.Type)
|
|
assert.Equal(t, 10*time.Minute, snp.Interval.Duration())
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, snp.TimestampFormat, "dense")
|
|
assert.Equal(t, snp.TimestampLocation, "UTC")
|
|
})
|
|
|
|
t.Run("cron", func(t *testing.T) {
|
|
c = testValidConfig(t, fillSnapshotting(cron))
|
|
snp := c.Jobs[0].Ret.(*PushJob).Snapshotting.Ret.(*SnapshottingCron)
|
|
assert.Equal(t, "cron", snp.Type)
|
|
assert.Equal(t, "zrepl_", snp.Prefix)
|
|
assert.Equal(t, snp.TimestampFormat, "dense")
|
|
assert.Equal(t, snp.TimestampLocation, "UTC")
|
|
})
|
|
}
|