Browse code

Merge pull request #456 from dotcloud/453-generic_kernel_detection-fix

453 generic kernel detection fix

Guillaume J. Charmes authored on 2013/04/23 10:20:17
Showing 4 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,9 @@
0
+package docker
1
+
2
+import (
3
+	"fmt"
4
+)
5
+
6
+func getKernelVersion() (*KernelVersionInfo, error) {
7
+	return nil, fmt.Errorf("Kernel version detection is not available on darwin")
8
+}
0 9
new file mode 100644
... ...
@@ -0,0 +1,69 @@
0
+package docker
1
+
2
+import (
3
+	"bytes"
4
+	"strconv"
5
+	"strings"
6
+	"syscall"
7
+)
8
+
9
+func getKernelVersion() (*KernelVersionInfo, error) {
10
+	var (
11
+		uts                  syscall.Utsname
12
+		flavor               string
13
+		kernel, major, minor int
14
+		err                  error
15
+	)
16
+
17
+	if err := syscall.Uname(&uts); err != nil {
18
+		return nil, err
19
+	}
20
+
21
+	release := make([]byte, len(uts.Release))
22
+
23
+	i := 0
24
+	for _, c := range uts.Release {
25
+		release[i] = byte(c)
26
+		i++
27
+	}
28
+
29
+	// Remove the \x00 from the release for Atoi to parse correctly
30
+	release = release[:bytes.IndexByte(release, 0)]
31
+
32
+	tmp := strings.SplitN(string(release), "-", 2)
33
+	tmp2 := strings.SplitN(tmp[0], ".", 3)
34
+
35
+	if len(tmp2) > 0 {
36
+		kernel, err = strconv.Atoi(tmp2[0])
37
+		if err != nil {
38
+			return nil, err
39
+		}
40
+	}
41
+
42
+	if len(tmp2) > 1 {
43
+		major, err = strconv.Atoi(tmp2[1])
44
+		if err != nil {
45
+			return nil, err
46
+		}
47
+	}
48
+
49
+	if len(tmp2) > 2 {
50
+		minor, err = strconv.Atoi(tmp2[2])
51
+		if err != nil {
52
+			return nil, err
53
+		}
54
+	}
55
+
56
+	if len(tmp) == 2 {
57
+		flavor = tmp[1]
58
+	} else {
59
+		flavor = ""
60
+	}
61
+
62
+	return &KernelVersionInfo{
63
+		Kernel: kernel,
64
+		Major:  major,
65
+		Minor:  minor,
66
+		Flavor: flavor,
67
+	}, nil
68
+}
... ...
@@ -295,14 +295,13 @@ func NewRuntime() (*Runtime, error) {
295 295
 		return nil, err
296 296
 	}
297 297
 
298
-	k, err := GetKernelVersion()
299
-	if err != nil {
300
-		return nil, err
301
-	}
302
-	runtime.kernelVersion = k
303
-
304
-	if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 {
305
-		log.Printf("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String())
298
+	if k, err := GetKernelVersion(); err != nil {
299
+		log.Printf("WARNING: %s\n", err)
300
+	} else {
301
+		runtime.kernelVersion = k
302
+		if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 {
303
+			log.Printf("WARNING: You are running linux kernel version %s, which might be unstable running docker. Please upgrade your kernel to 3.8.0.", k.String())
304
+		}
306 305
 	}
307 306
 
308 307
 	if cgroupMemoryMountpoint, err := FindCgroupMountpoint("memory"); err != nil {
... ...
@@ -14,10 +14,8 @@ import (
14 14
 	"path/filepath"
15 15
 	"regexp"
16 16
 	"runtime"
17
-	"strconv"
18 17
 	"strings"
19 18
 	"sync"
20
-	"syscall"
21 19
 	"time"
22 20
 )
23 21
 
... ...
@@ -407,52 +405,7 @@ type KernelVersionInfo struct {
407 407
 
408 408
 // FIXME: this doens't build on Darwin
409 409
 func GetKernelVersion() (*KernelVersionInfo, error) {
410
-	var uts syscall.Utsname
411
-
412
-	if err := syscall.Uname(&uts); err != nil {
413
-		return nil, err
414
-	}
415
-
416
-	release := make([]byte, len(uts.Release))
417
-
418
-	i := 0
419
-	for _, c := range uts.Release {
420
-		release[i] = byte(c)
421
-		i++
422
-	}
423
-
424
-	tmp := strings.SplitN(string(release), "-", 2)
425
-	if len(tmp) != 2 {
426
-		return nil, fmt.Errorf("Unrecognized kernel version")
427
-	}
428
-	tmp2 := strings.SplitN(tmp[0], ".", 3)
429
-	if len(tmp2) != 3 {
430
-		return nil, fmt.Errorf("Unrecognized kernel version")
431
-	}
432
-
433
-	kernel, err := strconv.Atoi(tmp2[0])
434
-	if err != nil {
435
-		return nil, err
436
-	}
437
-
438
-	major, err := strconv.Atoi(tmp2[1])
439
-	if err != nil {
440
-		return nil, err
441
-	}
442
-
443
-	minor, err := strconv.Atoi(tmp2[2])
444
-	if err != nil {
445
-		return nil, err
446
-	}
447
-
448
-	flavor := tmp[1]
449
-
450
-	return &KernelVersionInfo{
451
-		Kernel: kernel,
452
-		Major:  major,
453
-		Minor:  minor,
454
-		Flavor: flavor,
455
-	}, nil
410
+	return getKernelVersion()
456 411
 }
457 412
 
458 413
 func (k *KernelVersionInfo) String() string {