Skip to content

Commit 8be03cf

Browse files
committed
[no-relnote] Ignore annotation devices for non-CDI modes
Signed-off-by: Evan Lezar <[email protected]>
1 parent 8650ca6 commit 8be03cf

File tree

1 file changed

+43
-18
lines changed

1 file changed

+43
-18
lines changed

internal/runtime/runtime_factory.go

Lines changed: 43 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,12 @@ func newNVIDIAContainerRuntime(logger logger.Interface, cfg *config.Config, argv
6565

6666
// newSpecModifier is a factory method that creates constructs an OCI spec modifer based on the provided config.
6767
func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Spec, driver *root.Driver) (oci.SpecModifier, error) {
68-
rawSpec, err := ociSpec.Load()
69-
if err != nil {
70-
return nil, fmt.Errorf("failed to load OCI spec: %v", err)
71-
}
72-
73-
image, err := image.NewCUDAImageFromSpec(
74-
rawSpec,
75-
image.WithLogger(logger),
76-
image.WithAcceptDeviceListAsVolumeMounts(cfg.AcceptDeviceListAsVolumeMounts),
77-
image.WithAcceptEnvvarUnprivileged(cfg.AcceptEnvvarUnprivileged),
78-
image.WithAnnotationsPrefixes(cfg.NVIDIAContainerRuntimeConfig.Modes.CDI.AnnotationPrefixes),
79-
)
68+
mode, image, err := initRuntimeModeAndImage(logger, cfg, ociSpec)
8069
if err != nil {
8170
return nil, err
8271
}
8372

84-
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
85-
// We update the mode here so that we can continue passing just the config to other functions.
86-
cfg.NVIDIAContainerRuntimeConfig.Mode = mode
87-
modeModifier, err := newModeModifier(logger, mode, cfg, image)
73+
modeModifier, err := newModeModifier(logger, mode, cfg, *image)
8874
if err != nil {
8975
return nil, err
9076
}
@@ -98,13 +84,13 @@ func newSpecModifier(logger logger.Interface, cfg *config.Config, ociSpec oci.Sp
9884
case "nvidia-hook-remover":
9985
modifiers = append(modifiers, modifier.NewNvidiaContainerRuntimeHookRemover(logger))
10086
case "graphics":
101-
graphicsModifier, err := modifier.NewGraphicsModifier(logger, cfg, image, driver, hookCreator)
87+
graphicsModifier, err := modifier.NewGraphicsModifier(logger, cfg, *image, driver, hookCreator)
10288
if err != nil {
10389
return nil, err
10490
}
10591
modifiers = append(modifiers, graphicsModifier)
10692
case "feature-gated":
107-
featureGatedModifier, err := modifier.NewFeatureGatedModifier(logger, cfg, image, driver, hookCreator)
93+
featureGatedModifier, err := modifier.NewFeatureGatedModifier(logger, cfg, *image, driver, hookCreator)
10894
if err != nil {
10995
return nil, err
11096
}
@@ -128,6 +114,45 @@ func newModeModifier(logger logger.Interface, mode string, cfg *config.Config, i
128114
return nil, fmt.Errorf("invalid runtime mode: %v", cfg.NVIDIAContainerRuntimeConfig.Mode)
129115
}
130116

117+
// initRuntimeModeAndImage constructs an image from the specified OCI runtime
118+
// specification and runtime config.
119+
// The image is also used to determine the runtime mode to apply.
120+
// If a non-CDI mode is detected we ensure that the image does not process
121+
// annotation devices.
122+
func initRuntimeModeAndImage(logger logger.Interface, cfg *config.Config, ociSpec oci.Spec) (string, *image.CUDA, error) {
123+
rawSpec, err := ociSpec.Load()
124+
if err != nil {
125+
return "", nil, fmt.Errorf("failed to load OCI spec: %v", err)
126+
}
127+
128+
image, err := image.NewCUDAImageFromSpec(
129+
rawSpec,
130+
image.WithLogger(logger),
131+
image.WithAcceptDeviceListAsVolumeMounts(cfg.AcceptDeviceListAsVolumeMounts),
132+
image.WithAcceptEnvvarUnprivileged(cfg.AcceptEnvvarUnprivileged),
133+
image.WithAnnotationsPrefixes(cfg.NVIDIAContainerRuntimeConfig.Modes.CDI.AnnotationPrefixes),
134+
)
135+
if err != nil {
136+
return "", nil, err
137+
}
138+
139+
mode := info.ResolveAutoMode(logger, cfg.NVIDIAContainerRuntimeConfig.Mode, image)
140+
// We update the mode here so that we can continue passing just the config to other functions.
141+
cfg.NVIDIAContainerRuntimeConfig.Mode = mode
142+
143+
if mode == "cdi" || len(cfg.NVIDIAContainerRuntimeConfig.Modes.CDI.AnnotationPrefixes) == 0 {
144+
return mode, &image, nil
145+
}
146+
147+
// For non-cdi modes we explicitly set the annotation prefixes to nil and
148+
// call this function again to force a reconstruction of the image.
149+
// Note that since the mode is now explicitly set, we will effectively skip
150+
// the mode resolution.
151+
cfg.NVIDIAContainerRuntimeConfig.Modes.CDI.AnnotationPrefixes = nil
152+
153+
return initRuntimeModeAndImage(logger, cfg, ociSpec)
154+
}
155+
131156
// supportedModifierTypes returns the modifiers supported for a specific runtime mode.
132157
func supportedModifierTypes(mode string) []string {
133158
switch mode {

0 commit comments

Comments
 (0)