From 1d654aadae51259cb812d1eda2aa8ff55e324a2f Mon Sep 17 00:00:00 2001 From: John McCabe Date: Wed, 27 Sep 2017 16:11:25 +0100 Subject: [PATCH 1/2] (MAINT) Table driven tests for GetLocalContainerID --- utils/getlocalcontainerid_test.go | 108 ++++++++++++++++-------------- 1 file changed, 57 insertions(+), 51 deletions(-) diff --git a/utils/getlocalcontainerid_test.go b/utils/getlocalcontainerid_test.go index 18c83cf..177a8b6 100644 --- a/utils/getlocalcontainerid_test.go +++ b/utils/getlocalcontainerid_test.go @@ -1,61 +1,67 @@ package utils import ( - "strings" "testing" ) -func Test_GetLocalContainerID(t *testing.T) { - cgroupfile := "./fixtures/cgroup.valid" - expectedContainerID := "364b47437b435e097489faaafe9e896c20096fa555dae80d569e0cfa078a6d55" - actualContainerID, err := GetLocalContainerID(cgroupfile) - if err != nil { - t.Errorf("Unexpected error returned [%s], expected containerID [%s]", err, expectedContainerID) - } - if strings.Compare(expectedContainerID, actualContainerID) != 0 { - t.Errorf("Extracted containerID [%s] does not match expected value [%s]", actualContainerID, expectedContainerID) - } -} -func Test_GetLocalContainerID_cgroupCpuMultipleKeys(t *testing.T) { - cgroupfile := "./fixtures/cgroup.multi" - expectedContainerID := "c7acb1eb27bb163d07c2ce0a3e7deb36a698824472f21074662e605bf57c7521" - actualContainerID, err := GetLocalContainerID(cgroupfile) - if err != nil { - t.Errorf("Unexpected error returned [%s], expected containerID [%s]", err, expectedContainerID) - } - if strings.Compare(expectedContainerID, actualContainerID) != 0 { - t.Errorf("Extracted containerID [%s] does not match expected value [%s]", actualContainerID, expectedContainerID) - } -} - -func Test_GetLocalContainerID_missingCgroupFile(t *testing.T) { - cgroupfile := "./fixtures/cgroup.doesnotexist" - _, err := GetLocalContainerID(cgroupfile) - if err == nil { - t.Errorf("Expected error not thrown") - } -} - -func Test_GetLocalContainerID_emptyCgroupFile(t *testing.T) { - cgroupfile := "./fixtures/cgroup.empty" - _, err := GetLocalContainerID(cgroupfile) - if err == nil { - t.Errorf("Expected error not thrown") - } +var getLocalContainerIDTests = []struct { + title string + cgroupfile string + expectedContainerID string + expectError bool +}{ + { + title: "Simple success case", + cgroupfile: "./fixtures/cgroup.valid", + expectedContainerID: "364b47437b435e097489faaafe9e896c20096fa555dae80d569e0cfa078a6d55", + expectError: false, + }, + { + title: "cgroupCpuMultipleKeys", + cgroupfile: "./fixtures/cgroup.multi", + expectedContainerID: "c7acb1eb27bb163d07c2ce0a3e7deb36a698824472f21074662e605bf57c7521", + expectError: false, + }, + { + title: "missingCgroupFile", + cgroupfile: "./fixtures/cgroup.doesnotexist", + expectedContainerID: "n/a", + expectError: true, + }, + { + title: "emptyCgroupFile", + cgroupfile: "./fixtures/cgroup.empty", + expectedContainerID: "n/a", + expectError: true, + }, + { + title: "cgroupCpuMissing", + cgroupfile: "./fixtures/cgroup.nocpu", + expectedContainerID: "n/a", + expectError: true, + }, + { + title: "cgroupCpuNoId", + cgroupfile: "./fixtures/cgroup.emptycpu", + expectedContainerID: "n/a", + expectError: true, + }, } -func Test_GetLocalContainerID_cgroupCpuMissing(t *testing.T) { - cgroupfile := "./fixtures/cgroup.nocpu" - _, err := GetLocalContainerID(cgroupfile) - if err == nil { - t.Errorf("Expected error not thrown") - } -} - -func Test_GetLocalContainerID_cgroupCpuNoId(t *testing.T) { - cgroupfile := "./fixtures/cgroup.emptycpu" - _, err := GetLocalContainerID(cgroupfile) - if err == nil { - t.Errorf("Expected error not thrown") +func Test_GetLocalContainerID(t *testing.T) { + for _, test := range getLocalContainerIDTests { + t.Run(test.title, func(t *testing.T) { + actualContainerID, err := GetLocalContainerID(test.cgroupfile) + if err != nil { + if !test.expectError { + t.Errorf("Test [%s] threw unexpected error [%s]", test.title, err) + } + if err == nil { + if actualContainerID != test.expectedContainerID { + t.Errorf("Extracted containerID [%s] does not match expected value [%s]", actualContainerID, test.expectedContainerID) + } + } + } + }) } } From d9068f24bfa7944b7b9f5e463e9d285b393ad526 Mon Sep 17 00:00:00 2001 From: John McCabe Date: Wed, 27 Sep 2017 17:00:45 +0100 Subject: [PATCH 2/2] (DI-755) Update GetLocalContainerID to work in DIND This commit updates the GetLocalContainerID function and its tests to handle the extraction of the local container ID when Lumogon is running within a nested Docker engine, Docker-in-Docker for example. It does so by extracting the right-most id match in `/proc/self/cgroup`. --- utils/fixtures/cgroup.dind | 11 +++++++++++ utils/getlocalcontainerid.go | 2 +- utils/getlocalcontainerid_test.go | 13 +++++++++---- 3 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 utils/fixtures/cgroup.dind diff --git a/utils/fixtures/cgroup.dind b/utils/fixtures/cgroup.dind new file mode 100644 index 0000000..6170e40 --- /dev/null +++ b/utils/fixtures/cgroup.dind @@ -0,0 +1,11 @@ +11:devices:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +10:memory:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +9:hugetlb:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +8:cpuset:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +7:net_prio,net_cls:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +6:perf_event:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +5:blkio:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +4:pids:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +3:freezer:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +2:cpuacct,cpu:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 +1:name=systemd:/docker/5462b001b4b4253ac2ee52b27b04a821e48f369ed2c923b958995e6e51c496b4/docker/2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5 \ No newline at end of file diff --git a/utils/getlocalcontainerid.go b/utils/getlocalcontainerid.go index 73199e2..146e921 100644 --- a/utils/getlocalcontainerid.go +++ b/utils/getlocalcontainerid.go @@ -15,7 +15,7 @@ func GetLocalContainerID(cgroupfile string) (string, error) { } defer file.Close() - re := regexp.MustCompile(`^\d+:cpu.*:/docker/(\S+)$`) + re := regexp.MustCompile(`^\d+:cpu.*/docker/(\S+)$`) scanner := bufio.NewScanner(file) for scanner.Scan() { matches := re.FindStringSubmatch(scanner.Text()) diff --git a/utils/getlocalcontainerid_test.go b/utils/getlocalcontainerid_test.go index 177a8b6..a8fc568 100644 --- a/utils/getlocalcontainerid_test.go +++ b/utils/getlocalcontainerid_test.go @@ -22,6 +22,12 @@ var getLocalContainerIDTests = []struct { expectedContainerID: "c7acb1eb27bb163d07c2ce0a3e7deb36a698824472f21074662e605bf57c7521", expectError: false, }, + { + title: "nested container running in Docker-in-Docker", + cgroupfile: "./fixtures/cgroup.dind", + expectedContainerID: "2ea749928409f83bd7af82f2d520f56345c99a4fcf5d0642cc99bd5cbc8168d5", + expectError: false, + }, { title: "missingCgroupFile", cgroupfile: "./fixtures/cgroup.doesnotexist", @@ -56,10 +62,9 @@ func Test_GetLocalContainerID(t *testing.T) { if !test.expectError { t.Errorf("Test [%s] threw unexpected error [%s]", test.title, err) } - if err == nil { - if actualContainerID != test.expectedContainerID { - t.Errorf("Extracted containerID [%s] does not match expected value [%s]", actualContainerID, test.expectedContainerID) - } + } else { + if actualContainerID != test.expectedContainerID { + t.Errorf("Extracted containerID [%s] does not match expected value [%s]", actualContainerID, test.expectedContainerID) } } })