Files
kopia/cli/command_maintenance_set_test.go
PhracturedBlue 42aad38540 feat(repository): Implement retention time extension on S3 buckets using Object Locks (#2179)
* Implement ability to extend retention time on S3 buckets using Object Locks
    * Move object-lock extension to maintenance.Params.
    * Use a default function for unsupported extensions instead of duplicating code
    * Fix potential lockup during object-lock extension
    * Fix race condition.  Add more code coverage
    * rebase to V3
* Add checks to prevent user from setting Retention Period  < Full Maintenance Interval

---------

Co-authored-by: Ashlie Martinez <ashmrtnz@alcion.ai>
2023-07-03 16:20:02 -07:00

84 lines
3.4 KiB
Go

package cli_test
import (
"testing"
"github.com/stretchr/testify/require"
"github.com/kopia/kopia/cli"
"github.com/kopia/kopia/internal/testutil"
"github.com/kopia/kopia/repo/blob"
"github.com/kopia/kopia/tests/testenv"
)
func TestMaintenanceSetExtendObjectLocks(t *testing.T) {
t.Parallel()
e := testenv.NewCLITest(t, testenv.RepoFormatNotImportant, testenv.NewInProcRunner(t))
defer e.RunAndExpectSuccess(t, "repo", "disconnect")
var mi cli.MaintenanceInfo
e.RunAndExpectSuccess(t, "repo", "create", "filesystem", "--path", e.RepoDir)
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "maintenance", "info", "--json"), &mi)
require.False(t, mi.ExtendObjectLocks, "ExtendOjectLocks should not default to enabled.")
e.RunAndExpectSuccess(t, "maintenance", "set", "--extend-object-locks", "true")
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "maintenance", "info", "--json"), &mi)
require.True(t, mi.ExtendObjectLocks, "ExtendOjectLocks should be enabled.")
e.RunAndExpectSuccess(t, "maintenance", "set", "--extend-object-locks", "false")
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "maintenance", "info", "--json"), &mi)
require.False(t, mi.ExtendObjectLocks, "ExtendOjectLocks should be disabled.")
}
func (s *formatSpecificTestSuite) TestInvalidExtendRetainOptions(t *testing.T) {
var mi cli.MaintenanceInfo
var rs cli.RepositoryStatus
e := s.setupInMemoryRepo(t)
// set retention
e.RunAndExpectSuccess(t, "repository", "set-parameters", "--retention-mode", blob.Compliance.String(),
"--retention-period", "48h")
e.RunAndExpectSuccess(t, "maintenance", "set", "--full-interval", "24h01m")
// Cannot enable extend object locks when retention_period-full_maintenance_interval < 24h
e.RunAndExpectFailure(t, "maintenance", "set", "--extend-object-locks", "true")
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "maintenance", "info", "--json"), &mi)
require.False(t, mi.ExtendObjectLocks, "ExtendOjectLocks should be disabled.")
// Enable extend object locks when retention_period-full_maintenance_interval > 24h
e.RunAndExpectSuccess(t, "maintenance", "set", "--full-interval", "23h59m")
e.RunAndExpectSuccess(t, "maintenance", "set", "--extend-object-locks", "true")
// Cannot change full_maintenance_interval when retention_period-full_maintenance_interval < 24h
e.RunAndExpectFailure(t, "maintenance", "set", "--full-interval", "24h01m")
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "maintenance", "info", "--json"), &mi)
require.True(t, mi.ExtendObjectLocks, "ExtendOjectLocks should be enabled.")
require.True(t, mi.FullCycle.Interval == 86340000000000, "maintenance-interval should be unchanged.")
// Cannot change retention_period when retention_period-full_maintenance_interval < 24h
e.RunAndExpectFailure(t, "repository", "set-parameters", "--retention-period", "47h")
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "repo", "status", "--json"), &rs)
require.True(t, rs.BlobRetention.RetentionPeriod == 172800000000000, "retention-interval should be unchanged.")
// Can change retention_period when retention_period-full_maintenance_interval > 24h
e.RunAndExpectSuccess(t, "repository", "set-parameters", "--retention-period", "49h")
testutil.MustParseJSONLines(t, e.RunAndExpectSuccess(t, "repo", "status", "--json"), &rs)
require.True(t, rs.BlobRetention.RetentionPeriod == 176400000000000, "retention-interval should be unchanged.")
}