Skip to content

Commit

Permalink
Implement Kopia common args and opts (#2654)
Browse files Browse the repository at this point in the history
* Add safecli dependency

* add new flag implementations based on the safecli package for the Kopia CLI

* apply go fmt

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Add common Kopia args and flags

* Fix Apply and test.Suit

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Remove variadic args for Common and Cache flags

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* pkg/kopia/cli/internal/flag is implemented in the safecli@v0.0.4 now

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Add pkg/kopia/cli package

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* go mod tidy

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Convert common flags from vars to funcs

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Add safecli dependency

* add new flag implementations based on the safecli package for the Kopia CLI

* apply go fmt

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Fix Apply and test.Suit

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* pkg/kopia/cli/internal/flag is implemented in the safecli@v0.0.4 now

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Add pkg/kopia/cli package

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* go mod tidy

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Update safecli to v0.0.5

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Update safecli to v0.0.6

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Fix tests

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* Fix formatting

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

* organize imports

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>

---------

Signed-off-by: pavel.larkin <pavel.larkin@veeam.com>
Co-authored-by: Pavan Navarathna <6504783+pavannd1@users.noreply.github.com>
  • Loading branch information
plar and pavannd1 committed Mar 5, 2024
1 parent 2340f90 commit 15dff38
Show file tree
Hide file tree
Showing 11 changed files with 526 additions and 0 deletions.
26 changes: 26 additions & 0 deletions pkg/kopia/cli/args/cache_args.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
// 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

// Cache provides the cache arguments for Kopia CLI.
type Cache struct {
CacheDirectory string // the directory where cache is stored. Default is "/tmp/kopia-cache".
ContentCacheSizeLimitMB int // the maximum size of the content cache in MB.
MetadataCacheSizeLimitMB int // the maximum size of the metadata cache in MB.

// unused?
ContentCacheSizeMB int // the size of the content cache in MB.
MetadataCacheSizeMB int // the size of the metadata cache in MB.
}
23 changes: 23 additions & 0 deletions pkg/kopia/cli/args/common_args.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
// 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

// Common provides the common arguments for Kopia CLI.
type Common struct {
ConfigFilePath string // the path to the config file.
LogDirectory string // the directory where logs are stored.
LogLevel string // the level of logging. Default is "error".
RepoPassword string // the password for the repository.
}
25 changes: 25 additions & 0 deletions pkg/kopia/cli/errors.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
// 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 cli

import (
"github.com/pkg/errors"
)

// Common errors
var (
// ErrInvalidID is returned when the ID is empty.
ErrInvalidID = errors.New("invalid ID")
)
29 changes: 29 additions & 0 deletions pkg/kopia/cli/internal/args/args.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
// 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 (
"github.com/kanisterio/safecli/command"

"github.com/kanisterio/kanister/pkg/kopia/cli"
)

// ID creates a new ID argument.
func ID(id string) command.Applier {
if id == "" {
return command.NewErrorArgument(cli.ErrInvalidID)
}
return command.NewArgument(id)
}
40 changes: 40 additions & 0 deletions pkg/kopia/cli/internal/args/args_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
// 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_test

import (
"testing"

"github.com/kanisterio/safecli/test"
"gopkg.in/check.v1"

"github.com/kanisterio/kanister/pkg/kopia/cli"
"github.com/kanisterio/kanister/pkg/kopia/cli/internal/args"
)

func TestArgs(t *testing.T) { check.TestingT(t) }

var _ = check.Suite(&test.ArgumentSuite{Cmd: "cmd", Arguments: []test.ArgumentTest{
{
Name: "Invalid ID",
Argument: args.ID(""),
ExpectedErr: cli.ErrInvalidID,
},
{
Name: "ID",
Argument: args.ID("id12345"),
ExpectedCLI: []string{"cmd", "id12345"},
},
}})
69 changes: 69 additions & 0 deletions pkg/kopia/cli/internal/opts/cache_opts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// 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 opts

import (
"strconv"

"github.com/kanisterio/safecli/command"

"github.com/kanisterio/kanister/pkg/kopia/cli/args"
)

const (
defaultCacheDirectory = "/tmp/kopia-cache"
)

// CacheDirectory creates a new cache directory option with a given directory.
// If the directory is empty, the default cache directory is used.
func CacheDirectory(dir string) command.Applier {
if dir == "" {
dir = defaultCacheDirectory
}
return command.NewOptionWithArgument("--cache-directory", dir)
}

// ContentCacheSizeLimitMB creates a new content cache size option with a given size.
func ContentCacheSizeLimitMB(size int) command.Applier {
val := strconv.Itoa(size)
return command.NewOptionWithArgument("--content-cache-size-limit-mb", val)
}

