Skip to content

Commit b70af11

Browse files
committed
store: drop rootless from arguments
drop the rootless argument from DefaultStoreOptions and UpdateStoreOptions since this can be retrieved internally through the unshare package. Signed-off-by: Giuseppe Scrivano <[email protected]>
1 parent c72a594 commit b70af11

File tree

8 files changed

+66
-61
lines changed

8 files changed

+66
-61
lines changed

cmd/containers-storage/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func main() {
7373
os.Exit(1)
7474
}
7575
if options.GraphRoot == "" && options.RunRoot == "" && options.GraphDriverName == "" && len(options.GraphDriverOptions) == 0 {
76-
options, _ = types.DefaultStoreOptionsAutoDetectUID()
76+
options, _ = types.DefaultStoreOptions()
7777
}
7878
args := flags.Args()
7979
if len(args) < 1 {

pkg/chunked/storage_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ func convertTarToZstdChunked(destDirectory string, blobSize int64, iss ImageSour
254254

255255
// GetDiffer returns a differ than can be used with ApplyDiffWithDiffer.
256256
func GetDiffer(ctx context.Context, store storage.Store, blobSize int64, annotations map[string]string, iss ImageSourceSeekable) (graphdriver.Differ, error) {
257-
storeOpts, err := types.DefaultStoreOptionsAutoDetectUID()
257+
storeOpts, err := types.DefaultStoreOptions()
258258
if err != nil {
259259
return nil, err
260260
}

store.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3545,8 +3545,8 @@ func SetDefaultConfigFilePath(path string) {
35453545
}
35463546

35473547
// DefaultConfigFile returns the path to the storage config file used
3548-
func DefaultConfigFile(rootless bool) (string, error) {
3549-
return types.DefaultConfigFile(rootless)
3548+
func DefaultConfigFile() (string, error) {
3549+
return types.DefaultConfigFile()
35503550
}
35513551

35523552
// ReloadConfigurationFile parses the specified configuration file and overrides

types/options.go

Lines changed: 39 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ func loadDefaultStoreOptions() {
8989

9090
_, err := os.Stat(defaultOverrideConfigFile)
9191
if err == nil {
92-
// The DefaultConfigFile(rootless) function returns the path
92+
// The DefaultConfigFile() function returns the path
9393
// of the used storage.conf file, by returning defaultConfigFile
9494
// If override exists containers/storage uses it by default.
9595
defaultConfigFile = defaultOverrideConfigFile
@@ -111,21 +111,41 @@ func loadDefaultStoreOptions() {
111111
setDefaults()
112112
}
113113

114-
// defaultStoreOptionsIsolated is an internal implementation detail of DefaultStoreOptions to allow testing.
115-
// Everyone but the tests this is intended for should only call DefaultStoreOptions, never this function.
116-
func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf string) (StoreOptions, error) {
114+
// loadStoreOptions returns the default storage ops for containers
115+
func loadStoreOptions() (StoreOptions, error) {
116+
storageConf, err := DefaultConfigFile()
117+
if err != nil {
118+
return defaultStoreOptions, err
119+
}
120+
return loadStoreOptionsFromConfFile(storageConf)
121+
}
122+
123+
// usePerUserStorage returns whether the user private storage must be used.
124+
// We cannot simply use the unshare.IsRootless() condition, because
125+
// that checks only if the current process needs a user namespace to
126+
// work and it would break cases where the process is already created
127+
// in a user namespace (e.g. nested Podman/Buildah) and the desired
128+
// behavior is to use system paths instead of user private paths.
129+
func usePerUserStorage() bool {
130+
return unshare.IsRootless() && unshare.GetRootlessUID() != 0
131+
}
132+
133+
// loadStoreOptionsFromConfFile is an internal implementation detail of DefaultStoreOptions to allow testing.
134+
// Everyone but the tests this is intended for should only call loadStoreOptions, never this function.
135+
func loadStoreOptionsFromConfFile(storageConf string) (StoreOptions, error) {
117136
var (
118137
defaultRootlessRunRoot string
119138
defaultRootlessGraphRoot string
120139
err error
121140
)
141+
122142
defaultStoreOptionsOnce.Do(loadDefaultStoreOptions)
123143
if loadDefaultStoreOptionsErr != nil {
124144
return StoreOptions{}, loadDefaultStoreOptionsErr
125145
}
126146
storageOpts := defaultStoreOptions
127-
if rootless && rootlessUID != 0 {
128-
storageOpts, err = getRootlessStorageOpts(rootlessUID, storageOpts)
147+
if usePerUserStorage() {
148+
storageOpts, err = getRootlessStorageOpts(storageOpts)
129149
if err != nil {
130150
return storageOpts, err
131151
}
@@ -139,7 +159,7 @@ func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf str
139159
defaultRootlessGraphRoot = storageOpts.GraphRoot
140160
storageOpts = StoreOptions{}
141161
reloadConfigurationFileIfNeeded(storageConf, &storageOpts)
142-
if rootless && rootlessUID != 0 {
162+
if usePerUserStorage() {
143163
// If the file did not specify a graphroot or runroot,
144164
// set sane defaults so we don't try and use root-owned
145165
// directories
@@ -158,6 +178,7 @@ func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf str
158178
if storageOpts.RunRoot == "" {
159179
return storageOpts, fmt.Errorf("runroot must be set")
160180
}
181+
rootlessUID := unshare.GetRootlessUID()
161182
runRoot, err := expandEnvPath(storageOpts.RunRoot, rootlessUID)
162183
if err != nil {
163184
return storageOpts, err
@@ -188,26 +209,17 @@ func defaultStoreOptionsIsolated(rootless bool, rootlessUID int, storageConf str
188209
return storageOpts, nil
189210
}
190211

191-
// loadStoreOptions returns the default storage ops for containers
192-
func loadStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) {
193-
storageConf, err := DefaultConfigFile(rootless && rootlessUID != 0)
194-
if err != nil {
195-
return defaultStoreOptions, err
196-
}
197-
return defaultStoreOptionsIsolated(rootless, rootlessUID, storageConf)
198-
}
199-
200212
// UpdateOptions should be called iff container engine received a SIGHUP,
201213
// otherwise use DefaultStoreOptions
202-
func UpdateStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) {
203-
storeOptions, storeError = loadStoreOptions(rootless, rootlessUID)
214+
func UpdateStoreOptions() (StoreOptions, error) {
215+
storeOptions, storeError = loadStoreOptions()
204216
return storeOptions, storeError
205217
}
206218

207219
// DefaultStoreOptions returns the default storage ops for containers
208-
func DefaultStoreOptions(rootless bool, rootlessUID int) (StoreOptions, error) {
220+
func DefaultStoreOptions() (StoreOptions, error) {
209221
once.Do(func() {
210-
storeOptions, storeError = loadStoreOptions(rootless, rootlessUID)
222+
storeOptions, storeError = loadStoreOptions()
211223
})
212224
return storeOptions, storeError
213225
}
@@ -272,9 +284,11 @@ func isRootlessDriver(driver string) bool {
272284
}
273285

274286
// getRootlessStorageOpts returns the storage opts for containers running as non root
275-
func getRootlessStorageOpts(rootlessUID int, systemOpts StoreOptions) (StoreOptions, error) {
287+
func getRootlessStorageOpts(systemOpts StoreOptions) (StoreOptions, error) {
276288
var opts StoreOptions
277289

290+
rootlessUID := unshare.GetRootlessUID()
291+
278292
dataDir, err := homedir.GetDataHome()
279293
if err != nil {
280294
return opts, err
@@ -355,12 +369,6 @@ func getRootlessStorageOpts(rootlessUID int, systemOpts StoreOptions) (StoreOpti
355369
return opts, nil
356370
}
357371

358-
// DefaultStoreOptionsAutoDetectUID returns the default storage ops for containers
359-
func DefaultStoreOptionsAutoDetectUID() (StoreOptions, error) {
360-
uid := unshare.GetRootlessUID()
361-
return DefaultStoreOptions(uid != 0, uid)
362-
}
363-
364372
var prevReloadConfig = struct {
365373
storeOptions *StoreOptions
366374
mod time.Time
@@ -530,8 +538,8 @@ func Options() (StoreOptions, error) {
530538
}
531539

532540
// Save overwrites the tomlConfig in storage.conf with the given conf
533-
func Save(conf TomlConfig, rootless bool) error {
534-
configFile, err := DefaultConfigFile(rootless)
541+
func Save(conf TomlConfig) error {
542+
configFile, err := DefaultConfigFile()
535543
if err != nil {
536544
return err
537545
}
@@ -549,10 +557,10 @@ func Save(conf TomlConfig, rootless bool) error {
549557
}
550558

551559
// StorageConfig is used to retrieve the storage.conf toml in order to overwrite it
552-
func StorageConfig(rootless bool) (*TomlConfig, error) {
560+
func StorageConfig() (*TomlConfig, error) {
553561
config := new(TomlConfig)
554562

555-
configFile, err := DefaultConfigFile(rootless)
563+
configFile, err := DefaultConfigFile()
556564
if err != nil {
557565
return nil, err
558566
}

types/options_test.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"testing"
1111

1212
"github.com/containers/storage/pkg/idtools"
13+
"github.com/containers/storage/pkg/unshare"
1314
"github.com/sirupsen/logrus"
1415
"github.com/stretchr/testify/require"
1516
"gotest.tools/assert"
@@ -32,7 +33,7 @@ func TestGetRootlessStorageOpts(t *testing.T) {
3233

3334
systemOpts.GraphRoot = home
3435
systemOpts.RunRoot = runhome
35-
storageOpts, err := getRootlessStorageOpts(os.Geteuid(), systemOpts)
36+
storageOpts, err := getRootlessStorageOpts(systemOpts)
3637

3738
assert.NilError(t, err)
3839
expectedDriver := vfsDriver
@@ -45,55 +46,55 @@ func TestGetRootlessStorageOpts(t *testing.T) {
4546
t.Run("systemDriver=btrfs", func(t *testing.T) {
4647
systemOpts := StoreOptions{}
4748
systemOpts.GraphDriverName = "btrfs"
48-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
49+
storageOpts, err := getRootlessStorageOpts(systemOpts)
4950
assert.NilError(t, err)
5051
assert.Equal(t, storageOpts.GraphDriverName, "btrfs")
5152
})
5253

5354
t.Run("systemDriver=overlay", func(t *testing.T) {
5455
systemOpts := StoreOptions{}
5556
systemOpts.GraphDriverName = overlayDriver
56-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
57+
storageOpts, err := getRootlessStorageOpts(systemOpts)
5758
assert.NilError(t, err)
5859
assert.Equal(t, storageOpts.GraphDriverName, overlayDriver)
5960
})
6061

6162
t.Run("systemDriver=overlay2", func(t *testing.T) {
6263
systemOpts := StoreOptions{}
6364
systemOpts.GraphDriverName = "overlay2"
64-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
65+
storageOpts, err := getRootlessStorageOpts(systemOpts)
6566
assert.NilError(t, err)
6667
assert.Equal(t, storageOpts.GraphDriverName, overlayDriver)
6768
})
6869

6970
t.Run("systemDriver=vfs", func(t *testing.T) {
7071
systemOpts := StoreOptions{}
7172
systemOpts.GraphDriverName = vfsDriver
72-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
73+
storageOpts, err := getRootlessStorageOpts(systemOpts)
7374
assert.NilError(t, err)
7475
assert.Equal(t, storageOpts.GraphDriverName, vfsDriver)
7576
})
7677

7778
t.Run("systemDriver=aufs", func(t *testing.T) {
7879
systemOpts := StoreOptions{}
7980
systemOpts.GraphDriverName = "aufs"
80-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
81+
storageOpts, err := getRootlessStorageOpts(systemOpts)
8182
assert.NilError(t, err)
8283
assert.Assert(t, storageOpts.GraphDriverName == overlayDriver || storageOpts.GraphDriverName == vfsDriver, fmt.Sprintf("The rootless driver should be set to 'overlay' or 'vfs' not '%v'", storageOpts.GraphDriverName))
8384
})
8485

8586
t.Run("systemDriver=devmapper", func(t *testing.T) {
8687
systemOpts := StoreOptions{}
8788
systemOpts.GraphDriverName = "devmapper"
88-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
89+
storageOpts, err := getRootlessStorageOpts(systemOpts)
8990
assert.NilError(t, err)
9091
assert.Assert(t, storageOpts.GraphDriverName == overlayDriver || storageOpts.GraphDriverName == vfsDriver, fmt.Sprintf("The rootless driver should be set to 'overlay' or 'vfs' not '%v'", storageOpts.GraphDriverName))
9192
})
9293

9394
t.Run("systemDriver=zfs", func(t *testing.T) {
9495
systemOpts := StoreOptions{}
9596
systemOpts.GraphDriverName = "zfs"
96-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
97+
storageOpts, err := getRootlessStorageOpts(systemOpts)
9798
assert.NilError(t, err)
9899
assert.Assert(t, storageOpts.GraphDriverName == overlayDriver || storageOpts.GraphDriverName == vfsDriver, fmt.Sprintf("The rootless driver should be set to 'overlay' or 'vfs' not '%v'", storageOpts.GraphDriverName))
99100
})
@@ -102,7 +103,7 @@ func TestGetRootlessStorageOpts(t *testing.T) {
102103
t.Setenv("STORAGE_DRIVER", "btrfs")
103104
systemOpts := StoreOptions{}
104105
systemOpts.GraphDriverName = vfsDriver
105-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
106+
storageOpts, err := getRootlessStorageOpts(systemOpts)
106107
assert.NilError(t, err)
107108
assert.Equal(t, storageOpts.GraphDriverName, "btrfs")
108109
})
@@ -111,7 +112,7 @@ func TestGetRootlessStorageOpts(t *testing.T) {
111112
t.Setenv("STORAGE_DRIVER", "zfs")
112113
systemOpts := StoreOptions{}
113114
systemOpts.GraphDriverName = vfsDriver
114-
storageOpts, err := getRootlessStorageOpts(1000, systemOpts)
115+
storageOpts, err := getRootlessStorageOpts(systemOpts)
115116
assert.NilError(t, err)
116117
assert.Equal(t, storageOpts.GraphDriverName, "zfs")
117118
})
@@ -127,8 +128,8 @@ func TestGetRootlessStorageOpts2(t *testing.T) {
127128
opts := StoreOptions{
128129
RootlessStoragePath: "/$HOME/$UID/containers/storage",
129130
}
130-
expectedPath := filepath.Join(os.Getenv("HOME"), "2000", "containers/storage")
131-
storageOpts, err := getRootlessStorageOpts(2000, opts)
131+
expectedPath := filepath.Join(os.Getenv("HOME"), fmt.Sprintf("%d", unshare.GetRootlessUID()), "containers/storage")
132+
storageOpts, err := getRootlessStorageOpts(opts)
132133
assert.NilError(t, err)
133134
assert.Equal(t, storageOpts.GraphRoot, expectedPath)
134135
}

types/utils.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,15 @@ func expandEnvPath(path string, rootlessUID int) (string, error) {
2222
return newpath, nil
2323
}
2424

25-
func DefaultConfigFile(rootless bool) (string, error) {
25+
func DefaultConfigFile() (string, error) {
2626
if defaultConfigFileSet {
2727
return defaultConfigFile, nil
2828
}
2929

3030
if path, ok := os.LookupEnv(storageConfEnv); ok {
3131
return path, nil
3232
}
33-
if !rootless {
33+
if !usePerUserStorage() {
3434
if _, err := os.Stat(defaultOverrideConfigFile); err == nil {
3535
return defaultOverrideConfigFile, nil
3636
}

types/utils_test.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
package types
22

33
import (
4+
"fmt"
45
"os"
56
"path/filepath"
67
"testing"
78

9+
"github.com/containers/storage/pkg/unshare"
810
"gotest.tools/assert"
911
)
1012

1113
func TestDefaultStoreOpts(t *testing.T) {
12-
storageOpts, err := defaultStoreOptionsIsolated(true, 1000, "./storage_test.conf")
13-
14-
expectedPath := filepath.Join(os.Getenv("HOME"), "1000", "containers/storage")
14+
storageOpts, err := loadStoreOptionsFromConfFile("./storage_test.conf")
15+
expectedPath := filepath.Join(os.Getenv("HOME"), fmt.Sprintf("%d", unshare.GetRootlessUID()), "containers/storage")
1516

1617
assert.NilError(t, err)
1718
assert.Equal(t, storageOpts.RunRoot, expectedPath)
@@ -21,7 +22,7 @@ func TestDefaultStoreOpts(t *testing.T) {
2122

2223
func TestStorageConfOverrideEnvironmentDefaultConfigFileRootless(t *testing.T) {
2324
t.Setenv("CONTAINERS_STORAGE_CONF", "default_override_test.conf")
24-
defaultFile, err := DefaultConfigFile(true)
25+
defaultFile, err := DefaultConfigFile()
2526

2627
expectedPath := "default_override_test.conf"
2728

@@ -31,7 +32,7 @@ func TestStorageConfOverrideEnvironmentDefaultConfigFileRootless(t *testing.T) {
3132

3233
func TestStorageConfOverrideEnvironmentDefaultConfigFileRoot(t *testing.T) {
3334
t.Setenv("CONTAINERS_STORAGE_CONF", "default_override_test.conf")
34-
defaultFile, err := DefaultConfigFile(false)
35+
defaultFile, err := DefaultConfigFile()
3536

3637
expectedPath := "default_override_test.conf"
3738

utils.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,9 @@ func ParseIDMapping(UIDMapSlice, GIDMapSlice []string, subUIDMap, subGIDMap stri
1111
return types.ParseIDMapping(UIDMapSlice, GIDMapSlice, subUIDMap, subGIDMap)
1212
}
1313

14-
// DefaultStoreOptionsAutoDetectUID returns the default storage options for containers
15-
func DefaultStoreOptionsAutoDetectUID() (types.StoreOptions, error) {
16-
return types.DefaultStoreOptionsAutoDetectUID()
17-
}
18-
1914
// DefaultStoreOptions returns the default storage options for containers
20-
func DefaultStoreOptions(rootless bool, rootlessUID int) (types.StoreOptions, error) {
21-
return types.DefaultStoreOptions(rootless, rootlessUID)
15+
func DefaultStoreOptions() (types.StoreOptions, error) {
16+
return types.DefaultStoreOptions()
2217
}
2318

2419
func validateMountOptions(mountOptions []string) error {

0 commit comments

Comments
 (0)