Add support for NVIDIA_REQUIRE_JETPACK envvar

This change ensures that by default, the CSV discovery only considers the base CSV
files (l4t.csv, drivers.csv, devices.csv) and skips the rest unless the
NVIDIA_REQUIRE_JETPACK is set to "csv-mounts=all", in which case, all CSV files in the
specified folder are considered.

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar 2022-03-15 14:17:49 +02:00
parent 1c05a463bd
commit 6682bc90b4
3 changed files with 46 additions and 3 deletions

View File

@ -68,7 +68,17 @@ func NewExperimentalModifier(logger *logrus.Logger, cfg *config.Config, ociSpec
} }
d = legacyDiscoverer d = legacyDiscoverer
case "csv": case "csv":
csvDiscoverer, err := discover.NewFromCSV(logger, csv.DefaultRoot, "") csvFiles, err := csv.GetFileList(csv.DefaultRoot)
if err != nil {
return nil, fmt.Errorf("failed to get list of CSV files: %v", err)
}
nvidiaRequireJetpack, _ := ociSpec.LookupEnv(nvidiaRequireJetpackEnvvar)
if nvidiaRequireJetpack != "csv-mounts=all" {
csvFiles = csv.BaseFilesOnly(csvFiles)
}
csvDiscoverer, err := discover.NewFromCSVFiles(logger, csvFiles, root)
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to create CSV discoverer: %v", err) return nil, fmt.Errorf("failed to create CSV discoverer: %v", err)
} }

View File

@ -40,8 +40,15 @@ func NewFromCSV(logger *logrus.Logger, csvRoot string, root string) (Discover, e
if err != nil { if err != nil {
return nil, fmt.Errorf("failed to get CSV file from %v: %v", csvRoot, err) return nil, fmt.Errorf("failed to get CSV file from %v: %v", csvRoot, err)
} }
return NewFromCSVFiles(logger, files, root)
}
// NewFromCSVFiles creates a discoverer for the specified CSV files. A logger is also supplied.
// The constructed discoverer is comprised of a list, with each element in the list being associated with a
// single CSV files.
func NewFromCSVFiles(logger *logrus.Logger, files []string, root string) (Discover, error) {
if len(files) == 0 { if len(files) == 0 {
logger.Warnf("No CSV files found in %v", csvRoot) logger.Warnf("No CSV files specified")
return None{}, nil return None{}, nil
} }
@ -66,7 +73,9 @@ func NewFromCSV(logger *logrus.Logger, csvRoot string, root string) (Discover, e
return &list{discoverers: discoverers}, nil return &list{discoverers: discoverers}, nil
} }
// NewFromCSVFile creates a discoverer for the CSV file. A logger is also supplied. // NewFromCSVFile creates a discoverer for the specified CSV file. A logger is also supplied.
// The constructed discoverer is comprised of a list, with each element in the list being associated with a particular
// MountSpecType.
func NewFromCSVFile(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, filename string) (Discover, error) { func NewFromCSVFile(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, filename string) (Discover, error) {
// Create a discoverer for each file-kind combination // Create a discoverer for each file-kind combination
targets, err := csv.ParseFile(logger, filename) targets, err := csv.ParseFile(logger, filename)
@ -91,6 +100,7 @@ func NewFromCSVFile(logger *logrus.Logger, locators map[csv.MountSpecType]lookup
} }
// newFromMountSpecs creates a discoverer for the CSV file. A logger is also supplied. // newFromMountSpecs creates a discoverer for the CSV file. A logger is also supplied.
// A list of csvDiscoverers is returned, with each being associated with a single MountSpecType.
func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, targets []*csv.MountSpec) ([]*csvDiscoverer, error) { func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, targets []*csv.MountSpec) ([]*csvDiscoverer, error) {
var discoverers []*csvDiscoverer var discoverers []*csvDiscoverer
candidatesByType := make(map[csv.MountSpecType][]string) candidatesByType := make(map[csv.MountSpecType][]string)
@ -117,6 +127,8 @@ func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]loo
return discoverers, nil return discoverers, nil
} }
// Mounts returns the discovered mounts for the csvDiscoverer.
// Note that if the discoverer is for the device MountSpecType, the list of mounts is empty.
func (d csvDiscoverer) Mounts() ([]Mount, error) { func (d csvDiscoverer) Mounts() ([]Mount, error) {
if d.mountType == csv.MountSpecDev { if d.mountType == csv.MountSpecDev {
return d.None.Mounts() return d.None.Mounts()
@ -125,6 +137,8 @@ func (d csvDiscoverer) Mounts() ([]Mount, error) {
return d.mounts.Mounts() return d.mounts.Mounts()
} }
// Devices returns the discovered devices for the csvDiscoverer.
// Note that if the discoverer is not for the device MountSpecType, the list of devices is empty.
func (d csvDiscoverer) Devices() ([]Device, error) { func (d csvDiscoverer) Devices() ([]Device, error) {
if d.mountType != csv.MountSpecDev { if d.mountType != csv.MountSpecDev {
return d.None.Devices() return d.None.Devices()

View File

@ -62,6 +62,25 @@ func GetFileList(root string) ([]string, error) {
return csvFilePaths, nil return csvFilePaths, nil
} }
// BaseFilesOnly filters out non-base CSV files from the list of CSV files.
func BaseFilesOnly(filenames []string) []string {
filter := map[string]bool{
"l4t.csv": true,
"drivers.csv": true,
"devices.csv": true,
}
var selected []string
for _, file := range filenames {
base := filepath.Base(file)
if filter[base] {
selected = append(selected, file)
}
}
return selected
}
// ParseFile parses the specified file and returns a list of required jetson mounts // ParseFile parses the specified file and returns a list of required jetson mounts
func ParseFile(logger *logrus.Logger, filename string) ([]*MountSpec, error) { func ParseFile(logger *logrus.Logger, filename string) ([]*MountSpec, error) {
csvFile, err := os.Open(filename) csvFile, err := os.Open(filename)