Skip to content

Commit ee0f81b

Browse files
committed
Don't allow passing EnableIPv6 as a driver option (a label)
Signed-off-by: Aidan Hobson Sayers <aidanhs@cantab.net>
1 parent d1d60f9 commit ee0f81b

7 files changed

Lines changed: 71 additions & 67 deletions

File tree

api/api.go

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"io/ioutil"
77
"net/http"
8+
"strconv"
89
"strings"
910

1011
"github.com/docker/libnetwork"
@@ -276,22 +277,33 @@ func procCreateNetwork(c libnetwork.NetworkController, vars map[string]string, b
276277

277278
err := json.Unmarshal(body, &create)
278279
if err != nil {
279-
return "", &responseStatus{Status: "Invalid body: " + err.Error(), StatusCode: http.StatusBadRequest}
280+
return nil, &responseStatus{Status: "Invalid body: " + err.Error(), StatusCode: http.StatusBadRequest}
280281
}
281282
processCreateDefaults(c, &create)
282283

283284
options := []libnetwork.NetworkOption{}
284-
if len(create.NetworkOpts) > 0 {
285-
if _, ok := create.NetworkOpts[netlabel.Internal]; ok {
285+
if val, ok := create.NetworkOpts[netlabel.Internal]; ok {
286+
internal, err := strconv.ParseBool(val)
287+
if err != nil {
288+
return nil, &responseStatus{Status: err.Error(), StatusCode: http.StatusBadRequest}
289+
}
290+
if internal {
286291
options = append(options, libnetwork.NetworkOptionInternalNetwork())
287292
}
288293
}
294+
if val, ok := create.NetworkOpts[netlabel.EnableIPv6]; ok {
295+
enableIPv6, err := strconv.ParseBool(val)
296+
if err != nil {
297+
return nil, &responseStatus{Status: err.Error(), StatusCode: http.StatusBadRequest}
298+
}
299+
options = append(options, libnetwork.NetworkOptionEnableIPv6(enableIPv6))
300+
}
289301
if len(create.DriverOpts) > 0 {
290302
options = append(options, libnetwork.NetworkOptionDriverOpts(create.DriverOpts))
291303
}
292304
nw, err := c.NewNetwork(create.NetworkType, create.Name, options...)
293305
if err != nil {
294-
return "", convertNetworkError(err)
306+
return nil, convertNetworkError(err)
295307
}
296308

297309
return nw.ID(), &createdResponse

api/api_test.go

Lines changed: 11 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -225,11 +225,13 @@ func TestCreateDeleteNetwork(t *testing.T) {
225225
t.Fatalf("Expected StatusBadRequest status code, got: %v", errRsp)
226226
}
227227

228-
ops := map[string]string{
229-
bridge.BridgeName: "abc",
228+
dops := map[string]string{
229+
bridge.BridgeName: "abc",
230+
}
231+
nops := map[string]string{
230232
netlabel.EnableIPv6: "true",
231233
}
232-
nc := networkCreate{Name: "network_1", NetworkType: bridgeNetType, DriverOpts: ops}
234+
nc := networkCreate{Name: "network_1", NetworkType: bridgeNetType, DriverOpts: dops, NetworkOpts: nops}
233235
goodBody, err := json.Marshal(nc)
234236
if err != nil {
235237
t.Fatal(err)
@@ -257,29 +259,6 @@ func TestCreateDeleteNetwork(t *testing.T) {
257259
if errRsp != &successResponse {
258260
t.Fatalf("Unexepected failure: %v", errRsp)
259261
}
260-
261-
// Create with labels
262-
labels := map[string]string{
263-
netlabel.EnableIPv6: "true",
264-
bridge.BridgeName: "abc",
265-
}
266-
nc = networkCreate{Name: "network_2", NetworkType: bridgeNetType, DriverOpts: labels}
267-
goodBody, err = json.Marshal(nc)
268-
if err != nil {
269-
t.Fatal(err)
270-
}
271-
272-
_, errRsp = procCreateNetwork(c, vars, goodBody)
273-
if errRsp != &createdResponse {
274-
t.Fatalf("Unexepected failure: %v", errRsp)
275-
}
276-
277-
vars[urlNwName] = "network_2"
278-
_, errRsp = procDeleteNetwork(c, vars, nil)
279-
if errRsp != &successResponse {
280-
t.Fatalf("Unexepected failure: %v", errRsp)
281-
}
282-
283262
}
284263

285264
func TestGetNetworksAndEndpoints(t *testing.T) {
@@ -1830,14 +1809,16 @@ func TestEndToEnd(t *testing.T) {
18301809

18311810
handleRequest := NewHTTPHandler(c)
18321811

1833-
ops := map[string]string{
1834-
bridge.BridgeName: "cdef",
1812+
dops := map[string]string{
1813+
bridge.BridgeName: "cdef",
1814+
netlabel.DriverMTU: "1460",
1815+
}
1816+
nops := map[string]string{
18351817
netlabel.EnableIPv6: "true",
1836-
netlabel.DriverMTU: "1460",
18371818
}
18381819

18391820
// Create network
1840-
nc := networkCreate{Name: "network-fiftyfive", NetworkType: bridgeNetType, DriverOpts: ops}
1821+
nc := networkCreate{Name: "network-fiftyfive", NetworkType: bridgeNetType, DriverOpts: dops, NetworkOpts: nops}
18411822
body, err := json.Marshal(nc)
18421823
if err != nil {
18431824
t.Fatal(err)

client/network.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ func (cli *NetworkCli) CmdNetworkCreate(chain string, args ...string) error {
4343
cmd := cli.Subcmd(chain, "create", "NETWORK-NAME", "Creates a new network with a name specified by the user", false)
4444
flDriver := cmd.String([]string{"d", "-driver"}, "", "Driver to manage the Network")
4545
flInternal := cmd.Bool([]string{"-internal"}, false, "Config the network to be internal")
46+
flIPv6 := cmd.Bool([]string{"-ipv6"}, false, "Enable IPv6 on the network")
4647
cmd.Require(flag.Exact, 1)
4748
err := cmd.ParseFlags(args, true)
4849
if err != nil {
@@ -52,6 +53,9 @@ func (cli *NetworkCli) CmdNetworkCreate(chain string, args ...string) error {
5253
if *flInternal {
5354
networkOpts[netlabel.Internal] = "true"
5455
}
56+
if *flIPv6 {
57+
networkOpts[netlabel.EnableIPv6] = "true"
58+
}
5559
// Construct network create request body
5660
var driverOpts []string
5761
nc := networkCreate{Name: cmd.Arg(0), NetworkType: *flDriver, DriverOpts: driverOpts, NetworkOpts: networkOpts}

default_gateway_linux.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ import (
55
"strconv"
66

77
"github.com/docker/libnetwork/drivers/bridge"
8-
"github.com/docker/libnetwork/netlabel"
9-
"github.com/docker/libnetwork/options"
108
)
119

1210
func (c *controller) createGWNetwork() (Network, error) {
@@ -17,10 +15,9 @@ func (c *controller) createGWNetwork() (Network, error) {
1715
}
1816

1917
n, err := c.NewNetwork("bridge", libnGWNetwork,
20-
NetworkOptionGeneric(options.Generic{
21-
netlabel.GenericData: netOption,
22-
netlabel.EnableIPv6: false,
23-
}))
18+
NetworkOptionDriverOpts(netOption),
19+
NetworkOptionEnableIPv6(false),
20+
)
2421

2522
if err != nil {
2623
return nil, fmt.Errorf("error creating external connectivity network: %v", err)

drivers/bridge/bridge_test.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,6 @@ func TestCreateFullOptions(t *testing.T) {
4545
br, _ := types.ParseCIDR("172.16.0.1/16")
4646
defgw, _ := types.ParseCIDR("172.16.0.100/16")
4747

48-
netConfig := &networkConfiguration{
49-
BridgeName: DefaultBridgeName,
50-
EnableIPv6: true,
51-
}
5248
genericOption := make(map[string]interface{})
5349
genericOption[netlabel.GenericData] = config
5450

@@ -57,7 +53,10 @@ func TestCreateFullOptions(t *testing.T) {
5753
}
5854

5955
netOption := make(map[string]interface{})
60-
netOption[netlabel.GenericData] = netConfig
56+
netOption[netlabel.EnableIPv6] = true
57+
netOption[netlabel.GenericData] = &networkConfiguration{
58+
BridgeName: DefaultBridgeName,
59+
}
6160

6261
ipdList := []driverapi.IPAMData{
6362
driverapi.IPAMData{
@@ -118,15 +117,15 @@ func TestCreateFullOptionsLabels(t *testing.T) {
118117
gwV6, _ := types.ParseCIDR(gwV6s)
119118

120119
labels := map[string]string{
121-
BridgeName: DefaultBridgeName,
122-
DefaultBridge: "true",
123-
netlabel.EnableIPv6: "true",
124-
EnableICC: "true",
125-
EnableIPMasquerade: "true",
126-
DefaultBindingIP: bndIPs,
120+
BridgeName: DefaultBridgeName,
121+
DefaultBridge: "true",
122+
EnableICC: "true",
123+
EnableIPMasquerade: "true",
124+
DefaultBindingIP: bndIPs,
127125
}
128126

129127
netOption := make(map[string]interface{})
128+
netOption[netlabel.EnableIPv6] = true
130129
netOption[netlabel.GenericData] = labels
131130

132131
ipdList := getIPv4Data(t)
@@ -783,13 +782,13 @@ func TestSetDefaultGw(t *testing.T) {
783782

784783
config := &networkConfiguration{
785784
BridgeName: DefaultBridgeName,
786-
EnableIPv6: true,
787785
AddressIPv6: subnetv6,
788786
DefaultGatewayIPv4: gw4,
789787
DefaultGatewayIPv6: gw6,
790788
}
791789

792790
genericOption := make(map[string]interface{})
791+
genericOption[netlabel.EnableIPv6] = true
793792
genericOption[netlabel.GenericData] = config
794793

795794
err := d.CreateNetwork("dummy", genericOption, ipdList, nil)

libnetwork_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -269,9 +269,9 @@ func TestBridge(t *testing.T) {
269269
}
270270

271271
netOption := options.Generic{
272+
netlabel.EnableIPv6: true,
272273
netlabel.GenericData: options.Generic{
273274
"BridgeName": "testnetwork",
274-
"EnableIPv6": true,
275275
"EnableICC": true,
276276
"EnableIPMasquerade": true,
277277
},
@@ -323,7 +323,6 @@ func TestBridgeIpv6FromMac(t *testing.T) {
323323
netOption := options.Generic{
324324
netlabel.GenericData: options.Generic{
325325
"BridgeName": "testipv6mac",
326-
"EnableIPv6": true,
327326
"EnableICC": true,
328327
"EnableIPMasquerade": true,
329328
},
@@ -333,6 +332,7 @@ func TestBridgeIpv6FromMac(t *testing.T) {
333332

334333
network, err := controller.NewNetwork(bridgeNetType, "testipv6mac",
335334
libnetwork.NetworkOptionGeneric(netOption),
335+
libnetwork.NetworkOptionEnableIPv6(true),
336336
libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", ipamV4ConfList, ipamV6ConfList, nil),
337337
libnetwork.NetworkOptionDeferIPv6Alloc(true))
338338
if err != nil {
@@ -1008,14 +1008,14 @@ func TestEndpointJoin(t *testing.T) {
10081008
netOption := options.Generic{
10091009
netlabel.GenericData: options.Generic{
10101010
"BridgeName": "testnetwork1",
1011-
"EnableIPv6": true,
10121011
"EnableICC": true,
10131012
"EnableIPMasquerade": true,
10141013
},
10151014
}
10161015
ipamV6ConfList := []*libnetwork.IpamConf{&libnetwork.IpamConf{PreferredPool: "fe90::/64", Gateway: "fe90::22"}}
10171016
n1, err := controller.NewNetwork(bridgeNetType, "testnetwork1",
10181017
libnetwork.NetworkOptionGeneric(netOption),
1018+
libnetwork.NetworkOptionEnableIPv6(true),
10191019
libnetwork.NetworkOptionIpam(ipamapi.DefaultIPAM, "", nil, ipamV6ConfList, nil),
10201020
libnetwork.NetworkOptionDeferIPv6Alloc(true))
10211021
if err != nil {

network.go

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"encoding/json"
55
"fmt"
66
"net"
7-
"strconv"
87
"strings"
98
"sync"
109

@@ -476,9 +475,17 @@ type NetworkOption func(n *network)
476475
// in a Dictionary of Key-Value pair
477476
func NetworkOptionGeneric(generic map[string]interface{}) NetworkOption {
478477
return func(n *network) {
479-
n.generic = generic
480-
if _, ok := generic[netlabel.EnableIPv6]; ok {
481-
n.enableIPv6 = generic[netlabel.EnableIPv6].(bool)
478+
if n.generic == nil {
479+
n.generic = make(map[string]interface{})
480+
}
481+
if val, ok := generic[netlabel.EnableIPv6]; ok {
482+
n.enableIPv6 = val.(bool)
483+
}
484+
if val, ok := generic[netlabel.Internal]; ok {
485+
n.internal = val.(bool)
486+
}
487+
for k, v := range generic {
488+
n.generic[k] = v
482489
}
483490
}
484491
}
@@ -490,14 +497,25 @@ func NetworkOptionPersist(persist bool) NetworkOption {
490497
}
491498
}
492499

500+
// NetworkOptionEnableIPv6 returns an option setter to explicitly configure IPv6
501+
func NetworkOptionEnableIPv6(enableIPv6 bool) NetworkOption {
502+
return func(n *network) {
503+
if n.generic == nil {
504+
n.generic = make(map[string]interface{})
505+
}
506+
n.enableIPv6 = enableIPv6
507+
n.generic[netlabel.EnableIPv6] = enableIPv6
508+
}
509+
}
510+
493511
// NetworkOptionInternalNetwork returns an option setter to config the network
494512
// to be internal which disables default gateway service
495513
func NetworkOptionInternalNetwork() NetworkOption {
496514
return func(n *network) {
497-
n.internal = true
498515
if n.generic == nil {
499516
n.generic = make(map[string]interface{})
500517
}
518+
n.internal = true
501519
n.generic[netlabel.Internal] = true
502520
}
503521
}
@@ -526,13 +544,6 @@ func NetworkOptionDriverOpts(opts map[string]string) NetworkOption {
526544
}
527545
// Store the options
528546
n.generic[netlabel.GenericData] = opts
529-
// Decode and store the endpoint options of libnetwork interest
530-
if val, ok := opts[netlabel.EnableIPv6]; ok {
531-
var err error
532-
if n.enableIPv6, err = strconv.ParseBool(val); err != nil {
533-
log.Warnf("Failed to parse %s' value: %s (%s)", netlabel.EnableIPv6, val, err.Error())
534-
}
535-
}
536547
}
537548
}
538549

0 commit comments

Comments
 (0)