Browse code

Move getKernelVersion to utils package

Guillaume J. Charmes authored on 2013/05/16 09:40:47
Showing 5 changed files
... ...
@@ -251,7 +251,7 @@ func NewRuntime(autoRestart bool) (*Runtime, error) {
251 251
 		return nil, err
252 252
 	}
253 253
 
254
-	if k, err := GetKernelVersion(); err != nil {
254
+	if k, err := utils.GetKernelVersion(); err != nil {
255 255
 		log.Printf("WARNING: %s\n", err)
256 256
 	} else {
257 257
 		runtime.kernelVersion = k
... ...
@@ -1,9 +1,5 @@
1 1
 package docker
2 2
 
3
-import (
4
-	"github.com/dotcloud/docker/utils"
5
-)
6
-
7 3
 // Compare two Config struct. Do not compare the "Image" nor "Hostname" fields
8 4
 // If OpenStdin is set, then it differs
9 5
 func CompareConfig(a, b *Config) bool {
... ...
@@ -51,7 +47,3 @@ func CompareConfig(a, b *Config) bool {
51 51
 
52 52
 	return true
53 53
 }
54
-
55
-func GetKernelVersion() (*utils.KernelVersionInfo, error) {
56
-	return getKernelVersion()
57
-}
58 54
new file mode 100644
... ...
@@ -0,0 +1,10 @@
0
+package utils
1
+
2
+import (
3
+	"errors"
4
+	"syscall"
5
+)
6
+
7
+func uname() (*syscall.Utsname, error) {
8
+	return nil, errors.New("Kernel version detection is not available on darwin")
9
+}
0 10
new file mode 100644
... ...
@@ -0,0 +1,15 @@
0
+package utils
1
+
2
+import (
3
+	"syscall"
4
+)
5
+
6
+// FIXME: Move this to utils package
7
+func uname() (*syscall.Utsname, error) {
8
+	uts := &syscall.Utsname{}
9
+
10
+	if err := syscall.Uname(uts); err != nil {
11
+		return nil, err
12
+	}
13
+	return uts, nil
14
+}
... ...
@@ -14,6 +14,7 @@ import (
14 14
 	"os/exec"
15 15
 	"path/filepath"
16 16
 	"runtime"
17
+	"strconv"
17 18
 	"strings"
18 19
 	"sync"
19 20
 	"time"
... ...
@@ -468,3 +469,64 @@ func FindCgroupMountpoint(cgroupType string) (string, error) {
468 468
 
469 469
 	return "", fmt.Errorf("cgroup mountpoint not found for %s", cgroupType)
470 470
 }
471
+
472
+func GetKernelVersion() (*KernelVersionInfo, error) {
473
+	var (
474
+		flavor               string
475
+		kernel, major, minor int
476
+		err                  error
477
+	)
478
+
479
+	uts, err := uname()
480
+	if err != nil {
481
+		return nil, err
482
+	}
483
+
484
+	release := make([]byte, len(uts.Release))
485
+
486
+	i := 0
487
+	for _, c := range uts.Release {
488
+		release[i] = byte(c)
489
+		i++
490
+	}
491
+
492
+	// Remove the \x00 from the release for Atoi to parse correctly
493
+	release = release[:bytes.IndexByte(release, 0)]
494
+
495
+	tmp := strings.SplitN(string(release), "-", 2)
496
+	tmp2 := strings.SplitN(tmp[0], ".", 3)
497
+
498
+	if len(tmp2) > 0 {
499
+		kernel, err = strconv.Atoi(tmp2[0])
500
+		if err != nil {
501
+			return nil, err
502
+		}
503
+	}
504
+
505
+	if len(tmp2) > 1 {
506
+		major, err = strconv.Atoi(tmp2[1])
507
+		if err != nil {
508
+			return nil, err
509
+		}
510
+	}
511
+
512
+	if len(tmp2) > 2 {
513
+		minor, err = strconv.Atoi(tmp2[2])
514
+		if err != nil {
515
+			return nil, err
516
+		}
517
+	}
518
+
519
+	if len(tmp) == 2 {
520
+		flavor = tmp[1]
521
+	} else {
522
+		flavor = ""
523
+	}
524
+
525
+	return &KernelVersionInfo{
526
+		Kernel: kernel,
527
+		Major:  major,
528
+		Minor:  minor,
529
+		Flavor: flavor,
530
+	}, nil
531
+}