diff options
author | Mariano Lopez <mariano.lopez@linux.intel.com> | 2016-11-27 13:49:29 -0600 |
---|---|---|
committer | Richard Purdie <richard.purdie@linuxfoundation.org> | 2016-12-13 22:55:19 +0000 |
commit | 904b9153697493671cee600a184725ac87ee23a8 (patch) | |
tree | 4082001ba7477d468a78b90caed9fb0c75567f16 | |
parent | 9d55e9d489cd78be592fb9b4d6484f9060c62fdd (diff) | |
download | openembedded-core-contrib-904b9153697493671cee600a184725ac87ee23a8.tar.gz |
oeqa/utils/metadata.py: Add metadata library
Adds functions to get metadata from the host running the tests.
[YOCTO #9954]
(From OE-Core rev: 10b05794254886e55c76f29f7778d783c550befa)
Signed-off-by: Mariano Lopez <mariano.lopez@linux.intel.com>
Signed-off-by: Ross Burton <ross.burton@intel.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r-- | meta/lib/oeqa/utils/metadata.py | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/meta/lib/oeqa/utils/metadata.py b/meta/lib/oeqa/utils/metadata.py new file mode 100644 index 0000000000..ecbe763c0f --- /dev/null +++ b/meta/lib/oeqa/utils/metadata.py @@ -0,0 +1,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 |