Browse code

Move links to sub pkg Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)

Michael Crosby authored on 2014/02/15 11:18:16
Showing 5 changed files
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"github.com/dotcloud/docker/engine"
9 9
 	"github.com/dotcloud/docker/execdriver"
10 10
 	"github.com/dotcloud/docker/graphdriver"
11
+	"github.com/dotcloud/docker/links"
11 12
 	"github.com/dotcloud/docker/nat"
12 13
 	"github.com/dotcloud/docker/pkg/mount"
13 14
 	"github.com/dotcloud/docker/pkg/term"
... ...
@@ -71,7 +72,7 @@ type Container struct {
71 71
 	VolumesRW  map[string]bool
72 72
 	hostConfig *runconfig.HostConfig
73 73
 
74
-	activeLinks map[string]*Link
74
+	activeLinks map[string]*links.Link
75 75
 }
76 76
 
77 77
 type BindMap struct {
... ...
@@ -537,7 +538,7 @@ func (container *Container) Start() (err error) {
537 537
 	}
538 538
 
539 539
 	if len(children) > 0 {
540
-		container.activeLinks = make(map[string]*Link, len(children))
540
+		container.activeLinks = make(map[string]*links.Link, len(children))
541 541
 
542 542
 		// If we encounter an error make sure that we rollback any network
543 543
 		// config and ip table changes
... ...
@@ -553,7 +554,7 @@ func (container *Container) Start() (err error) {
553 553
 				return fmt.Errorf("Cannot link to a non running container: %s AS %s", child.Name, linkAlias)
554 554
 			}
555 555
 
556
-			link, err := NewLink(
556
+			link, err := links.NewLink(
557 557
 				container.NetworkSettings.IPAddress,
558 558
 				child.NetworkSettings.IPAddress,
559 559
 				linkAlias,
560 560
deleted file mode 100644
... ...
@@ -1,137 +0,0 @@
1
-package docker
2
-
3
-import (
4
-	"fmt"
5
-	"github.com/dotcloud/docker/engine"
6
-	"github.com/dotcloud/docker/nat"
7
-	"path"
8
-	"strings"
9
-)
10
-
11
-type Link struct {
12
-	ParentIP         string
13
-	ChildIP          string
14
-	Name             string
15
-	ChildEnvironment []string
16
-	Ports            []nat.Port
17
-	IsEnabled        bool
18
-	eng              *engine.Engine
19
-}
20
-
21
-func NewLink(parentIP, childIP, name string, env []string, exposedPorts map[nat.Port]struct{}, eng *engine.Engine) (*Link, error) {
22
-
23
-	var (
24
-		i     int
25
-		ports = make([]nat.Port, len(exposedPorts))
26
-	)
27
-
28
-	for p := range exposedPorts {
29
-		ports[i] = p
30
-		i++
31
-	}
32
-
33
-	l := &Link{
34
-		Name:             name,
35
-		ChildIP:          childIP,
36
-		ParentIP:         parentIP,
37
-		ChildEnvironment: env,
38
-		Ports:            ports,
39
-		eng:              eng,
40
-	}
41
-	return l, nil
42
-
43
-}
44
-
45
-func (l *Link) Alias() string {
46
-	_, alias := path.Split(l.Name)
47
-	return alias
48
-}
49
-
50
-func (l *Link) ToEnv() []string {
51
-	env := []string{}
52
-	alias := strings.ToUpper(l.Alias())
53
-
54
-	if p := l.getDefaultPort(); p != nil {
55
-		env = append(env, fmt.Sprintf("%s_PORT=%s://%s:%s", alias, p.Proto(), l.ChildIP, p.Port()))
56
-	}
57
-
58
-	// Load exposed ports into the environment
59
-	for _, p := range l.Ports {
60
-		env = append(env, fmt.Sprintf("%s_PORT_%s_%s=%s://%s:%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto(), l.ChildIP, p.Port()))
61
-		env = append(env, fmt.Sprintf("%s_PORT_%s_%s_ADDR=%s", alias, p.Port(), strings.ToUpper(p.Proto()), l.ChildIP))
62
-		env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PORT=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Port()))
63
-		env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PROTO=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto()))
64
-	}
65
-
66
-	// Load the linked container's name into the environment
67
-	env = append(env, fmt.Sprintf("%s_NAME=%s", alias, l.Name))
68
-
69
-	if l.ChildEnvironment != nil {
70
-		for _, v := range l.ChildEnvironment {
71
-			parts := strings.Split(v, "=")
72
-			if len(parts) != 2 {
73
-				continue
74
-			}
75
-			// Ignore a few variables that are added during docker build
76
-			if parts[0] == "HOME" || parts[0] == "PATH" {
77
-				continue
78
-			}
79
-			env = append(env, fmt.Sprintf("%s_ENV_%s=%s", alias, parts[0], parts[1]))
80
-		}
81
-	}
82
-	return env
83
-}
84
-
85
-// Default port rules
86
-func (l *Link) getDefaultPort() *nat.Port {
87
-	var p nat.Port
88
-	i := len(l.Ports)
89
-
90
-	if i == 0 {
91
-		return nil
92
-	} else if i > 1 {
93
-		nat.Sort(l.Ports, func(ip, jp nat.Port) bool {
94
-			// If the two ports have the same number, tcp takes priority
95
-			// Sort in desc order
96
-			return ip.Int() < jp.Int() || (ip.Int() == jp.Int() && strings.ToLower(ip.Proto()) == "tcp")
97
-		})
98
-	}
99
-	p = l.Ports[0]
100
-	return &p
101
-}
102
-
103
-func (l *Link) Enable() error {
104
-	if err := l.toggle("-I", false); err != nil {
105
-		return err
106
-	}
107
-	l.IsEnabled = true
108
-	return nil
109
-}
110
-
111
-func (l *Link) Disable() {
112
-	// We do not care about errors here because the link may not
113
-	// exist in iptables
114
-	l.toggle("-D", true)
115
-
116
-	l.IsEnabled = false
117
-}
118
-
119
-func (l *Link) toggle(action string, ignoreErrors bool) error {
120
-	job := l.eng.Job("link", action)
121
-
122
-	job.Setenv("ParentIP", l.ParentIP)
123
-	job.Setenv("ChildIP", l.ChildIP)
124
-	job.SetenvBool("IgnoreErrors", ignoreErrors)
125
-
126
-	out := make([]string, len(l.Ports))
127
-	for i, p := range l.Ports {
128
-		out[i] = fmt.Sprintf("%s/%s", p.Port(), p.Proto())
129
-	}
130
-	job.SetenvList("Ports", out)
131
-
132
-	if err := job.Run(); err != nil {
133
-		// TODO: get ouput from job
134
-		return err
135
-	}
136
-	return nil
137
-}
138 1
new file mode 100644
... ...
@@ -0,0 +1,137 @@
0
+package links
1
+
2
+import (
3
+	"fmt"
4
+	"github.com/dotcloud/docker/engine"
5
+	"github.com/dotcloud/docker/nat"
6
+	"path"
7
+	"strings"
8
+)
9
+
10
+type Link struct {
11
+	ParentIP         string
12
+	ChildIP          string
13
+	Name             string
14
+	ChildEnvironment []string
15
+	Ports            []nat.Port
16
+	IsEnabled        bool
17
+	eng              *engine.Engine
18
+}
19
+
20
+func NewLink(parentIP, childIP, name string, env []string, exposedPorts map[nat.Port]struct{}, eng *engine.Engine) (*Link, error) {
21
+
22
+	var (
23
+		i     int
24
+		ports = make([]nat.Port, len(exposedPorts))
25
+	)
26
+
27
+	for p := range exposedPorts {
28
+		ports[i] = p
29
+		i++
30
+	}
31
+
32
+	l := &Link{
33
+		Name:             name,
34
+		ChildIP:          childIP,
35
+		ParentIP:         parentIP,
36
+		ChildEnvironment: env,
37
+		Ports:            ports,
38
+		eng:              eng,
39
+	}
40
+	return l, nil
41
+
42
+}
43
+
44
+func (l *Link) Alias() string {
45
+	_, alias := path.Split(l.Name)
46
+	return alias
47
+}
48
+
49
+func (l *Link) ToEnv() []string {
50
+	env := []string{}
51
+	alias := strings.ToUpper(l.Alias())
52
+
53
+	if p := l.getDefaultPort(); p != nil {
54
+		env = append(env, fmt.Sprintf("%s_PORT=%s://%s:%s", alias, p.Proto(), l.ChildIP, p.Port()))
55
+	}
56
+
57
+	// Load exposed ports into the environment
58
+	for _, p := range l.Ports {
59
+		env = append(env, fmt.Sprintf("%s_PORT_%s_%s=%s://%s:%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto(), l.ChildIP, p.Port()))
60
+		env = append(env, fmt.Sprintf("%s_PORT_%s_%s_ADDR=%s", alias, p.Port(), strings.ToUpper(p.Proto()), l.ChildIP))
61
+		env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PORT=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Port()))
62
+		env = append(env, fmt.Sprintf("%s_PORT_%s_%s_PROTO=%s", alias, p.Port(), strings.ToUpper(p.Proto()), p.Proto()))
63
+	}
64
+
65
+	// Load the linked container's name into the environment
66
+	env = append(env, fmt.Sprintf("%s_NAME=%s", alias, l.Name))
67
+
68
+	if l.ChildEnvironment != nil {
69
+		for _, v := range l.ChildEnvironment {
70
+			parts := strings.Split(v, "=")
71
+			if len(parts) != 2 {
72
+				continue
73
+			}
74
+			// Ignore a few variables that are added during docker build
75
+			if parts[0] == "HOME" || parts[0] == "PATH" {
76
+				continue
77
+			}
78
+			env = append(env, fmt.Sprintf("%s_ENV_%s=%s", alias, parts[0], parts[1]))
79
+		}
80
+	}
81
+	return env
82
+}
83
+
84
+// Default port rules
85
+func (l *Link) getDefaultPort() *nat.Port {
86
+	var p nat.Port
87
+	i := len(l.Ports)
88
+
89
+	if i == 0 {
90
+		return nil
91
+	} else if i > 1 {
92
+		nat.Sort(l.Ports, func(ip, jp nat.Port) bool {
93
+			// If the two ports have the same number, tcp takes priority
94
+			// Sort in desc order
95
+			return ip.Int() < jp.Int() || (ip.Int() == jp.Int() && strings.ToLower(ip.Proto()) == "tcp")
96
+		})
97
+	}
98
+	p = l.Ports[0]
99
+	return &p
100
+}
101
+
102
+func (l *Link) Enable() error {
103
+	if err := l.toggle("-I", false); err != nil {
104
+		return err
105
+	}
106
+	l.IsEnabled = true
107
+	return nil
108
+}
109
+
110
+func (l *Link) Disable() {
111
+	// We do not care about errors here because the link may not
112
+	// exist in iptables
113
+	l.toggle("-D", true)
114
+
115
+	l.IsEnabled = false
116
+}
117
+
118
+func (l *Link) toggle(action string, ignoreErrors bool) error {
119
+	job := l.eng.Job("link", action)
120
+
121
+	job.Setenv("ParentIP", l.ParentIP)
122
+	job.Setenv("ChildIP", l.ChildIP)
123
+	job.SetenvBool("IgnoreErrors", ignoreErrors)
124
+
125
+	out := make([]string, len(l.Ports))
126
+	for i, p := range l.Ports {
127
+		out[i] = fmt.Sprintf("%s/%s", p.Port(), p.Proto())
128
+	}
129
+	job.SetenvList("Ports", out)
130
+
131
+	if err := job.Run(); err != nil {
132
+		// TODO: get ouput from job
133
+		return err
134
+	}
135
+	return nil
136
+}
0 137
new file mode 100644
... ...
@@ -0,0 +1,79 @@
0
+package links
1
+
2
+import (
3
+	"github.com/dotcloud/docker/nat"
4
+	"strings"
5
+	"testing"
6
+)
7
+
8
+func TestLinkNew(t *testing.T) {
9
+	ports := make(nat.PortSet)
10
+	ports[nat.Port("6379/tcp")] = struct{}{}
11
+
12
+	link, err := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", nil, ports, nil)
13
+	if err != nil {
14
+		t.Fatal(err)
15
+	}
16
+
17
+	if link == nil {
18
+		t.FailNow()
19
+	}
20
+	if link.Name != "/db/docker" {
21
+		t.Fail()
22
+	}
23
+	if link.Alias() != "docker" {
24
+		t.Fail()
25
+	}
26
+	if link.ParentIP != "172.0.17.3" {
27
+		t.Fail()
28
+	}
29
+	if link.ChildIP != "172.0.17.2" {
30
+		t.Fail()
31
+	}
32
+	for _, p := range link.Ports {
33
+		if p != nat.Port("6379/tcp") {
34
+			t.Fail()
35
+		}
36
+	}
37
+}
38
+
39
+func TestLinkEnv(t *testing.T) {
40
+	ports := make(nat.PortSet)
41
+	ports[nat.Port("6379/tcp")] = struct{}{}
42
+
43
+	link, err := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", []string{"PASSWORD=gordon"}, ports, nil)
44
+	if err != nil {
45
+		t.Fatal(err)
46
+	}
47
+
48
+	rawEnv := link.ToEnv()
49
+	env := make(map[string]string, len(rawEnv))
50
+	for _, e := range rawEnv {
51
+		parts := strings.Split(e, "=")
52
+		if len(parts) != 2 {
53
+			t.FailNow()
54
+		}
55
+		env[parts[0]] = parts[1]
56
+	}
57
+	if env["DOCKER_PORT"] != "tcp://172.0.17.2:6379" {
58
+		t.Fatalf("Expected 172.0.17.2:6379, got %s", env["DOCKER_PORT"])
59
+	}
60
+	if env["DOCKER_PORT_6379_TCP"] != "tcp://172.0.17.2:6379" {
61
+		t.Fatalf("Expected tcp://172.0.17.2:6379, got %s", env["DOCKER_PORT_6379_TCP"])
62
+	}
63
+	if env["DOCKER_PORT_6379_TCP_PROTO"] != "tcp" {
64
+		t.Fatalf("Expected tcp, got %s", env["DOCKER_PORT_6379_TCP_PROTO"])
65
+	}
66
+	if env["DOCKER_PORT_6379_TCP_ADDR"] != "172.0.17.2" {
67
+		t.Fatalf("Expected 172.0.17.2, got %s", env["DOCKER_PORT_6379_TCP_ADDR"])
68
+	}
69
+	if env["DOCKER_PORT_6379_TCP_PORT"] != "6379" {
70
+		t.Fatalf("Expected 6379, got %s", env["DOCKER_PORT_6379_TCP_PORT"])
71
+	}
72
+	if env["DOCKER_NAME"] != "/db/docker" {
73
+		t.Fatalf("Expected /db/docker, got %s", env["DOCKER_NAME"])
74
+	}
75
+	if env["DOCKER_ENV_PASSWORD"] != "gordon" {
76
+		t.Fatalf("Expected gordon, got %s", env["DOCKER_ENV_PASSWORD"])
77
+	}
78
+}
0 79
deleted file mode 100644
... ...
@@ -1,79 +0,0 @@
1
-package docker
2
-
3
-import (
4
-	"github.com/dotcloud/docker/nat"
5
-	"strings"
6
-	"testing"
7
-)
8
-
9
-func TestLinkNew(t *testing.T) {
10
-	ports := make(nat.PortSet)
11
-	ports[nat.Port("6379/tcp")] = struct{}{}
12
-
13
-	link, err := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", nil, ports, nil)
14
-	if err != nil {
15
-		t.Fatal(err)
16
-	}
17
-
18
-	if link == nil {
19
-		t.FailNow()
20
-	}
21
-	if link.Name != "/db/docker" {
22
-		t.Fail()
23
-	}
24
-	if link.Alias() != "docker" {
25
-		t.Fail()
26
-	}
27
-	if link.ParentIP != "172.0.17.3" {
28
-		t.Fail()
29
-	}
30
-	if link.ChildIP != "172.0.17.2" {
31
-		t.Fail()
32
-	}
33
-	for _, p := range link.Ports {
34
-		if p != nat.Port("6379/tcp") {
35
-			t.Fail()
36
-		}
37
-	}
38
-}
39
-
40
-func TestLinkEnv(t *testing.T) {
41
-	ports := make(nat.PortSet)
42
-	ports[nat.Port("6379/tcp")] = struct{}{}
43
-
44
-	link, err := NewLink("172.0.17.3", "172.0.17.2", "/db/docker", []string{"PASSWORD=gordon"}, ports, nil)
45
-	if err != nil {
46
-		t.Fatal(err)
47
-	}
48
-
49
-	rawEnv := link.ToEnv()
50
-	env := make(map[string]string, len(rawEnv))
51
-	for _, e := range rawEnv {
52
-		parts := strings.Split(e, "=")
53
-		if len(parts) != 2 {
54
-			t.FailNow()
55
-		}
56
-		env[parts[0]] = parts[1]
57
-	}
58
-	if env["DOCKER_PORT"] != "tcp://172.0.17.2:6379" {
59
-		t.Fatalf("Expected 172.0.17.2:6379, got %s", env["DOCKER_PORT"])
60
-	}
61
-	if env["DOCKER_PORT_6379_TCP"] != "tcp://172.0.17.2:6379" {
62
-		t.Fatalf("Expected tcp://172.0.17.2:6379, got %s", env["DOCKER_PORT_6379_TCP"])
63
-	}
64
-	if env["DOCKER_PORT_6379_TCP_PROTO"] != "tcp" {
65
-		t.Fatalf("Expected tcp, got %s", env["DOCKER_PORT_6379_TCP_PROTO"])
66
-	}
67
-	if env["DOCKER_PORT_6379_TCP_ADDR"] != "172.0.17.2" {
68
-		t.Fatalf("Expected 172.0.17.2, got %s", env["DOCKER_PORT_6379_TCP_ADDR"])
69
-	}
70
-	if env["DOCKER_PORT_6379_TCP_PORT"] != "6379" {
71
-		t.Fatalf("Expected 6379, got %s", env["DOCKER_PORT_6379_TCP_PORT"])
72
-	}
73
-	if env["DOCKER_NAME"] != "/db/docker" {
74
-		t.Fatalf("Expected /db/docker, got %s", env["DOCKER_NAME"])
75
-	}
76
-	if env["DOCKER_ENV_PASSWORD"] != "gordon" {
77
-		t.Fatalf("Expected gordon, got %s", env["DOCKER_ENV_PASSWORD"])
78
-	}
79
-}