Use Options to set FileLocator options

Signed-off-by: Evan Lezar <elezar@nvidia.com>
This commit is contained in:
Evan Lezar 2022-12-02 11:38:40 +01:00
parent bea8321205
commit 8604c255c4
9 changed files with 92 additions and 39 deletions

View File

@ -26,7 +26,10 @@ import (
func NewIPCDiscoverer(logger *logrus.Logger, root string) (discover.Discover, error) { func NewIPCDiscoverer(logger *logrus.Logger, root string) (discover.Discover, error) {
d := discover.NewMounts( d := discover.NewMounts(
logger, logger,
lookup.NewFileLocator(logger, root), lookup.NewFileLocator(
lookup.WithLogger(logger),
lookup.WithRoot(root),
),
root, root,
[]string{ []string{
"/var/run/nvidia-persistenced/socket", "/var/run/nvidia-persistenced/socket",

View File

@ -45,7 +45,10 @@ func NewGDSDiscoverer(logger *logrus.Logger, root string) (Discover, error) {
cufile := NewMounts( cufile := NewMounts(
logger, logger,
lookup.NewFileLocator(logger, root), lookup.NewFileLocator(
lookup.WithLogger(logger),
lookup.WithRoot(root),
),
root, root,
[]string{"/etc/cufile.json"}, []string{"/etc/cufile.json"},
) )

View File

@ -70,7 +70,11 @@ func NewGraphicsMountsDiscoverer(logger *logrus.Logger, root string) (Discover,
jsonMounts := NewMounts( jsonMounts := NewMounts(
logger, logger,
lookup.NewFileLocator(logger, root, "/etc", "/usr/share"), lookup.NewFileLocator(
lookup.WithLogger(logger),
lookup.WithRoot(root),
lookup.WithSearchPaths("/etc", "/usr/share"),
),
root, root,
[]string{ []string{
"glvnd/egl_vendor.d/10_nvidia.json", "glvnd/egl_vendor.d/10_nvidia.json",
@ -161,7 +165,10 @@ func (d drmDevicesByPath) getSpecificLinkArgs(devices []Device) ([]string, error
selectedDevices[filepath.Base(d.HostPath)] = true selectedDevices[filepath.Base(d.HostPath)] = true
} }
linkLocator := lookup.NewFileLocator(d.logger, d.root) linkLocator := lookup.NewFileLocator(
lookup.WithLogger(d.logger),
lookup.WithRoot(d.root),
)
candidates, err := linkLocator.Locate("/dev/dri/by-path/pci-*-*") candidates, err := linkLocator.Locate("/dev/dri/by-path/pci-*-*")
if err != nil { if err != nil {
d.logger.Warningf("Failed to locate by-path links: %v; ignoring", err) d.logger.Warningf("Failed to locate by-path links: %v; ignoring", err)

View File

@ -30,13 +30,12 @@ const (
// NewCharDeviceLocator creates a Locator that can be used to find char devices at the specified root. A logger is // NewCharDeviceLocator creates a Locator that can be used to find char devices at the specified root. A logger is
// also specified. // also specified.
func NewCharDeviceLocator(logger *logrus.Logger, root string) Locator { func NewCharDeviceLocator(logger *logrus.Logger, root string) Locator {
l := file{ return NewFileLocator(
logger: logger, WithLogger(logger),
prefixes: getSearchPrefixes(root, "", devRoot), WithRoot(root),
filter: assertCharDevice, WithSearchPaths("", devRoot),
} WithFilter(assertCharDevice),
)
return &l
} }
// assertCharDevice checks whether the specified path is a char device and returns an error if this is not the case. // assertCharDevice checks whether the specified path is a char device and returns an error if this is not the case.

View File

@ -26,13 +26,11 @@ import (
// NewDirectoryLocator creates a Locator that can be used to find directories at the specified root. A logger // NewDirectoryLocator creates a Locator that can be used to find directories at the specified root. A logger
// is also specified. // is also specified.
func NewDirectoryLocator(logger *log.Logger, root string) Locator { func NewDirectoryLocator(logger *log.Logger, root string) Locator {
l := file{ return NewFileLocator(
logger: logger, WithLogger(logger),
prefixes: getSearchPrefixes(root), WithRoot(root),
filter: assertDirectory, WithFilter(assertDirectory),
} )
return &l
} }
// assertDirectory checks wither the specified path is a directory. // assertDirectory checks wither the specified path is a directory.

View File

@ -36,12 +36,15 @@ func NewExecutableLocator(logger *log.Logger, root string) Locator {
} }
func newExecutableLocator(logger *log.Logger, root string, paths ...string) *executable { func newExecutableLocator(logger *log.Logger, root string, paths ...string) *executable {
f := newFileLocator(
WithLogger(logger),
WithRoot(root),
WithSearchPaths(paths...),
WithFilter(assertExecutable),
)
l := executable{ l := executable{
file: file{ file: *f,
logger: logger,
prefixes: getSearchPrefixes(root, paths...),
filter: assertExecutable,
},
} }
return &l return &l

View File

@ -28,31 +28,69 @@ import (
// prefixes. The validity of a file is determined by a filter function. // prefixes. The validity of a file is determined by a filter function.
type file struct { type file struct {
logger *log.Logger logger *log.Logger
root string
prefixes []string prefixes []string
filter func(string) error filter func(string) error
} }
// NewFileLocator creates a Locator that can be used to find files at the specified root. // Option defines a function for passing options to the NewFileLocator() call
// An optional list of prefixes can aslo be specified with each of these being searched in order. type Option func(*file)
// The specified root is prefixed to each of the prefixes to determine the final search path.
func NewFileLocator(logger *log.Logger, root string, prefixes ...string) Locator {
l := newFileLocator(logger, root, prefixes...)
return &l // WithRoot sets the root for the file locator
func WithRoot(root string) Option {
return func(f *file) {
f.root = root
}
} }
func newFileLocator(logger *log.Logger, root string, prefixes ...string) file { // WithLogger sets the logger for the file locator
func WithLogger(logger *log.Logger) Option {
return file{ return func(f *file) {
logger: logger, f.logger = logger
prefixes: getSearchPrefixes(root, prefixes...),
filter: assertFile,
} }
} }
// WithSearchPaths sets the search paths for the file locator.
func WithSearchPaths(paths ...string) Option {
return func(f *file) {
f.prefixes = paths
}
}
// WithFilter sets the filter for the file locator
// The filter is called for each candidate file and candidates that return nil are considered.
func WithFilter(assert func(string) error) Option {
return func(f *file) {
f.filter = assert
}
}
// NewFileLocator creates a Locator that can be used to find files with the specified options.
func NewFileLocator(opts ...Option) Locator {
return newFileLocator(opts...)
}
func newFileLocator(opts ...Option) *file {
f := &file{}
for _, opt := range opts {
opt(f)
}
if f.logger == nil {
f.logger = log.StandardLogger()
}
if f.filter == nil {
f.filter = assertFile
}
// Since the `Locate` implementations rely on the root already being specified we update
// the prefixes to include the root.
f.prefixes = getSearchPrefixes(f.root, f.prefixes...)
return f
}
// getSearchPrefixes generates a list of unique paths to be searched by a file locator. // getSearchPrefixes generates a list of unique paths to be searched by a file locator.
// //
// For each of the unique prefixes <p> specified the path <root><p> is searched, where <root> is the // For each of the unique prefixes <p> specified, the path <root><p> is searched, where <root> is the
// specified root. If no prefixes are specified, <root> is returned as the only search prefix. // specified root. If no prefixes are specified, <root> is returned as the only search prefix.
// //
// Note that an empty root is equivalent to searching relative to the current working directory, and // Note that an empty root is equivalent to searching relative to the current working directory, and

View File

@ -35,8 +35,9 @@ type symlink struct {
// NewSymlinkChainLocator creats a locator that can be used for locating files through symlinks. // NewSymlinkChainLocator creats a locator that can be used for locating files through symlinks.
// A logger can also be specified. // A logger can also be specified.
func NewSymlinkChainLocator(logger *logrus.Logger, root string) Locator { func NewSymlinkChainLocator(logger *logrus.Logger, root string) Locator {
f := newFileLocator(WithLogger(logger), WithRoot(root))
l := symlinkChain{ l := symlinkChain{
file: newFileLocator(logger, root), file: *f,
} }
return &l return &l
@ -45,8 +46,9 @@ func NewSymlinkChainLocator(logger *logrus.Logger, root string) Locator {
// NewSymlinkLocator creats a locator that can be used for locating files through symlinks. // NewSymlinkLocator creats a locator that can be used for locating files through symlinks.
// A logger can also be specified. // A logger can also be specified.
func NewSymlinkLocator(logger *logrus.Logger, root string) Locator { func NewSymlinkLocator(logger *logrus.Logger, root string) Locator {
f := newFileLocator(WithLogger(logger), WithRoot(root))
l := symlink{ l := symlink{
file: newFileLocator(logger, root), file: *f,
} }
return &l return &l

View File

@ -33,7 +33,7 @@ func NewTegraPlatformFiles(logger *logrus.Logger) (oci.SpecModifier, error) {
tegraSystemMounts := discover.NewMounts( tegraSystemMounts := discover.NewMounts(
logger, logger,
lookup.NewFileLocator(logger, ""), lookup.NewFileLocator(lookup.WithLogger(logger)),
"", "",
[]string{ []string{
"/etc/nv_tegra_release", "/etc/nv_tegra_release",