Skip to content

Commit 629a689

Browse files
author
Evan Lezar
committed
Merge branch 'fix-relative-files' into 'main'
Fix adjusting relative paths for containerised devices and mounts. See merge request nvidia/container-toolkit/container-toolkit!193
2 parents bcdef81 + 34e80ab commit 629a689

File tree

8 files changed

+87
-68
lines changed

8 files changed

+87
-68
lines changed

internal/discover/char_devices.go

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,14 @@ var _ Discover = (*charDevices)(nil)
3030
func NewCharDeviceDiscoverer(logger *logrus.Logger, devices []string, root string) Discover {
3131
locator := lookup.NewCharDeviceLocator(logger, root)
3232

33-
return NewDeviceDiscoverer(logger, locator, devices)
33+
return NewDeviceDiscoverer(logger, locator, root, devices)
3434
}
3535

3636
// NewDeviceDiscoverer creates a discoverer which locates the specified set of device nodes using the specified locator.
37-
func NewDeviceDiscoverer(logger *logrus.Logger, locator lookup.Locator, devices []string) Discover {
38-
return &charDevices{
39-
logger: logger,
40-
lookup: locator,
41-
required: devices,
42-
}
37+
func NewDeviceDiscoverer(logger *logrus.Logger, locator lookup.Locator, root string, devices []string) Discover {
38+
m := NewMounts(logger, locator, root, devices).(*mounts)
39+
40+
return (*charDevices)(m)
4341
}
4442

4543
// Mounts returns the discovered mounts for the charDevices.

internal/discover/csv.go

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ func NewFromCSVFiles(logger *logrus.Logger, files []string, root string) (Discov
5252
mountSpecs = append(mountSpecs, targets...)
5353
}
5454

55-
return newFromMountSpecs(logger, locators, mountSpecs)
55+
return newFromMountSpecs(logger, locators, root, mountSpecs)
5656
}
5757

