Skip to content

Commit

Permalink
Register Kopia additional args (#2858)
Browse files Browse the repository at this point in the history
* register kopia additional args

* Set ServerInfo in repository/client.go

* fix outdated test

* rework after review

* addressing nits

---------

Co-authored-by: mergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
  • Loading branch information
bathina2 and mergify[bot] committed May 10, 2024
1 parent 7f0c993 commit a3aa9e6
Show file tree
Hide file tree
Showing 11 changed files with 363 additions and 61 deletions.
57 changes: 57 additions & 0 deletions pkg/kopia/cli/args/ephemeral_args.go
Original file line number Diff line number Diff line change
@@ -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
}
23 changes: 14 additions & 9 deletions pkg/kopia/cli/repository/repository_connect_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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...,
)
}
41 changes: 41 additions & 0 deletions pkg/kopia/cli/repository/repository_connect_server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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",
},
},
}))
25 changes: 15 additions & 10 deletions pkg/kopia/cli/repository/repository_create.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand All @@ -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...,
)
}
41 changes: 41 additions & 0 deletions pkg/kopia/cli/repository/repository_create_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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",
},
},
}))
39 changes: 22 additions & 17 deletions pkg/kopia/command/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
)

Expand Down Expand Up @@ -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,
Expand All @@ -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
Expand All @@ -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 {
Expand Down
Loading

0 comments on commit a3aa9e6

Please sign in to comment.