Skip to content

Commit d1286bc

Browse files
authored
Merge pull request #763 from elezar/allow-config-override-by-envvar
Add support for specifying the config file path in an environment variable
2 parents 2f20414 + 849691d commit d1286bc

File tree

11 files changed

+80
-82
lines changed

11 files changed

+80
-82
lines changed

cmd/nvidia-container-runtime-hook/hook_config.go

Lines changed: 18 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"fmt"
55
"log"
66
"os"
7-
"path"
87
"reflect"
98
"strings"
109
"sync"
@@ -14,11 +13,6 @@ import (
1413
"github.com/NVIDIA/nvidia-container-toolkit/internal/info"
1514
)
1615

17-
const (
18-
configPath = "/etc/nvidia-container-runtime/config.toml"
19-
driverPath = "/run/nvidia/driver"
20-
)
21-
2216
// hookConfig wraps the toolkit config.
2317
// This allows for functions to be defined on the local type.
2418
type hookConfig struct {
@@ -29,29 +23,27 @@ type hookConfig struct {
2923

3024
// loadConfig loads the required paths for the hook config.
3125
func loadConfig() (*config.Config, error) {
32-
var configPaths []string
33-
var required bool
34-
if len(*configflag) != 0 {
35-
configPaths = append(configPaths, *configflag)
36-
required = true
37-
} else {
38-
configPaths = append(configPaths, path.Join(driverPath, configPath), configPath)
26+
configFilePath, required := getConfigFilePath()
27+
cfg, err := config.New(
28+
config.WithConfigFile(configFilePath),
29+
config.WithRequired(true),
30+
)
31+
if err == nil {
32+
return cfg.Config()
33+
} else if os.IsNotExist(err) && !required {
34+
return config.GetDefault()
3935
}
36+
return nil, fmt.Errorf("couldn't open required configuration file: %v", err)
37+
}
4038

41-
for _, p := range configPaths {
42-
cfg, err := config.New(
43-
config.WithConfigFile(p),
44-
config.WithRequired(true),
45-
)
46-
if err == nil {
47-
return cfg.Config()
48-
} else if os.IsNotExist(err) && !required {
49-
continue
50-
}
51-
return nil, fmt.Errorf("couldn't open required configuration file: %v", err)
39+
func getConfigFilePath() (string, bool) {
40+
if configFromFlag := *configflag; configFromFlag != "" {
41+
return configFromFlag, true
5242
}
53-
54-
return config.GetDefault()
43+
if configFromEnvvar := os.Getenv(config.FilePathOverrideEnvVar); configFromEnvvar != "" {
44+
return configFromEnvvar, true
45+
}
46+
return config.GetConfigFilePath(), false
5547
}
5648

5749
func getHookConfig() (*hookConfig, error) {

cmd/nvidia-ctk-installer/toolkit/installer/directory.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type createDirectory struct {
2828
logger logger.Interface
2929
}
3030

31-
func (t *toolkitInstaller) createDirectory() Installer {
31+
func (t *ToolkitInstaller) createDirectory() Installer {
3232
return &createDirectory{
3333
logger: t.logger,
3434
}

cmd/nvidia-ctk-installer/toolkit/installer/executables.go

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,20 +28,18 @@ import (
2828
log "github.com/sirupsen/logrus"
2929

3030
"github.com/NVIDIA/nvidia-container-toolkit/cmd/nvidia-ctk-installer/container/operator"
31+
"github.com/NVIDIA/nvidia-container-toolkit/internal/config"
3132
)
3233

3334
type executable struct {
3435
requiresKernelModule bool
3536
path string
3637
symlink string
37-
args []string
3838
env map[string]string
3939
}
4040

41-
func (t *toolkitInstaller) collectExecutables(destDir string) ([]Installer, error) {
42-
configHome := filepath.Join(destDir, ".config")
43-
configDir := filepath.Join(configHome, "nvidia-container-runtime")
44-
configPath := filepath.Join(configDir, "config.toml")
41+
func (t *ToolkitInstaller) collectExecutables(destDir string) ([]Installer, error) {
42+
configFilePath := t.ConfigFilePath(destDir)
4543

4644
executables := []executable{
4745
{
@@ -56,7 +54,7 @@ func (t *toolkitInstaller) collectExecutables(destDir string) ([]Installer, erro
5654
path: runtime.Path,
5755
requiresKernelModule: true,
5856
env: map[string]string{
59-
"XDG_CONFIG_HOME": configHome,
57+
config.FilePathOverrideEnvVar: configFilePath,
6058
},
6159
}
6260
executables = append(executables, e)
@@ -72,7 +70,9 @@ func (t *toolkitInstaller) collectExecutables(destDir string) ([]Installer, erro
7270
executable{
7371
path: "nvidia-container-runtime-hook",
7472
symlink: "nvidia-container-toolkit",
75-
args: []string{fmt.Sprintf("-config %s", configPath)},
73+
env: map[string]string{
74+
config.FilePathOverrideEnvVar: configFilePath,
75+
},
7676
},
7777
)
7878

@@ -94,7 +94,6 @@ func (t *toolkitInstaller) collectExecutables(destDir string) ([]Installer, erro
9494
Source: executablePath,
9595
WrappedExecutable: dotRealFilename,
9696
CheckModules: executable.requiresKernelModule,
97-
Args: executable.args,
9897
Envvars: map[string]string{
9998
"PATH": strings.Join([]string{destDir, "$PATH"}, ":"),
10099
},
@@ -124,7 +123,6 @@ type wrapper struct {
124123
Envvars map[string]string
125124
WrappedExecutable string
126125
CheckModules bool
127-
Args []string
128126
}
129127

130128
type render struct {
@@ -165,9 +163,6 @@ fi
165163
{{$key}}={{$value}} \
166164
{{- end }}
167165
{{ .DestDir }}/{{ .WrappedExecutable }} \
168-
{{- range $arg := .Args }}
169-
{{$arg}} \
170-
{{- end }}
171166
"$@"
172167
`
173168

cmd/nvidia-ctk-installer/toolkit/installer/executables_test.go

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -68,19 +68,6 @@ fi
6868
PATH=/foo/bar/baz \
6969
/dest-dir/some-runtime \
7070
"$@"
71-
`,
72-
},
73-
{
74-
description: "args are added",
75-
w: &wrapper{
76-
WrappedExecutable: "some-runtime",
77-
Args: []string{"--config foo", "bar"},
78-
},
79-
expected: `#! /bin/sh
80-
/dest-dir/some-runtime \
81-
--config foo \
82-
bar \
83-
"$@"
8471
`,
8572
},
8673
}

cmd/nvidia-ctk-installer/toolkit/installer/installer.go

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ type Installer interface {
3333
Install(string) error
3434
}
3535

36-
type toolkitInstaller struct {
36+
type ToolkitInstaller struct {
3737
logger logger.Interface
3838
ignoreErrors bool
3939
sourceRoot string
@@ -43,11 +43,11 @@ type toolkitInstaller struct {
4343
ensureTargetDirectory Installer
4444
}
4545

46-
var _ Installer = (*toolkitInstaller)(nil)
46+
var _ Installer = (*ToolkitInstaller)(nil)
4747

4848
// New creates a toolkit installer with the specified options.
49-
func New(opts ...Option) (Installer, error) {
50-
t := &toolkitInstaller{
49+
func New(opts ...Option) (*ToolkitInstaller, error) {
50+
t := &ToolkitInstaller{
5151
sourceRoot: "/",
5252
}
5353
for _, opt := range opts {
@@ -73,7 +73,7 @@ func New(opts ...Option) (Installer, error) {
7373
}
7474

7575
// Install ensures that the required toolkit files are installed in the specified directory.
76-
func (t *toolkitInstaller) Install(destDir string) error {
76+
func (t *ToolkitInstaller) Install(destDir string) error {
7777
var installers []Installer
7878

7979
installers = append(installers, t.ensureTargetDirectory)
@@ -98,6 +98,11 @@ func (t *toolkitInstaller) Install(destDir string) error {
9898
return errs
9999
}
100100

101+
func (t *ToolkitInstaller) ConfigFilePath(destDir string) string {
102+
toolkitConfigDir := filepath.Join(destDir, ".config", "nvidia-container-runtime")
103+
return filepath.Join(toolkitConfigDir, "config.toml")
104+
}
105+
101106
type symlink struct {
102107
linkname string
103108
target string

cmd/nvidia-ctk-installer/toolkit/installer/installer_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ func TestToolkitInstaller(t *testing.T) {
112112
return nil
113113
},
114114
}
115-
i := toolkitInstaller{
115+
i := ToolkitInstaller{
116116
logger: logger,
117117
artifactRoot: r,
118118
ensureTargetDirectory: createDirectory,
@@ -172,8 +172,8 @@ if [ "${?}" != "0" ]; then
172172
echo "nvidia driver modules are not yet loaded, invoking runc directly"
173173
exec runc "$@"
174174
fi
175+
NVIDIA_CTK_CONFIG_FILE_PATH=/foo/bar/baz/.config/nvidia-container-runtime/config.toml \
175176
PATH=/foo/bar/baz:$PATH \
176-
XDG_CONFIG_HOME=/foo/bar/baz/.config \
177177
/foo/bar/baz/nvidia-container-runtime.real \
178178
"$@"
179179
`,
@@ -187,8 +187,8 @@ if [ "${?}" != "0" ]; then
187187
echo "nvidia driver modules are not yet loaded, invoking runc directly"
188188
exec runc "$@"
189189
fi
190+
NVIDIA_CTK_CONFIG_FILE_PATH=/foo/bar/baz/.config/nvidia-container-runtime/config.toml \
190191
PATH=/foo/bar/baz:$PATH \
191-
XDG_CONFIG_HOME=/foo/bar/baz/.config \
192192
/foo/bar/baz/nvidia-container-runtime.cdi.real \
193193
"$@"
194194
`,
@@ -202,8 +202,8 @@ if [ "${?}" != "0" ]; then
202202
echo "nvidia driver modules are not yet loaded, invoking runc directly"
203203
exec runc "$@"
204204
fi
205+
NVIDIA_CTK_CONFIG_FILE_PATH=/foo/bar/baz/.config/nvidia-container-runtime/config.toml \
205206
PATH=/foo/bar/baz:$PATH \
206-
XDG_CONFIG_HOME=/foo/bar/baz/.config \
207207
/foo/bar/baz/nvidia-container-runtime.legacy.real \
208208
"$@"
209209
`,
@@ -240,9 +240,9 @@ PATH=/foo/bar/baz:$PATH \
240240
path: "/foo/bar/baz/nvidia-container-runtime-hook",
241241
mode: 0777,
242242
wrapper: `#! /bin/sh
243+
NVIDIA_CTK_CONFIG_FILE_PATH=/foo/bar/baz/.config/nvidia-container-runtime/config.toml \
243244
PATH=/foo/bar/baz:$PATH \
244245
/foo/bar/baz/nvidia-container-runtime-hook.real \
245-
-config /foo/bar/baz/.config/nvidia-container-runtime/config.toml \
246246
"$@"
247247
`,
248248
},

cmd/nvidia-ctk-installer/toolkit/installer/libraries.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import (
2828
// A predefined set of library candidates are considered, with the first one
2929
// resulting in success being installed to the toolkit folder. The install process
3030
// resolves the symlink for the library and copies the versioned library itself.
31-
func (t *toolkitInstaller) collectLibraries() ([]Installer, error) {
31+
func (t *ToolkitInstaller) collectLibraries() ([]Installer, error) {
3232
requiredLibraries := []string{
3333
"libnvidia-container.so.1",
3434
"libnvidia-container-go.so.1",

cmd/nvidia-ctk-installer/toolkit/installer/options.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,29 +19,29 @@ package installer
1919

2020
import "github.com/NVIDIA/nvidia-container-toolkit/internal/logger"
2121

22-
type Option func(*toolkitInstaller)
22+
type Option func(*ToolkitInstaller)
2323

2424
func WithLogger(logger logger.Interface) Option {
25-
return func(ti *toolkitInstaller) {
25+
return func(ti *ToolkitInstaller) {
2626
ti.logger = logger
2727
}
2828
}
2929

3030
func WithArtifactRoot(artifactRoot *artifactRoot) Option {
31-
return func(ti *toolkitInstaller) {
31+
return func(ti *ToolkitInstaller) {
3232
ti.artifactRoot = artifactRoot
3333
}
3434
}
3535

3636
func WithIgnoreErrors(ignoreErrors bool) Option {
37-
return func(ti *toolkitInstaller) {
37+
return func(ti *ToolkitInstaller) {
3838
ti.ignoreErrors = ignoreErrors
3939
}
4040
}
4141

4242
// WithSourceRoot sets the root directory for locating artifacts to be installed.
4343
func WithSourceRoot(sourceRoot string) Option {
44-
return func(ti *toolkitInstaller) {
44+
return func(ti *ToolkitInstaller) {
4545
ti.sourceRoot = sourceRoot
4646
}
4747
}

cmd/nvidia-ctk-installer/toolkit/toolkit.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ import (
3737
const (
3838
// DefaultNvidiaDriverRoot specifies the default NVIDIA driver run directory
3939
DefaultNvidiaDriverRoot = "/run/nvidia/driver"
40-
41-
configFilename = "config.toml"
4240
)
4341

4442
type cdiOptions struct {
@@ -316,7 +314,7 @@ func (t *Installer) Install(cli *cli.Context, opts *Options) error {
316314
t.logger.Errorf("Ignoring error: %v", fmt.Errorf("could not install toolkit components: %w", err))
317315
}
318316

319-
err = t.installToolkitConfig(cli, opts)
317+
err = t.installToolkitConfig(cli, opts, toolkit.ConfigFilePath(t.toolkitRoot))
320318
if err != nil && !opts.ignoreErrors {
321319
return fmt.Errorf("error installing NVIDIA container toolkit config: %v", err)
322320
} else if err != nil {
@@ -343,13 +341,11 @@ func (t *Installer) Install(cli *cli.Context, opts *Options) error {
343341

344342
// installToolkitConfig installs the config file for the NVIDIA container toolkit ensuring
345343
// that the settings are updated to match the desired install and nvidia driver directories.
346-
func (t *Installer) installToolkitConfig(c *cli.Context, opts *Options) error {
347-
toolkitConfigDir := filepath.Join(t.toolkitRoot, ".config", "nvidia-container-runtime")
348-
toolkitConfigPath := filepath.Join(toolkitConfigDir, configFilename)
344+
func (t *Installer) installToolkitConfig(c *cli.Context, opts *Options, toolkitConfigPath string) error {
349345

350346
t.logger.Infof("Installing NVIDIA container toolkit config '%v'", toolkitConfigPath)
351347

352-
err := t.createDirectories(toolkitConfigDir)
348+
err := t.createDirectories(filepath.Dir(toolkitConfigPath))
353349
if err != nil && !opts.ignoreErrors {
354350
return fmt.Errorf("could not create required directories: %v", err)
355351
} else if err != nil {

internal/config/config.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,10 @@ import (
3131
)
3232

3333
const (
34-
configOverride = "XDG_CONFIG_HOME"
35-
configFilePath = "nvidia-container-runtime/config.toml"
34+
FilePathOverrideEnvVar = "NVIDIA_CTK_CONFIG_FILE_PATH"
35+
RelativeFilePath = "nvidia-container-runtime/config.toml"
36+
37+
configRootOverride = "XDG_CONFIG_HOME"
3638

3739
nvidiaCTKExecutable = "nvidia-ctk"
3840
nvidiaCTKDefaultFilePath = "/usr/bin/nvidia-ctk"
@@ -74,11 +76,15 @@ type Config struct {
7476

7577
// GetConfigFilePath returns the path to the config file for the configured system
7678
func GetConfigFilePath() string {
77-
if XDGConfigDir := os.Getenv(configOverride); len(XDGConfigDir) != 0 {
78-
return filepath.Join(XDGConfigDir, configFilePath)
79+
if configFilePathOverride := os.Getenv(FilePathOverrideEnvVar); configFilePathOverride != "" {
80+
return configFilePathOverride
81+
}
82+
configRoot := "/etc"
83+
if XDGConfigDir := os.Getenv(configRootOverride); len(XDGConfigDir) != 0 {
84+
configRoot = XDGConfigDir
7985
}
8086

81-
return filepath.Join("/etc", configFilePath)
87+
return filepath.Join(configRoot, RelativeFilePath)
8288
}
8389

8490
// GetConfig sets up the config struct. Values are read from a toml file

0 commit comments

Comments
 (0)