Browse code

Expose bridge IPv6 setting to `docker network inspect`

Signed-off-by: Aidan Hobson Sayers <aidanhs@cantab.net>

Aidan Hobson Sayers authored on 2015/12/10 23:02:50
Showing 8 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, "enables IPv6 on the network")
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)
... ...
@@ -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
 	}
... ...
@@ -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)