Browse code

Merge pull request #17513 from aidanhs/aphs-expose-ipv6-default-bridge

Expose bridge IPv6 setting to `docker network inspect`

David Calavera authored on 2016/02/19 03:35:04
Showing 13 changed files
... ...
@@ -50,6 +50,7 @@ func (cli *DockerCli) CmdNetworkCreate(args ...string) error {
50 50
 	cmd.Var(flIpamOpt, []string{"-ipam-opt"}, "set IPAM driver specific options")
51 51
 
52 52
 	flInternal := cmd.Bool([]string{"-internal"}, false, "restricts external access to the network")
53
+	flIPv6 := cmd.Bool([]string{"-ipv6"}, false, "enable IPv6 networking")
53 54
 
54 55
 	cmd.Require(flag.Exact, 1)
55 56
 	err := cmd.ParseFlags(args, true)
... ...
@@ -77,6 +78,7 @@ func (cli *DockerCli) CmdNetworkCreate(args ...string) error {
77 77
 		Options:        flOpts.GetAll(),
78 78
 		CheckDuplicate: true,
79 79
 		Internal:       *flInternal,
80
+		EnableIPv6:     *flIPv6,
80 81
 	}
81 82
 
82 83
 	resp, err := cli.client.NetworkCreate(nc)
... ...
@@ -14,7 +14,7 @@ type Backend interface {
14 14
 	GetNetworkByName(idName string) (libnetwork.Network, error)
15 15
 	GetNetworksByID(partialID string) []libnetwork.Network
16 16
 	GetAllNetworks() []libnetwork.Network
17
-	CreateNetwork(name, driver string, ipam network.IPAM, options map[string]string, internal bool) (libnetwork.Network, error)
17
+	CreateNetwork(name, driver string, ipam network.IPAM, options map[string]string, internal bool, enableIPv6 bool) (libnetwork.Network, error)
18 18
 	ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error
19 19
 	DisconnectContainerFromNetwork(containerName string, network libnetwork.Network, force bool) error
20 20
 	DeleteNetwork(name string) error
... ...
@@ -91,7 +91,7 @@ func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWr
91 91
 		warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID())
92 92
 	}
93 93
 
94
-	nw, err = n.backend.CreateNetwork(create.Name, create.Driver, create.IPAM, create.Options, create.Internal)
94
+	nw, err = n.backend.CreateNetwork(create.Name, create.Driver, create.IPAM, create.Options, create.Internal, create.EnableIPv6)
95 95
 	if err != nil {
96 96
 		return err
97 97
 	}
... ...
@@ -160,6 +160,8 @@ func buildNetworkResource(nw libnetwork.Network) *types.NetworkResource {
160 160
 	r.ID = nw.ID()
161 161
 	r.Scope = nw.Info().Scope()
162 162
 	r.Driver = nw.Type()
163
+	r.EnableIPv6 = nw.Info().IPv6Enabled()
164
+	r.Internal = nw.Info().Internal()
163 165
 	r.Options = nw.Info().DriverOptions()
164 166
 	r.Containers = make(map[string]types.EndpointResource)
165 167
 	buildIpamResources(r, nw)
... ...
@@ -1275,7 +1275,7 @@ _docker_network_connect() {
1275 1275
 
1276 1276
 _docker_network_create() {
1277 1277
 	case "$prev" in
1278
-		--aux-address|--gateway|--ip-range|--ipam-opt|--opt|-o|--subnet)
1278
+		--aux-address|--gateway|--internal|--ip-range|--ipam-opt|--ipv6|--opt|-o|--subnet)
1279 1279
 			return
1280 1280
 			;;
1281 1281
 		--ipam-driver)
... ...
@@ -1294,7 +1294,7 @@ _docker_network_create() {
1294 1294
 
1295 1295
 	case "$cur" in
1296 1296
 		-*)
1297
-			COMPREPLY=( $( compgen -W "--aux-address --driver -d --gateway --help --internal --ip-range --ipam-driver --ipam-opt --opt -o --subnet" -- "$cur" ) )
1297
+			COMPREPLY=( $( compgen -W "--aux-address --driver -d --gateway --help --internal --ip-range --ipam-driver --ipam-opt --ipv6 --opt -o --subnet" -- "$cur" ) )
1298 1298
 			;;
