Browse code

Merge pull request #3201 from jpoimboe/libvirt-prereq-network

Set hostname and IP address from dockerinit

Victor Vieux authored on 2013/12/14 03:38:17
Showing 4 changed files
... ...
@@ -574,7 +574,11 @@ func (container *Container) Start() (err error) {
574 574
 
575 575
 	// Networking
576 576
 	if !container.Config.NetworkDisabled {
577
-		params = append(params, "-g", container.network.Gateway.String())
577
+		network := container.NetworkSettings
578
+		params = append(params,
579
+			"-g", network.Gateway,
580
+			"-i", fmt.Sprintf("%s/%d", network.IPAddress, network.IPPrefixLen),
581
+		)
578 582
 	}
579 583
 
580 584
 	// User
... ...
@@ -6,24 +6,15 @@ import (
6 6
 )
7 7
 
8 8
 const LxcTemplate = `
9
-# hostname
10
-{{if .Config.Hostname}}
11
-lxc.utsname = {{.Config.Hostname}}
12
-{{else}}
13
-lxc.utsname = {{.Id}}
14
-{{end}}
15
-
16 9
 {{if .Config.NetworkDisabled}}
17 10
 # network is disabled (-n=false)
18 11
 lxc.network.type = empty
19 12
 {{else}}
20 13
 # network configuration
21 14
 lxc.network.type = veth
22
-lxc.network.flags = up
23 15
 lxc.network.link = {{.NetworkSettings.Bridge}}
24 16
 lxc.network.name = eth0
25 17
 lxc.network.mtu = 1500
26
-lxc.network.ipv4 = {{.NetworkSettings.IPAddress}}/{{.NetworkSettings.IPPrefixLen}}
27 18
 {{end}}
28 19
 
29 20
 # root filesystem
... ...
@@ -29,7 +29,6 @@ func TestLXCConfig(t *testing.T) {
29 29
 	container := &Container{
30 30
 		root: root,
31 31
 		Config: &Config{
32
-			Hostname:        "foobar",
33 32
 			Memory:          int64(mem),
34 33
 			CpuShares:       int64(cpu),
35 34
 			NetworkDisabled: true,
... ...
@@ -41,7 +40,6 @@ func TestLXCConfig(t *testing.T) {
41 41
 	if err := container.generateLXCConfig(); err != nil {
42 42
 		t.Fatal(err)
43 43
 	}
44
-	grepFile(t, container.lxcConfigPath(), "lxc.utsname = foobar")
45 44
 	grepFile(t, container.lxcConfigPath(),
46 45
 		fmt.Sprintf("lxc.cgroup.memory.limit_in_bytes = %d", mem))
47 46
 	grepFile(t, container.lxcConfigPath(),
... ...
@@ -20,25 +20,58 @@ import (
20 20
 type DockerInitArgs struct {
21 21
 	user       string
22 22
 	gateway    string
23
+	ip         string
23 24
 	workDir    string
24 25
 	privileged bool
25 26
 	env        []string
26 27
 	args       []string
27 28
 }
28 29
 
29
-// Setup networking
30
-func setupNetworking(args *DockerInitArgs) error {
31
-	if args.gateway == "" {
30
+func setupHostname(args *DockerInitArgs) error {
31
+	hostname := getEnv(args, "HOSTNAME")
32
+	if hostname == "" {
32 33
 		return nil
33 34
 	}
35
+	return syscall.Sethostname([]byte(hostname))
36
+}
37
+
38
+// Setup networking
39
+func setupNetworking(args *DockerInitArgs) error {
40
+	if args.ip != "" {
41
+		// eth0
42
+		iface, err := net.InterfaceByName("eth0")
43
+		if err != nil {
44
+			return fmt.Errorf("Unable to set up networking: %v", err)
45
+		}
46
+		ip, ipNet, err := net.ParseCIDR(args.ip)
47
+		if err != nil {
48
+			return fmt.Errorf("Unable to set up networking: %v", err)
49
+		}
50
+		if err := netlink.NetworkLinkAddIp(iface, ip, ipNet); err != nil {
51
+			return fmt.Errorf("Unable to set up networking: %v", err)
52
+		}
53
+		if err := netlink.NetworkLinkUp(iface); err != nil {
54
+			return fmt.Errorf("Unable to set up networking: %v", err)
55
+		}
34 56
 
35
-	ip := net.ParseIP(args.gateway)
36
-	if ip == nil {
37
-		return fmt.Errorf("Unable to set up networking, %s is not a valid IP", args.gateway)
57
+		// loopback
58
+		iface, err = net.InterfaceByName("lo")
59
+		if err != nil {
60
+			return fmt.Errorf("Unable to set up networking: %v", err)
61
+		}
62
+		if err := netlink.NetworkLinkUp(iface); err != nil {
63
+			return fmt.Errorf("Unable to set up networking: %v", err)
64
+		}
38 65
 	}
66
+	if args.gateway != "" {
67
+		gw := net.ParseIP(args.gateway)
68
+		if gw == nil {
69
+			return fmt.Errorf("Unable to set up networking, %s is not a valid gateway IP", args.gateway)
70
+		}
39 71
 
40
-	if err := netlink.AddDefaultGw(ip); err != nil {
41
-		return fmt.Errorf("Unable to set up networking: %v", err)
72
+		if err := netlink.AddDefaultGw(gw); err != nil {
73
+			return fmt.Errorf("Unable to set up networking: %v", err)
74
+		}
42 75
 	}
43 76
 
44 77
 	return nil
... ...
@@ -132,9 +165,23 @@ func setupEnv(args *DockerInitArgs) {
132 132
 	}
133 133
 }
134 134
 
135
+func getEnv(args *DockerInitArgs, key string) string {
136
+	for _, kv := range args.env {
137
+		parts := strings.SplitN(kv, "=", 2)
138
+		if parts[0] == key && len(parts) == 2 {
139
+			return parts[1]
140
+		}
141
+	}
142
+	return ""
143
+}
144
+
135 145
 func executeProgram(args *DockerInitArgs) error {
136 146
 	setupEnv(args)
137 147
 
148
+	if err := setupHostname(args); err != nil {
149
+		return err
150
+	}
151
+
138 152
 	if err := setupNetworking(args); err != nil {
139 153
 		return err
140 154
 	}
... ...
@@ -177,6 +224,7 @@ func SysInit() {
177 177
 	// Get cmdline arguments
178 178
 	user := flag.String("u", "", "username or uid")
179 179
 	gateway := flag.String("g", "", "gateway address")
180
+	ip := flag.String("i", "", "ip address")
180 181
 	workDir := flag.String("w", "", "workdir")
181 182
 	privileged := flag.Bool("privileged", false, "privileged mode")
182 183
 	flag.Parse()
... ...
@@ -197,6 +245,7 @@ func SysInit() {
197 197
 	args := &DockerInitArgs{
198 198
 		user:       *user,
199 199
 		gateway:    *gateway,
200
+		ip:         *ip,
200 201
 		workDir:    *workDir,
201 202
 		privileged: *privileged,
202 203
 		env:        env,