// MetadataCacheSizeLimitMB creates a new metadata cache size option with a given size.
func MetadataCacheSizeLimitMB(size int) command.Applier {
val := strconv.Itoa(size)
return command.NewOptionWithArgument("--metadata-cache-size-limit-mb", val)
}

// ContentCacheSizeMB creates a new content cache size option with a given size.
func ContentCacheSizeMB(size int) command.Applier {
val := strconv.Itoa(size)
return command.NewOptionWithArgument("--content-cache-size-mb", val)
}

// MetadataCacheSizeMB creates a new metadata cache size option with a given size.
func MetadataCacheSizeMB(size int) command.Applier {
val := strconv.Itoa(size)
return command.NewOptionWithArgument("--metadata-cache-size-mb", val)
}

// Cache maps the Cache arguments to the CLI command options.
func Cache(args args.Cache) command.Applier {
return command.NewArguments(
CacheDirectory(args.CacheDirectory),
ContentCacheSizeLimitMB(args.ContentCacheSizeLimitMB),
MetadataCacheSizeLimitMB(args.MetadataCacheSizeLimitMB),
)
}
55 changes: 55 additions & 0 deletions pkg/kopia/cli/internal/opts/cache_opts_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
// 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 opts_test

import (
"testing"

"github.com/kanisterio/safecli/command"
"github.com/kanisterio/safecli/test"
"gopkg.in/check.v1"

"github.com/kanisterio/kanister/pkg/kopia/cli/args"
"github.com/kanisterio/kanister/pkg/kopia/cli/internal/opts"
)

func TestCacheOptions(t *testing.T) { check.TestingT(t) }

var _ = check.Suite(&test.ArgumentSuite{Cmd: "cmd", Arguments: []test.ArgumentTest{
{
Name: "CacheDirectory",
Argument: command.NewArguments(opts.CacheDirectory(""), opts.CacheDirectory("/path/to/cache")),
ExpectedCLI: []string{"cmd", "--cache-directory=/tmp/kopia-cache", "--cache-directory=/path/to/cache"},
},
{
Name: "ContentCacheSizeLimitMB",
Argument: command.NewArguments(opts.ContentCacheSizeLimitMB(0), opts.ContentCacheSizeLimitMB(1024)),
ExpectedCLI: []string{"cmd", "--content-cache-size-limit-mb=0", "--content-cache-size-limit-mb=1024"},
},
{
Name: "MetadataCacheSizeLimitMB",
Argument: command.NewArguments(opts.MetadataCacheSizeLimitMB(0), opts.MetadataCacheSizeLimitMB(1024)),
ExpectedCLI: []string{"cmd", "--metadata-cache-size-limit-mb=0", "--metadata-cache-size-limit-mb=1024"},
},
{
Name: "Cache",
Argument: opts.Cache(args.Cache{
CacheDirectory: "/path/to/cache",
ContentCacheSizeLimitMB: 1024,
MetadataCacheSizeLimitMB: 2048,
}),
ExpectedCLI: []string{"cmd", "--cache-directory=/path/to/cache", "--content-cache-size-limit-mb=1024", "--metadata-cache-size-limit-mb=2048"},
},
}})
71 changes: 71 additions & 0 deletions pkg/kopia/cli/internal/opts/common_opts.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
// 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 opts

import (
"github.com/kanisterio/safecli/command"

"github.com/kanisterio/kanister/pkg/kopia/cli/args"
)

const (
defaultLogLevel = "error"
)

// LogDirectory creates a new log directory option with a given directory.
// if the directory is empty, the log directory option is not set.
func LogDirectory(dir string) command.Applier {
if dir == "" {
return command.NewNoopArgument()
}
return command.NewOptionWithArgument("--log-dir", dir)
}

// LogLevel creates a new log level flag with a given level.
// If the level is empty, the default log level is used.
func LogLevel(level string) command.Applier {
if level == "" {
level = defaultLogLevel
}
return command.NewOptionWithArgument("--log-level", level)
}

// ConfigFilePath creates a new config file path option with a given path.
// If the path is empty, the config file path option is not set.
func ConfigFilePath(path string) command.Applier {
if path == "" {
return command.NewNoopArgument()
}
return command.NewOptionWithArgument("--config-file", path)
}

// RepoPassword creates a new repository password option with a given password.
// If the password is empty, the repository password option is not set.
func RepoPassword(password string) command.Applier {
if password == "" {
return command.NewNoopArgument()
}
return command.NewOptionWithRedactedArgument("--password", password)
}

// Common maps the common arguments to the CLI command options.
func Common(args args.Common) command.Applier {
return command.NewArguments(
ConfigFilePath(args.ConfigFilePath),
LogDirectory(args.LogDirectory),
LogLevel(args.LogLevel),
RepoPassword(args.RepoPassword),
)
}
Loading

0 comments on commit 15dff38

Please sign in to comment.