From 5885fead8fbccc771e05d309910f818f73411bf1 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Mon, 19 Sep 2022 14:54:44 +0200 Subject: [PATCH] Improve locating NVIDIA Container Runtime Hook This change ensures that a more concrete error is provided by the NVIDIA Container Runtime if the NVIDIA Container Runtime hook cannot be located. Signed-off-by: Evan Lezar --- internal/modifier/stable.go | 37 +++++++++++++++++++------------------ 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/internal/modifier/stable.go b/internal/modifier/stable.go index c927e702..1b4d8401 100644 --- a/internal/modifier/stable.go +++ b/internal/modifier/stable.go @@ -17,11 +17,10 @@ package modifier import ( - "os" - "os/exec" - "path/filepath" + "fmt" "github.com/NVIDIA/nvidia-container-toolkit/internal/config" + "github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" "github.com/NVIDIA/nvidia-container-toolkit/internal/oci" "github.com/opencontainers/runtime-spec/specs-go" "github.com/sirupsen/logrus" @@ -44,21 +43,8 @@ type stableRuntimeModifier struct { // Modify applies the required modification to the incoming OCI spec, inserting the nvidia-container-runtime-hook // as a prestart hook. func (m stableRuntimeModifier) Modify(spec *specs.Spec) error { - path, err := exec.LookPath(config.NVIDIAContainerRuntimeHookExecutable) - if err != nil { - path = filepath.Join(config.DefaultExecutableDir, config.NVIDIAContainerRuntimeHookExecutable) - _, err = os.Stat(path) - if err != nil { - return err - } - } - - m.logger.Infof("Using prestart hook path: %s", path) - - args := []string{path} - if spec.Hooks == nil { - spec.Hooks = &specs.Hooks{} - } else if len(spec.Hooks.Prestart) != 0 { + // If an NVIDIA Container Runtime Hook already exists, we don't make any modifications to the spec. + if spec.Hooks != nil { for _, hook := range spec.Hooks.Prestart { if isNVIDIAContainerRuntimeHook(&hook) { m.logger.Infof("Existing nvidia prestart hook (%v) found in OCI spec", hook.Path) @@ -67,6 +53,21 @@ func (m stableRuntimeModifier) Modify(spec *specs.Spec) error { } } + // We create a locator and look for the NVIDIA Container Runtime Hook in the path. + candidates, err := lookup.NewExecutableLocator(m.logger, "").Locate(config.NVIDIAContainerRuntimeHookExecutable) + if err != nil { + return fmt.Errorf("failed to locate NVIDIA Container Runtime Hook: %v", err) + } + path := candidates[0] + if len(candidates) > 1 { + m.logger.Debugf("Using %v from multiple NVIDIA Container Runtime Hook candidates: %v", path, candidates) + } + + m.logger.Infof("Using prestart hook path: %v", path) + args := []string{path} + if spec.Hooks == nil { + spec.Hooks = &specs.Hooks{} + } spec.Hooks.Prestart = append(spec.Hooks.Prestart, specs.Hook{ Path: path, Args: append(args, "prestart"),