Exemplo n.º 1
0
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
Exemplo n.º 2
0
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)))
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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
Exemplo n.º 6
0
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