From 0c4b5a13688298c97f439afcf2d27e69081f67e7 Mon Sep 17 00:00:00 2001 From: JoJo <1043708974@qq.com> Date: Tue, 30 Apr 2019 22:49:09 +0800 Subject: [PATCH] fix the empty label Signed-off-by: JoJo <1043708974@qq.com> --- apis/opts/labels.go | 19 +++++++---------- apis/opts/labels_test.go | 45 +++++++++++++++++++++++++++++++--------- cli/container.go | 5 +---- daemon/mgr/container.go | 5 +---- 4 files changed, 45 insertions(+), 29 deletions(-) diff --git a/apis/opts/labels.go b/apis/opts/labels.go index 2d4039415..bb3584df4 100644 --- a/apis/opts/labels.go +++ b/apis/opts/labels.go @@ -1,28 +1,25 @@ package opts import ( - "fmt" "strings" ) // ParseLabels parses the labels params of container. -func ParseLabels(labels []string) (map[string]string, error) { +func ParseLabels(labels []string) map[string]string { results := make(map[string]string) for _, label := range labels { - fields, err := parseLabel(label) - if err != nil { - return nil, err - } + fields := parseLabel(label) k, v := fields[0], fields[1] results[k] = v } - return results, nil + return results } -func parseLabel(label string) ([]string, error) { +func parseLabel(label string) []string { fields := strings.SplitN(label, "=", 2) - if len(fields) != 2 { - return nil, fmt.Errorf("invalid label %s: label must be in format of key=value", label) + // Only input key without value + if len(fields) == 1 { + fields = append(fields, "") } - return fields, nil + return fields } diff --git a/apis/opts/labels_test.go b/apis/opts/labels_test.go index 8d8a668dc..8770cb80f 100644 --- a/apis/opts/labels_test.go +++ b/apis/opts/labels_test.go @@ -1,7 +1,6 @@ package opts import ( - "fmt" "testing" "github.com/stretchr/testify/assert" @@ -10,8 +9,8 @@ import ( func TestParseLabels(t *testing.T) { type result struct { labels map[string]string - err error } + type TestCase struct { input []string expected result @@ -24,7 +23,6 @@ func TestParseLabels(t *testing.T) { labels: map[string]string{ "a": "b", }, - err: nil, }, }, { @@ -33,7 +31,6 @@ func TestParseLabels(t *testing.T) { labels: map[string]string{ "a": "b", }, - err: nil, }, }, { @@ -43,21 +40,49 @@ func TestParseLabels(t *testing.T) { labels: map[string]string{ "a": "bb", }, - err: nil, + }, + }, + // only input key + { + input: []string{"a"}, + expected: result{ + labels: map[string]string{ + "a": "", + }, + }, + }, + { + input: []string{"a="}, + expected: result{ + labels: map[string]string{ + "a": "", + }, + }, + }, + { + input: []string{"a=b=c"}, + expected: result{ + labels: map[string]string{ + "a": "b=c", + }, + }, + }, + { + input: []string{}, + expected: result{ + labels: map[string]string{}, }, }, { - input: []string{"ThisIsALableWithoutEqualMark"}, + input: nil, expected: result{ - labels: nil, - err: fmt.Errorf("invalid label ThisIsALableWithoutEqualMark: label must be in format of key=value"), + labels: map[string]string{}, }, }, } for _, testCase := range testCases { - labels, err := ParseLabels(testCase.input) - assert.Equal(t, testCase.expected.err, err) + labels := ParseLabels(testCase.input) assert.Equal(t, testCase.expected.labels, labels) } } diff --git a/cli/container.go b/cli/container.go index f947392fb..881a7e012 100644 --- a/cli/container.go +++ b/cli/container.go @@ -97,10 +97,7 @@ type container struct { } func (c *container) config() (*types.ContainerCreateConfig, error) { - labels, err := opts.ParseLabels(c.labels) - if err != nil { - return nil, err - } + labels := opts.ParseLabels(c.labels) memory, err := opts.ParseMemory(c.memory) if err != nil { diff --git a/daemon/mgr/container.go b/daemon/mgr/container.go index c6d5b01fd..32860f2e9 100644 --- a/daemon/mgr/container.go +++ b/daemon/mgr/container.go @@ -1149,10 +1149,7 @@ func (mgr *ContainerManager) Update(ctx context.Context, name string, config *ty // but ContainerConfig.Labels is map[string]string if len(config.Label) != 0 { // support remove some labels - newLabels, err := opts.ParseLabels(config.Label) - if err != nil { - return errors.Wrapf(err, "failed to parse labels") - } + newLabels := opts.ParseLabels(config.Label) for k, v := range newLabels { if v == "" {