mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-22 00:08:11 +00:00
Pass image when constructing CSV modifier
Since the incoming OCI spec has already been parsed and used to construct a CUDA image representation, pass this to the CSV modifier constructor instead of re-creating an image representation. Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
parent
f08e48e700
commit
cca343abb0
@ -45,17 +45,7 @@ const (
|
|||||||
|
|
||||||
// NewCSVModifier creates a modifier that applies modications to an OCI spec if required by the runtime wrapper.
|
// NewCSVModifier creates a modifier that applies modications to an OCI spec if required by the runtime wrapper.
|
||||||
// The modifications are defined by CSV MountSpecs.
|
// The modifications are defined by CSV MountSpecs.
|
||||||
func NewCSVModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Spec) (oci.SpecModifier, error) {
|
func NewCSVModifier(logger logger.Interface, cfg *config.Config, image image.CUDA) (oci.SpecModifier, error) {
|
||||||
rawSpec, err := ociSpec.Load()
|
|
||||||
if err != nil {
|
|
||||||
return nil, fmt.Errorf("failed to load OCI spec: %v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
image, err := image.NewCUDAImageFromSpec(rawSpec)
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if devices := image.DevicesFromEnvvars(visibleDevicesEnvvar); len(devices.List()) == 0 {
|
if devices := image.DevicesFromEnvvars(visibleDevicesEnvvar); len(devices.List()) == 0 {
|
||||||
logger.Infof("No modification required; no devices requested")
|
logger.Infof("No modification required; no devices requested")
|
||||||
return nil, nil
|
return nil, nil
|
||||||
|
@ -17,11 +17,10 @@
|
|||||||
package modifier
|
package modifier
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/NVIDIA/nvidia-container-toolkit/internal/config"
|
"github.com/NVIDIA/nvidia-container-toolkit/internal/config"
|
||||||
"github.com/NVIDIA/nvidia-container-toolkit/internal/oci"
|
"github.com/NVIDIA/nvidia-container-toolkit/internal/config/image"
|
||||||
"github.com/opencontainers/runtime-spec/specs-go"
|
"github.com/opencontainers/runtime-spec/specs-go"
|
||||||
testlog "github.com/sirupsen/logrus/hooks/test"
|
testlog "github.com/sirupsen/logrus/hooks/test"
|
||||||
"github.com/stretchr/testify/require"
|
"github.com/stretchr/testify/require"
|
||||||
@ -31,54 +30,32 @@ func TestNewCSVModifier(t *testing.T) {
|
|||||||
logger, _ := testlog.NewNullLogger()
|
logger, _ := testlog.NewNullLogger()
|
||||||
|
|
||||||
testCases := []struct {
|
testCases := []struct {
|
||||||
description string
|
description string
|
||||||
cfg *config.Config
|
cfg *config.Config
|
||||||
spec oci.Spec
|
image image.CUDA
|
||||||
visibleDevices string
|
expectedError error
|
||||||
expectedError error
|
expectedNil bool
|
||||||
expectedNil bool
|
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
description: "spec load error returns error",
|
description: "visible devices not set returns nil",
|
||||||
spec: &oci.SpecMock{
|
image: image.CUDA{},
|
||||||
LoadFunc: func() (*specs.Spec, error) {
|
expectedNil: true,
|
||||||
return nil, fmt.Errorf("load failed")
|
|
||||||
},
|
|
||||||
},
|
|
||||||
expectedError: fmt.Errorf("load failed"),
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "visible devices not set returns nil",
|
description: "visible devices empty returns nil",
|
||||||
visibleDevices: "NOT_SET",
|
image: image.CUDA{"NVIDIA_VISIBLE_DEVICES": ""},
|
||||||
expectedNil: true,
|
expectedNil: true,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
description: "visible devices empty returns nil",
|
description: "visible devices 'void' returns nil",
|
||||||
visibleDevices: "",
|
image: image.CUDA{"NVIDIA_VISIBLE_DEVICES": "void"},
|
||||||
expectedNil: true,
|
expectedNil: true,
|
||||||
},
|
|
||||||
{
|
|
||||||
description: "visible devices 'void' returns nil",
|
|
||||||
visibleDevices: "void",
|
|
||||||
expectedNil: true,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, tc := range testCases {
|
for _, tc := range testCases {
|
||||||
t.Run(tc.description, func(t *testing.T) {
|
t.Run(tc.description, func(t *testing.T) {
|
||||||
spec := tc.spec
|
m, err := NewCSVModifier(logger, tc.cfg, tc.image)
|
||||||
if spec == nil {
|
|
||||||
spec = &oci.SpecMock{
|
|
||||||
LookupEnvFunc: func(s string) (string, bool) {
|
|
||||||
if tc.visibleDevices != "NOT_SET" && s == visibleDevicesEnvvar {
|
|
||||||
return tc.visibleDevices, true
|
|
||||||
}
|
|
||||||
return "", false
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m, err := NewCSVModifier(logger, tc.cfg, spec)
|
|
||||||
if tc.expectedError != nil {
|
if tc.expectedError != nil {
|
||||||
require.Error(t, err)
|
require.Error(t, err)
|
||||||
} else {
|
} else {
|
||||||
|
@ -73,7 +73,7 @@ func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Sp
|
|||||||
}
|
}
|
||||||
|
|
||||||
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
|
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
|
||||||
modeModifier, err := newModeModifier(logger, mode, cfg, ociSpec)
|
modeModifier, err := newModeModifier(logger, mode, cfg, ociSpec, image)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -106,12 +106,12 @@ func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Sp
|
|||||||
return modifiers, nil
|
return modifiers, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func newModeModifier(logger logger.Interface, mode string, cfg *config.Config, ociSpec oci.Spec) (oci.SpecModifier, error) {
|
func newModeModifier(logger logger.Interface, mode string, cfg *config.Config, ociSpec oci.Spec, image image.CUDA) (oci.SpecModifier, error) {
|
||||||
switch mode {
|
switch mode {
|
||||||
case "legacy":
|
case "legacy":
|
||||||
return modifier.NewStableRuntimeModifier(logger, cfg.NVIDIAContainerRuntimeHookConfig.Path), nil
|
return modifier.NewStableRuntimeModifier(logger, cfg.NVIDIAContainerRuntimeHookConfig.Path), nil
|
||||||
case "csv":
|
case "csv":
|
||||||
return modifier.NewCSVModifier(logger, cfg, ociSpec)
|
return modifier.NewCSVModifier(logger, cfg, image)
|
||||||
case "cdi":
|
case "cdi":
|
||||||
return modifier.NewCDIModifier(logger, cfg, ociSpec)
|
return modifier.NewCDIModifier(logger, cfg, ociSpec)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user