Browse code

Windows: Refactor network modes

Signed-off-by: John Howard <jhoward@microsoft.com>

John Howard authored on 2015/06/24 02:13:42
Showing 10 changed files
... ...
@@ -65,22 +65,17 @@ func populateCommand(c *Container, env []string) error {
65 65
 		Interface: nil,
66 66
 	}
67 67
 
68
-	// TODO Windows. Appropriate network mode (will refactor as part of
69
-	// libnetwork. For now, even through bridge not used, let it succeed to
70
-	// allow the Windows daemon to limp during its bring-up
71 68
 	parts := strings.SplitN(string(c.hostConfig.NetworkMode), ":", 2)
72 69
 	switch parts[0] {
70
+
73 71
 	case "none":
74
-	case "bridge", "": // empty string to support existing containers
72
+	case "default", "": // empty string to support existing containers
75 73
 		if !c.Config.NetworkDisabled {
76 74
 			network := c.NetworkSettings
77 75
 			en.Interface = &execdriver.NetworkInterface{
78
-				Bridge:     network.Bridge,
79 76
 				MacAddress: network.MacAddress,
80 77
 			}
81 78
 		}
82
-	case "host", "container":
83
-		return fmt.Errorf("unsupported network mode: %s", c.hostConfig.NetworkMode)
84 79
 	default:
85 80
 		return fmt.Errorf("invalid network mode: %s", c.hostConfig.NetworkMode)
86 81
 	}
... ...
@@ -29,7 +29,6 @@ import (
29 29
 	"github.com/docker/docker/pkg/graphdb"
30 30
 	"github.com/docker/docker/pkg/ioutils"
31 31
 	"github.com/docker/docker/pkg/namesgenerator"
32
-	"github.com/docker/docker/pkg/parsers"
33 32
 	"github.com/docker/docker/pkg/stringid"
34 33
 	"github.com/docker/docker/pkg/sysinfo"
35 34
 	"github.com/docker/docker/pkg/system"
... ...
@@ -553,43 +552,6 @@ func (daemon *Daemon) RegisterLink(parent, child *Container, alias string) error
553 553
 	return nil
554 554
 }
555 555
 
