mirror of
https://github.com/kopia/kopia.git
synced 2026-05-24 06:34:46 -04:00
feat(cli): add policy import/export commands to im-/export policies from/to json (#4020)
* feat(cli): add policy export command * feat(cli): add policy import command * chore(cli): remove unused policyTargetFlags in commandPolicyImport * feat(cli): allow limiting which policies to import * docs(cli): document policy import and export commands * feat(cli): add policy import/export commands * fix(cli): apply suggestions * fix(general): unintentional commit * feat(cli: add policy export tests * feat(cli): add policy import tests * feat(cli): add deleteOtherPolicies option for policy import * docs(cli): stdin/stdout in policy import/export and --delete-other-policies flag * chore(cli): fix linter issues * fix(cli): fix newly introduced errors * fix(cli): fix failing windows tests * chore(cli): more test coverage for policy import/export * fixed windows test --------- Co-authored-by: Jarek Kowalski <jaak@jkowalski.net>
This commit is contained in:
129
cli/command_policy_export_test.go
Normal file
129
cli/command_policy_export_test.go
Normal file
@@ -0,0 +1,129 @@
|
||||
package cli_test
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
|
||||
"github.com/kopia/kopia/internal/testutil"
|
||||
"github.com/kopia/kopia/snapshot"
|
||||
"github.com/kopia/kopia/snapshot/policy"
|
||||
"github.com/kopia/kopia/tests/testenv"
|
||||
)
|
||||
|
||||
func TestExportPolicy(t *testing.T) {
|
||||
e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, testenv.NewInProcRunner(t))
|
||||
defer e.RunAndExpectSuccess(t, "repo", "disconnect")
|
||||
|
||||
e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir, "--override-username=user", "--override-hostname=host")
|
||||
|
||||
// check if we get the default global policy
|
||||
var policies1 map[string]*policy.Policy
|
||||
|
||||
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export"), &policies1)
|
||||
|
||||
assert.Len(t, policies1, 1, "unexpected number of policies")
|
||||
assert.Equal(t, policy.DefaultPolicy, policies1["(global)"], "unexpected policy")
|
||||
|
||||
var policies2 map[string]*policy.Policy
|
||||
|
||||
// we only have one policy, so exporting all policies should be the same as exporting the global policy explicitly
|
||||
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", "(global)"), &policies2)
|
||||
|
||||
assert.Len(t, policies2, 1, "unexpected number of policies")
|
||||
assert.Equal(t, policies1, policies2, "unexpected policy")
|
||||
|
||||
// create a new policy
|
||||
td := testutil.TempDirectory(t)
|
||||
id := snapshot.SourceInfo{
|
||||
Host: "host",
|
||||
UserName: "user",
|
||||
Path: td,
|
||||
}.String()
|
||||
|
||||
e.RunAndExpectSuccess(t, "policy", "set", td, "--splitter=FIXED-4M")
|
||||
|
||||
expectedPolicy := &policy.Policy{
|
||||
SplitterPolicy: policy.SplitterPolicy{
|
||||
Algorithm: "FIXED-4M",
|
||||
},
|
||||
}
|
||||
expectedPolicies := map[string]*policy.Policy{
|
||||
"(global)": policy.DefaultPolicy,
|
||||
id: expectedPolicy,
|
||||
}
|
||||
|
||||
// check if we get the new policy
|
||||
var policies3 map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", id), &policies3)
|
||||
|
||||
assert.Len(t, policies3, 1, "unexpected number of policies")
|
||||
assert.Equal(t, expectedPolicy, policies3[id], "unexpected policy")
|
||||
|
||||
// specifying a local id should return the same policy
|
||||
var policies4 map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export", td), &policies4) // note: td, not id
|
||||
|
||||
assert.Len(t, policies4, 1, "unexpected number of policies")
|
||||
assert.Equal(t, expectedPolicy, policies4[id], "unexpected policy") // thee key is always the full id however
|
||||
|
||||
// exporting without specifying a policy should return all policies
|
||||
var policies5 map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "policy", "export"), &policies5)
|
||||
|
||||
assert.Len(t, policies5, 2, "unexpected number of policies")
|
||||
assert.Equal(t, expectedPolicies, policies5, "unexpected policy")
|
||||
|
||||
// sanity check if --to-file works
|
||||
exportPath := path.Join(td, "exported.json")
|
||||
|
||||
e.RunAndExpectSuccess(t, "policy", "export", "--to-file", exportPath)
|
||||
exportedContent, err := os.ReadFile(exportPath)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to read exported file: %v", err)
|
||||
}
|
||||
|
||||
var policies6 map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, []string{string(exportedContent)}, &policies6)
|
||||
|
||||
assert.Equal(t, expectedPolicies, policies6, "unexpected policy")
|
||||
|
||||
// should not overwrite existing file
|
||||
e.RunAndExpectFailure(t, "policy", "export", "--to-file", exportPath, id)
|
||||
|
||||
// unless --overwrite is passed
|
||||
e.RunAndExpectSuccess(t, "policy", "export", "--overwrite", "--to-file", exportPath, id)
|
||||
|
||||
exportedContent, err = os.ReadFile(exportPath)
|
||||
if err != nil {
|
||||
t.Fatalf("unable to read exported file: %v", err)
|
||||
}
|
||||
|
||||
var policies7 map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, []string{string(exportedContent)}, &policies7)
|
||||
|
||||
// we specified id, so only that policy should be exported
|
||||
assert.Len(t, policies7, 1, "unexpected number of policies")
|
||||
assert.Equal(t, expectedPolicy, policies5[id], "unexpected policy")
|
||||
|
||||
// pretty-printed JSON should be different but also correct
|
||||
policies8prettyJSON := e.RunAndExpectSuccess(t, "policy", "export", "--json-indent")
|
||||
|
||||
var policies8pretty map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, policies8prettyJSON, &policies8pretty)
|
||||
|
||||
policies8JSON := e.RunAndExpectSuccess(t, "policy", "export")
|
||||
var policies8 map[string]*policy.Policy
|
||||
testutil.MustParseJSONLines(t, policies8JSON, &policies8)
|
||||
|
||||
assert.Equal(t, policies8, policies8pretty, "pretty-printing should not change the content")
|
||||
assert.NotEqual(t, policies8JSON, policies8prettyJSON, "pretty-printed JSON should be different")
|
||||
|
||||
// --overwrite and no --to-file should fail
|
||||
e.RunAndExpectFailure(t, "policy", "export", "--overwrite")
|
||||
|
||||
// writing to inaccessible file should fail
|
||||
e.RunAndExpectFailure(t, "policy", "export", "--to-file", "/not/a/real/file/path")
|
||||
}
|
||||
Reference in New Issue
Block a user