From 02c14e981c5840ccf8a39fb617b00e9a8321598a Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Fri, 15 Jul 2022 12:17:01 +0200 Subject: [PATCH 1/2] Add tests for identifying libraries Signed-off-by: Evan Lezar --- internal/discover/ldconfig.go | 19 +++++---- internal/discover/ldconfig_test.go | 65 ++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 internal/discover/ldconfig_test.go diff --git a/internal/discover/ldconfig.go b/internal/discover/ldconfig.go index d6f06827..30f65486 100644 --- a/internal/discover/ldconfig.go +++ b/internal/discover/ldconfig.go @@ -100,7 +100,7 @@ func getLibDirs(mounts []Mount) []string { if exists { continue } - checked[dir] = isLibName(filepath.Base(m.Path)) + checked[dir] = isLibName(m.Path) if checked[dir] { paths = append(paths, dir) @@ -114,13 +114,18 @@ func getLibDirs(mounts []Mount) []string { // isLibName checks if the specified filename is a library (i.e. ends in `.so*`) func isLibName(filename string) bool { - parts := strings.Split(filename, ".") - for _, p := range parts { - if p == "so" { - return true - } + base := filepath.Base(filename) + + isLib, err := filepath.Match("lib?*.so*", base) + if !isLib || err != nil { + return false + } + + parts := strings.Split(base, ".so") + if len(parts) == 1 { + return true } - return false + return parts[len(parts)-1] == "" || strings.HasPrefix(parts[len(parts)-1], ".") } diff --git a/internal/discover/ldconfig_test.go b/internal/discover/ldconfig_test.go new file mode 100644 index 00000000..0e741a45 --- /dev/null +++ b/internal/discover/ldconfig_test.go @@ -0,0 +1,65 @@ +/** +# Copyright (c) 2022, 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 discover + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestIsLibName(t *testing.T) { + testCases := []struct { + name string + isLib bool + }{ + { + name: "", + isLib: false, + }, + { + name: "lib/not/.so", + isLib: false, + }, + { + name: "lib.so", + isLib: false, + }, + { + name: "notlibcuda.so", + isLib: false, + }, + { + name: "libcuda.so", + isLib: true, + }, + { + name: "libcuda.so.1", + isLib: true, + }, + { + name: "libcuda.soNOT", + isLib: false, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + require.Equal(t, tc.isLib, isLibName(tc.name)) + }) + } +} From 7584044b3c8aec48c8a026f109eefe4961d54d43 Mon Sep 17 00:00:00 2001 From: Evan Lezar Date: Fri, 15 Jul 2022 12:18:36 +0200 Subject: [PATCH 2/2] Fix bug where ldcache may not contain symlinks Since the creation of symlinks may include other libraries / folders the ldcache should be updated AFTER the symlinks are created. Signed-off-by: Evan Lezar --- internal/modifier/csv.go | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/internal/modifier/csv.go b/internal/modifier/csv.go index 4c5348b7..d2a2f7ad 100644 --- a/internal/modifier/csv.go +++ b/internal/modifier/csv.go @@ -84,17 +84,22 @@ func NewCSVModifier(logger *logrus.Logger, cfg *config.Config, ociSpec oci.Spec) return nil, fmt.Errorf("failed to create CSV discoverer: %v", err) } - ldcacheUpdateHook, err := discover.NewLDCacheUpdateHook(logger, csvDiscoverer, config) + createSymlinksHook, err := discover.NewCreateSymlinksHook(logger, csvFiles, csvDiscoverer, config) if err != nil { - return nil, fmt.Errorf("failed to create ldcach update hook discoverer: %v", err) + return nil, fmt.Errorf("failed to create symlink hook discoverer: %v", err) } - createSymlinksHook, err := discover.NewCreateSymlinksHook(logger, csvFiles, csvDiscoverer, config) + ldcacheUpdateHook, err := discover.NewLDCacheUpdateHook(logger, csvDiscoverer, config) if err != nil { - return nil, fmt.Errorf("failed to create symlink hook discoverer: %v", err) + return nil, fmt.Errorf("failed to create ldcach update hook discoverer: %v", err) } - d := discover.Merge(csvDiscoverer, ldcacheUpdateHook, createSymlinksHook) + d := discover.Merge( + csvDiscoverer, + createSymlinksHook, + // The ldcacheUpdateHook is added last to ensure that the created symlinks are included + ldcacheUpdateHook, + ) discoverModifier, err := NewModifierFromDiscoverer(logger, d) if err != nil {