mirror of
				https://github.com/NVIDIA/nvidia-container-toolkit
				synced 2025-06-26 18:18:24 +00:00 
			
		
		
		
	Move libcuda locator to internal/lookup package
Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
		
							parent
							
								
									9571513601
								
							
						
					
					
						commit
						2abe679dd1
					
				
							
								
								
									
										102
									
								
								internal/lookup/cuda/cuda.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										102
									
								
								internal/lookup/cuda/cuda.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,102 @@ | |||||||
|  | /** | ||||||
|  | # 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 cuda | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"path/filepath" | ||||||
|  | 
 | ||||||
|  | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" | ||||||
|  | 	"github.com/sirupsen/logrus" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type cudaLocator struct { | ||||||
|  | 	logger     *logrus.Logger | ||||||
|  | 	driverRoot string | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Options is a function that configures a cudaLocator.
 | ||||||
|  | type Options func(*cudaLocator) | ||||||
|  | 
 | ||||||
|  | // WithLogger is an option that configures the logger used by the locator.
 | ||||||
|  | func WithLogger(logger *logrus.Logger) Options { | ||||||
|  | 	return func(c *cudaLocator) { | ||||||
|  | 		c.logger = logger | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // WithDriverRoot is an option that configures the driver root used by the locator.
 | ||||||
|  | func WithDriverRoot(driverRoot string) Options { | ||||||
|  | 	return func(c *cudaLocator) { | ||||||
|  | 		c.driverRoot = driverRoot | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // New creates a new CUDA library locator.
 | ||||||
|  | func New(opts ...Options) lookup.Locator { | ||||||
|  | 	c := &cudaLocator{} | ||||||
|  | 	for _, opt := range opts { | ||||||
|  | 		opt(c) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	if c.logger == nil { | ||||||
|  | 		c.logger = logrus.StandardLogger() | ||||||
|  | 	} | ||||||
|  | 	if c.driverRoot == "" { | ||||||
|  | 		c.driverRoot = "/" | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return c | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Locate returns the path to the libcuda.so.RMVERSION file.
 | ||||||
|  | // libcuda.so is prefixed to the specified pattern.
 | ||||||
|  | func (l *cudaLocator) Locate(pattern string) ([]string, error) { | ||||||
|  | 	ldcacheLocator, err := lookup.NewLibraryLocator( | ||||||
|  | 		l.logger, | ||||||
|  | 		l.driverRoot, | ||||||
|  | 	) | ||||||
|  | 	if err != nil { | ||||||
|  | 		l.logger.Debugf("Failed to create LDCache locator: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	fullPattern := "libcuda.so" + pattern | ||||||
|  | 
 | ||||||
|  | 	candidates, err := ldcacheLocator.Locate("libcuda.so") | ||||||
|  | 	if err == nil { | ||||||
|  | 		for _, c := range candidates { | ||||||
|  | 			if match, err := filepath.Match(fullPattern, filepath.Base(c)); err != nil || !match { | ||||||
|  | 				l.logger.Debugf("Skipping non-matching candidate %v: %v", c, err) | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			return []string{c}, nil | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	l.logger.Debugf("Could not locate %q in LDCache: Checking predefined library paths.", pattern) | ||||||
|  | 
 | ||||||
|  | 	pathLocator := lookup.NewFileLocator( | ||||||
|  | 		lookup.WithLogger(l.logger), | ||||||
|  | 		lookup.WithRoot(l.driverRoot), | ||||||
|  | 		lookup.WithSearchPaths( | ||||||
|  | 			"/usr/lib64", | ||||||
|  | 			"/usr/lib/x86_64-linux-gnu", | ||||||
|  | 			"/usr/lib/aarch64-linux-gnu", | ||||||
|  | 		), | ||||||
|  | 		lookup.WithCount(1), | ||||||
|  | 	) | ||||||
|  | 
 | ||||||
|  | 	return pathLocator.Locate(fullPattern) | ||||||
|  | } | ||||||
| @ -23,6 +23,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/NVIDIA/nvidia-container-toolkit/internal/discover" | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/discover" | ||||||
| 	"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup" | ||||||
|  | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda" | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 	"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" | 	"gitlab.com/nvidia/cloud-native/go-nvlib/pkg/nvml" | ||||||
| ) | ) | ||||||
| @ -135,11 +136,10 @@ func NewDriverBinariesDiscoverer(logger *logrus.Logger, driverRoot string) disco | |||||||
| func getVersionLibs(logger *logrus.Logger, driverRoot string, version string) ([]string, error) { | func getVersionLibs(logger *logrus.Logger, driverRoot string, version string) ([]string, error) { | ||||||
| 	logger.Infof("Using driver version %v", version) | 	logger.Infof("Using driver version %v", version) | ||||||
| 
 | 
 | ||||||
| 	l := cudaLocator{ | 	libCudaPaths, err := cuda.New( | ||||||
| 		logger:     logger, | 		cuda.WithLogger(logger), | ||||||
| 		driverRoot: driverRoot, | 		cuda.WithDriverRoot(driverRoot), | ||||||
| 	} | 	).Locate("." + version) | ||||||
| 	libCudaPaths, err := l.Locate("libcuda.so." + version) |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, fmt.Errorf("failed to locate libcuda.so.%v: %v", version, err) | 		return nil, fmt.Errorf("failed to locate libcuda.so.%v: %v", version, err) | ||||||
| 	} | 	} | ||||||
| @ -167,43 +167,3 @@ func getVersionLibs(logger *logrus.Logger, driverRoot string, version string) ([ | |||||||
| 
 | 
 | ||||||
| 	return relative, nil | 	return relative, nil | ||||||
| } | } | ||||||
| 
 |  | ||||||
| type cudaLocator struct { |  | ||||||
| 	logger     *logrus.Logger |  | ||||||
| 	driverRoot string |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| // Locate returns the path to the libcuda.so.RMVERSION file.
 |  | ||||||
| func (l *cudaLocator) Locate(pattern string) ([]string, error) { |  | ||||||
| 	ldcacheLocator, err := lookup.NewLibraryLocator( |  | ||||||
| 		l.logger, |  | ||||||
| 		l.driverRoot, |  | ||||||
| 	) |  | ||||||
| 	if err != nil { |  | ||||||
| 		l.logger.Debugf("Failed to create LDCache locator: %v", err) |  | ||||||
| 	} |  | ||||||
| 	candidates, err := ldcacheLocator.Locate("libcuda.so") |  | ||||||
| 	if err == nil { |  | ||||||
| 		for _, c := range candidates { |  | ||||||
| 			if match, err := filepath.Match(pattern, filepath.Base(c)); err != nil || !match { |  | ||||||
| 				l.logger.Debugf("Skipping non-matching candidate %v: %v", c, err) |  | ||||||
| 				continue |  | ||||||
| 			} |  | ||||||
| 			return []string{c}, nil |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| 	l.logger.Debugf("Could not locate %q in LDCache: Checking predefined library paths.", pattern) |  | ||||||
| 
 |  | ||||||
| 	pathLocator := lookup.NewFileLocator( |  | ||||||
| 		lookup.WithLogger(l.logger), |  | ||||||
| 		lookup.WithRoot(l.driverRoot), |  | ||||||
| 		lookup.WithSearchPaths( |  | ||||||
| 			"/usr/lib64", |  | ||||||
| 			"/usr/lib/x86_64-linux-gnu", |  | ||||||
| 			"/usr/lib/aarch64-linux-gnu", |  | ||||||
| 		), |  | ||||||
| 		lookup.WithCount(1), |  | ||||||
| 	) |  | ||||||
| 
 |  | ||||||
| 	return pathLocator.Locate(pattern) |  | ||||||
| } |  | ||||||
|  | |||||||
| @ -23,6 +23,7 @@ import ( | |||||||
| 
 | 
 | ||||||
| 	"github.com/NVIDIA/nvidia-container-toolkit/internal/discover" | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/discover" | ||||||
| 	"github.com/NVIDIA/nvidia-container-toolkit/internal/edits" | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/edits" | ||||||
|  | 	"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup/cuda" | ||||||
| 	"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" | 	"github.com/NVIDIA/nvidia-container-toolkit/pkg/nvcdi/spec" | ||||||
| 	"github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" | 	"github.com/container-orchestrated-devices/container-device-interface/pkg/cdi" | ||||||
| 	"github.com/container-orchestrated-devices/container-device-interface/specs-go" | 	"github.com/container-orchestrated-devices/container-device-interface/specs-go" | ||||||
| @ -84,12 +85,10 @@ func (m *managementlib) getCudaVersion() (string, error) { | |||||||
| 		return version, nil | 		return version, nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	l := cudaLocator{ | 	libCudaPaths, err := cuda.New( | ||||||
| 		logger:     m.logger, | 		cuda.WithLogger(m.logger), | ||||||
| 		driverRoot: m.driverRoot, | 		cuda.WithDriverRoot(m.driverRoot), | ||||||
| 	} | 	).Locate(".*.*.*") | ||||||
| 
 |  | ||||||
| 	libCudaPaths, err := l.Locate("libcuda.so.*.*.*") |  | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return "", fmt.Errorf("failed to locate libcuda.so: %v", err) | 		return "", fmt.Errorf("failed to locate libcuda.so: %v", err) | ||||||
| 	} | 	} | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user