def parse_legacy_docker_system_df(info): def int_or_zero(string): return int(string.strip() or 0) type_map = ( ('type', 'total', 'active', 'size', 'reclaimable'), (str, int_or_zero, int_or_zero, _legacy_docker_get_bytes, _legacy_docker_get_bytes), ) try: # parse legacy json output: from 1.5.0 - 1.5.0p6 table = [json.loads(",".join(row)) for row in info if row] except ValueError: table = _legacy_docker_parse_table(info, type_map[0]) parsed = DeprecatedDict() for line in table: sane_line = {k.lower(): v for k, v in line.items()} _legacy_map_keys(sane_line, (('totalcount', 'total'),)) for key, type_ in zip(type_map[0], type_map[1]): val = sane_line.get(key) if val is not None: sane_line[key] = type_(val) _legacy_map_keys(sane_line, (('total', 'count'),)) parsed[sane_line.get("type").lower()] = sane_line return parsed
def parse_legacy_docker_node_images(subsections): images = parse_legacy_docker_subsection_images( subsections.get("images", [])) image_labels = parse_legacy_docker_subsection_image_labels( subsections.get("image_labels", [])) image_inspect = parse_legacy_docker_subsection_image_inspect( subsections.get("image_inspect", [])) containers = parse_legacy_docker_subsection_containers( subsections.get("containers", [])) for image_id, pref_info in image_inspect.items(): image = images.setdefault(image_id, {}) image["Id"] = image_id labels = pref_info.get("Config", {}).get("Labels") or {} image.setdefault("Labels", {}).update(labels) image["Created"] = pref_info["Created"] image["VirtualSize"] = pref_info["VirtualSize"] repotags = pref_info.get("RepoTags") if repotags: image["RepoTags"] = repotags repodigests = pref_info.get("RepoDigests") or [] if 'RepoDigest' in pref_info: # Singular? I think this was a bug, and never existed. # But better safe than sorry. repodigests.append(pref_info['RepoDigest']) image["RepoDigests"] = repodigests images_lookup = {} for image_id, image in images.items(): image["amount_containers"] = 0 image.setdefault("Labels", {}) for reta in image.get("RepoTags", []): images_lookup[reta] = image images_lookup[_legacy_docker_trunk_id(image_id) + ':latest'] = image for image_id, labels in image_labels.items(): image = images.get(_legacy_docker_trunk_id(image_id)) if image is not None and labels is not None: image["Labels"].update(labels) for cont in containers.values(): if 'Image' in cont: image_repotag = cont["Image"] if ':' not in image_repotag: image_repotag += ':latest' image = images_lookup.get(image_repotag) if image is not None: image["amount_containers"] += 1 labels = cont.get("Labels") if isinstance(labels, (bytes, str)): # TODO: Check if bytes is necessary cont["Labels"] = parse_legacy_docker_messed_up_labels(labels) return DeprecatedDict((("images", images), ("containers", containers)))
def parse_legacy_docker_subsection_image_inspect(info): parsed = DeprecatedDict() try: table = json.loads(' '.join(' '.join(row) for row in info if row)) except ValueError: return parsed for image in table: parsed[_legacy_docker_trunk_id(image["Id"])] = image return parsed
def parse_legacy_docker_subsection_image_labels(info): table = _get_json_list(info) parsed = DeprecatedDict() for long_id, data in table: if data is not None: parsed[_legacy_docker_trunk_id(long_id)] = data return parsed
def parse_legacy_docker_subsection_containers(info): table = _get_json_list(info) map_keys = (("ID", "Id"), ("CreatedAt", "Created"), ("Names", "Name")) parsed = DeprecatedDict() for item in table: _legacy_map_keys(item, map_keys) if "Status" in item: item["State"] = {"Status": item["Status"]} parsed[item.get("Id")] = item return parsed
def parse_legacy_docker_subsection_images(info): table = _get_json_list(info) map_keys = (("ID", "Id"), ("CreatedAt", "Created")) parsed = DeprecatedDict() for item in table: _legacy_map_keys(item, map_keys) val = item.get("VirtualSize") if val is not None: item["VirtualSize"] = _legacy_docker_get_bytes(val) repotags = item.setdefault("RepoTags", []) if not repotags and item.get("Repository"): repotags.append('%s:%s' % (item["Repository"], item.get("Tag", "latest"))) parsed[item.get("Id")] = item return parsed