1299 1299
 	esac
1300 1300
 }
... ...
@@ -332,6 +332,7 @@ __docker_network_subcommand() {
332 332
                 "($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \
333 333
                 "($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \
334 334
                 "($help)*--ipam-opt=[Set custom IPAM plugin options]:opt=value: " \
335
+                "($help)--ipv6[Enable IPv6 networking]" \
335 336
                 "($help)*"{-o=,--opt=}"[Set driver specific options]:opt=value: " \
336 337
                 "($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \
337 338
                 "($help -)1:Network Name: " && ret=0
... ...
@@ -694,10 +694,8 @@ func initBridgeDriver(controller libnetwork.NetworkController, config *Config) e
694 694
 	}
695 695
 	// Initialize default network on "bridge" with the same name
696 696
 	_, err = controller.NewNetwork("bridge", "bridge",
697
-		libnetwork.NetworkOptionGeneric(options.Generic{
698
-			netlabel.GenericData: netOption,
699
-			netlabel.EnableIPv6:  config.bridgeConfig.EnableIPv6,
700
-		}),
697
+		libnetwork.NetworkOptionEnableIPv6(config.bridgeConfig.EnableIPv6),
698
+		libnetwork.NetworkOptionDriverOpts(netOption),
701 699
 		libnetwork.NetworkOptionIpam("default", "", v4Conf, v6Conf, nil),
702 700
 		libnetwork.NetworkOptionDeferIPv6Alloc(deferIPv6Alloc))
