Merge branch 'fix-user-group' into 'main'

Fix bug in determining CLI user on SUSE systems

See merge request nvidia/container-toolkit/container-toolkit!532
This commit is contained in:
Evan Lezar 2024-01-11 13:19:25 +00:00
commit ba3d80e8ea
4 changed files with 117 additions and 8 deletions

View File

@ -7,6 +7,7 @@
* Remove package dependency on libseccomp. * Remove package dependency on libseccomp.
* Added detection of libnvdxgdmal.so.1 on WSL2 * Added detection of libnvdxgdmal.so.1 on WSL2
* Use devRoot to resolve MIG device nodes. * Use devRoot to resolve MIG device nodes.
* Fix bug in determining default nvidia-container-runtime.user config value on SUSE-based systems.
## v1.15.0-rc.1 ## v1.15.0-rc.1
* Skip update of ldcache in containers without ldconfig. The .so.SONAME symlinks are still created. * Skip update of ldcache in containers without ldconfig. The .so.SONAME symlinks are still created.

View File

@ -95,6 +95,7 @@ func GetDefault() (*Config, error) {
NVIDIAContainerCLIConfig: ContainerCLIConfig{ NVIDIAContainerCLIConfig: ContainerCLIConfig{
LoadKmods: true, LoadKmods: true,
Ldconfig: getLdConfigPath(), Ldconfig: getLdConfigPath(),
User: getUserGroup(),
}, },
NVIDIACTKConfig: CTKConfig{ NVIDIACTKConfig: CTKConfig{
Path: nvidiaCTKExecutable, Path: nvidiaCTKExecutable,
@ -126,24 +127,32 @@ func getLdConfigPath() string {
return NormalizeLDConfigPath("@/sbin/ldconfig") return NormalizeLDConfigPath("@/sbin/ldconfig")
} }
// getCommentedUserGroup returns whether the nvidia-container-cli user and group config option should be commented. func getUserGroup() string {
func getCommentedUserGroup() bool { if isSuse() {
uncommentIf := map[string]bool{ return "root:video"
}
return ""
}
// isSuse returns whether a SUSE-based distribution was detected.
func isSuse() bool {
suseDists := map[string]bool{
"suse": true, "suse": true,
"opensuse": true, "opensuse": true,
} }
idsLike := getDistIDLike() idsLike := getDistIDLike()
for _, id := range idsLike { for _, id := range idsLike {
if uncommentIf[id] { if suseDists[id] {
return false return true
} }
} }
return true return false
} }
// getDistIDLike returns the ID_LIKE field from /etc/os-release. // getDistIDLike returns the ID_LIKE field from /etc/os-release.
func getDistIDLike() []string { // We can override this for testing.
var getDistIDLike = func() []string {
releaseFile, err := os.Open("/etc/os-release") releaseFile, err := os.Open("/etc/os-release")
if err != nil { if err != nil {
return nil return nil

View File

@ -48,6 +48,7 @@ func TestGetConfig(t *testing.T) {
contents []string contents []string
expectedError error expectedError error
inspectLdconfig bool inspectLdconfig bool
distIdsLike []string
expectedConfig *Config expectedConfig *Config
}{ }{
{ {
@ -93,6 +94,7 @@ func TestGetConfig(t *testing.T) {
"nvidia-container-cli.root = \"/bar/baz\"", "nvidia-container-cli.root = \"/bar/baz\"",
"nvidia-container-cli.load-kmods = false", "nvidia-container-cli.load-kmods = false",
"nvidia-container-cli.ldconfig = \"/foo/bar/ldconfig\"", "nvidia-container-cli.ldconfig = \"/foo/bar/ldconfig\"",
"nvidia-container-cli.user = \"foo:bar\"",
"nvidia-container-runtime.debug = \"/foo/bar\"", "nvidia-container-runtime.debug = \"/foo/bar\"",
"nvidia-container-runtime.discover-mode = \"not-legacy\"", "nvidia-container-runtime.discover-mode = \"not-legacy\"",
"nvidia-container-runtime.log-level = \"debug\"", "nvidia-container-runtime.log-level = \"debug\"",
@ -112,6 +114,7 @@ func TestGetConfig(t *testing.T) {
Root: "/bar/baz", Root: "/bar/baz",
LoadKmods: false, LoadKmods: false,
Ldconfig: "/foo/bar/ldconfig", Ldconfig: "/foo/bar/ldconfig",
User: "foo:bar",
}, },
NVIDIAContainerRuntimeConfig: RuntimeConfig{ NVIDIAContainerRuntimeConfig: RuntimeConfig{
DebugFilePath: "/foo/bar", DebugFilePath: "/foo/bar",
@ -152,6 +155,7 @@ func TestGetConfig(t *testing.T) {
"root = \"/bar/baz\"", "root = \"/bar/baz\"",
"load-kmods = false", "load-kmods = false",
"ldconfig = \"/foo/bar/ldconfig\"", "ldconfig = \"/foo/bar/ldconfig\"",
"user = \"foo:bar\"",
"[nvidia-container-runtime]", "[nvidia-container-runtime]",
"debug = \"/foo/bar\"", "debug = \"/foo/bar\"",
"discover-mode = \"not-legacy\"", "discover-mode = \"not-legacy\"",
@ -176,6 +180,7 @@ func TestGetConfig(t *testing.T) {
Root: "/bar/baz", Root: "/bar/baz",
LoadKmods: false, LoadKmods: false,
Ldconfig: "/foo/bar/ldconfig", Ldconfig: "/foo/bar/ldconfig",
User: "foo:bar",
}, },
NVIDIAContainerRuntimeConfig: RuntimeConfig{ NVIDIAContainerRuntimeConfig: RuntimeConfig{
DebugFilePath: "/foo/bar", DebugFilePath: "/foo/bar",
@ -207,10 +212,88 @@ func TestGetConfig(t *testing.T) {
}, },
}, },
}, },
{
description: "suse config",
distIdsLike: []string{"suse", "opensuse"},
inspectLdconfig: true,
expectedConfig: &Config{
AcceptEnvvarUnprivileged: true,
SupportedDriverCapabilities: "compat32,compute,display,graphics,ngx,utility,video",
NVIDIAContainerCLIConfig: ContainerCLIConfig{
Root: "",
LoadKmods: true,
Ldconfig: "WAS_CHECKED",
User: "root:video",
},
NVIDIAContainerRuntimeConfig: RuntimeConfig{
DebugFilePath: "/dev/null",
LogLevel: "info",
Runtimes: []string{"docker-runc", "runc"},
Mode: "auto",
Modes: modesConfig{
CSV: csvModeConfig{
MountSpecPath: "/etc/nvidia-container-runtime/host-files-for-container.d",
},
CDI: cdiModeConfig{
DefaultKind: "nvidia.com/gpu",
AnnotationPrefixes: []string{"cdi.k8s.io/"},
SpecDirs: []string{"/etc/cdi", "/var/run/cdi"},
},
},
},
NVIDIAContainerRuntimeHookConfig: RuntimeHookConfig{
Path: "nvidia-container-runtime-hook",
},
NVIDIACTKConfig: CTKConfig{
Path: "nvidia-ctk",
},
},
},
{
description: "suse config overrides user",
distIdsLike: []string{"suse", "opensuse"},
inspectLdconfig: true,
contents: []string{
"nvidia-container-cli.user = \"foo:bar\"",
},
expectedConfig: &Config{
AcceptEnvvarUnprivileged: true,
SupportedDriverCapabilities: "compat32,compute,display,graphics,ngx,utility,video",
NVIDIAContainerCLIConfig: ContainerCLIConfig{
Root: "",
LoadKmods: true,
Ldconfig: "WAS_CHECKED",
User: "foo:bar",
},
NVIDIAContainerRuntimeConfig: RuntimeConfig{
DebugFilePath: "/dev/null",
LogLevel: "info",
Runtimes: []string{"docker-runc", "runc"},
Mode: "auto",
Modes: modesConfig{
CSV: csvModeConfig{
MountSpecPath: "/etc/nvidia-container-runtime/host-files-for-container.d",
},
CDI: cdiModeConfig{
DefaultKind: "nvidia.com/gpu",
AnnotationPrefixes: []string{"cdi.k8s.io/"},
SpecDirs: []string{"/etc/cdi", "/var/run/cdi"},
},
},
},
NVIDIAContainerRuntimeHookConfig: RuntimeHookConfig{
Path: "nvidia-container-runtime-hook",
},
NVIDIACTKConfig: CTKConfig{
Path: "nvidia-ctk",
},
},
},
} }
for _, tc := range testCases { for _, tc := range testCases {
t.Run(tc.description, func(t *testing.T) { t.Run(tc.description, func(t *testing.T) {
defer setGetDistIDLikeForTest(tc.distIdsLike)()
reader := strings.NewReader(strings.Join(tc.contents, "\n")) reader := strings.NewReader(strings.Join(tc.contents, "\n"))
tomlCfg, err := loadConfigTomlFrom(reader) tomlCfg, err := loadConfigTomlFrom(reader)
@ -236,3 +319,19 @@ func TestGetConfig(t *testing.T) {
}) })
} }
} }
// setGetDistIDsLikeForTest overrides the distribution IDs that would normally be read from the /etc/os-release file.
func setGetDistIDLikeForTest(ids []string) func() {
if ids == nil {
return func() {}
}
original := getDistIDLike
getDistIDLike = func() []string {
return ids
}
return func() {
getDistIDLike = original
}
}

View File

@ -201,7 +201,7 @@ func (t *Toml) commentDefaults() *Toml {
} }
func shouldComment(key string, defaultValue interface{}, setTo interface{}) bool { func shouldComment(key string, defaultValue interface{}, setTo interface{}) bool {
if key == "nvidia-container-cli.user" && !getCommentedUserGroup() { if key == "nvidia-container-cli.user" && defaultValue == setTo && isSuse() {
return false return false
} }
if key == "nvidia-container-runtime.debug" && setTo == "/dev/null" { if key == "nvidia-container-runtime.debug" && setTo == "/dev/null" {