mirror of
https://github.com/NVIDIA/nvidia-container-toolkit
synced 2024-11-28 23:17:24 +00:00
90 lines
2.3 KiB
Go
90 lines
2.3 KiB
Go
|
/**
|
||
|
# Copyright (c) NVIDIA CORPORATION. All rights reserved.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
**/
|
||
|
|
||
|
package ocihook
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// CreateHook creates an OCI hook file for the specified NVIDIA Container Runtime hook path
|
||
|
func CreateHook(hookFilePath string, nvidiaContainerRuntimeHookExecutablePath string) error {
|
||
|
var output io.Writer
|
||
|
if hookFilePath == "" {
|
||
|
output = os.Stdout
|
||
|
} else {
|
||
|
if hooksDir := filepath.Dir(hookFilePath); hooksDir != "" {
|
||
|
err := os.MkdirAll(hooksDir, 0755)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error creating hooks directory %v: %v", hooksDir, err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
hookFile, err := os.Create(hookFilePath)
|
||
|
if err != nil {
|
||
|
return fmt.Errorf("error creating hook file '%v': %v", hookFilePath, err)
|
||
|
}
|
||
|
defer hookFile.Close()
|
||
|
output = hookFile
|
||
|
}
|
||
|
|
||
|
encoder := json.NewEncoder(output)
|
||
|
encoder.SetIndent("", " ")
|
||
|
if err := encoder.Encode(generateOciHook(nvidiaContainerRuntimeHookExecutablePath)); err != nil {
|
||
|
return fmt.Errorf("error writing hook file: %v", err)
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func generateOciHook(executablePath string) podmanHook {
|
||
|
pathParts := []string{"/usr/local/sbin", "/usr/local/bin", "/usr/sbin", "/usr/bin", "/sbin", "/bin"}
|
||
|
|
||
|
dir := filepath.Dir(executablePath)
|
||
|
var found bool
|
||
|
for _, pathPart := range pathParts {
|
||
|
if pathPart == dir {
|
||
|
found = true
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
if !found {
|
||
|
pathParts = append(pathParts, dir)
|
||
|
}
|
||
|
|
||
|
envPath := "PATH=" + strings.Join(pathParts, ":")
|
||
|
always := true
|
||
|
|
||
|
hook := podmanHook{
|
||
|
Version: "1.0.0",
|
||
|
Stages: []string{"prestart"},
|
||
|
Hook: specHook{
|
||
|
Path: executablePath,
|
||
|
Args: []string{filepath.Base(executablePath), "prestart"},
|
||
|
Env: []string{envPath},
|
||
|
},
|
||
|
When: When{
|
||
|
Always: &always,
|
||
|
Commands: []string{".*"},
|
||
|
},
|
||
|
}
|
||
|
return hook
|
||
|
}
|