Add envvar to control debug logging in CDI hooks

This change allows hooks to be configured with debug logging. This
is currently only enabled for the hooks generated from the runtime.

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar 2025-05-21 15:58:56 +02:00
parent 19a83e3542
commit 479df7134a
No known key found for this signature in database
13 changed files with 46 additions and 10 deletions

View File

@ -70,13 +70,15 @@ func main() {
Aliases: []string{"d"}, Aliases: []string{"d"},
Usage: "Enable debug-level logging", Usage: "Enable debug-level logging",
Destination: &opts.Debug, Destination: &opts.Debug,
EnvVars: []string{"NVIDIA_CDI_DEBUG"}, // TODO: Support for NVIDIA_CDI_DEBUG is deprecated and NVIDIA_CTK_DEBUG should be used instead.
EnvVars: []string{"NVIDIA_CTK_DEBUG", "NVIDIA_CDI_DEBUG"},
}, },
&cli.BoolFlag{ &cli.BoolFlag{
Name: "quiet", Name: "quiet",
Usage: "Suppress all output except for errors; overrides --debug", Usage: "Suppress all output except for errors; overrides --debug",
Destination: &opts.Quiet, Destination: &opts.Quiet,
EnvVars: []string{"NVIDIA_CDI_QUIET"}, // TODO: Support for NVIDIA_CDI_QUIET is deprecated and NVIDIA_CTK_QUIET should be used instead.
EnvVars: []string{"NVDIA_CTK_QUIET", "NVIDIA_CDI_QUIET"},
}, },
} }

View File

@ -95,6 +95,8 @@ containerEdits:
- create-symlinks - create-symlinks
- --link - --link
- libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so - libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so
env:
- NVIDIA_CTK_DEBUG=false
- hookName: createContainer - hookName: createContainer
path: {{ .toolkitRoot }}/nvidia-cdi-hook path: {{ .toolkitRoot }}/nvidia-cdi-hook
args: args:
@ -102,6 +104,8 @@ containerEdits:
- update-ldcache - update-ldcache
- --folder - --folder
- /lib/x86_64-linux-gnu - /lib/x86_64-linux-gnu
env:
- NVIDIA_CTK_DEBUG=false
mounts: mounts:
- hostPath: /host/driver/root/lib/x86_64-linux-gnu/libcuda.so.999.88.77 - hostPath: /host/driver/root/lib/x86_64-linux-gnu/libcuda.so.999.88.77
containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77 containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77

View File

@ -91,12 +91,16 @@ containerEdits:
- create-symlinks - create-symlinks
- --link - --link
- libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so - libcuda.so.1::/lib/x86_64-linux-gnu/libcuda.so
env:
- NVIDIA_CTK_DEBUG=false
- hookName: createContainer - hookName: createContainer
path: /usr/bin/nvidia-cdi-hook path: /usr/bin/nvidia-cdi-hook
args: args:
- nvidia-cdi-hook - nvidia-cdi-hook
- enable-cuda-compat - enable-cuda-compat
- --host-driver-version=999.88.77 - --host-driver-version=999.88.77
env:
- NVIDIA_CTK_DEBUG=false
- hookName: createContainer - hookName: createContainer
path: /usr/bin/nvidia-cdi-hook path: /usr/bin/nvidia-cdi-hook
args: args:
@ -104,6 +108,8 @@ containerEdits:
- update-ldcache - update-ldcache
- --folder - --folder
- /lib/x86_64-linux-gnu - /lib/x86_64-linux-gnu
env:
- NVIDIA_CTK_DEBUG=false
mounts: mounts:
- hostPath: {{ .driverRoot }}/lib/x86_64-linux-gnu/libcuda.so.999.88.77 - hostPath: {{ .driverRoot }}/lib/x86_64-linux-gnu/libcuda.so.999.88.77
containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77 containerPath: /lib/x86_64-linux-gnu/libcuda.so.999.88.77

View File

@ -34,6 +34,7 @@ type Hook struct {
Lifecycle string Lifecycle string
Path string Path string
Args []string Args []string
Env []string
} }
// Discover defines an interface for discovering the devices, mounts, and hooks available on a system // Discover defines an interface for discovering the devices, mounts, and hooks available on a system

View File

