-
Notifications
You must be signed in to change notification settings - Fork 152
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Implement Kopia common args and opts #2654
Changes from all commits
680e782
72011e7
0f635ad
d0a6dd1
9850f4a
246e1c1
419652c
24707e5
c029fc1
cff7220
550d124
fc918a0
9530c91
2c6cb6e
1a3ee2d
386e7e9
b815f63
bcafabb
6d61bb4
e6ddb8f
4e7ffd7
f16aea7
dcd6425
d3dfb31
b093421
44c133e
1897a1e
33b1342
8baab6d
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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. | ||
Comment on lines
+24
to
+25
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @plar If these are not referenced anywhere, can you remove them please? |
||
} |
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. | ||
} |
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") | ||
) |
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) | ||
} |
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"}, | ||
}, | ||
}}) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Not test to run defined? Am I missing something? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. What do you mean? We have 2 tests here:
We're using |
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" | ||
plar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
"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) | ||
plar marked this conversation as resolved.
Show resolved
Hide resolved
plar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
} | ||
|
||
// 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), | ||
) | ||
} |
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" | ||
plar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
"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"}, | ||
}, | ||
}}) |
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" | ||
plar marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
||
"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), | ||
) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes I think we had switched to
ContentCacheSizeLimitMB
andMetadataCacheSizeLimitMB
for setting hard limits. @kale-amruta can confirm.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yes these are not used, we are using hard limits when providing cache options in K10 and kanister.