703 701
 	if err != nil {
... ...
@@ -90,7 +90,7 @@ func (daemon *Daemon) GetAllNetworks() []libnetwork.Network {
90 90
 }
91 91
 
92 92
 // CreateNetwork creates a network with the given name, driver and other optional parameters
93
-func (daemon *Daemon) CreateNetwork(name, driver string, ipam network.IPAM, options map[string]string, internal bool) (libnetwork.Network, error) {
93
+func (daemon *Daemon) CreateNetwork(name, driver string, ipam network.IPAM, netOption map[string]string, internal bool, enableIPv6 bool) (libnetwork.Network, error) {
94 94
 	c := daemon.netController
95 95
 	if driver == "" {
96 96
 		driver = c.Config().Daemon.DefaultDriver
... ...
@@ -104,7 +104,8 @@ func (daemon *Daemon) CreateNetwork(name, driver string, ipam network.IPAM, opti
104 104
 	}
105 105
 
106 106
 	nwOptions = append(nwOptions, libnetwork.NetworkOptionIpam(ipam.Driver, "", v4Conf, v6Conf, ipam.Options))
107
-	nwOptions = append(nwOptions, libnetwork.NetworkOptionDriverOpts(options))
107
+	nwOptions = append(nwOptions, libnetwork.NetworkOptionEnableIPv6(enableIPv6))
108
+	nwOptions = append(nwOptions, libnetwork.NetworkOptionDriverOpts(netOption))
108 109
 	if internal {
109 110
 		nwOptions = append(nwOptions, libnetwork.NetworkOptionInternalNetwork())
110 111
 	}
... ...
@@ -22,6 +22,7 @@ parent = "smn_cli"
22 22
     --ip-range=[]            Allocate container ip from a sub-range
23 23
     --ipam-driver=default    IP Address Management Driver
24 24
     --ipam-opt=map[]         Set custom IPAM driver specific options
25
+    --ipv6                   Enable IPv6 networking
25 26
     -o --opt=map[]           Set custom driver specific options
26 27
     --subnet=[]              Subnet in CIDR format that represents a network segment
27 28
 
... ...
@@ -134,7 +135,13 @@ The following are those options and the equivalent docker daemon flags used for
134 134
 | `com.docker.network.bridge.enable_icc`           | `--icc`     | Enable or Disable Inter Container Connectivity        |
135 135
 | `com.docker.network.bridge.host_binding_ipv4`    | `--ip`      | Default IP when binding container ports               |
136 136
 | `com.docker.network.mtu`                         | `--mtu`     | Set the containers network MTU                        |
137
-| `com.docker.network.enable_ipv6`                 | `--ipv6`    | Enable IPv6 networking                                |
137
+
138
+The following arguments can be passed to `docker network create` for any network driver.
139
+
140
+| Argument     | Equivalent | Description                              |
141
+|--------------|------------|------------------------------------------|
142
+| `--internal` | -          | Restricts external access to the network |
143
+| `--ipv6`     | `--ipv6`   | Enable IPv6 networking                   |
138 144
 
139 145
 For example, let's use `-o` or `--opt` options to specify an IP address binding when publishing ports:
140 146
 
... ...
@@ -111,7 +111,13 @@ The following are those options and the equivalent docker daemon flags used for
111 111
 | `com.docker.network.bridge.enable_icc`           | `--icc`     | Enable or Disable Inter Container Connectivity        |
112 112
 | `com.docker.network.bridge.host_binding_ipv4`    | `--ip`      | Default IP when binding container ports               |
113 113
 | `com.docker.network.mtu`                         | `--mtu`     | Set the containers network MTU                        |
114
-| `com.docker.network.enable_ipv6`                 | `--ipv6`    | Enable IPv6 networking                                |
114
+
115
+The following arguments can be passed to `docker network create` for any network driver.
116
+
117
+| Argument     | Equivalent | Description                              |
118
+|--------------|------------|------------------------------------------|
119
+| `--internal` | -          | Restricts external access to the network |
120
+| `--ipv6`     | `--ipv6`   | Enable IPv6 networking                   |
115 121
 
116 122
 For example, now let's use `-o` or `--opt` options to specify an IP address binding when publishing ports:
117 123
 
... ...
@@ -84,6 +84,8 @@ func (s *DockerSuite) TestApiNetworkInspect(c *check.C) {
84 84
 	nr = getNetworkResource(c, nr.ID)
85 85
 	c.Assert(nr.Driver, checker.Equals, "bridge")
86 86
 	c.Assert(nr.Scope, checker.Equals, "local")
87
+	c.Assert(nr.Internal, checker.Equals, false)
88
+	c.Assert(nr.EnableIPv6, checker.Equals, false)
87 89
 	c.Assert(nr.IPAM.Driver, checker.Equals, "default")
88 90
 	c.Assert(len(nr.Containers), checker.Equals, 1)
89 91
 	c.Assert(nr.Containers[containerID], checker.NotNil)
... ...
@@ -574,18 +574,24 @@ func (s *DockerNetworkSuite) TestDockerNetworkInspectDefault(c *check.C) {
574 574
 	nr := getNetworkResource(c, "none")
575 575
 	c.Assert(nr.Driver, checker.Equals, "null")
576 576
 	c.Assert(nr.Scope, checker.Equals, "local")
577
+	c.Assert(nr.Internal, checker.Equals, false)
578
+	c.Assert(nr.EnableIPv6, checker.Equals, false)
577 579
 	c.Assert(nr.IPAM.Driver, checker.Equals, "default")
578 580
 	c.Assert(len(nr.IPAM.Config), checker.Equals, 0)
579 581
 
580 582
 	nr = getNetworkResource(c, "host")
581 583
 	c.Assert(nr.Driver, checker.Equals, "host")
582 584
 	c.Assert(nr.Scope, checker.Equals, "local")
585
+	c.Assert(nr.Internal, checker.Equals, false)
586
+	c.Assert(nr.EnableIPv6, checker.Equals, false)
583 587
 	c.Assert(nr.IPAM.Driver, checker.Equals, "default")
584 588
 	c.Assert(len(nr.IPAM.Config), checker.Equals, 0)
585 589
 
586 590
 	nr = getNetworkResource(c, "bridge")
587 591
 	c.Assert(nr.Driver, checker.Equals, "bridge")
588 592
 	c.Assert(nr.Scope, checker.Equals, "local")
593
+	c.Assert(nr.Internal, checker.Equals, false)
594
+	c.Assert(nr.EnableIPv6, checker.Equals, false)
589 595
 	c.Assert(nr.IPAM.Driver, checker.Equals, "default")
590 596
 	c.Assert(len(nr.IPAM.Config), checker.Equals, 1)
591 597
 	c.Assert(nr.IPAM.Config[0].Subnet, checker.NotNil)
... ...
@@ -600,6 +606,8 @@ func (s *DockerNetworkSuite) TestDockerNetworkInspectCustomUnspecified(c *check.
600 600
 	nr := getNetworkResource(c, "test01")
601 601
 	c.Assert(nr.Driver, checker.Equals, "bridge")
602 602
 	c.Assert(nr.Scope, checker.Equals, "local")
603
+	c.Assert(nr.Internal, checker.Equals, false)
604
+	c.Assert(nr.EnableIPv6, checker.Equals, false)
603 605
 	c.Assert(nr.IPAM.Driver, checker.Equals, "default")
604 606
 	c.Assert(len(nr.IPAM.Config), checker.Equals, 1)
605 607
 	c.Assert(nr.IPAM.Config[0].Subnet, checker.NotNil)
... ...
@@ -610,12 +618,14 @@ func (s *DockerNetworkSuite) TestDockerNetworkInspectCustomUnspecified(c *check.
610 610
 }
611 611
 
612 612
 func (s *DockerNetworkSuite) TestDockerNetworkInspectCustomSpecified(c *check.C) {
613
-	dockerCmd(c, "network", "create", "--driver=bridge", "--subnet=172.28.0.0/16", "--ip-range=172.28.5.0/24", "--gateway=172.28.5.254", "br0")
613
+	dockerCmd(c, "network", "create", "--driver=bridge", "--ipv6", "--subnet=172.28.0.0/16", "--ip-range=172.28.5.0/24", "--gateway=172.28.5.254", "br0")
614 614
 	assertNwIsAvailable(c, "br0")
615 615
 
616 616
 	nr := getNetworkResource(c, "br0")
617 617
 	c.Assert(nr.Driver, checker.Equals, "bridge")
618 618
 	c.Assert(nr.Scope, checker.Equals, "local")
619
+	c.Assert(nr.Internal, checker.Equals, false)
620
+	c.Assert(nr.EnableIPv6, checker.Equals, true)
619 621
 	c.Assert(nr.IPAM.Driver, checker.Equals, "default")
620 622
 	c.Assert(len(nr.IPAM.Config), checker.Equals, 1)
621 623
 	c.Assert(nr.IPAM.Config[0].Subnet, checker.Equals, "172.28.0.0/16")
... ...
@@ -297,6 +297,9 @@ func (s *DockerSuite) TestPortExposeHostBinding(c *check.C) {
297 297
 func (s *DockerSuite) TestPortBindingOnSandbox(c *check.C) {
298 298
 	testRequires(c, DaemonIsLinux, NotUserNamespace)
299 299
 	dockerCmd(c, "network", "create", "--internal", "-d", "bridge", "internal-net")
300
+	nr := getNetworkResource(c, "internal-net")
301
+	c.Assert(nr.Internal, checker.Equals, true)
302
+
300 303
 	dockerCmd(c, "run", "--net", "internal-net", "-d", "--name", "c1",
301 304
 		"-p", "8080:8080", "busybox", "nc", "-l", "-p", "8080")
302 305
 	c.Assert(waitRun("c1"), check.IsNil)
... ...
@@ -14,6 +14,7 @@ docker-network-create - create a new network
14 14
 [**--ip-range**=*[]*]
15 15
 [**--ipam-driver**=*default*]
16 16
 [**--ipam-opt**=*map[]*]
17
+[**--ipv6**]
17 18
 [**-o**|**--opt**=*map[]*]
18 19
 [**--subnet**=*[]*]
19 20
 NETWORK-NAME
... ...
@@ -152,6 +153,9 @@ If you want to create an externally isolated `overlay` network, you can specify
152 152
 **--ipam-opt**=map[]
153 153
   Set custom IPAM driver options
154 154
 
155
+**--ipv6**
156
+  Enable IPv6 networking
157
+
155 158
 **-o**, **--opt**=map[]
156 159
   Set custom driver options
157 160