556
-func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error {
557
-	if hostConfig != nil && hostConfig.Links != nil {
558
-		for _, l := range hostConfig.Links {
559
-			name, alias, err := parsers.ParseLink(l)
560
-			if err != nil {
561
-				return err
562
-			}
563
-			child, err := daemon.Get(name)
564
-			if err != nil {
565
-				//An error from daemon.Get() means this name could not be found
566
-				return fmt.Errorf("Could not get container for %s", name)
567
-			}
568
-			for child.hostConfig.NetworkMode.IsContainer() {
569
-				parts := strings.SplitN(string(child.hostConfig.NetworkMode), ":", 2)
570
-				child, err = daemon.Get(parts[1])
571
-				if err != nil {
572
-					return fmt.Errorf("Could not get container for %s", parts[1])
573
-				}
574
-			}
575
-			if child.hostConfig.NetworkMode.IsHost() {
576
-				return runconfig.ErrConflictHostNetworkAndLinks
577
-			}
578
-			if err := daemon.RegisterLink(container, child, alias); err != nil {
579
-				return err
580
-			}
581
-		}
582
-
583
-		// After we load all the links into the daemon
584
-		// set them to nil on the hostconfig
585
-		hostConfig.Links = nil
586
-		if err := container.WriteHostConfig(); err != nil {
587
-			return err
588
-		}
589
-	}
590
-	return nil
591
-}
592
-
593 556
 func NewDaemon(config *Config, registryService *registry.Service) (daemon *Daemon, err error) {
594 557
 	setDefaultMtu(config)
595 558
 
... ...
@@ -17,6 +17,7 @@ import (
17 17
 	"github.com/docker/docker/daemon/graphdriver"
18 18
 	"github.com/docker/docker/pkg/archive"
19 19
 	"github.com/docker/docker/pkg/fileutils"
20
+	"github.com/docker/docker/pkg/parsers"
20 21
 	"github.com/docker/docker/pkg/parsers/kernel"
21 22
 	"github.com/docker/docker/pkg/system"
22 23
 	"github.com/docker/docker/runconfig"
... ...
@@ -460,3 +461,44 @@ func setupInitLayer(initLayer string) error {
460 460
 func (daemon *Daemon) NetworkApiRouter() func(w http.ResponseWriter, req *http.Request) {
461 461
 	return nwapi.NewHTTPHandler(daemon.netController)
462 462
 }
463
+
464
+func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error {
465
+
466
+	if hostConfig == nil || hostConfig.Links == nil {
467
+		return nil
468
+	}
469
+
470
+	for _, l := range hostConfig.Links {
471
+		name, alias, err := parsers.ParseLink(l)
472
+		if err != nil {
473
+			return err
474
+		}
475
+		child, err := daemon.Get(name)
476
+		if err != nil {
477
+			//An error from daemon.Get() means this name could not be found
478
+			return fmt.Errorf("Could not get container for %s", name)
479
+		}
480
+		for child.hostConfig.NetworkMode.IsContainer() {
481
+			parts := strings.SplitN(string(child.hostConfig.NetworkMode), ":", 2)
482
+			child, err = daemon.Get(parts[1])
483
+			if err != nil {
484
+				return fmt.Errorf("Could not get container for %s", parts[1])
485
+			}
486
+		}
487
+		if child.hostConfig.NetworkMode.IsHost() {
488
+			return runconfig.ErrConflictHostNetworkAndLinks
489
+		}
490
+		if err := daemon.RegisterLink(container, child, alias); err != nil {
491
+			return err
492
+		}
493
+	}
494
+
495
+	// After we load all the links into the daemon
496
+	// set them to nil on the hostconfig
497
+	hostConfig.Links = nil
498
+	if err := container.WriteHostConfig(); err != nil {
499
+		return err
500
+	}
501
+
502
+	return nil
503
+}
... ...
@@ -8,6 +8,7 @@ import (
8 8
 
9 9
 	"github.com/docker/docker/daemon/graphdriver"
10 10
 	"github.com/docker/docker/pkg/archive"
11
+	"github.com/docker/docker/pkg/parsers"
11 12
 	"github.com/docker/docker/runconfig"
12 13
 	"github.com/docker/libnetwork"
13 14
 )
... ...
@@ -103,3 +104,35 @@ func initNetworkController(config *Config) (libnetwork.NetworkController, error)
103 103
 	// TODO Windows
104 104
 	return nil, nil
105 105
 }
106
+
107
+func (daemon *Daemon) RegisterLinks(container *Container, hostConfig *runconfig.HostConfig) error {
108
+	// TODO Windows. Factored out for network modes. There may be more
109
+	// refactoring required here.
110
+
111
+	if hostConfig == nil || hostConfig.Links == nil {
112
+		return nil
113
+	}
114
+
115
+	for _, l := range hostConfig.Links {
116
+		name, alias, err := parsers.ParseLink(l)
117
+		if err != nil {
118
+			return err
119
+		}
120
+		child, err := daemon.Get(name)
121
+		if err != nil {
122
+			//An error from daemon.Get() means this name could not be found
123
+			return fmt.Errorf("Could not get container for %s", name)
124
+		}
125
+		if err := daemon.RegisterLink(container, child, alias); err != nil {
126
+			return err
127
+		}
128
+	}
129
+
130
+	// After we load all the links into the daemon
131
+	// set them to nil on the hostconfig
132
+	hostConfig.Links = nil
133
+	if err := container.WriteHostConfig(); err != nil {
134
+		return err
135
+	}
136
+	return nil
137
+}
... ...
@@ -16,51 +16,6 @@ type KeyValuePair struct {
16 16
 
17 17
 type NetworkMode string
18 18
 
19
-// IsPrivate indicates whether container use it's private network stack
20
-func (n NetworkMode) IsPrivate() bool {
21
-	return !(n.IsHost() || n.IsContainer())
22
-}
23
-
24
-func (n NetworkMode) IsDefault() bool {
25
-	return n == "default"
26
-}
27
-
28
-func DefaultDaemonNetworkMode() NetworkMode {
29
-	return NetworkMode("bridge")
30
-}
31
-
32
-func (n NetworkMode) NetworkName() string {
33
-	if n.IsBridge() {
34
-		return "bridge"
35
-	} else if n.IsHost() {
36
-		return "host"
37
-	} else if n.IsContainer() {
38
-		return "container"
39
-	} else if n.IsNone() {
40
-		return "none"
41
-	} else if n.IsDefault() {
42
-		return "default"
43
-	}
44
-	return ""
45
-}
46
-
47
-func (n NetworkMode) IsBridge() bool {
48
-	return n == "bridge"
49
-}
50
-
51
-func (n NetworkMode) IsHost() bool {
52
-	return n == "host"
53
-}
54
-
55
-func (n NetworkMode) IsContainer() bool {
56
-	parts := strings.SplitN(string(n), ":", 2)
57
-	return len(parts) > 1 && parts[0] == "container"
58
-}
59
-
60
-func (n NetworkMode) IsNone() bool {
61
-	return n == "none"
62
-}
63
-
64 19
 type IpcMode string
65 20
 
66 21
 // IsPrivate indicates whether container use it's private ipc stack
67 22
new file mode 100644
... ...
@@ -0,0 +1,52 @@
0
+// +build !windows
1
+
2
+package runconfig
3
+
4
+import (
5
+	"strings"
6
+)
7
+
8
+// IsPrivate indicates whether container use it's private network stack
9
+func (n NetworkMode) IsPrivate() bool {
10
+	return !(n.IsHost() || n.IsContainer())
11
+}
12
+
13
+func (n NetworkMode) IsDefault() bool {
14
+	return n == "default"
15
+}
16
+
17
+func DefaultDaemonNetworkMode() NetworkMode {
18
+	return NetworkMode("bridge")
19
+}
20
+
21
+func (n NetworkMode) NetworkName() string {
22
+	if n.IsBridge() {
23
+		return "bridge"
24
+	} else if n.IsHost() {
25
+		return "host"
26
+	} else if n.IsContainer() {
27
+		return "container"
28
+	} else if n.IsNone() {
29
+		return "none"
30
+	} else if n.IsDefault() {
31
+		return "default"
32
+	}
33
+	return ""
34
+}
35
+
36
+func (n NetworkMode) IsBridge() bool {
37
+	return n == "bridge"
38
+}
39
+
40
+func (n NetworkMode) IsHost() bool {
41
+	return n == "host"
42
+}
43
+
44
+func (n NetworkMode) IsContainer() bool {
45
+	parts := strings.SplitN(string(n), ":", 2)
46
+	return len(parts) > 1 && parts[0] == "container"
47
+}
48
+
49
+func (n NetworkMode) IsNone() bool {
50
+	return n == "none"
51
+}
0 52
new file mode 100644
... ...
@@ -0,0 +1,18 @@
0
+// +build !windows
1
+
2
+package runconfig
3
+
4
+func (n NetworkMode) IsDefault() bool {
5
+	return n == "default"
6
+}
7
+
8
+func DefaultDaemonNetworkMode() NetworkMode {
9
+	return NetworkMode("default")
10
+}
11
+
12
+func (n NetworkMode) NetworkName() string {
13
+	if n.IsDefault() {
14
+		return "default"
15
+	}
16
+	return ""
17
+}
... ...
@@ -24,6 +24,19 @@ var (
24 24
 	ErrConflictNetworkExposePorts       = fmt.Errorf("Conflicting options: --expose and the network mode (--expose)")
25 25
 )
26 26
 
27
+// validateNM is the set of fields passed to validateNetMode()
28
+type validateNM struct {
29
+	netMode      NetworkMode
30
+	flHostname   *string
31
+	flLinks      opts.ListOpts
32
+	flDns        opts.ListOpts
33
+	flExtraHosts opts.ListOpts
34
+	flMacAddress *string
35
+	flPublish    opts.ListOpts
36
+	flPublishAll *bool
37
+	flExpose     opts.ListOpts
38
+}
39
+
27 40
 func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSet, error) {
28 41
 	var (
29 42
 		// FIXME: use utils.ListOpts for attach and volumes?
... ...
@@ -121,37 +134,22 @@ func Parse(cmd *flag.FlagSet, args []string) (*Config, *HostConfig, *flag.FlagSe
121 121
 		return nil, nil, cmd, fmt.Errorf("--net: invalid net mode: %v", err)
122 122
 	}
123 123
 
124
-	if (netMode.IsHost() || netMode.IsContainer()) && *flHostname != "" {
125
-		return nil, nil, cmd, ErrConflictNetworkHostname
126
-	}
127
-
128
-	if netMode.IsHost() && flLinks.Len() > 0 {
129
-		return nil, nil, cmd, ErrConflictHostNetworkAndLinks
130
-	}
131
-
132
-	if netMode.IsContainer() && flLinks.Len() > 0 {
133
-		return nil, nil, cmd, ErrConflictContainerNetworkAndLinks
134
-	}
135
-
136
-	if (netMode.IsHost() || netMode.IsContainer()) && flDns.Len() > 0 {
137
-		return nil, nil, cmd, ErrConflictNetworkAndDns
138
-	}
139
-
140
-	if (netMode.IsContainer() || netMode.IsHost()) && flExtraHosts.Len() > 0 {
141
-		return nil, nil, cmd, ErrConflictNetworkHosts
124
+	vals := validateNM{
125
+		netMode:      netMode,
126
+		flHostname:   flHostname,
127
+		flLinks:      flLinks,
128
+		flDns:        flDns,
129
+		flExtraHosts: flExtraHosts,
130
+		flMacAddress: flMacAddress,
131
+		flPublish:    flPublish,
132
+		flPublishAll: flPublishAll,
133
+		flExpose:     flExpose,
142 134
 	}
143 135
 
144
-	if (netMode.IsContainer() || netMode.IsHost()) && *flMacAddress != "" {
145
-		return nil, nil, cmd, ErrConflictContainerNetworkAndMac
146
-	}
147
-
148
-	if netMode.IsContainer() && (flPublish.Len() > 0 || *flPublishAll == true) {
149
-		return nil, nil, cmd, ErrConflictNetworkPublishPorts
136
+	if err := validateNetMode(&vals); err != nil {
137
+		return nil, nil, cmd, err
150 138
 	}
151 139
 
152
-	if netMode.IsContainer() && flExpose.Len() > 0 {
153
-		return nil, nil, cmd, ErrConflictNetworkExposePorts
154
-	}
155 140
 	// Validate the input mac address
156 141
 	if *flMacAddress != "" {
157 142
 		if _, err := opts.ValidateMACAddress(*flMacAddress); err != nil {
... ...
@@ -463,20 +461,6 @@ func parseKeyValueOpts(opts opts.ListOpts) ([]KeyValuePair, error) {
463 463
 	return out, nil
464 464
 }
465 465
 
466
-func parseNetMode(netMode string) (NetworkMode, error) {
467
-	parts := strings.Split(netMode, ":")
468
-	switch mode := parts[0]; mode {
469
-	case "default", "bridge", "none", "host":
470
-	case "container":
471
-		if len(parts) < 2 || parts[1] == "" {
472
-			return "", fmt.Errorf("invalid container format container:<name|id>")
473
-		}
474
-	default:
475
-		return "", fmt.Errorf("invalid --net: %s", netMode)
476
-	}
477
-	return NetworkMode(netMode), nil
478
-}
479
-
480 466
 func ParseDevice(device string) (DeviceMapping, error) {
481 467
 	src := ""
482 468
 	dst := ""
483 469
new file mode 100644
... ...
@@ -0,0 +1,58 @@
0
+// +build !windows
1
+
2
+package runconfig
3
+
4
+import (
5
+	"fmt"
6
+	"strings"
7
+)
8
+
9
+func parseNetMode(netMode string) (NetworkMode, error) {
10
+	parts := strings.Split(netMode, ":")
11
+	switch mode := parts[0]; mode {
12
+	case "default", "bridge", "none", "host":
13
+	case "container":
14
+		if len(parts) < 2 || parts[1] == "" {
15
+			return "", fmt.Errorf("invalid container format container:<name|id>")
16
+		}
17
+	default:
18
+		return "", fmt.Errorf("invalid --net: %s", netMode)
19
+	}
20
+	return NetworkMode(netMode), nil
21
+}
22
+
23
+func validateNetMode(vals *validateNM) error {
24
+
25
+	if (vals.netMode.IsHost() || vals.netMode.IsContainer()) && *vals.flHostname != "" {
26
+		return ErrConflictNetworkHostname
27
+	}
28
+
29
+	if vals.netMode.IsHost() && vals.flLinks.Len() > 0 {
30
+		return ErrConflictHostNetworkAndLinks
31
+	}
32
+
33
+	if vals.netMode.IsContainer() && vals.flLinks.Len() > 0 {
34
+		return ErrConflictContainerNetworkAndLinks
35
+	}
36
+
37
+	if (vals.netMode.IsHost() || vals.netMode.IsContainer()) && vals.flDns.Len() > 0 {
38
+		return ErrConflictNetworkAndDns
39
+	}
40
+
41
+	if (vals.netMode.IsContainer() || vals.netMode.IsHost()) && vals.flExtraHosts.Len() > 0 {
42
+		return ErrConflictNetworkHosts
43
+	}
44
+
45
+	if (vals.netMode.IsContainer() || vals.netMode.IsHost()) && *vals.flMacAddress != "" {
46
+		return ErrConflictContainerNetworkAndMac
47
+	}
48
+
49
+	if vals.netMode.IsContainer() && (vals.flPublish.Len() > 0 || *vals.flPublishAll == true) {
50
+		return ErrConflictNetworkPublishPorts
51
+	}
52
+
53
+	if vals.netMode.IsContainer() && vals.flExpose.Len() > 0 {
54
+		return ErrConflictNetworkExposePorts
55
+	}
56
+	return nil
57
+}
0 58
new file mode 100644
... ...
@@ -0,0 +1,20 @@
0
+package runconfig
1
+
2
+import (
3
+	"fmt"
4
+	"strings"
5
+)
6
+
7
+func parseNetMode(netMode string) (NetworkMode, error) {
8
+	parts := strings.Split(netMode, ":")
9
+	switch mode := parts[0]; mode {
10
+	case "default":
11
+	default:
12
+		return "", fmt.Errorf("invalid --net: %s", netMode)
13
+	}
14
+	return NetworkMode(netMode), nil
15
+}
16
+
17
+func validateNetMode(vals *validateNM) error {
18
+	return nil
19
+}