summaryrefslogtreecommitdiffstats
path: root/meta/lib/oeqa/utils/metadata.py
blob: ecbe763c0f351fc048fadbef7fd6a2eb828cd77f (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 git import Repo, InvalidGitRepositoryError, NoSuchPathError
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. """

    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