mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2025-06-26 18:18:24 +00:00
fetch current container runtime config through the command line
Signed-off-by: Tariq Ibrahim <tibrahim@nvidia.com> add default runtime binary path to runtimes field of toolkit config toml Signed-off-by: Tariq Ibrahim <tibrahim@nvidia.com> [no-relnote] Get low-level runtimes consistently We ensure that we use the same low-level runtimes regardless of the runtime engine being configured. This ensures consistent behaviour. Signed-off-by: Evan Lezar <elezar@nvidia.com> Co-authored-by: Evan Lezar <elezar@nvidia.com> address review comment Signed-off-by: Tariq Ibrahim <tibrahim@nvidia.com>
This commit is contained in:
@@ -30,6 +30,22 @@ type Config struct {
|
||||
Logger logger.Interface
|
||||
}
|
||||
|
||||
type crioRuntime struct {
|
||||
tree *toml.Tree
|
||||
}
|
||||
|
||||
var _ engine.RuntimeConfig = (*crioRuntime)(nil)
|
||||
|
||||
// GetBinaryPath retrieves the path to the actual low-level runtime binary invoked by the runtime handler
|
||||
func (c *crioRuntime) GetBinaryPath() string {
|
||||
if c.tree != nil {
|
||||
if binaryPath, ok := c.tree.GetPath([]string{"runtime_path"}).(string); ok {
|
||||
return binaryPath
|
||||
}
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
var _ engine.Interface = (*Config)(nil)
|
||||
|
||||
// New creates a cri-o config with the specified options
|
||||
@@ -65,11 +81,7 @@ func (c *Config) AddRuntime(name string, path string, setAsDefault bool) error {
|
||||
|
||||
config := *c.Tree
|
||||
|
||||
// By default we extract the runtime options from the runc settings; if this does not exist we get the options from the default runtime specified in the config.
|
||||
runtimeNamesForConfig := []string{"runc"}
|
||||
if name, ok := config.GetPath([]string{"crio", "runtime", "default_runtime"}).(string); ok && name != "" {
|
||||
runtimeNamesForConfig = append(runtimeNamesForConfig, name)
|
||||
}
|
||||
runtimeNamesForConfig := engine.GetLowLevelRuntimes(c)
|
||||
for _, r := range runtimeNamesForConfig {
|
||||
if options, ok := config.GetPath([]string{"crio", "runtime", "runtimes", r}).(*toml.Tree); ok {
|
||||
c.Logger.Debugf("using options from runtime %v: %v", r, options.String())
|
||||
@@ -129,3 +141,27 @@ func (c *Config) RemoveRuntime(name string) error {
|
||||
*c.Tree = config
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Config) GetRuntimeConfig(name string) (engine.RuntimeConfig, error) {
|
||||
if c == nil || c.Tree == nil {
|
||||
return nil, fmt.Errorf("config is nil")
|
||||
}
|
||||
runtimeData := c.GetSubtreeByPath([]string{"crio", "runtime", "runtimes", name})
|
||||
return &crioRuntime{
|
||||
tree: runtimeData,
|
||||
}, nil
|
||||
}
|
||||
|
||||
// CommandLineSource returns the CLI-based crio config loader
|
||||
func CommandLineSource(hostRoot string) toml.Loader {
|
||||
commandLine := chrootIfRequired(hostRoot, "crio", "status", "config")
|
||||
return toml.FromCommandLine(commandLine[0], commandLine[1:]...)
|
||||
}
|
||||
|
||||
func chrootIfRequired(hostRoot string, commandLine ...string) []string {
|
||||
if hostRoot == "" || hostRoot == "/" {
|
||||
return commandLine
|
||||
}
|
||||
|
||||
return append([]string{"chroot", hostRoot}, commandLine...)
|
||||
}
|
||||
|
||||
@@ -91,7 +91,7 @@ func TestAddRuntime(t *testing.T) {
|
||||
`,
|
||||
},
|
||||
{
|
||||
description: "options from runc take precedence over default runtime",
|
||||
description: "options from the default runtime take precedence over runc",
|
||||
config: `
|
||||
[crio]
|
||||
[crio.runtime]
|
||||
@@ -120,7 +120,7 @@ func TestAddRuntime(t *testing.T) {
|
||||
[crio.runtime.runtimes.test]
|
||||
runtime_path = "/usr/bin/test"
|
||||
runtime_type = "oci"
|
||||
runc_option = "option"
|
||||
default_option = "option"
|
||||
`,
|
||||
},
|
||||
}
|
||||
@@ -144,3 +144,61 @@ func TestAddRuntime(t *testing.T) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestGetRuntimeConfig(t *testing.T) {
|
||||
logger, _ := testlog.NewNullLogger()
|
||||
config := `
|
||||
[crio.image]
|
||||
signature_policy = "/etc/crio/policy.json"
|
||||
|
||||
[crio.runtime]
|
||||
default_runtime = "crun"
|
||||
|
||||
[crio.runtime.runtimes.crun]
|
||||
runtime_path = "/usr/libexec/crio/crun"
|
||||
runtime_root = "/run/crun"
|
||||
monitor_path = "/usr/libexec/crio/conmon"
|
||||
allowed_annotations = [
|
||||
"io.containers.trace-syscall",
|
||||
]
|
||||
|
||||
[crio.runtime.runtimes.runc]
|
||||
runtime_path = "/usr/libexec/crio/runc"
|
||||
runtime_root = "/run/runc"
|
||||
monitor_path = "/usr/libexec/crio/conmon"
|
||||
`
|
||||
testCases := []struct {
|
||||
description string
|
||||
runtime string
|
||||
expected string
|
||||
expectedError error
|
||||
}{
|
||||
{
|
||||
description: "valid runtime config, existing runtime",
|
||||
runtime: "crun",
|
||||
expected: "/usr/libexec/crio/crun",
|
||||
expectedError: nil,
|
||||
},
|
||||
{
|
||||
description: "valid runtime config, non-existing runtime",
|
||||
runtime: "some-other-runtime",
|
||||
expected: "",
|
||||
expectedError: nil,
|
||||
},
|
||||
}
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.description, func(t *testing.T) {
|
||||
cfg, err := toml.Load(config)
|
||||
require.NoError(t, err)
|
||||
|
||||
c := &Config{
|
||||
Logger: logger,
|
||||
Tree: cfg,
|
||||
}
|
||||
|
||||
rc, err := c.GetRuntimeConfig(tc.runtime)
|
||||
require.Equal(t, tc.expectedError, err)
|
||||
require.Equal(t, tc.expected, rc.GetBinaryPath())
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user