-
Notifications
You must be signed in to change notification settings - Fork 149
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement Kopia common args and opts (#2654)
* 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
Showing
11 changed files
with
526 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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. | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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") | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"}, | ||
}, | ||
}}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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), | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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"}, | ||
}, | ||
}}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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), | ||
) | ||
} |
Oops, something went wrong.