@ -25,7 +25,7 @@ import (
func TestGraphicsLibrariesDiscoverer(t *testing.T) { func TestGraphicsLibrariesDiscoverer(t *testing.T) {
logger, _ := testlog.NewNullLogger() logger, _ := testlog.NewNullLogger()
hookCreator := NewHookCreator("/usr/bin/nvidia-cdi-hook") hookCreator := NewHookCreator("/usr/bin/nvidia-cdi-hook", false)
testCases := []struct { testCases := []struct {
description string description string
@ -71,6 +71,7 @@ func TestGraphicsLibrariesDiscoverer(t *testing.T) {
Args: []string{"nvidia-cdi-hook", "create-symlinks", Args: []string{"nvidia-cdi-hook", "create-symlinks",
"--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so", "--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so",
}, },
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -98,6 +99,7 @@ func TestGraphicsLibrariesDiscoverer(t *testing.T) {
Args: []string{"nvidia-cdi-hook", "create-symlinks", Args: []string{"nvidia-cdi-hook", "create-symlinks",
"--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so", "--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so",
}, },
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -129,6 +131,7 @@ func TestGraphicsLibrariesDiscoverer(t *testing.T) {
"--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so", "--link", "../libnvidia-allocator.so.1::/usr/lib64/gbm/nvidia-drm_gbm.so",
"--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so", "--link", "libnvidia-vulkan-producer.so.123.45.67::/usr/lib64/libnvidia-vulkan-producer.so",
}, },
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },

View File

@ -17,6 +17,7 @@
package discover package discover
import ( import (
"fmt"
"path/filepath" "path/filepath"
"tags.cncf.io/container-device-interface/pkg/cdi" "tags.cncf.io/container-device-interface/pkg/cdi"
@ -49,15 +50,17 @@ type Option func(*CDIHook)
type CDIHook struct { type CDIHook struct {
nvidiaCDIHookPath string nvidiaCDIHookPath string
debugLogging bool
} }
type HookCreator interface { type HookCreator interface {
Create(string, ...string) *Hook Create(string, ...string) *Hook
} }
func NewHookCreator(nvidiaCDIHookPath string) HookCreator { func NewHookCreator(nvidiaCDIHookPath string, debugLogging bool) HookCreator {
CDIHook := &CDIHook{ CDIHook := &CDIHook{
nvidiaCDIHookPath: nvidiaCDIHookPath, nvidiaCDIHookPath: nvidiaCDIHookPath,
debugLogging: debugLogging,
} }
return CDIHook return CDIHook
@ -80,6 +83,7 @@ func (c CDIHook) Create(name string, args ...string) *Hook {
Lifecycle: cdi.CreateContainerHook, Lifecycle: cdi.CreateContainerHook,
Path: c.nvidiaCDIHookPath, Path: c.nvidiaCDIHookPath,
Args: append(c.requiredArgs(name), args...), Args: append(c.requiredArgs(name), args...),
Env: []string{fmt.Sprintf("NVIDIA_CTK_DEBUG=%v", c.debugLogging)},
} }
} }

View File

@ -31,7 +31,7 @@ const (
func TestLDCacheUpdateHook(t *testing.T) { func TestLDCacheUpdateHook(t *testing.T) {
logger, _ := testlog.NewNullLogger() logger, _ := testlog.NewNullLogger()
hookCreator := NewHookCreator(testNvidiaCDIHookPath) hookCreator := NewHookCreator(testNvidiaCDIHookPath, false)
testCases := []struct { testCases := []struct {
description string description string
@ -96,6 +96,7 @@ func TestLDCacheUpdateHook(t *testing.T) {
Path: testNvidiaCDIHookPath, Path: testNvidiaCDIHookPath,
Args: tc.expectedArgs, Args: tc.expectedArgs,
Lifecycle: "createContainer", Lifecycle: "createContainer",
Env: []string{"NVIDIA_CTK_DEBUG=false"},
} }
d, err := NewLDCacheUpdateHook(logger, mountMock, hookCreator, tc.ldconfigPath) d, err := NewLDCacheUpdateHook(logger, mountMock, hookCreator, tc.ldconfigPath)

View File

@ -115,6 +115,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
Lifecycle: "createContainer", Lifecycle: "createContainer",
Path: "/path/to/nvidia-cdi-hook", Path: "/path/to/nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"}, Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -147,6 +148,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
Lifecycle: "createContainer", Lifecycle: "createContainer",
Path: "/path/to/nvidia-cdi-hook", Path: "/path/to/nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"}, Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -178,6 +180,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
Lifecycle: "createContainer", Lifecycle: "createContainer",
Path: "/path/to/nvidia-cdi-hook", Path: "/path/to/nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"}, Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -247,6 +250,7 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
Lifecycle: "createContainer", Lifecycle: "createContainer",
Path: "/path/to/nvidia-cdi-hook", Path: "/path/to/nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"}, Args: []string{"nvidia-cdi-hook", "create-symlinks", "--link", "libcuda.so.1::/usr/lib/libcuda.so"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -301,12 +305,13 @@ func TestWithWithDriverDotSoSymlinks(t *testing.T) {
"--link", "libGLX_nvidia.so.1.2.3::/usr/lib/libGLX_indirect.so.0", "--link", "libGLX_nvidia.so.1.2.3::/usr/lib/libGLX_indirect.so.0",
"--link", "libnvidia-opticalflow.so.1::/usr/lib/libnvidia-opticalflow.so", "--link", "libnvidia-opticalflow.so.1::/usr/lib/libnvidia-opticalflow.so",
}, },
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
} }
hookCreator := NewHookCreator("/path/to/nvidia-cdi-hook") hookCreator := NewHookCreator("/path/to/nvidia-cdi-hook", false)
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) { t.Run(tc.description, func(t *testing.T) {
d := WithDriverDotSoSymlinks( d := WithDriverDotSoSymlinks(

View File

@ -42,6 +42,7 @@ func (d hook) toSpec() *specs.Hook {
HookName: d.Lifecycle, HookName: d.Lifecycle,
Path: d.Path, Path: d.Path,
Args: d.Args, Args: d.Args,
Env: d.Env,
} }
return &s return &s

View File

@ -97,6 +97,7 @@ func TestDiscovererFromCSVFiles(t *testing.T) {
"--link", "--link",
"/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so", "/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so",
}, },
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -153,6 +154,7 @@ func TestDiscovererFromCSVFiles(t *testing.T) {
"--link", "--link",
"/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so", "/usr/lib/aarch64-linux-gnu/tegra/libv4l2_nvargus.so::/usr/lib/aarch64-linux-gnu/libv4l/plugins/nv/libv4l2_nvargus.so",
}, },
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -181,7 +183,7 @@ func TestDiscovererFromCSVFiles(t *testing.T) {
}, },
} }
hookCreator := discover.NewHookCreator("/usr/bin/nvidia-cdi-hook") hookCreator := discover.NewHookCreator("/usr/bin/nvidia-cdi-hook", false)
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) { t.Run(tc.description, func(t *testing.T) {
defer setGetTargetsFromCSVFiles(tc.moutSpecs)() defer setGetTargetsFromCSVFiles(tc.moutSpecs)()

View File

@ -18,6 +18,7 @@ package runtime
import ( import (
"fmt" "fmt"
"os"
"github.com/NVIDIA/nvidia-container-toolkit/internal/config" "github.com/NVIDIA/nvidia-container-toolkit/internal/config"
"github.com/NVIDIA/nvidia-container-toolkit/internal/config/image" "github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
@ -75,7 +76,10 @@ func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Sp
return nil, err return nil, err
} }
hookCreator := discover.NewHookCreator(cfg.NVIDIACTKConfig.Path) hookCreator := discover.NewHookCreator(
cfg.NVIDIACTKConfig.Path,
cfg.NVIDIAContainerRuntimeConfig.DebugFilePath == "" || cfg.NVIDIAContainerRuntimeConfig.DebugFilePath == os.DevNull,
)
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image) mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
// We update the mode here so that we can continue passing just the config to other functions. // We update the mode here so that we can continue passing just the config to other functions.

View File

@ -29,7 +29,7 @@ import (
func TestNvidiaSMISymlinkHook(t *testing.T) { func TestNvidiaSMISymlinkHook(t *testing.T) {
logger, _ := testlog.NewNullLogger() logger, _ := testlog.NewNullLogger()
hookCreator := discover.NewHookCreator("nvidia-cdi-hook") hookCreator := discover.NewHookCreator("nvidia-cdi-hook", false)
errMounts := errors.New("mounts error") errMounts := errors.New("mounts error")
@ -96,6 +96,7 @@ func TestNvidiaSMISymlinkHook(t *testing.T) {
Path: "nvidia-cdi-hook", Path: "nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", Args: []string{"nvidia-cdi-hook", "create-symlinks",
"--link", "nvidia-smi::/usr/bin/nvidia-smi"}, "--link", "nvidia-smi::/usr/bin/nvidia-smi"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -116,6 +117,7 @@ func TestNvidiaSMISymlinkHook(t *testing.T) {
Path: "nvidia-cdi-hook", Path: "nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", Args: []string{"nvidia-cdi-hook", "create-symlinks",
"--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"}, "--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },
@ -136,6 +138,7 @@ func TestNvidiaSMISymlinkHook(t *testing.T) {
Path: "nvidia-cdi-hook", Path: "nvidia-cdi-hook",
Args: []string{"nvidia-cdi-hook", "create-symlinks", Args: []string{"nvidia-cdi-hook", "create-symlinks",
"--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"}, "--link", "/some/path/nvidia-smi::/usr/bin/nvidia-smi"},
Env: []string{"NVIDIA_CTK_DEBUG=false"},
}, },
}, },
}, },

View File

@ -85,7 +85,7 @@ func New(opts ...Option) (Interface, error) {
l.nvidiaCDIHookPath = "/usr/bin/nvidia-cdi-hook" l.nvidiaCDIHookPath = "/usr/bin/nvidia-cdi-hook"
} }
// create hookCreator // create hookCreator
l.hookCreator = discover.NewHookCreator(l.nvidiaCDIHookPath) l.hookCreator = discover.NewHookCreator(l.nvidiaCDIHookPath, false)
if l.driverRoot == "" { if l.driverRoot == "" {
l.driverRoot = "/" l.driverRoot = "/"