Module: check_mk
Branch: master
Commit: 554b56b0a4b6286a65e34841f114812bda6a745f
URL:
http://git.mathias-kettner.de/git/?p=check_mk.git;a=commit;h=554b56b0a4b628…
Author: Moritz Kiemer <mo(a)mathias-kettner.de>
Date: Fri Oct 5 14:36:51 2018 +0200
inventory/docker_node_images: fix
The attribution of the containers/images was
not working properly. This has bin been fixed.
Also note that this is an intermediate commit,
The parse function is not meant to stay this way.
Change-Id: Id3e813422dfbe365807d75723c6d929159f332a4
---
inventory/docker_node_images | 128 ++++++++++++++++++++++++-------------------
1 file changed, 71 insertions(+), 57 deletions(-)
diff --git a/inventory/docker_node_images b/inventory/docker_node_images
index fcb99b7..d254884 100644
--- a/inventory/docker_node_images
+++ b/inventory/docker_node_images
@@ -23,49 +23,91 @@
# License along with GNU Make; see the file COPYING. If not, write
# to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
# Boston, MA 02110-1301 USA.
+import json
-def _parse_docker_node_images(info):
- import json
- parsed = {}
- section_name = None
- for line in info:
- if line[0].startswith("[[[") and line[0].endswith("]]]"):
- section_name = line[0][3:-3]
+def _split_subsections(info):
+ subname = ''
+ subsections = {}
+ for row in info:
+ if not row:
+ continue
+ if row[0].startswith('[[[') and row[0].endswith(']]]'):
+ subname = row[0].strip('[]')
continue
+ subsections.setdefault(subname, []).append(row)
+ return subsections
+
+
+def _parse_subsection_images(subinfo):
+ '''parse output of "docker images"'''
+ parsed = {}
+ for row in subinfo:
+ data = json.loads(" ".join(row))
+ parsed.setdefault(data["ID"], data)
+ return parsed
- data = json.loads(" ".join(line))
- if section_name == "images" and data:
- parsed.setdefault(data["ID"], data)
+def _parse_subsection_labels(subinfo):
+ return [json.loads(" ".join(row)) for row in subinfo]
- elif section_name == "images_labels":
- if len(data) == 2:
- image_id, labels = data
- image = parsed.get(image_id)
- if image is not None and labels:
- image.setdefault("__labels__", labels)
- elif section_name == "containers":
- image_name = data["Image"]
- if ":" in image_name:
- repository, tag = image_name.split(":", 1)
- else:
- repository, tag = image_name, "latest"
+def _parse_subsection_containers(subinfo):
+ parsed = {}
+ for row in subinfo:
+ data = json.loads(" ".join(row))
- image = parsed.get((repository, tag))
- if image is not None:
- image.setdefault("__containers__", []).append(data)
+ image_name = data["Image"]
+ if ":" in image_name:
+ data["Repository"], data["Tag"] =
image_name.split(":", 1)
+ else:
+ data["Repository"], data["Tag"] = image_name,
"latest"
+ parsed[data["ID"]] = data
return parsed
+def parse_docker_node_images(info):
+ '''parse output of <<<docker_node_images>>>
+
+ $ echo "[[[images]]]"
+ $ docker images
+ $ echo "[[[image_labels]]]"
+ $ IMAGE_IDS=$(docker images ls | awk 'BEGIN {ORF=" "} NR>1 {print
$3}')
+ $ docker image inspect "$IMAGE_IDS"
+ $ echo "[[[containers]]]"
+ $ docker ps --all
+ '''
+ subsections = _split_subsections(info)
+
+ images = _parse_subsection_images(subsections.get("images", []))
+ label_data = _parse_subsection_labels(subsections.get("images_labels",
[]))
+ containers = _parse_subsection_containers(subsections.get("containers",
[]))
+
+ for image_id, labels in label_data:
+ image = images.get(image_id)
+ if None not in (image_id, labels, image):
+ image.setdefault("__labels__", {}).update(labels)
+
+ mapping = {(i['Repository'], i['Tag']): i['ID'] for i in
images}
+ for c in containers:
+ image_id = mapping.get((c["Repository"], c["Tag"]))
+ image = images.get(image_id)
+ if image is not None:
+ image.setdefault("__containers__", []).append(c)
+
+ lab = (p.split("=", 1) for p in c.get("Labels",
[]).split(","))
+ c["Labels"] = list(lab)
+
+ return {"images": images, "containers": containers}
+
+
def inv_docker_node_images(info, inventory_tree, status_data_tree):
- parsed = _parse_docker_node_images(info)
+ images = parse_docker_node_images(info).get("images", {})
path = "software.applications.docker.images:"
inv_node = inventory_tree.get_list(path)
status_node = status_data_tree.get_list(path)
- for image_id, image in sorted(parsed.iteritems()):
+ for image_id, image in sorted(images.iteritems()):
inv_node.append({
"repository" : image["Repository"],
"tag" : image["Tag"],
@@ -89,39 +131,11 @@ inv_info['docker_node_images'] = {
}
-def _parse_docker_node_containers(info):
- import json
- parsed = {}
- section_name = None
- for line in info:
- if line[0].startswith("[[[") and line[0].endswith("]]]"):
- section_name = line[0][3:-3]
- continue
-
- if section_name != "containers":
- continue
-
- data = json.loads(" ".join(line))
-
- image_name = data["Image"]
- if ":" in image_name:
- data["Repository"], data["Tag"] =
image_name.split(":", 1)
- else:
- data["Repository"], data["Tag"] = image_name,
"latest"
-
- data["Labels"] = [ p.split("=", 1) for p in
data["Labels"].split(",") ]
-
- parsed[data["ID"]] = data
-
-
- return parsed
-
-
def inv_docker_node_images_containers(info, inventory_tree, status_data_tree):
- parsed = _parse_docker_node_containers(info)
+ containers = parse_docker_node_images(info).get("containers", {})
status_node =
status_data_tree.get_list("software.applications.docker.containers:")
- for id_, container in sorted(parsed.iteritems()):
+ for id_, container in sorted(containers.iteritems()):
status_node.append({
"id" : id_,
"repository" : container["Repository"],