diff --git a/pkg/kopia/cli/args/ephemeral_args.go b/pkg/kopia/cli/args/ephemeral_args.go new file mode 100644 index 0000000000..d9195eb257 --- /dev/null +++ b/pkg/kopia/cli/args/ephemeral_args.go @@ -0,0 +1,57 @@ +// Copyright 2024 The Kanister Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package args + +import ( + "fmt" + + "github.com/kanisterio/kanister/pkg/logsafe" + "github.com/kanisterio/safecli/command" +) + +var ( + RepositoryCreate Args + RepositoryConnectServer Args + UserAddSet Args +) + +type Args struct { + args map[string]string +} + +func (a *Args) Set(key, value string) { + if a.args == nil { + a.args = make(map[string]string) + } + if _, ok := a.args[key]; ok { + panic(fmt.Sprintf("key %q already registered", key)) + } + a.args[key] = value +} + +func (a *Args) AppendToCmd(cmd logsafe.Cmd) logsafe.Cmd { + for k, v := range a.args { + cmd = cmd.AppendLoggableKV(k, v) + } + return cmd +} + +func (a *Args) CommandAppliers() []command.Applier { + appliers := make([]command.Applier, len(a.args)) + for k, v := range a.args { + appliers = append(appliers, command.NewOptionWithArgument(k, v)) + } + return appliers +} diff --git a/pkg/kopia/cli/repository/repository_connect_server.go b/pkg/kopia/cli/repository/repository_connect_server.go index e9314cdb13..e66975f7d9 100644 --- a/pkg/kopia/cli/repository/repository_connect_server.go +++ b/pkg/kopia/cli/repository/repository_connect_server.go @@ -16,6 +16,7 @@ package repository import ( "github.com/kanisterio/safecli" + "github.com/kanisterio/safecli/command" "github.com/kanisterio/kanister/pkg/kopia/cli/args" "github.com/kanisterio/kanister/pkg/kopia/cli/internal" @@ -38,16 +39,20 @@ type ConnectServerArgs struct { } // ConnectServer creates a new `kopia repository connect server...` command. -func ConnectServer(args ConnectServerArgs) (*safecli.Builder, error) { - return internal.NewKopiaCommand( - opts.Common(args.Common), +func ConnectServer(connectServerArgs ConnectServerArgs) (*safecli.Builder, error) { + appliers := []command.Applier{ + opts.Common(connectServerArgs.Common), cmdRepository, subcmdConnect, subcmdServer, opts.CheckForUpdates(false), - optReadOnly(args.ReadOnly), - opts.Cache(args.Cache), - optHostname(args.Hostname), - optUsername(args.Username), - optServerURL(args.ServerURL), - optServerCertFingerprint(args.Fingerprint), + optReadOnly(connectServerArgs.ReadOnly), + opts.Cache(connectServerArgs.Cache), + optHostname(connectServerArgs.Hostname), + optUsername(connectServerArgs.Username), + optServerURL(connectServerArgs.ServerURL), + optServerCertFingerprint(connectServerArgs.Fingerprint), + } + appliers = append(appliers, args.RepositoryConnectServer.CommandAppliers()...) + return internal.NewKopiaCommand( + appliers..., ) } diff --git a/pkg/kopia/cli/repository/repository_connect_server_test.go b/pkg/kopia/cli/repository/repository_connect_server_test.go index 25fdae08c8..9d73fd270a 100644 --- a/pkg/kopia/cli/repository/repository_connect_server_test.go +++ b/pkg/kopia/cli/repository/repository_connect_server_test.go @@ -20,6 +20,7 @@ import ( "github.com/kanisterio/safecli" "gopkg.in/check.v1" + "github.com/kanisterio/kanister/pkg/kopia/cli/args" "github.com/kanisterio/kanister/pkg/kopia/cli/internal/test" ) @@ -60,4 +61,44 @@ var _ = check.Suite(test.NewCommandSuite([]test.CommandTest{ "--server-cert-fingerprint=test-fingerprint", }, }, + { + Name: "repository connect server, with additonal args", + Command: func() (*safecli.Builder, error) { + arguments := ConnectServerArgs{ + Common: common, + Cache: cache, + Hostname: "test-hostname", + Username: "test-username", + ServerURL: "http://test-server", + Fingerprint: "test-fingerprint", + ReadOnly: true, + } + + flags := args.RepositoryConnectServer + args.RepositoryConnectServer = args.Args{} + args.RepositoryConnectServer.Set("--testflag", "testvalue") + defer func() { args.RepositoryConnectServer = flags }() + + return ConnectServer(arguments) + }, + ExpectedCLI: []string{"kopia", + "--config-file=path/kopia.config", + "--log-dir=cache/log", + "--log-level=error", + "--password=encr-key", + "repository", + "connect", + "server", + "--no-check-for-updates", + "--readonly", + "--cache-directory=/tmp/cache.dir", + "--content-cache-size-limit-mb=0", + "--metadata-cache-size-limit-mb=0", + "--override-hostname=test-hostname", + "--override-username=test-username", + "--url=http://test-server", + "--server-cert-fingerprint=test-fingerprint", + "--testflag=testvalue", + }, + }, })) diff --git a/pkg/kopia/cli/repository/repository_create.go b/pkg/kopia/cli/repository/repository_create.go index f7efd91d54..33f0b02ca8 100644 --- a/pkg/kopia/cli/repository/repository_create.go +++ b/pkg/kopia/cli/repository/repository_create.go @@ -18,6 +18,7 @@ import ( "time" "github.com/kanisterio/safecli" + "github.com/kanisterio/safecli/command" "github.com/kanisterio/kanister/pkg/kopia/cli/args" "github.com/kanisterio/kanister/pkg/kopia/cli/internal" @@ -41,19 +42,23 @@ type CreateArgs struct { } // Create creates a new `kopia repository create ...` command. -func Create(args CreateArgs) (*safecli.Builder, error) { - return internal.NewKopiaCommand( - opts.Common(args.Common), +func Create(createArgs CreateArgs) (*safecli.Builder, error) { + appliers := []command.Applier{ + opts.Common(createArgs.Common), cmdRepository, subcmdCreate, opts.CheckForUpdates(false), - opts.Cache(args.Cache), - optHostname(args.Hostname), - optUsername(args.Username), - optBlobRetention(args.RetentionMode, args.RetentionPeriod), + opts.Cache(createArgs.Cache), + optHostname(createArgs.Hostname), + optUsername(createArgs.Username), + optBlobRetention(createArgs.RetentionMode, createArgs.RetentionPeriod), optStorage( - args.Location, - args.RepoPathPrefix, - args.Logger, + createArgs.Location, + createArgs.RepoPathPrefix, + createArgs.Logger, ), + } + appliers = append(appliers, args.RepositoryCreate.CommandAppliers()...) + return internal.NewKopiaCommand( + appliers..., ) } diff --git a/pkg/kopia/cli/repository/repository_create_test.go b/pkg/kopia/cli/repository/repository_create_test.go index 7a9001932c..76554ae61b 100644 --- a/pkg/kopia/cli/repository/repository_create_test.go +++ b/pkg/kopia/cli/repository/repository_create_test.go @@ -21,6 +21,7 @@ import ( "gopkg.in/check.v1" "github.com/kanisterio/kanister/pkg/kopia/cli" + "github.com/kanisterio/kanister/pkg/kopia/cli/args" "github.com/kanisterio/kanister/pkg/kopia/cli/internal/test" ) @@ -221,4 +222,44 @@ var _ = check.Suite(test.NewCommandSuite([]test.CommandTest{ "--prefix=test-prefix/test-path/prefix/", }, }, + { + Name: "repository create with filestore location and additional args", + Command: func() (*safecli.Builder, error) { + arguments := CreateArgs{ + Common: common, + Cache: cache, + Hostname: "test-hostname", + Username: "test-username", + RepoPathPrefix: "test-path/prefix", + Location: locFS, + RetentionMode: retentionMode, + RetentionPeriod: retentionPeriod, + } + flags := args.RepositoryCreate + args.RepositoryCreate = args.Args{} + args.RepositoryCreate.Set("--testflag", "testvalue") + defer func() { args.RepositoryCreate = flags }() + + return Create(arguments) + }, + ExpectedCLI: []string{"kopia", + "--config-file=path/kopia.config", + "--log-dir=cache/log", + "--log-level=error", + "--password=encr-key", + "repository", + "create", + "--no-check-for-updates", + "--cache-directory=/tmp/cache.dir", + "--content-cache-size-limit-mb=0", + "--metadata-cache-size-limit-mb=0", + "--override-hostname=test-hostname", + "--override-username=test-username", + "--retention-mode=Locked", + "--retention-period=15m0s", + "filesystem", + "--path=/mnt/data/test-prefix/test-path/prefix/", + "--testflag=testvalue", + }, + }, })) diff --git a/pkg/kopia/command/repository.go b/pkg/kopia/command/repository.go index c36b2611f8..20c44aeb37 100644 --- a/pkg/kopia/command/repository.go +++ b/pkg/kopia/command/repository.go @@ -20,6 +20,7 @@ import ( "github.com/go-openapi/strfmt" "github.com/pkg/errors" + "github.com/kanisterio/kanister/pkg/kopia/cli/args" "github.com/kanisterio/kanister/pkg/kopia/command/storage" ) @@ -79,25 +80,27 @@ func RepositoryConnectCommand(cmdArgs RepositoryCommandArgs) ([]string, error) { // RepositoryCreateCommand returns the kopia command for creation of a repo func RepositoryCreateCommand(cmdArgs RepositoryCommandArgs) ([]string, error) { - args := commonArgs(cmdArgs.CommandArgs) - args = args.AppendLoggable(repositorySubCommand, createSubCommand, noCheckForUpdatesFlag) + command := commonArgs(cmdArgs.CommandArgs) + command = command.AppendLoggable(repositorySubCommand, createSubCommand, noCheckForUpdatesFlag) - args = cmdArgs.kopiaCacheArgs(args, cmdArgs.CacheDirectory) + command = cmdArgs.kopiaCacheArgs(command, cmdArgs.CacheDirectory) if cmdArgs.Hostname != "" { - args = args.AppendLoggableKV(overrideHostnameFlag, cmdArgs.Hostname) + command = command.AppendLoggableKV(overrideHostnameFlag, cmdArgs.Hostname) } if cmdArgs.Username != "" { - args = args.AppendLoggableKV(overrideUsernameFlag, cmdArgs.Username) + command = command.AppendLoggableKV(overrideUsernameFlag, cmdArgs.Username) } // During creation, both should be set. Technically RetentionPeriod should be >= 24 * time.Hour if cmdArgs.RetentionMode != "" && cmdArgs.RetentionPeriod > 0 { - args = args.AppendLoggableKV(retentionModeFlag, cmdArgs.RetentionMode) - args = args.AppendLoggableKV(retentionPeriodFlag, cmdArgs.RetentionPeriod.String()) + command = command.AppendLoggableKV(retentionModeFlag, cmdArgs.RetentionMode) + command = command.AppendLoggableKV(retentionPeriodFlag, cmdArgs.RetentionPeriod.String()) } + command = args.RepositoryCreate.AppendToCmd(command) + bsArgs, err := storage.KopiaStorageArgs(&storage.StorageCommandParams{ Location: cmdArgs.Location, RepoPathPrefix: cmdArgs.RepoPathPrefix, @@ -106,7 +109,7 @@ func RepositoryCreateCommand(cmdArgs RepositoryCommandArgs) ([]string, error) { return nil, errors.Wrap(err, "Failed to generate storage args") } - return stringSliceCommand(args.Combine(bsArgs)), nil + return stringSliceCommand(command.Combine(bsArgs)), nil } // RepositoryServerCommandArgs contains fields required for connecting @@ -127,31 +130,33 @@ type RepositoryServerCommandArgs struct { // RepositoryConnectServerCommand returns the kopia command for connecting to a remote // repository on Kopia Repository API server func RepositoryConnectServerCommand(cmdArgs RepositoryServerCommandArgs) []string { - args := commonArgs(&CommandArgs{ + command := commonArgs(&CommandArgs{ RepoPassword: cmdArgs.UserPassword, ConfigFilePath: cmdArgs.ConfigFilePath, LogDirectory: cmdArgs.LogDirectory, }) - args = args.AppendLoggable(repositorySubCommand, connectSubCommand, serverSubCommand, noCheckForUpdatesFlag) + command = command.AppendLoggable(repositorySubCommand, connectSubCommand, serverSubCommand, noCheckForUpdatesFlag) if cmdArgs.ReadOnly { - args = args.AppendLoggable(readOnlyFlag) + command = command.AppendLoggable(readOnlyFlag) } - args = cmdArgs.kopiaCacheArgs(args, cmdArgs.CacheDirectory) + command = cmdArgs.kopiaCacheArgs(command, cmdArgs.CacheDirectory) if cmdArgs.Hostname != "" { - args = args.AppendLoggableKV(overrideHostnameFlag, cmdArgs.Hostname) + command = command.AppendLoggableKV(overrideHostnameFlag, cmdArgs.Hostname) } if cmdArgs.Username != "" { - args = args.AppendLoggableKV(overrideUsernameFlag, cmdArgs.Username) + command = command.AppendLoggableKV(overrideUsernameFlag, cmdArgs.Username) } - args = args.AppendLoggableKV(urlFlag, cmdArgs.ServerURL) + command = command.AppendLoggableKV(urlFlag, cmdArgs.ServerURL) - args = args.AppendRedactedKV(serverCertFingerprint, cmdArgs.Fingerprint) + command = args.RepositoryConnectServer.AppendToCmd(command) - return stringSliceCommand(args) + command = command.AppendRedactedKV(serverCertFingerprint, cmdArgs.Fingerprint) + + return stringSliceCommand(command) } type RepositoryStatusCommandArgs struct { diff --git a/pkg/kopia/command/repository_test.go b/pkg/kopia/command/repository_test.go index df8217fbe3..171e8feac0 100644 --- a/pkg/kopia/command/repository_test.go +++ b/pkg/kopia/command/repository_test.go @@ -21,6 +21,8 @@ import ( "github.com/go-openapi/strfmt" "gopkg.in/check.v1" + + "github.com/kanisterio/kanister/pkg/kopia/cli/args" ) func Test(t *testing.T) { check.TestingT(t) } @@ -33,8 +35,9 @@ func (s *RepositoryUtilsSuite) TestRepositoryCreateUtil(c *check.C) { retentionMode := "Locked" retentionPeriod := 10 * time.Second for _, tc := range []struct { - cmdArg RepositoryCommandArgs - location map[string]string + cmdArg RepositoryCommandArgs + location map[string]string + addRegisteredArgs bool check.Checker expectedCmd []string expectedError string @@ -137,7 +140,55 @@ func (s *RepositoryUtilsSuite) TestRepositoryCreateUtil(c *check.C) { "--path=/mnt/data/test-prefix/test-path/prefix/", }, }, + { + cmdArg: RepositoryCommandArgs{ + CommandArgs: &CommandArgs{ + RepoPassword: "pass123", + ConfigFilePath: "/tmp/config.file", + LogDirectory: "/tmp/log.dir", + }, + CacheDirectory: "/tmp/cache.dir", + Hostname: "test-hostname", + ContentCacheMB: 0, + MetadataCacheMB: 0, + Username: "test-username", + RepoPathPrefix: "test-path/prefix", + Location: map[string][]byte{ + "prefix": []byte("test-prefix"), + "type": []byte("filestore"), + }, + RetentionMode: retentionMode, + RetentionPeriod: retentionPeriod, + }, + Checker: check.IsNil, + expectedCmd: []string{"kopia", + "--log-level=error", + "--config-file=/tmp/config.file", + "--log-dir=/tmp/log.dir", + "--password=pass123", + "repository", + "create", + "--no-check-for-updates", + "--cache-directory=/tmp/cache.dir", + "--content-cache-size-limit-mb=0", + "--metadata-cache-size-limit-mb=0", + "--override-hostname=test-hostname", + "--override-username=test-username", + "--retention-mode=Locked", + "--retention-period=10s", + "--testflag=testvalue", + "filesystem", + "--path=/mnt/data/test-prefix/test-path/prefix/", + }, + addRegisteredArgs: true, + }, } { + if tc.addRegisteredArgs { + flags := args.RepositoryCreate + args.RepositoryCreate = args.Args{} + args.RepositoryCreate.Set("--testflag", "testvalue") + defer func() { args.RepositoryCreate = flags }() + } cmd, err := RepositoryCreateCommand(tc.cmdArg) c.Assert(err, tc.Checker) if tc.Checker == check.IsNil { @@ -227,22 +278,50 @@ func (s *RepositoryUtilsSuite) TestRepositoryConnectUtil(c *check.C) { } func (s *RepositoryUtilsSuite) TestRepositoryConnectServerUtil(c *check.C) { - cmd := RepositoryConnectServerCommand(RepositoryServerCommandArgs{ - UserPassword: "testpass123", - ConfigFilePath: "/tmp/config.file", - LogDirectory: "/tmp/log.dir", - CacheDirectory: "/tmp/cache.dir", - Hostname: "test-hostname", - Username: "test-username", - ServerURL: "https://127.0.0.1:51515", - Fingerprint: "test-fingerprint", - ReadOnly: true, - CacheArgs: CacheArgs{ - ContentCacheLimitMB: 0, - MetadataCacheLimitMB: 0, - }, + cmd := func() []string { + return RepositoryConnectServerCommand(RepositoryServerCommandArgs{ + UserPassword: "testpass123", + ConfigFilePath: "/tmp/config.file", + LogDirectory: "/tmp/log.dir", + CacheDirectory: "/tmp/cache.dir", + Hostname: "test-hostname", + Username: "test-username", + ServerURL: "https://127.0.0.1:51515", + Fingerprint: "test-fingerprint", + ReadOnly: true, + CacheArgs: CacheArgs{ + ContentCacheLimitMB: 0, + MetadataCacheLimitMB: 0, + }, + }) + } + c.Assert(cmd(), check.DeepEquals, []string{"kopia", + "--log-level=error", + "--config-file=/tmp/config.file", + "--log-dir=/tmp/log.dir", + "--password=testpass123", + "repository", + "connect", + "server", + "--no-check-for-updates", + "--readonly", + "--cache-directory=/tmp/cache.dir", + "--content-cache-size-limit-mb=0", + "--metadata-cache-size-limit-mb=0", + "--override-hostname=test-hostname", + "--override-username=test-username", + "--url=https://127.0.0.1:51515", + "--server-cert-fingerprint=test-fingerprint", }) - c.Assert(cmd, check.DeepEquals, []string{"kopia", + + // register additional arguments + flags := args.RepositoryConnectServer + args.RepositoryConnectServer = args.Args{} + args.RepositoryConnectServer.Set("--testflag", "testvalue") + defer func() { args.RepositoryConnectServer = flags }() + + // ensure they are set + c.Assert(cmd(), check.DeepEquals, []string{"kopia", "--log-level=error", "--config-file=/tmp/config.file", "--log-dir=/tmp/log.dir", @@ -258,6 +337,7 @@ func (s *RepositoryUtilsSuite) TestRepositoryConnectServerUtil(c *check.C) { "--override-hostname=test-hostname", "--override-username=test-username", "--url=https://127.0.0.1:51515", + "--testflag=testvalue", // additional flag is set "--server-cert-fingerprint=test-fingerprint", }) } diff --git a/pkg/kopia/command/server.go b/pkg/kopia/command/server.go index c328bc73e6..da44a8cc48 100644 --- a/pkg/kopia/command/server.go +++ b/pkg/kopia/command/server.go @@ -14,6 +14,10 @@ package command +import ( + "github.com/kanisterio/kanister/pkg/kopia/cli/args" +) + type ServerStartCommandArgs struct { *CommandArgs ServerAddress string @@ -122,11 +126,13 @@ type ServerSetUserCommandArgs struct { // ServerSetUser returns the kopia command setting password for existing user for the Kopia API Server func ServerSetUser(cmdArgs ServerSetUserCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs) - args = args.AppendLoggable(serverSubCommand, userSubCommand, setSubCommand, cmdArgs.NewUsername) - args = args.AppendRedactedKV(userPasswordFlag, cmdArgs.UserPassword) + command := commonArgs(cmdArgs.CommandArgs) + command = command.AppendLoggable(serverSubCommand, userSubCommand, setSubCommand, cmdArgs.NewUsername) + command = command.AppendRedactedKV(userPasswordFlag, cmdArgs.UserPassword) - return stringSliceCommand(args) + command = args.UserAddSet.AppendToCmd(command) + + return stringSliceCommand(command) } type ServerAddUserCommandArgs struct { @@ -137,9 +143,11 @@ type ServerAddUserCommandArgs struct { // ServerAddUser returns the kopia command adding a new user to the Kopia API Server func ServerAddUser(cmdArgs ServerAddUserCommandArgs) []string { - args := commonArgs(cmdArgs.CommandArgs) - args = args.AppendLoggable(serverSubCommand, userSubCommand, addSubCommand, cmdArgs.NewUsername) - args = args.AppendRedactedKV(userPasswordFlag, cmdArgs.UserPassword) + command := commonArgs(cmdArgs.CommandArgs) + command = command.AppendLoggable(serverSubCommand, userSubCommand, addSubCommand, cmdArgs.NewUsername) + command = command.AppendRedactedKV(userPasswordFlag, cmdArgs.UserPassword) - return stringSliceCommand(args) + command = args.UserAddSet.AppendToCmd(command) + + return stringSliceCommand(command) } diff --git a/pkg/kopia/command/server_test.go b/pkg/kopia/command/server_test.go index 03f42d056c..57e6517b29 100644 --- a/pkg/kopia/command/server_test.go +++ b/pkg/kopia/command/server_test.go @@ -18,6 +18,8 @@ import ( "strings" . "gopkg.in/check.v1" + + "github.com/kanisterio/kanister/pkg/kopia/cli/args" ) type KopiaServerTestSuite struct{} @@ -125,6 +127,21 @@ func (kServer *KopiaServerTestSuite) TestServerCommands(c *C) { }, expectedLog: "kopia --log-level=error --config-file=path/kopia.config --log-dir=cache/log --password=encr-key server user add a-username@a-hostname --user-password=a-user-password", }, + { + f: func() []string { + flags := args.UserAddSet + args.UserAddSet = args.Args{} + args.UserAddSet.Set("--testflag", "testvalue") + defer func() { args.UserAddSet = flags }() + args := ServerAddUserCommandArgs{ + CommandArgs: commandArgs, + NewUsername: "a-username@a-hostname", + UserPassword: "a-user-password", + } + return ServerAddUser(args) + }, + expectedLog: "kopia --log-level=error --config-file=path/kopia.config --log-dir=cache/log --password=encr-key server user add a-username@a-hostname --user-password=a-user-password --testflag=testvalue", + }, { f: func() []string { args := ServerSetUserCommandArgs{ @@ -136,6 +153,21 @@ func (kServer *KopiaServerTestSuite) TestServerCommands(c *C) { }, expectedLog: "kopia --log-level=error --config-file=path/kopia.config --log-dir=cache/log --password=encr-key server user set a-username@a-hostname --user-password=a-user-password", }, + { + f: func() []string { + flags := args.UserAddSet + args.UserAddSet = args.Args{} + args.UserAddSet.Set("--testflag", "testvalue") + defer func() { args.UserAddSet = flags }() + args := ServerSetUserCommandArgs{ + CommandArgs: commandArgs, + NewUsername: "a-username@a-hostname", + UserPassword: "a-user-password", + } + return ServerSetUser(args) + }, + expectedLog: "kopia --log-level=error --config-file=path/kopia.config --log-dir=cache/log --password=encr-key server user set a-username@a-hostname --user-password=a-user-password --testflag=testvalue", + }, { f: func() []string { args := ServerListUserCommmandArgs{ diff --git a/pkg/kopia/repository/client.go b/pkg/kopia/repository/client.go index 7ed33a8290..9bc478a367 100644 --- a/pkg/kopia/repository/client.go +++ b/pkg/kopia/repository/client.go @@ -34,6 +34,7 @@ import ( const ( defaultConnectMaxListCacheDuration time.Duration = time.Second * 600 connectionRefusedError = "connection refused" + Pbkdf2Algorithm = "pbkdf2-sha256-600000" // maxConnectRetries with value 100 results in ~23 total minutes of // retries with the apiConnectBackoff settings defined below. @@ -67,6 +68,7 @@ func ConnectToAPIServer( serverInfo := &repo.APIServerInfo{ BaseURL: serverAddress, TrustedServerCertificateFingerprint: fingerprint, + LocalCacheKeyDerivationAlgorithm: Pbkdf2Algorithm, } opts := &repo.ConnectOptions{ diff --git a/pkg/kopia/repository/client_test.go b/pkg/kopia/repository/client_test.go new file mode 100644 index 0000000000..9c41abb5fc --- /dev/null +++ b/pkg/kopia/repository/client_test.go @@ -0,0 +1,26 @@ +package repository_test + +import ( + "testing" + + "gopkg.in/check.v1" + + "github.com/kanisterio/kanister/pkg/kopia/repository" + "github.com/kopia/kopia/repo" +) + +func Test(t *testing.T) { check.TestingT(t) } + +type RepositoryClientSuite struct{} + +var _ = check.Suite(&RepositoryClientSuite{}) + +func (s *RepositoryClientSuite) TestKopiaAllowedAlgorithms(c *check.C) { + pbkdf2Supported := false + for _, algorithm := range repo.SupportedLocalCacheKeyDerivationAlgorithms() { + if algorithm == repository.Pbkdf2Algorithm { + pbkdf2Supported = true + } + } + c.Assert(pbkdf2Supported, check.Equals, true) +}