Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions cli/command/container/opts_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -609,6 +609,17 @@ func TestParseNetworkConfig(t *testing.T) {
expected: map[string]*networktypes.EndpointSettings{},
expectedHostCfg: container.HostConfig{NetworkMode: "net1"},
},
{
name: "single-network-advanced-preserves-case",
flags: []string{"--network", "name=MyNetwork,alias=WebApp,driver-opt=CustomKey=CaseSensitiveValue"},
expected: map[string]*networktypes.EndpointSettings{
"MyNetwork": {
Aliases: []string{"WebApp"},
DriverOpts: map[string]string{"CustomKey": "CaseSensitiveValue"},
},
},
expectedHostCfg: container.HostConfig{NetworkMode: "MyNetwork"},
},
{
name: "single-network-legacy-with-options",
flags: []string{
Expand Down
8 changes: 3 additions & 5 deletions opts/network.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,12 @@ func (n *NetworkOpt) Set(value string) error { //nolint:gocyclo
netOpt.Aliases = []string{}
for _, field := range fields {
// TODO(thaJeztah): these options should not be case-insensitive.
key, val, ok := strings.Cut(strings.ToLower(field), "=")
key, val, ok := strings.Cut(field, "=")
if !ok || key == "" {
return fmt.Errorf("invalid field %s", field)
}

key = strings.TrimSpace(key)
key = strings.ToLower(strings.TrimSpace(key))
val = strings.TrimSpace(val)

switch key {
Expand Down Expand Up @@ -148,9 +148,7 @@ func (n *NetworkOpt) NetworkMode() string {
}

func parseDriverOpt(driverOpt string) (string, string, error) {
// TODO(thaJeztah): these options should not be case-insensitive.
// TODO(thaJeztah): should value be converted to lowercase as well, or only the key?
key, value, ok := strings.Cut(strings.ToLower(driverOpt), "=")
key, value, ok := strings.Cut(driverOpt, "=")
if !ok || key == "" {
return "", "", errors.New("invalid key value pair format in driver options")
}
Expand Down
28 changes: 25 additions & 3 deletions opts/network_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,30 @@ func TestNetworkOptAdvancedSyntax(t *testing.T) {
value string
expected []NetworkAttachmentOpts
}{
{
value: "name=MyNetwork,alias=WebApp,driver-opt=CustomKey=CaseSensitiveValue",
expected: []NetworkAttachmentOpts{
{
Target: "MyNetwork",
Aliases: []string{"WebApp"},
DriverOpts: map[string]string{
"CustomKey": "CaseSensitiveValue",
},
},
},
},
{
value: "NAME=MyNetwork,ALIAS=WebApp,DRIVER-OPT=CustomKey=CaseSensitiveValue",
expected: []NetworkAttachmentOpts{
{
Target: "MyNetwork",
Aliases: []string{"WebApp"},
DriverOpts: map[string]string{
"CustomKey": "CaseSensitiveValue",
},
},
},
},
{
value: "name=docknet1,alias=web,driver-opt=field1=value1",
expected: []NetworkAttachmentOpts{
Expand Down Expand Up @@ -107,9 +131,7 @@ func TestNetworkOptAdvancedSyntax(t *testing.T) {
Target: "docknet1",
Aliases: []string{},
DriverOpts: map[string]string{
// The CLI converts IFNAME to ifname - it probably shouldn't, but the API
// allows ifname to cater for this.
"com.docker.network.endpoint.sysctls": "net.ipv6.conf.ifname.accept_ra=2,net.ipv6.conf.ifname.forwarding=1",
"com.docker.network.endpoint.sysctls": "net.ipv6.conf.IFNAME.accept_ra=2,net.ipv6.conf.IFNAME.forwarding=1",
},
},
},
Expand Down