Skip to content

Commit

Permalink
Merge branch 'cherry-pick-enable-cdi' into 'release-1.14'
Browse files Browse the repository at this point in the history
Add cdi.enabled option to runtime configure

See merge request nvidia/container-toolkit/container-toolkit!539
  • Loading branch information
Evan Lezar committed Jan 19, 2024
2 parents ccff00b + 7ff2399 commit d167812
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 1 deletion.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
* Added detection of libnvdxgdmal.so.1 on WSL2.
* Fix bug in determining default nvidia-container-runtime.user config value on SUSE-based systems.
* Add `crun` to the list of configured low-level runtimes.
* Add `--cdi.enabled` option to `nvidia-ctk runtime configure` command to enable CDI in containerd.
* Added support for `nvidia-ctk runtime configure --enable-cdi` for the `docker` runtime. Note that this requires Docker >= 25.

* [toolkit-container] Bump CUDA base image version to 12.3.1.
* [libnvidia-container] Added detection of libnvdxgdmal.so.1 on WSL2.
Expand Down
39 changes: 38 additions & 1 deletion cmd/nvidia-ctk/runtime/configure/configure.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,14 @@ import (
"fmt"
"path/filepath"

"github.com/urfave/cli/v2"

"github.com/NVIDIA/nvidia-container-toolkit/internal/logger"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/containerd"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/crio"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/engine/docker"
"github.com/NVIDIA/nvidia-container-toolkit/pkg/config/ocihook"
"github.com/urfave/cli/v2"
)

const (
Expand Down Expand Up @@ -71,6 +72,11 @@ type config struct {
hookPath string
setAsDefault bool
}

// cdi-specific options
cdi struct {
enabled bool
}
}

func (m command) build() *cli.Command {
Expand Down Expand Up @@ -141,6 +147,11 @@ func (m command) build() *cli.Command {
Usage: "set the NVIDIA runtime as the default runtime",
Destination: &config.nvidiaRuntime.setAsDefault,
},
&cli.BoolFlag{
Name: "cdi.enabled",
Usage: "Enable CDI in the configured runtime",
Destination: &config.cdi.enabled,
},
}

return &configure
Expand Down Expand Up @@ -175,6 +186,13 @@ func (m command) validateFlags(c *cli.Context, config *config) error {
}
}

if config.runtime != "containerd" && config.runtime != "docker" {
if config.cdi.enabled {
m.logger.Warningf("Ignoring cdi.enabled flag for %v", config.runtime)
}
config.cdi.enabled = false
}

return nil
}

Expand Down Expand Up @@ -227,6 +245,11 @@ func (m command) configureConfigFile(c *cli.Context, config *config) error {
return fmt.Errorf("unable to update config: %v", err)
}

err = enableCDI(config, cfg)
if err != nil {
return fmt.Errorf("failed to enable CDI in %s: %w", config.runtime, err)
}

outputPath := config.getOuputConfigPath()
n, err := cfg.Save(outputPath)
if err != nil {
Expand Down Expand Up @@ -277,3 +300,17 @@ func (m *command) configureOCIHook(c *cli.Context, config *config) error {
}
return nil
}

// enableCDI enables the use of CDI in the corresponding container engine
func enableCDI(config *config, cfg engine.Interface) error {
if !config.cdi.enabled {
return nil
}
switch config.runtime {
case "containerd":
return cfg.Set("enable_cdi", true)
case "docker":
return cfg.Set("experimental", true)
}
return fmt.Errorf("enabling CDI in %s is not supported", config.runtime)
}
1 change: 1 addition & 0 deletions pkg/config/engine/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ package engine
type Interface interface {
DefaultRuntime() string
AddRuntime(string, string, bool) error
Set(string, interface{}) error
RemoveRuntime(string) error
Save(string) (int64, error)
}
8 changes: 8 additions & 0 deletions pkg/config/engine/containerd/config_v1.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,14 @@ func (c *ConfigV1) RemoveRuntime(name string) error {
return nil
}

// SetOption sets the specified containerd option.
func (c *ConfigV1) Set(key string, value interface{}) error {
config := *c.Tree
config.SetPath([]string{"plugins", "cri", "containerd", key}, value)
*c.Tree = config
return nil
}

// Save wrotes the config to a file
func (c ConfigV1) Save(path string) (int64, error) {
return (Config)(c).Save(path)
Expand Down
8 changes: 8 additions & 0 deletions pkg/config/engine/containerd/config_v2.go
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,14 @@ func (c *Config) getRuntimeAnnotations(path []string) ([]string, error) {
return annotations, nil
}

// Set sets the specified containerd option.
func (c *Config) Set(key string, value interface{}) error {
config := *c.Tree
config.SetPath([]string{"plugins", "io.containerd.grpc.v1.cri", key}, value)
*c.Tree = config
return nil
}

// DefaultRuntime returns the default runtime for the cri-o config
func (c Config) DefaultRuntime() string {
if runtime, ok := c.GetPath([]string{"plugins", "io.containerd.grpc.v1.cri", "containerd", "default_runtime_name"}).(string); ok {
Expand Down
5 changes: 5 additions & 0 deletions pkg/config/engine/crio/crio.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,11 @@ func (c *Config) RemoveRuntime(name string) error {
return nil
}

// Set is not supported for cri-o configs.
func (c *Config) Set(key string, value interface{}) error {
return fmt.Errorf("Set is not supported for crio configs")
}

// Save writes the config to the specified path
func (c Config) Save(path string) (int64, error) {
config := (toml.Tree)(c)
Expand Down
6 changes: 6 additions & 0 deletions pkg/config/engine/docker/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,12 @@ func (c *Config) RemoveRuntime(name string) error {
return nil
}

// Set sets the specified docker option
func (c *Config) Set(key string, value interface{}) error {
(*c)[key] = value
return nil
}

// Save writes the config to the specified path
func (c Config) Save(path string) (int64, error) {
output, err := json.MarshalIndent(c, "", " ")
Expand Down

0 comments on commit d167812

Please sign in to comment.