diff --git a/storage/drivers/btrfs/btrfs.go b/storage/drivers/btrfs/btrfs.go index da029fec12..b2948c4605 100644 --- a/storage/drivers/btrfs/btrfs.go +++ b/storage/drivers/btrfs/btrfs.go @@ -33,7 +33,7 @@ import ( "github.com/opencontainers/selinux/go-selinux/label" "github.com/sirupsen/logrus" graphdriver "go.podman.io/storage/drivers" - "go.podman.io/storage/internal/opts" + "go.podman.io/storage/internal/driver" "go.podman.io/storage/internal/tempdir" "go.podman.io/storage/pkg/directory" "go.podman.io/storage/pkg/fileutils" @@ -97,7 +97,7 @@ func parseOptions(opt []string) (btrfsOptions, bool, error) { var options btrfsOptions userDiskQuota := false for _, option := range opt { - driver, key, val, err := opts.ParseDriverOption(option) + driver, key, val, err := driver.ParseDriverOption(option) if err != nil { return options, userDiskQuota, err } diff --git a/storage/drivers/overlay/overlay.go b/storage/drivers/overlay/overlay.go index 5e81a6cb49..a3338d9bca 100644 --- a/storage/drivers/overlay/overlay.go +++ b/storage/drivers/overlay/overlay.go @@ -28,7 +28,7 @@ import ( "go.podman.io/storage/drivers/overlayutils" "go.podman.io/storage/drivers/quota" "go.podman.io/storage/internal/dedup" - "go.podman.io/storage/internal/opts" + "go.podman.io/storage/internal/driver" "go.podman.io/storage/internal/staging_lockfile" "go.podman.io/storage/internal/tempdir" "go.podman.io/storage/pkg/archive" @@ -467,7 +467,7 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) func parseOptions(options []string) (*overlayOptions, error) { o := &overlayOptions{} for _, option := range options { - driver, key, val, err := opts.ParseDriverOption(option) + driver, key, val, err := driver.ParseDriverOption(option) if err != nil { return nil, err } diff --git a/storage/drivers/vfs/driver.go b/storage/drivers/vfs/driver.go index 934d4af629..93db9997e7 100644 --- a/storage/drivers/vfs/driver.go +++ b/storage/drivers/vfs/driver.go @@ -15,7 +15,7 @@ import ( "github.com/vbatts/tar-split/tar/storage" graphdriver "go.podman.io/storage/drivers" "go.podman.io/storage/internal/dedup" - "go.podman.io/storage/internal/opts" + "go.podman.io/storage/internal/driver" "go.podman.io/storage/internal/tempdir" "go.podman.io/storage/pkg/archive" "go.podman.io/storage/pkg/directory" @@ -46,7 +46,7 @@ func Init(home string, options graphdriver.Options) (graphdriver.Driver, error) return nil, err } for _, option := range options.DriverOptions { - driver, key, val, err := opts.ParseDriverOption(option) + driver, key, val, err := driver.ParseDriverOption(option) if err != nil { return nil, err } diff --git a/storage/drivers/zfs/zfs.go b/storage/drivers/zfs/zfs.go index f25a300362..342c8587b7 100644 --- a/storage/drivers/zfs/zfs.go +++ b/storage/drivers/zfs/zfs.go @@ -16,7 +16,7 @@ import ( "github.com/opencontainers/selinux/go-selinux/label" "github.com/sirupsen/logrus" graphdriver "go.podman.io/storage/drivers" - "go.podman.io/storage/internal/opts" + "go.podman.io/storage/internal/driver" "go.podman.io/storage/internal/tempdir" "go.podman.io/storage/pkg/directory" "go.podman.io/storage/pkg/idtools" @@ -123,7 +123,7 @@ func parseOptions(opt []string) (zfsOptions, error) { var options zfsOptions options.fsName = "" for _, option := range opt { - driver, key, val, err := opts.ParseDriverOption(option) + driver, key, val, err := driver.ParseDriverOption(option) if err != nil { return options, err } diff --git a/storage/internal/opts/driver.go b/storage/internal/driver/driver.go similarity index 98% rename from storage/internal/opts/driver.go rename to storage/internal/driver/driver.go index 5991f73318..dd2500ba3c 100644 --- a/storage/internal/opts/driver.go +++ b/storage/internal/driver/driver.go @@ -1,4 +1,4 @@ -package opts +package driver import ( "fmt" diff --git a/storage/internal/driver/driver_test.go b/storage/internal/driver/driver_test.go new file mode 100644 index 0000000000..578ffe38ae --- /dev/null +++ b/storage/internal/driver/driver_test.go @@ -0,0 +1,86 @@ +package driver_test + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "go.podman.io/storage/internal/driver" +) + +func TestParseDriverOption(t *testing.T) { + tests := []struct { + name string + option string + wantDriver string + wantKey string + wantValue string + wantErr string + }{ + { + name: "valid option with overlay driver", + option: "overlay.mountopt=nodev", + wantDriver: "overlay", + wantKey: "mountopt", + wantValue: "nodev", + }, + { + name: "empty driver string before the dot", + option: ".mountopt=nodev", + wantDriver: "", + wantKey: "mountopt", + wantValue: "nodev", + }, + { + name: "not dot in option", + option: "mountopt=nodev", + wantDriver: "", + wantKey: "mountopt", + wantValue: "nodev", + }, + { + name: "valid option with overlay2 driver", + option: "overlay2.size=10G", + wantDriver: "overlay2", + wantKey: "size", + wantValue: "10G", + }, + { + name: "uppercase driver and key are converted to lowercase", + option: "ZFS.SIZE=20G", + wantDriver: "zfs", + wantKey: "size", + wantValue: "20G", + }, + { + name: "spaces are trimmed", + option: " key= val ", + wantDriver: "", + wantKey: "key", + wantValue: "val", + }, + { + name: "invalid driver returns an error", + option: "magicfs.size=5G", + wantErr: `unknown driver "magicfs" in option "magicfs.size=5G"`, + }, + { + name: "invalid syntax", + option: "myopt", + wantErr: "unable to parse key/value option: myopt", + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + driver, key, val, err := driver.ParseDriverOption(tt.option) + if tt.wantErr != "" { + assert.ErrorContains(t, err, tt.wantErr) + return + } + + assert.NoError(t, err) + assert.Equal(t, tt.wantDriver, driver) + assert.Equal(t, tt.wantKey, key) + assert.Equal(t, tt.wantValue, val) + }) + } +} diff --git a/storage/store.go b/storage/store.go index 4a9cea5b5f..4b66388fd2 100644 --- a/storage/store.go +++ b/storage/store.go @@ -25,7 +25,7 @@ import ( "github.com/sirupsen/logrus" drivers "go.podman.io/storage/drivers" "go.podman.io/storage/internal/dedup" - "go.podman.io/storage/internal/opts" + "go.podman.io/storage/internal/driver" "go.podman.io/storage/internal/tempdir" "go.podman.io/storage/pkg/archive" "go.podman.io/storage/pkg/directory" @@ -3942,13 +3942,13 @@ func GetDefaultMountOptions() ([]string, error) { } // GetMountOptions returns the mountoptions for the specified driver and graphDriverOptions -func GetMountOptions(driver string, graphDriverOptions []string) ([]string, error) { +func GetMountOptions(usedDriver string, graphDriverOptions []string) ([]string, error) { for _, option := range graphDriverOptions { - optDriver, key, val, err := opts.ParseDriverOption(option) + optDriver, key, val, err := driver.ParseDriverOption(option) if err != nil { return nil, err } - if (optDriver == "" || optDriver == driver) && key == "mountopt" { + if (optDriver == "" || optDriver == usedDriver) && key == "mountopt" { return strings.Split(val, ","), nil } } diff --git a/storage/types/options.go b/storage/types/options.go index 12e58ea726..bb6046136e 100644 --- a/storage/types/options.go +++ b/storage/types/options.go @@ -244,7 +244,7 @@ func LoadStoreOptions(opts LoadOptions) (StoreOptions, error) { if config.Storage.GraphRoot != "" { if config.Storage.RootlessStoragePath != "" { - logrus.Warn("Both rootless_storage_path and graphroot are set, using graphroot setting only, rootless_storage_path is deprecated and should be removed form the config") + logrus.Warn("Both rootless_storage_path and graphroot are set, using graphroot setting only, rootless_storage_path is deprecated and should be removed from the config") } graphRoot, err := expandEnvPath(config.Storage.GraphRoot, rootlessUID) if err != nil {