Skip to content

Commit 5b18a79

Browse files
committed
deprecate pkg/parsers.ParseKeyValueOpt and move internal
Move the utility to where it's used, and deprecate the implementation in pkg/parsers. Signed-off-by: Sebastiaan van Stijn <[email protected]>
1 parent df0174b commit 5b18a79

8 files changed

Lines changed: 52 additions & 35 deletions

File tree

daemon/graphdriver/btrfs/btrfs.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,6 @@ import (
3939
"github.com/docker/docker/daemon/internal/fstype"
4040
"github.com/docker/docker/internal/containerfs"
4141
"github.com/docker/docker/pkg/idtools"
42-
"github.com/docker/docker/pkg/parsers"
4342
"github.com/docker/go-units"
4443
"github.com/moby/sys/mount"
4544
"github.com/moby/sys/userns"
@@ -121,7 +120,7 @@ func parseOptions(opt []string) (btrfsOptions, bool, error) {
121120
var options btrfsOptions
122121
userDiskQuota := false
123122
for _, option := range opt {
124-
key, val, err := parsers.ParseKeyValueOpt(option)
123+
key, val, err := graphdriver.ParseStorageOptKeyValue(option)
125124
if err != nil {
126125
return options, userDiskQuota, err
127126
}

daemon/graphdriver/overlay2/overlay.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import (
2626
"github.com/docker/docker/pkg/atomicwriter"
2727
"github.com/docker/docker/pkg/chrootarchive"
2828
"github.com/docker/docker/pkg/idtools"
29-
"github.com/docker/docker/pkg/parsers"
3029
"github.com/docker/docker/quota"
3130
"github.com/docker/go-units"
3231
"github.com/moby/locker"
@@ -235,7 +234,7 @@ func isMounted(path string) bool {
235234
func parseOptions(options []string) (*overlayOptions, error) {
236235
o := &overlayOptions{}
237236
for _, option := range options {
238-
key, val, err := parsers.ParseKeyValueOpt(option)
237+
key, val, err := graphdriver.ParseStorageOptKeyValue(option)
239238
if err != nil {
240239
return nil, err
241240
}

daemon/graphdriver/utils.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package graphdriver
2+
3+
import (
4+
"fmt"
5+
"strings"
6+
)
7+
8+
// ParseStorageOptKeyValue parses and validates the specified string as a key/value
9+
// pair (key=value).
10+
func ParseStorageOptKeyValue(opt string) (key string, value string, err error) {
11+
k, v, ok := strings.Cut(opt, "=")
12+
if !ok {
13+
return "", "", fmt.Errorf("unable to parse storage-opt key/value: %s", opt)
14+
}
15+
return strings.TrimSpace(k), strings.TrimSpace(v), nil
16+
}

daemon/graphdriver/utils_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package graphdriver
2+
3+
import "testing"
4+
5+
func TestParseKeyValueOpt(t *testing.T) {
6+
invalids := map[string]string{
7+
"": "unable to parse storage-opt key/value: ",
8+
"key": "unable to parse storage-opt key/value: key",
9+
}
10+
for invalid, expectedError := range invalids {
11+
if _, _, err := ParseStorageOptKeyValue(invalid); err == nil || err.Error() != expectedError {
12+
t.Fatalf("Expected error %v for %v, got %v", expectedError, invalid, err)
13+
}
14+
}
15+
valids := map[string][]string{
16+
"key=value": {"key", "value"},
17+
" key = value ": {"key", "value"},
18+
"key=value1=value2": {"key", "value1=value2"},
19+
" key = value1 = value2 ": {"key", "value1 = value2"},
20+
}
21+
for valid, expectedKeyValue := range valids {
22+
key, value, err := ParseStorageOptKeyValue(valid)
23+
if err != nil {
24+
t.Fatal(err)
25+
}
26+
if key != expectedKeyValue[0] || value != expectedKeyValue[1] {
27+
t.Fatalf("Expected {%v: %v} got {%v: %v}", expectedKeyValue[0], expectedKeyValue[1], key, value)
28+
}
29+
}
30+
}

daemon/graphdriver/vfs/driver.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/docker/docker/errdefs"
1010
"github.com/docker/docker/internal/containerfs"
1111
"github.com/docker/docker/pkg/idtools"
12-
"github.com/docker/docker/pkg/parsers"
1312
"github.com/docker/docker/quota"
1413
"github.com/docker/go-units"
1514
"github.com/opencontainers/selinux/go-selinux/label"
@@ -100,7 +99,7 @@ func (d *Driver) Cleanup() error {
10099

101100
func (d *Driver) parseOptions(options []string) error {
102101
for _, option := range options {
103-
key, val, err := parsers.ParseKeyValueOpt(option)
102+
key, val, err := graphdriver.ParseStorageOptKeyValue(option)
104103
if err != nil {
105104
return errdefs.InvalidParameter(err)
106105
}

daemon/graphdriver/zfs/zfs.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import (
1717
"github.com/docker/docker/daemon/graphdriver"
1818
"github.com/docker/docker/daemon/internal/mountref"
1919
"github.com/docker/docker/pkg/idtools"
20-
"github.com/docker/docker/pkg/parsers"
2120
zfs "github.com/mistifyio/go-zfs/v3"
2221
"github.com/moby/locker"
2322
"github.com/moby/sys/mount"
@@ -136,7 +135,7 @@ func parseOptions(opt []string) (zfsOptions, error) {
136135
var options zfsOptions
137136
options.fsName = ""
138137
for _, option := range opt {
139-
key, val, err := parsers.ParseKeyValueOpt(option)
138+
key, val, err := graphdriver.ParseStorageOptKeyValue(option)
140139
if err != nil {
141140
return options, err
142141
}

pkg/parsers/parsers.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import (
1111

1212
// ParseKeyValueOpt parses and validates the specified string as a key/value
1313
// pair (key=value).
14+
//
15+
// Deprecated: use [strings.Cut] instead. This utility was only used internally, and will be removed in the next release.
1416
func ParseKeyValueOpt(opt string) (key string, value string, err error) {
1517
k, v, ok := strings.Cut(opt, "=")
1618
if !ok {

pkg/parsers/parsers_test.go

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,33 +5,6 @@ import (
55
"testing"
66
)
77

8-
func TestParseKeyValueOpt(t *testing.T) {
9-
invalids := map[string]string{
10-
"": "unable to parse key/value option: ",
11-
"key": "unable to parse key/value option: key",
12-
}
13-
for invalid, expectedError := range invalids {
14-
if _, _, err := ParseKeyValueOpt(invalid); err == nil || err.Error() != expectedError {
15-
t.Fatalf("Expected error %v for %v, got %v", expectedError, invalid, err)
16-
}
17-
}
18-
valids := map[string][]string{
19-
"key=value": {"key", "value"},
20-
" key = value ": {"key", "value"},
21-
"key=value1=value2": {"key", "value1=value2"},
22-
" key = value1 = value2 ": {"key", "value1 = value2"},
23-
}
24-
for valid, expectedKeyValue := range valids {
25-
key, value, err := ParseKeyValueOpt(valid)
26-
if err != nil {
27-
t.Fatal(err)
28-
}
29-
if key != expectedKeyValue[0] || value != expectedKeyValue[1] {
30-
t.Fatalf("Expected {%v: %v} got {%v: %v}", expectedKeyValue[0], expectedKeyValue[1], key, value)
31-
}
32-
}
33-
}
34-
358
func TestParseUintList(t *testing.T) {
369
valids := map[string]map[int]bool{
3710
"": {},

0 commit comments

Comments
 (0)