From 7e4afd3263e30d6f7a982c28923a5356628bbf74 Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Mon, 20 Jan 2014 18:59:31 -0800 Subject: [PATCH 1/7] Add failing test for odd kernel version Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: fc30346086a890687d145c33aa8fb3d0ad6a4b7e Component: engine --- components/engine/utils/utils_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/components/engine/utils/utils_test.go b/components/engine/utils/utils_test.go index c8be7b1928..e95e108225 100644 --- a/components/engine/utils/utils_test.go +++ b/components/engine/utils/utils_test.go @@ -414,6 +414,7 @@ func TestParseRelease(t *testing.T) { assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: "1"}, 0) assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "19-generic"}, 0) + assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0) } func TestParsePortMapping(t *testing.T) { From 185397ce274b9819baa7d0734f2e347180573219 Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Mon, 20 Jan 2014 19:20:33 -0800 Subject: [PATCH 2/7] Remove Flavor from KernelVersionInfo Also change to parsing it with regexp to keep things simple. Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: d2c9c1036b94b0c3e7fa3f591fa83f9c95f49406 Component: engine --- components/engine/utils/utils.go | 54 ++++++++------------------- components/engine/utils/utils_test.go | 14 +++---- 2 files changed, 22 insertions(+), 46 deletions(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index 08a1994c1a..13c69c5ffc 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -6,6 +6,7 @@ import ( "crypto/sha256" "encoding/hex" "encoding/json" + "errors" "fmt" "index/suffixarray" "io" @@ -552,15 +553,10 @@ type KernelVersionInfo struct { Kernel int Major int Minor int - Flavor string } func (k *KernelVersionInfo) String() string { - flavor := "" - if len(k.Flavor) > 0 { - flavor = fmt.Sprintf("-%s", k.Flavor) - } - return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, flavor) + return fmt.Sprintf("%d.%d.%d", k.Kernel, k.Major, k.Minor) } // Compare two KernelVersionInfo struct. @@ -613,48 +609,28 @@ func GetKernelVersion() (*KernelVersionInfo, error) { func ParseRelease(release string) (*KernelVersionInfo, error) { var ( - flavor string - kernel, major, minor int - err error + parts [3]int + err error ) - tmp := strings.SplitN(release, "-", 2) - tmp2 := strings.Split(tmp[0], ".") + re := regexp.MustCompile(`^([0-9]+)\.([0-9]+)\.([0-9]+)`) + subs := re.FindStringSubmatch(release) - if len(tmp2) > 0 { - kernel, err = strconv.Atoi(tmp2[0]) + if len(subs) < 4 { + return nil, errors.New("Can't parse kernel version " + release) + } + + for i := 0; i < 3; i++ { + parts[i], err = strconv.Atoi(subs[i+1]) 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 { - // Removes "+" because git kernels might set it - minorUnparsed := strings.Trim(tmp2[2], "+") - minor, err = strconv.Atoi(minorUnparsed) - 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, + Kernel: parts[0], + Major: parts[1], + Minor: parts[2], }, nil } diff --git a/components/engine/utils/utils_test.go b/components/engine/utils/utils_test.go index e95e108225..8acc27e15a 100644 --- a/components/engine/utils/utils_test.go +++ b/components/engine/utils/utils_test.go @@ -237,16 +237,16 @@ func TestCompareKernelVersion(t *testing.T) { &KernelVersionInfo{Kernel: 2, Major: 6, Minor: 0}, 1) assertKernelVersion(t, - &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"}, - &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "16"}, + &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, + &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) assertKernelVersion(t, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 5}, &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 1) assertKernelVersion(t, - &KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20, Flavor: "25"}, - &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "0"}, + &KernelVersionInfo{Kernel: 3, Major: 0, Minor: 20}, + &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, -1) } @@ -412,9 +412,9 @@ func assertParseRelease(t *testing.T, release string, b *KernelVersionInfo, resu func TestParseRelease(t *testing.T) { assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) - assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: "1"}, 0) - assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "19-generic"}, 0) - assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0) + assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) + assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) + assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8}, 0) } func TestParsePortMapping(t *testing.T) { From 3fbfa38dfc9cb8bde3ffe6fd42947842d664bfc2 Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Mon, 20 Jan 2014 19:21:25 -0800 Subject: [PATCH 3/7] Fix apparent typo Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: 14b2b2b7c2db83ef1413a7469608f655cd15958e Component: engine --- components/engine/utils/utils.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index 13c69c5ffc..e5757ae36c 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -560,7 +560,7 @@ func (k *KernelVersionInfo) String() string { } // Compare two KernelVersionInfo struct. -// Returns -1 if a < b, = if a == b, 1 it a > b +// Returns -1 if a < b, 0 if a == b, 1 it a > b func CompareKernelVersion(a, b *KernelVersionInfo) int { if a.Kernel < b.Kernel { return -1 From e8c0aaecc523e0385552565fe7c7d6a2bbeb8556 Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Mon, 20 Jan 2014 21:02:37 -0800 Subject: [PATCH 4/7] Use Sscanf instead of regexp Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: 5b97e00438b094db608f350732f7e4d426c50999 Component: engine --- components/engine/utils/utils.go | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index e5757ae36c..0f05a24279 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -609,28 +609,22 @@ func GetKernelVersion() (*KernelVersionInfo, error) { func ParseRelease(release string) (*KernelVersionInfo, error) { var ( - parts [3]int - err error + kernel, major, minor, parsed int + err error ) - re := regexp.MustCompile(`^([0-9]+)\.([0-9]+)\.([0-9]+)`) - subs := re.FindStringSubmatch(release) - - if len(subs) < 4 { + parsed, err = fmt.Sscanf(release, "%d.%d.%d", &kernel, &major, &minor) + if err != nil { + return nil, err + } + if parsed < 3 { return nil, errors.New("Can't parse kernel version " + release) } - for i := 0; i < 3; i++ { - parts[i], err = strconv.Atoi(subs[i+1]) - if err != nil { - return nil, err - } - } - return &KernelVersionInfo{ - Kernel: parts[0], - Major: parts[1], - Minor: parts[2], + Kernel: kernel, + Major: major, + Minor: minor, }, nil } From 17cbc16b08c13e5d99c23845ebda97cbcac57656 Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Mon, 20 Jan 2014 21:03:09 -0800 Subject: [PATCH 5/7] Re-add Flavor to KernelVersionInfo Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: b78ae3b652d609a895cf36886e053124d2f8ae80 Component: engine --- components/engine/utils/utils.go | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index 0f05a24279..ae39bcac36 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -553,10 +553,11 @@ type KernelVersionInfo struct { Kernel int Major int Minor int + Flavor string } func (k *KernelVersionInfo) String() string { - return fmt.Sprintf("%d.%d.%d", k.Kernel, k.Major, k.Minor) + return fmt.Sprintf("%d.%d.%d%s", k.Kernel, k.Major, k.Minor, k.Flavor) } // Compare two KernelVersionInfo struct. @@ -610,13 +611,10 @@ func GetKernelVersion() (*KernelVersionInfo, error) { func ParseRelease(release string) (*KernelVersionInfo, error) { var ( kernel, major, minor, parsed int - err error + flavor string ) - parsed, err = fmt.Sscanf(release, "%d.%d.%d", &kernel, &major, &minor) - if err != nil { - return nil, err - } + parsed, _ = fmt.Sscanf(release, "%d.%d.%d%s", &kernel, &major, &minor, &flavor) if parsed < 3 { return nil, errors.New("Can't parse kernel version " + release) } @@ -625,6 +623,7 @@ func ParseRelease(release string) (*KernelVersionInfo, error) { Kernel: kernel, Major: major, Minor: minor, + Flavor: flavor, }, nil } From 875dd771958d4e156b3bbfe119f0a226d5913a7f Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Tue, 21 Jan 2014 09:56:53 -0800 Subject: [PATCH 6/7] Re-add kernel Flavor tests Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: cce099aa34e9588abc778b5f106bf862d4a838b0 Component: engine --- components/engine/utils/utils_test.go | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/components/engine/utils/utils_test.go b/components/engine/utils/utils_test.go index 8acc27e15a..b0a5acb170 100644 --- a/components/engine/utils/utils_test.go +++ b/components/engine/utils/utils_test.go @@ -407,14 +407,17 @@ func assertParseRelease(t *testing.T, release string, b *KernelVersionInfo, resu if r := CompareKernelVersion(a, b); r != result { t.Fatalf("Unexpected kernel version comparison result. Found %d, expected %d", r, result) } + if a.Flavor != b.Flavor { + t.Fatalf("Unexpected parsed kernel flavor. Found %s, expected %s", a.Flavor, b.Flavor) + } } func TestParseRelease(t *testing.T) { assertParseRelease(t, "3.8.0", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) - assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) - assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54}, 0) - assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0}, 0) - assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8}, 0) + assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0) + assertParseRelease(t, "3.4.54.longterm-1", &KernelVersionInfo{Kernel: 3, Major: 4, Minor: 54, Flavor: ".longterm-1"}, 0) + assertParseRelease(t, "3.8.0-19-generic", &KernelVersionInfo{Kernel: 3, Major: 8, Minor: 0, Flavor: "-19-generic"}, 0) + assertParseRelease(t, "3.12.8tag", &KernelVersionInfo{Kernel: 3, Major: 12, Minor: 8, Flavor: "tag"}, 0) } func TestParsePortMapping(t *testing.T) { From c462b24e66b5d8fdc99ef168106933b5701393e5 Mon Sep 17 00:00:00 2001 From: Charles Lindsay Date: Wed, 22 Jan 2014 09:32:50 -0800 Subject: [PATCH 7/7] Add comment about ignoring Sscanf error Docker-DCO-1.1-Signed-off-by: Charles Lindsay (github: chazomaticus) Upstream-commit: dea3c2655dc02c03cf7dc03d058068cf9f0d0970 Component: engine --- components/engine/utils/utils.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/engine/utils/utils.go b/components/engine/utils/utils.go index ae39bcac36..2a11397212 100644 --- a/components/engine/utils/utils.go +++ b/components/engine/utils/utils.go @@ -614,6 +614,8 @@ func ParseRelease(release string) (*KernelVersionInfo, error) { flavor string ) + // Ignore error from Sscanf to allow an empty flavor. Instead, just + // make sure we got all the version numbers. parsed, _ = fmt.Sscanf(release, "%d.%d.%d%s", &kernel, &major, &minor, &flavor) if parsed < 3 { return nil, errors.New("Can't parse kernel version " + release)