5858
// loadCSVFile loads the specified CSV file and returns the list of mount specs
@@ -71,7 +71,7 @@ func loadCSVFile(logger *logrus.Logger, filename string) ([]*csv.MountSpec, erro
7171

7272
// newFromMountSpecs creates a discoverer for the CSV file. A logger is also supplied.
7373
// A list of csvDiscoverers is returned, with each being associated with a single MountSpecType.
74-
func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, targets []*csv.MountSpec) (Discover, error) {
74+
func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]lookup.Locator, root string, targets []*csv.MountSpec) (Discover, error) {
7575
if len(targets) == 0 {
7676
return &None{}, nil
7777
}
@@ -95,13 +95,9 @@ func newFromMountSpecs(logger *logrus.Logger, locators map[csv.MountSpecType]loo
9595
var m Discover
9696
switch t {
9797
case csv.MountSpecDev:
98-
m = NewDeviceDiscoverer(logger, locator, candidatesByType[t])
98+
m = NewDeviceDiscoverer(logger, locator, root, candidatesByType[t])
9999
default:
100-
m = &mounts{
101-
logger: logger,
102-
lookup: locator,
103-
required: candidatesByType[t],
104-
}
100+
m = NewMounts(logger, locator, root, candidatesByType[t])
105101
}
106102
discoverers = append(discoverers, m)
107103

internal/discover/csv_test.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ func TestNewFromMountSpec(t *testing.T) {
3636

3737
testCases := []struct {
3838
description string
39+
root string
3940
targets []*csv.MountSpec
4041
expectedError error
4142
expectedDiscoverer Discover
@@ -76,12 +77,50 @@ func TestNewFromMountSpec(t *testing.T) {
7677
&mounts{
7778
logger: logger,
7879
lookup: locators["dev"],
80+
root: "/",
7981
required: []string{"dev0", "dev1"},
8082
},
8183
),
8284
&mounts{
8385
logger: logger,
8486
lookup: locators["lib"],
87+
root: "/",
88+
required: []string{"lib0"},
89+
},
90+
},
91+
},
92+
},
93+
{
94+
description: "sets root",
95+
targets: []*csv.MountSpec{
96+
{
97+
Type: "dev",
98+
Path: "dev0",
99+
},
100+
{
101+
Type: "lib",
102+
Path: "lib0",
103+
},
104+
{
105+
Type: "dev",
106+
Path: "dev1",
107+
},
108+
},
109+
root: "/some/root",
110+
expectedDiscoverer: &list{
111+
discoverers: []Discover{
112+
(*charDevices)(
113+
&mounts{
114+
logger: logger,
115+
lookup: locators["dev"],
116+
root: "/some/root",
117+
required: []string{"dev0", "dev1"},
118+
},
119+
),
120+
&mounts{
121+
logger: logger,
122+
lookup: locators["lib"],
123+
root: "/some/root",
85124
required: []string{"lib0"},
86125
},
87126
},
@@ -91,7 +130,7 @@ func TestNewFromMountSpec(t *testing.T) {
91130

92131
for _, tc := range testCases {
93132
t.Run(tc.description, func(t *testing.T) {
94-
discoverer, err := newFromMountSpecs(logger, locators, tc.targets)
133+
discoverer, err := newFromMountSpecs(logger, locators, tc.root, tc.targets)
95134
if tc.expectedError != nil {
96135
require.Error(t, err)
97136
return

internal/discover/gds.go

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,19 @@ func NewGDSDiscoverer(logger *logrus.Logger, root string) (Discover, error) {
3636
root,
3737
)
3838

39-
udev := &mounts{
40-
logger: logger,
41-
lookup: lookup.NewDirectoryLocator(logger, root),
42-
required: []string{"/run/udev"},
43-
}
39+
udev := NewMounts(
40+
logger,
41+
lookup.NewDirectoryLocator(logger, root),
42+
root,
43+
[]string{"/run/udev"},
44+
)
4445

45-
cufile := &mounts{
46-
logger: logger,
47-
lookup: lookup.NewFileLocator(logger, root),
48-
required: []string{"/etc/cufile.json"},
49-
}
46+
cufile := NewMounts(
47+
logger,
48+
lookup.NewFileLocator(logger, root),
49+
root,
50+
[]string{"/etc/cufile.json"},
51+
)
5052

5153
d := gdsDeviceDiscoverer{
5254
logger: logger,

internal/discover/mounts.go

Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ package discover
1818

1919
import (
2020
"fmt"
21+
"path/filepath"
22+
"strings"
2123
"sync"
2224

2325
"github.com/NVIDIA/nvidia-container-toolkit/internal/lookup"
@@ -31,13 +33,24 @@ type mounts struct {
3133
None
3234
logger *logrus.Logger
3335
lookup lookup.Locator
36+
root string
3437
required []string
3538
sync.Mutex
3639
cache []Mount
3740
}
3841

3942
var _ Discover = (*mounts)(nil)
4043

44+
// NewMounts creates a discoverer for the required mounts using the specified locator.
45+
func NewMounts(logger *logrus.Logger, lookup lookup.Locator, root string, required []string) Discover {
46+
return &mounts{
47+
logger: logger,
48+
lookup: lookup,
49+
root: filepath.Join("/", root),
50+
required: required,
51+
}
52+
}
53+
4154
func (d *mounts) Mounts() ([]Mount, error) {
4255
if d.lookup == nil {
4356
return nil, fmt.Errorf("no lookup defined")
@@ -71,11 +84,7 @@ func (d *mounts) Mounts() ([]Mount, error) {
7184
continue
7285
}
7386

74-
r, err := d.lookup.Relative(p)
75-
if err != nil {
76-
d.logger.Warnf("Failed to get relative path of %v: %v", p, err)
77-
continue
78-
}
87+
r := d.relativeTo(p)
7988
if r == "" {
8089
r = p
8190
}
@@ -97,3 +106,12 @@ func (d *mounts) Mounts() ([]Mount, error) {
97106

98107
return d.cache, nil
99108
}
109+
110+
// relativeTo returns the path relative to the root for the file locator
111+
func (d *mounts) relativeTo(path string) string {
112+
if d.root == "/" {
113+
return path
114+
}
115+
116+
return strings.TrimPrefix(path, d.root)
117+
}

internal/discover/mounts_test.go

Lines changed: 3 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -140,37 +140,14 @@ func TestMounts(t *testing.T) {
140140
input: &mounts{
141141
lookup: &lookup.LocatorMock{
142142
LocateFunc: func(s string) ([]string, error) {
143-
return []string{"located"}, nil
144-
},
145-
RelativeFunc: func(s string) (string, error) {
146-
return "relative", nil
143+
return []string{"/some/root/located"}, nil
147144
},
148145
},
146+
root: "/some/root",
149147
required: []string{"required0", "multiple", "required1"},
150148
},
151149
expectedMounts: []Mount{
152-
{Path: "relative", HostPath: "located"},
153-
},
154-
},
155-
{
156-
description: "mounts skips relative error",
157-
input: &mounts{
158-
lookup: &lookup.LocatorMock{
159-
LocateFunc: func(s string) ([]string, error) {
160-
return []string{s}, nil
161-
},
162-
RelativeFunc: func(s string) (string, error) {
163-
if s == "error" {
164-
return "", fmt.Errorf("no relative path")
165-
}
166-
return "relative" + s, nil
167-
},
168-
},
169-
required: []string{"required0", "error", "required1"},
170-
},
171-
expectedMounts: []Mount{
172-
{Path: "relativerequired0", HostPath: "required0"},
173-
{Path: "relativerequired1", HostPath: "required1"},
150+
{Path: "/located", HostPath: "/some/root/located"},
174151
},
175152
},
176153
}

internal/lookup/file.go

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ import (
2828
// prefixes. The validity of a file is determined by a filter function.
2929
type file struct {
3030
logger *log.Logger
31-
root string
3231
prefixes []string
3332
filter func(string) error
3433
}
@@ -78,15 +77,6 @@ func (p file) Locate(pattern string) ([]string, error) {
7877
return filenames, nil
7978
}
8079

81-
// Relative returns the path relative to the root for the file locator
82-
func (p file) Relative(path string) (string, error) {
83-
if p.root == "" || p.root == "/" {
84-
return path, nil
85-
}
86-
87-
return filepath.Rel(p.root, path)
88-
}
89-
9080
// assertFile checks whether the specified path is a regular file
9181
func assertFile(filename string) error {
9282
info, err := os.Stat(filename)

internal/lookup/locator.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,4 @@ package lookup
2121
// Locator defines the interface for locating files on a system.
2222
type Locator interface {
2323
Locate(string) ([]string, error)
24-
Relative(string) (string, error)
2524
}

0 commit comments

Comments
 (0)