From cb7605e132abd3aa410ece1d14bd823ddb651391 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Thu, 3 Apr 2025 09:17:49 +0200 Subject: [PATCH 1/2] [no-relnote] Remove unused runtimeConfigOverideJSON variable Signed-off-by: Evan Lezar --- cmd/nvidia-ctk/runtime/configure/configure.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/cmd/nvidia-ctk/runtime/configure/configure.go b/cmd/nvidia-ctk/runtime/configure/configure.go index aa8a496c..09122ba0 100644 --- a/cmd/nvidia-ctk/runtime/configure/configure.go +++ b/cmd/nvidia-ctk/runtime/configure/configure.go @@ -72,8 +72,6 @@ type config struct { mode string hookFilePath string - runtimeConfigOverrideJSON string - nvidiaRuntime struct { name string path string @@ -208,11 +206,6 @@ func (m command) validateFlags(c *cli.Context, config *config) error { config.cdi.enabled = false } - if config.runtimeConfigOverrideJSON != "" && config.runtime != "containerd" { - m.logger.Warningf("Ignoring runtime-config-override flag for %v", config.runtime) - config.runtimeConfigOverrideJSON = "" - } - switch config.configSource { case configSourceCommand: if config.runtime == "docker" { From 3e77955c870d5d81d40795a6cba1afaefc328848 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Wed, 2 Apr 2025 17:56:46 +0200 Subject: [PATCH 2/2] Allow container runtime executable path to be specified This change adds support for specifying the container runtime executable path. This can be used if, for example, there are two containerd or crio executables and a specific one must be used. Signed-off-by: Evan Lezar --- cmd/nvidia-ctk-installer/container/container.go | 5 +++++ .../container/runtime/containerd/containerd.go | 2 +- .../container/runtime/crio/crio.go | 2 +- .../container/runtime/runtime.go | 16 ++++++++++++++-- cmd/nvidia-ctk-installer/main.go | 2 +- cmd/nvidia-ctk/runtime/configure/configure.go | 15 +++++++++++++-- pkg/config/engine/containerd/containerd.go | 7 +++++-- pkg/config/engine/crio/crio.go | 7 +++++-- 8 files changed, 45 insertions(+), 11 deletions(-) diff --git a/cmd/nvidia-ctk-installer/container/container.go b/cmd/nvidia-ctk-installer/container/container.go index 5e838608..f8184a42 100644 --- a/cmd/nvidia-ctk-installer/container/container.go +++ b/cmd/nvidia-ctk-installer/container/container.go @@ -38,6 +38,11 @@ const ( type Options struct { Config string Socket string + // ExecutablePath specifies the path to the container runtime executable. + // This is used to extract the current config, for example. + // If a HostRootMount is specified, this path is relative to the host root + // mount. + ExecutablePath string // EnabledCDI indicates whether CDI should be enabled. EnableCDI bool RuntimeName string diff --git a/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go index 9ece5306..e6eb835a 100644 --- a/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go +++ b/cmd/nvidia-ctk-installer/container/runtime/containerd/containerd.go @@ -173,7 +173,7 @@ func getRuntimeConfig(o *container.Options, co *Options) (engine.Interface, erro containerd.WithPath(o.Config), containerd.WithConfigSource( toml.LoadFirst( - containerd.CommandLineSource(o.HostRootMount), + containerd.CommandLineSource(o.HostRootMount, o.ExecutablePath), toml.FromFile(o.Config), ), ), diff --git a/cmd/nvidia-ctk-installer/container/runtime/crio/crio.go b/cmd/nvidia-ctk-installer/container/runtime/crio/crio.go index 0db1f41b..a621aeb4 100644 --- a/cmd/nvidia-ctk-installer/container/runtime/crio/crio.go +++ b/cmd/nvidia-ctk-installer/container/runtime/crio/crio.go @@ -202,7 +202,7 @@ func getRuntimeConfig(o *container.Options) (engine.Interface, error) { crio.WithPath(o.Config), crio.WithConfigSource( toml.LoadFirst( - crio.CommandLineSource(o.HostRootMount), + crio.CommandLineSource(o.HostRootMount, o.ExecutablePath), toml.FromFile(o.Config), ), ), diff --git a/cmd/nvidia-ctk-installer/container/runtime/runtime.go b/cmd/nvidia-ctk-installer/container/runtime/runtime.go index 2920262c..488522b5 100644 --- a/cmd/nvidia-ctk-installer/container/runtime/runtime.go +++ b/cmd/nvidia-ctk-installer/container/runtime/runtime.go @@ -26,6 +26,7 @@ import ( "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/runtime/crio" "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/runtime/docker" "github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/toolkit" + "github.com/NVIDIA/nvidia-container-toolkit/internal/logger" ) const ( @@ -53,6 +54,12 @@ func Flags(opts *Options) []cli.Flag { Destination: &opts.Config, EnvVars: []string{"RUNTIME_CONFIG", "CONTAINERD_CONFIG", "DOCKER_CONFIG"}, }, + &cli.StringFlag{ + Name: "executable-path", + Usage: "The path to the runtime executable. This is used to extract the current config", + Destination: &opts.ExecutablePath, + EnvVars: []string{"RUNTIME_EXECUTABLE_PATH"}, + }, &cli.StringFlag{ Name: "socket", Usage: "Path to the runtime socket file", @@ -104,8 +111,8 @@ func Flags(opts *Options) []cli.Flag { return flags } -// ValidateOptions checks whether the specified options are valid -func ValidateOptions(c *cli.Context, opts *Options, runtime string, toolkitRoot string, to *toolkit.Options) error { +// Validate checks whether the specified options are valid +func (opts *Options) Validate(logger logger.Interface, c *cli.Context, runtime string, toolkitRoot string, to *toolkit.Options) error { // We set this option here to ensure that it is available in future calls. opts.RuntimeDir = toolkitRoot @@ -113,6 +120,11 @@ func ValidateOptions(c *cli.Context, opts *Options, runtime string, toolkitRoot opts.EnableCDI = to.CDI.Enabled } + if opts.ExecutablePath != "" && opts.RuntimeName != containerd.Name && opts.RuntimeName != crio.Name { + logger.Warningf("Ignoring executable-path=%q flag for %v", opts.ExecutablePath, opts.RuntimeName) + opts.ExecutablePath = "" + } + // Apply the runtime-specific config changes. switch runtime { case containerd.Name: diff --git a/cmd/nvidia-ctk-installer/main.go b/cmd/nvidia-ctk-installer/main.go index fa1dabad..ccb73595 100644 --- a/cmd/nvidia-ctk-installer/main.go +++ b/cmd/nvidia-ctk-installer/main.go @@ -167,7 +167,7 @@ func (a *app) validateFlags(c *cli.Context, o *options) error { if err := a.toolkit.ValidateOptions(&o.toolkitOptions); err != nil { return err } - if err := runtime.ValidateOptions(c, &o.runtimeOptions, o.runtime, o.toolkitRoot(), &o.toolkitOptions); err != nil { + if err := o.runtimeOptions.Validate(a.logger, c, o.runtime, o.toolkitRoot(), &o.toolkitOptions); err != nil { return err } return nil diff --git a/cmd/nvidia-ctk/runtime/configure/configure.go b/cmd/nvidia-ctk/runtime/configure/configure.go index 09122ba0..a4b1b5e2 100644 --- a/cmd/nvidia-ctk/runtime/configure/configure.go +++ b/cmd/nvidia-ctk/runtime/configure/configure.go @@ -68,6 +68,7 @@ type config struct { dryRun bool runtime string configFilePath string + executablePath string configSource string mode string hookFilePath string @@ -118,6 +119,11 @@ func (m command) build() *cli.Command { Usage: "path to the config file for the target runtime", Destination: &config.configFilePath, }, + &cli.StringFlag{ + Name: "executable-path", + Usage: "The path to the runtime executable. This is used to extract the current config", + Destination: &config.executablePath, + }, &cli.StringFlag{ Name: "config-mode", Usage: "the config mode for runtimes that support multiple configuration mechanisms", @@ -206,6 +212,11 @@ func (m command) validateFlags(c *cli.Context, config *config) error { config.cdi.enabled = false } + if config.executablePath != "" && config.runtime != "containerd" && config.runtime != "crio" { + m.logger.Warningf("Ignoring executable-path=%q flag for %v", config.executablePath, config.runtime) + config.executablePath = "" + } + switch config.configSource { case configSourceCommand: if config.runtime == "docker" { @@ -323,9 +334,9 @@ func (c *config) resolveConfigSource() (toml.Loader, error) { func (c *config) getCommandConfigSource() toml.Loader { switch c.runtime { case "containerd": - return containerd.CommandLineSource("") + return containerd.CommandLineSource("", c.executablePath) case "crio": - return crio.CommandLineSource("") + return crio.CommandLineSource("", c.executablePath) } return toml.Empty } diff --git a/pkg/config/engine/containerd/containerd.go b/pkg/config/engine/containerd/containerd.go index 8c41e947..ca35c75d 100644 --- a/pkg/config/engine/containerd/containerd.go +++ b/pkg/config/engine/containerd/containerd.go @@ -162,8 +162,11 @@ func (c *Config) GetRuntimeConfig(name string) (engine.RuntimeConfig, error) { } // CommandLineSource returns the CLI-based containerd config loader -func CommandLineSource(hostRoot string) toml.Loader { - return toml.FromCommandLine(chrootIfRequired(hostRoot, "containerd", "config", "dump")...) +func CommandLineSource(hostRoot string, executablePath string) toml.Loader { + if executablePath == "" { + executablePath = "containerd" + } + return toml.FromCommandLine(chrootIfRequired(hostRoot, executablePath, "config", "dump")...) } func chrootIfRequired(hostRoot string, commandLine ...string) []string { diff --git a/pkg/config/engine/crio/crio.go b/pkg/config/engine/crio/crio.go index c0cc60be..473b8fa4 100644 --- a/pkg/config/engine/crio/crio.go +++ b/pkg/config/engine/crio/crio.go @@ -157,9 +157,12 @@ func (c *Config) GetRuntimeConfig(name string) (engine.RuntimeConfig, error) { func (c *Config) EnableCDI() {} // CommandLineSource returns the CLI-based crio config loader -func CommandLineSource(hostRoot string) toml.Loader { +func CommandLineSource(hostRoot string, executablePath string) toml.Loader { + if executablePath == "" { + executablePath = "crio" + } return toml.LoadFirst( - toml.FromCommandLine(chrootIfRequired(hostRoot, "crio", "status", "config")...), + toml.FromCommandLine(chrootIfRequired(hostRoot, executablePath, "status", "config")...), toml.FromCommandLine(chrootIfRequired(hostRoot, "crio-status", "config")...), ) }