Browse Source

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

453 generic kernel detection fix
Guillaume J. Charmes 12 years ago
parent
commit
7a8ac76299
4 changed files with 86 additions and 56 deletions
  1. 9 0
      getKernelVersion_darwin.go
  2. 69 0
      getKernelVersion_linux.go
  3. 7 8
      runtime.go
  4. 1 48
      utils.go

+ 9 - 0
getKernelVersion_darwin.go

@@ -0,0 +1,9 @@
+package docker
+
+import (
+	"fmt"
+)
+
+func getKernelVersion() (*KernelVersionInfo, error) {
+	return nil, fmt.Errorf("Kernel version detection is not available on darwin")
+}

+ 69 - 0
getKernelVersion_linux.go

@@ -0,0 +1,69 @@
+package docker
+
+import (
+	"bytes"
+	"strconv"
+	"strings"
+	"syscall"
+)
+
+func getKernelVersion() (*KernelVersionInfo, error) {
+	var (
+		uts                  syscall.Utsname
+		flavor               string
+		kernel, major, minor int
+		err                  error
+	)
+
+	if err := syscall.Uname(&uts); err != nil {
+		return nil, err
+	}
+
+	release := make([]byte, len(uts.Release))
+
+	i := 0
+	for _, c := range uts.Release {
+		release[i] = byte(c)
+		i++
+	}
+
+	// Remove the \x00 from the release for Atoi to parse correctly
+	release = release[:bytes.IndexByte(release, 0)]
+
+	tmp := strings.SplitN(string(release), "-", 2)
+	tmp2 := strings.SplitN(tmp[0], ".", 3)
+
+	if len(tmp2) > 0 {
+		kernel, err = strconv.Atoi(tmp2[0])
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(tmp2) > 1 {
+		major, err = strconv.Atoi(tmp2[1])
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(tmp2) > 2 {
+		minor, err = strconv.Atoi(tmp2[2])
+		if err != nil {
+			return nil, err
+		}
+	}
+
+	if len(tmp) == 2 {
+		flavor = tmp[1]
+	} else {
+		flavor = ""
+	}
+
+	return &KernelVersionInfo{
+		Kernel: kernel,
+		Major:  major,
+		Minor:  minor,
+		Flavor: flavor,
+	}, nil
+}

+ 7 - 8
runtime.go

@@ -295,14 +295,13 @@ func NewRuntime() (*Runtime, error) {
 		return nil, err
 	}
 
-	k, err := GetKernelVersion()
-	if err != nil {
-		return nil, err
-	}
-	runtime.kernelVersion = k
-
-	if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 {
-		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())
+	if k, err := GetKernelVersion(); err != nil {
+		log.Printf("WARNING: %s\n", err)
+	} else {
+		runtime.kernelVersion = k
+		if CompareKernelVersion(k, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}) < 0 {
+			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())
+		}
 	}
 
 	if cgroupMemoryMountpoint, err := FindCgroupMountpoint("memory"); err != nil {

+ 1 - 48
utils.go

@@ -14,10 +14,8 @@ import (
 	"path/filepath"
 	"regexp"
 	"runtime"
-	"strconv"
 	"strings"
 	"sync"
-	"syscall"
 	"time"
 )
 
@@ -407,52 +405,7 @@ type KernelVersionInfo struct {
 
 // FIXME: this doens't build on Darwin
 func GetKernelVersion() (*KernelVersionInfo, error) {
-	var uts syscall.Utsname
-
-	if err := syscall.Uname(&uts); err != nil {
-		return nil, err
-	}
-
-	release := make([]byte, len(uts.Release))
-
-	i := 0
-	for _, c := range uts.Release {
-		release[i] = byte(c)
-		i++
-	}
-
-	tmp := strings.SplitN(string(release), "-", 2)
-	if len(tmp) != 2 {
-		return nil, fmt.Errorf("Unrecognized kernel version")
-	}
-	tmp2 := strings.SplitN(tmp[0], ".", 3)
-	if len(tmp2) != 3 {
-		return nil, fmt.Errorf("Unrecognized kernel version")
-	}
-
-	kernel, err := strconv.Atoi(tmp2[0])
-	if err != nil {
-		return nil, err
-	}
-
-	major, err := strconv.Atoi(tmp2[1])
-	if err != nil {
-		return nil, err
-	}
-
-	minor, err := strconv.Atoi(tmp2[2])
-	if err != nil {
-		return nil, err
-	}
-
-	flavor := tmp[1]
-
-	return &KernelVersionInfo{
-		Kernel: kernel,
-		Major:  major,
-		Minor:  minor,
-		Flavor: flavor,
-	}, nil
+	return getKernelVersion()
 }
 
 func (k *KernelVersionInfo) String() string {