Skip to content

Commit

Permalink
[release/v1.33.x] Fix the logic to get container.id resource attribute (
Browse files Browse the repository at this point in the history
#11333)

Co-authored-by: Rui Liu <liurui@cn.ibm.com>
Co-authored-by: Lauri Tulmin <tulmin@gmail.com>
  • Loading branch information
3 people committed May 10, 2024
1 parent db36233 commit d9fa778
Show file tree
Hide file tree
Showing 7 changed files with 214 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
Expand All @@ -25,6 +26,7 @@ class CgroupV2ContainerIdExtractor {

static final Path V2_CGROUP_PATH = Paths.get("/proc/self/mountinfo");
private static final Pattern CONTAINER_ID_RE = Pattern.compile("^[0-9a-f]{64}$");
private static final Pattern CRI_CONTAINER_ID_RE = Pattern.compile("cri-containerd:[0-9a-f]{64}");

private final ContainerResource.Filesystem filesystem;

Expand All @@ -41,18 +43,31 @@ Optional<String> extractContainerId() {
if (!filesystem.isReadable(V2_CGROUP_PATH)) {
return empty();
}

List<String> fileAsList;
try {
return filesystem
.lines(V2_CGROUP_PATH)
.filter(line -> line.contains("hostname"))
.flatMap(line -> Stream.of(line.split("/")))
.map(CONTAINER_ID_RE::matcher)
.filter(Matcher::matches)
.findFirst()
.map(matcher -> matcher.group(0));
fileAsList = filesystem.lineList(V2_CGROUP_PATH);
} catch (IOException e) {
logger.log(Level.WARNING, "Unable to read v2 cgroup path", e);
return empty();
}

Optional<String> optCid =
fileAsList.stream()
.filter(line -> line.contains("/containers/"))
.flatMap(line -> Stream.of(line.split("/")))
.map(CONTAINER_ID_RE::matcher)
.filter(Matcher::matches)
.reduce((first, second) -> second)
.map(matcher -> matcher.group(0));
if (optCid.isPresent()) {
return optCid;
}
return empty();
return fileAsList.stream()
.filter(line -> line.contains("cri-containerd:"))
.map(CRI_CONTAINER_ID_RE::matcher)
.filter(Matcher::find)
.findFirst()
.map(matcher -> matcher.group(0).substring(15));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
Expand Down Expand Up @@ -75,5 +77,11 @@ boolean isReadable(Path path) {
Stream<String> lines(Path path) throws IOException {
return Files.lines(path);
}

List<String> lineList(Path path) throws IOException {
try (Stream<String> lines = lines(path)) {
return lines.collect(Collectors.toList());
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Optional;
import java.util.stream.Stream;
import java.util.stream.Collectors;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
Expand All @@ -33,39 +34,61 @@ void fileNotReadable() {
assertThat(result).isSameAs(Optional.empty());
}

@Test
void extractSuccess_docker() throws Exception {
private void verifyContainerId(String rawFileContent, String containerId) throws Exception {
when(filesystem.isReadable(V2_CGROUP_PATH)).thenReturn(true);
Stream<String> fileContent = getTestDockerFileContent();
when(filesystem.lines(V2_CGROUP_PATH)).thenReturn(fileContent);
when(filesystem.lineList(V2_CGROUP_PATH)).thenReturn(fileToListOfLines(rawFileContent));
CgroupV2ContainerIdExtractor extractor = new CgroupV2ContainerIdExtractor(filesystem);
Optional<String> result = extractor.extractContainerId();
assertThat(result.orElse("fail"))
.isEqualTo("be522444b60caf2d3934b8b24b916a8a314f4b68d4595aa419874657e8d103f2");
assertThat(result.orElse("fail")).isEqualTo(containerId);
}

@Test
void extractSuccess_docker() throws Exception {
verifyContainerId(
"docker_proc_self_mountinfo",
"be522444b60caf2d3934b8b24b916a8a314f4b68d4595aa419874657e8d103f2");
}

@Test
void extractSuccess_docker1() throws Exception {
verifyContainerId(
"docker_proc_self_mountinfo1",
"188329f95b930c32eeeffd34658ed2538960947e166743fa3743f5ce3d739b40");
}

@Test
void extractSuccess_containerd() throws Exception {
verifyContainerId(
"containerd_proc_self_mountinfo",
"f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91");
}

@Test
void extractSuccess_podman() throws Exception {
when(filesystem.isReadable(V2_CGROUP_PATH)).thenReturn(true);
Stream<String> fileContent = getTestPodmanFileContent();
when(filesystem.lines(V2_CGROUP_PATH)).thenReturn(fileContent);
CgroupV2ContainerIdExtractor extractor = new CgroupV2ContainerIdExtractor(filesystem);
Optional<String> result = extractor.extractContainerId();
assertThat(result.orElse("fail"))
.isEqualTo("2a33efc76e519c137fe6093179653788bed6162d4a15e5131c8e835c968afbe6");
verifyContainerId(
"podman_proc_self_mountinfo",
"2a33efc76e519c137fe6093179653788bed6162d4a15e5131c8e835c968afbe6");
}

private static Stream<String> getTestDockerFileContent() throws Exception {
return fileToStreamOfLines("docker_proc_self_mountinfo");
@Test
void extractSuccess_crio() throws Exception {
verifyContainerId(
"crio_proc_self_mountinfo",
"a8f62e52ed7c2cd85242dcf0eb1d727b643540ceca7f328ad7d2f31aedf07731");
}

private static Stream<String> getTestPodmanFileContent() throws Exception {
return fileToStreamOfLines("podman_proc_self_mountinfo");
@Test
void extractSuccess_crio1() throws Exception {
verifyContainerId(
"crio_proc_self_mountinfo1",
"f23ec1d4b715c6531a17e9c549222fbbe1f7ffff697a29a2212b3b4cdc37f52e");
}

private static Stream<String> fileToStreamOfLines(String filename) {
private static List<String> fileToListOfLines(String filename) {
InputStream in =
CgroupV2ContainerIdExtractorTest.class.getClassLoader().getResourceAsStream(filename);
return new BufferedReader(new InputStreamReader(in, UTF_8)).lines();
return new BufferedReader(new InputStreamReader(in, UTF_8))
.lines()
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
2002 1895 0:226 / / rw,relatime master:629 - overlay overlay rw,lowerdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75438/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75437/fs:/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75394/fs,upperdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75439/fs,workdir=/var/lib/containerd/io.containerd.snapshotter.v1.overlayfs/snapshots/75439/work,xino=off
2003 2002 0:227 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
2004 2002 0:228 / /dev rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
2005 2004 0:229 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,gid=5,mode=620,ptmxmode=666
2006 2004 0:117 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw
2007 2002 0:124 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro
2008 2007 0:230 / /sys/fs/cgroup rw,nosuid,nodev,noexec,relatime - tmpfs tmpfs rw,mode=755
2009 2008 0:32 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/systemd ro,nosuid,nodev,noexec,relatime master:11 - cgroup cgroup rw,xattr,name=systemd
2010 2008 0:35 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/pids ro,nosuid,nodev,noexec,relatime master:15 - cgroup cgroup rw,pids
2011 2008 0:36 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/freezer ro,nosuid,nodev,noexec,relatime master:16 - cgroup cgroup rw,freezer
2012 2008 0:37 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/cpu,cpuacct ro,nosuid,nodev,noexec,relatime master:17 - cgroup cgroup rw,cpu,cpuacct
2013 2008 0:38 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime master:18 - cgroup cgroup rw,blkio
2014 2008 0:39 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/cpuset ro,nosuid,nodev,noexec,relatime master:19 - cgroup cgroup rw,cpuset
2015 2008 0:40 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/hugetlb ro,nosuid,nodev,noexec,relatime master:20 - cgroup cgroup rw,hugetlb
2016 2008 0:41 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/memory ro,nosuid,nodev,noexec,relatime master:21 - cgroup cgroup rw,memory
2017 2008 0:42 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/net_cls,net_prio ro,nosuid,nodev,noexec,relatime master:22 - cgroup cgroup rw,net_cls,net_prio
2018 2008 0:43 /system.slice/containerd.service/kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/devices ro,nosuid,nodev,noexec,relatime master:23 - cgroup cgroup rw,devices
2019 2008 0:44 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/rdma ro,nosuid,nodev,noexec,relatime master:24 - cgroup cgroup rw,rdma
2020 2008 0:45 /kubepods-burstable-pod321c09bf_282b_44e4_a467_39daf144ef1f.slice:cri-containerd:f2a44bc8e090f93a2b4d7f510bdaff0615ad52906e3287ee956dcf5aa5012a91 /sys/fs/cgroup/perf_event ro,nosuid,nodev,noexec,relatime master:25 - cgroup cgroup rw,perf_event
2021 2002 253:1 /var/lib/kubelet/pods/321c09bf-282b-44e4-a467-39daf144ef1f/etc-hosts /etc/hosts rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2022 2004 253:1 /var/lib/kubelet/pods/321c09bf-282b-44e4-a467-39daf144ef1f/containers/accountingservice/82b03b66 /dev/termination-log rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2023 2002 253:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/b136f3d296b4c2024b3e7ad816f2a804a47cf1acc3d445075c6d78cf159ef58d/hostname /etc/hostname rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2024 2002 253:1 /var/lib/containerd/io.containerd.grpc.v1.cri/sandboxes/b136f3d296b4c2024b3e7ad816f2a804a47cf1acc3d445075c6d78cf159ef58d/resolv.conf /etc/resolv.conf rw,relatime - xfs /dev/mapper/ubuntu--vg-root rw,attr2,inode64,logbufs=8,logbsize=32k,noquota
2025 2004 0:115 / /dev/shm rw,nosuid,nodev,noexec,relatime - tmpfs shm rw,size=65536k
2026 2002 0:96 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,size=32768456k
1896 2003 0:227 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw
1897 2003 0:227 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw
1898 2003 0:227 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw
1899 2003 0:227 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw
1900 2003 0:227 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw
1901 2003 0:231 / /proc/asound ro,relatime - tmpfs tmpfs ro
1902 2003 0:232 / /proc/acpi ro,relatime - tmpfs tmpfs ro
1903 2003 0:228 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1904 2003 0:228 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1905 2003 0:228 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1906 2003 0:228 /null /proc/sched_debug rw,nosuid - tmpfs tmpfs rw,size=65536k,mode=755
1907 2003 0:233 / /proc/scsi ro,relatime - tmpfs tmpfs ro
1908 2007 0:234 / /sys/firmware ro,relatime - tmpfs tmpfs ro
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
10303 9025 0:676 / / rw,relatime master:2633 - overlay overlay rw,context="system_u:object_r:container_file_t:s0:c285,c353",lowerdir=/var/lib/containers/storage/overlay/l/MOUYF2QTVBFHJCEJ7L4FQSJBYL:/var/lib/containers/storage/overlay/l/G6UHPBRIDD4LUQGKZ3B3LQNNBF:/var/lib/containers/storage/overlay/l/NYLNBZF5BPFKTTPCUH2NV2CI76,upperdir=/var/lib/containers/storage/overlay/7af2ec0ca188ec1e39e53f5a89d81ddcc721d39b6d2b818d0b00c6accf871382/diff,workdir=/var/lib/containers/storage/overlay/7af2ec0ca188ec1e39e53f5a89d81ddcc721d39b6d2b818d0b00c6accf871382/work,volatile
10304 10303 0:680 / /proc rw,nosuid,nodev,noexec,relatime - proc proc rw
10305 10303 0:681 / /dev rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
10306 10305 0:689 / /dev/pts rw,nosuid,noexec,relatime - devpts devpts rw,context="system_u:object_r:container_file_t:s0:c285,c353",gid=5,mode=620,ptmxmode=666
10307 10305 0:668 / /dev/mqueue rw,nosuid,nodev,noexec,relatime - mqueue mqueue rw,seclabel
10308 10303 0:690 / /sys ro,nosuid,nodev,noexec,relatime - sysfs sysfs ro,seclabel
10309 10308 0:26 / /sys/fs/cgroup ro,nosuid,nodev,noexec,relatime - cgroup2 cgroup rw,seclabel
10310 10305 0:667 / /dev/shm rw,nosuid,nodev,noexec,relatime master:2583 - tmpfs shm rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,inode64
10311 10303 0:25 /containers/storage/overlay-containers/2ac4c84cb0d3c3beb04beeef6ccf71c17b5fdd0252ce3a2b66bc2fdd0aaa1814/userdata/resolv.conf /etc/resolv.conf rw,nosuid,nodev,noexec master:15 - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10312 10303 0:25 /containers/storage/overlay-containers/2ac4c84cb0d3c3beb04beeef6ccf71c17b5fdd0252ce3a2b66bc2fdd0aaa1814/userdata/hostname /etc/hostname rw,nosuid,nodev master:15 - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10313 10303 0:25 /containers/storage/overlay-containers/2ac4c84cb0d3c3beb04beeef6ccf71c17b5fdd0252ce3a2b66bc2fdd0aaa1814/userdata/.containerenv /run/.containerenv rw,nosuid,nodev master:15 - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10314 10303 252:4 /ostree/deploy/rhcos/var/lib/kubelet/pods/0a947273-7214-4824-8411-875ebd7626e4/etc-hosts /etc/hosts rw,relatime - xfs /dev/vda4 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota
10315 10305 252:4 /ostree/deploy/rhcos/var/lib/kubelet/pods/0a947273-7214-4824-8411-875ebd7626e4/containers/ubuntu23/354653d0 /dev/termination-log rw,relatime - xfs /dev/vda4 rw,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota
10316 10303 0:25 /containers/storage/overlay-containers/a8f62e52ed7c2cd85242dcf0eb1d727b643540ceca7f328ad7d2f31aedf07731/userdata/run/secrets /run/secrets rw,nosuid,nodev - tmpfs tmpfs rw,seclabel,size=6416204k,nr_inodes=819200,mode=755,inode64
10317 10316 0:666 / /run/secrets/kubernetes.io/serviceaccount ro,relatime - tmpfs tmpfs rw,seclabel,size=30930028k,inode64
9026 10304 0:680 /bus /proc/bus ro,nosuid,nodev,noexec,relatime - proc proc rw
9027 10304 0:680 /fs /proc/fs ro,nosuid,nodev,noexec,relatime - proc proc rw
9029 10304 0:680 /irq /proc/irq ro,nosuid,nodev,noexec,relatime - proc proc rw
9030 10304 0:680 /sys /proc/sys ro,nosuid,nodev,noexec,relatime - proc proc rw
9031 10304 0:680 /sysrq-trigger /proc/sysrq-trigger ro,nosuid,nodev,noexec,relatime - proc proc rw
9032 10304 0:691 / /proc/acpi ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
9033 10304 0:681 /null /proc/kcore rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
9034 10304 0:681 /null /proc/keys rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
9035 10304 0:681 /null /proc/timer_list rw,nosuid - tmpfs tmpfs rw,context="system_u:object_r:container_file_t:s0:c285,c353",size=65536k,mode=755,inode64
9036 10304 0:692 / /proc/scsi ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
9037 10308 0:693 / /sys/firmware ro,relatime - tmpfs tmpfs ro,context="system_u:object_r:container_file_t:s0:c285,c353",inode64
Loading

0 comments on commit d9fa778

Please sign in to comment.