Support CDI devices as mounts

This change allows CDI devices to be requested as mounts in the
container. This enables their use in environments such as kind
where environment variables or annotations cannot be used.

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar
2023-10-10 13:48:38 +02:00
parent 1b1aae9c4a
commit 833254fa59
13 changed files with 278 additions and 84 deletions

View File

@@ -67,6 +67,13 @@ func getDevicesFromSpec(logger logger.Interface, ociSpec oci.Spec, cfg *config.C
if err != nil {
return nil, err
}
if cfg.AcceptDeviceListAsVolumeMounts {
mountDevices := container.CDIDevicesFromMounts()
if len(mountDevices) > 0 {
return mountDevices, nil
}
}
envDevices := container.DevicesFromEnvvars(visibleDevicesEnvvar)
var devices []string

View File

@@ -55,7 +55,7 @@ func NewCSVModifier(logger logger.Interface, cfg *config.Config, image image.CUD
return nil, fmt.Errorf("failed to get list of CSV files: %v", err)
}
if nvidiaRequireJetpack := image[nvidiaRequireJetpackEnvvar]; nvidiaRequireJetpack != "csv-mounts=all" {
if image.Getenv(nvidiaRequireJetpackEnvvar) != "csv-mounts=all" {
csvFiles = csv.BaseFilesOnly(csvFiles)
}

View File

@@ -32,30 +32,33 @@ func TestNewCSVModifier(t *testing.T) {
testCases := []struct {
description string
cfg *config.Config
image image.CUDA
envmap map[string]string
expectedError error
expectedNil bool
}{
{
description: "visible devices not set returns nil",
image: image.CUDA{},
envmap: map[string]string{},
expectedNil: true,
},
{
description: "visible devices empty returns nil",
image: image.CUDA{"NVIDIA_VISIBLE_DEVICES": ""},
envmap: map[string]string{"NVIDIA_VISIBLE_DEVICES": ""},
expectedNil: true,
},
{
description: "visible devices 'void' returns nil",
image: image.CUDA{"NVIDIA_VISIBLE_DEVICES": "void"},
envmap: map[string]string{"NVIDIA_VISIBLE_DEVICES": "void"},
expectedNil: true,
},
}
for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) {
m, err := NewCSVModifier(logger, tc.cfg, tc.image)
image, _ := image.New(
image.WithEnvMap(tc.envmap),
)
m, err := NewCSVModifier(logger, tc.cfg, image)
if tc.expectedError != nil {
require.Error(t, err)
} else {

View File

@@ -38,7 +38,7 @@ func NewGDSModifier(logger logger.Interface, cfg *config.Config, image image.CUD
return nil, nil
}
if gds := image[nvidiaGDSEnvvar]; gds != "enabled" {
if image.Getenv(nvidiaGDSEnvvar) != "enabled" {
return nil, nil
}

View File

@@ -26,7 +26,7 @@ import (
func TestGraphicsModifier(t *testing.T) {
testCases := []struct {
description string
cudaImage image.CUDA
envmap map[string]string
expectedRequired bool
}{
{
@@ -34,20 +34,20 @@ func TestGraphicsModifier(t *testing.T) {
},
{
description: "devices with no capabilities does not create modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
},
},
{
description: "devices with no non-graphics does not create modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
"NVIDIA_DRIVER_CAPABILITIES": "compute",
},
},
{
description: "devices with all capabilities creates modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
"NVIDIA_DRIVER_CAPABILITIES": "all",
},
@@ -55,7 +55,7 @@ func TestGraphicsModifier(t *testing.T) {
},
{
description: "devices with graphics capability creates modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
"NVIDIA_DRIVER_CAPABILITIES": "graphics",
},
@@ -63,7 +63,7 @@ func TestGraphicsModifier(t *testing.T) {
},
{
description: "devices with compute,graphics capability creates modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
"NVIDIA_DRIVER_CAPABILITIES": "compute,graphics",
},
@@ -71,7 +71,7 @@ func TestGraphicsModifier(t *testing.T) {
},
{
description: "devices with display capability creates modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
"NVIDIA_DRIVER_CAPABILITIES": "display",
},
@@ -79,7 +79,7 @@ func TestGraphicsModifier(t *testing.T) {
},
{
description: "devices with display,graphics capability creates modifier",
cudaImage: image.CUDA{
envmap: map[string]string{
"NVIDIA_VISIBLE_DEVICES": "all",
"NVIDIA_DRIVER_CAPABILITIES": "display,graphics",
},
@@ -89,7 +89,10 @@ func TestGraphicsModifier(t *testing.T) {
for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) {
required, _ := requiresGraphicsModifier(tc.cudaImage)
image, _ := image.New(
image.WithEnvMap(tc.envmap),
)
required, _ := requiresGraphicsModifier(image)
require.EqualValues(t, tc.expectedRequired, required)
})
}

View File

@@ -38,7 +38,7 @@ func NewMOFEDModifier(logger logger.Interface, cfg *config.Config, image image.C
return nil, nil
}
if mofed := image[nvidiaMOFEDEnvvar]; mofed != "enabled" {
if image.Getenv(nvidiaMOFEDEnvvar) != "enabled" {
return nil, nil
}