aboutsummaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/utils/metadata.py
blob: 5d8bf84755f97c76b6c2922c862e7a24306df085 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Copyright (C) 2016 Intel Corporation
#
# Released under the MIT license (see COPYING.MIT)
#
# Functions to get metadata from the testing host used
# for analytics of test results.

from collections import OrderedDict
from collections.abc import MutableMapping
from xml.dom.minidom import parseString
from xml.etree.ElementTree import Element, tostring

from oe.lsb import distro_identifier
from oeqa.utils.commands import runCmd, get_bb_var, get_bb_vars

metadata_vars = ['MACHINE', 'DISTRO', 'DISTRO_VERSION']

def metadata_from_bb():
    """ Returns test's metadata as OrderedDict.

        Data will be gathered using bitbake -e thanks to get_bb_vars.
    """

    info_dict = OrderedDict()
    hostname = runCmd('hostname')
    info_dict['hostname'] = hostname.output
    data_dict = get_bb_vars(metadata_vars)
    for var in metadata_vars:
        info_dict[var.lower()] = data_dict[var]
    host_distro= distro_identifier()
    host_distro, _, host_distro_release = host_distro.partition('-')
    info_dict['host_distro'] = host_distro
    info_dict['host_distro_release'] = host_distro_release
    info_dict['layers'] = get_layers(get_bb_var('BBLAYERS'))
    return info_dict

def metadata_from_data_store(d):
    """ Returns test's metadata as OrderedDict.

        Data will be collected from the provided data store.
    """
    # TODO: Getting metadata from the data store would
    # be useful when running within bitbake.
    pass

def get_layers(layers):
    """ Returns layer name, branch, and revision as OrderedDict. """
    from git import Repo, InvalidGitRepositoryError, NoSuchPathError

    layer_dict = OrderedDict()
    for layer in layers.split():
        layer_name = os.path.basename(layer)
        layer_dict[layer_name] = OrderedDict()
        try:
            repo = Repo(layer, search_parent_directories=True)
            revision, branch = repo.head.object.name_rev.split()
            layer_dict[layer_name]['branch'] = branch
            layer_dict[layer_name]['revision'] = revision
        except (InvalidGitRepositoryError, NoSuchPathError):
            layer_dict[layer_name]['branch'] = 'unknown'
            layer_dict[layer_name]['revision'] = 'unknown'
    return layer_dict

def write_metadata_file(file_path, metadata):
    """ Writes metadata to a XML file in directory. """

    xml = dict_to_XML('metadata', metadata)
    xml_doc = parseString(tostring(xml).decode('UTF-8'))
    with open(file_path, 'w') as f:
        f.write(xml_doc.toprettyxml())

def dict_to_XML(tag, dictionary):
    """ Return XML element converting dicts recursively. """

    elem = Element(tag)
    for key, val in dictionary.items():
        if isinstance(val, MutableMapping):
            child = (dict_to_XML(key, val))
        else:
            child = Element(key)
            child.text = str(val)
        elem.append(child)
    return elem