This is going to be needed in order to test whether we're adding duplicated devices in OSes which derives-from or clones some other OS. Signed-off-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> --- tests/osinfo.py | 18 ++++++++++++++++++ tests/util.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+) diff --git a/tests/osinfo.py b/tests/osinfo.py index eb63724..a203369 100644 --- a/tests/osinfo.py +++ b/tests/osinfo.py @@ -27,6 +27,24 @@ class Os(): self._root = root self._cache = {} + def _get_id(self): + return self._root.get('id') + internal_id = _cache_property(_get_id) + + def _get_derives_from(self): + derives_from = self._root.find('derives-from') + if derives_from is not None: + return derives_from.get('id') + return None + derives_from = _cache_property(_get_derives_from) + + def _get_clones(self): + clones = self._root.find('clones') + if clones is not None: + return clones.get('id') + return None + clones = _cache_property(_get_clones) + def _get_images(self): images = [] for image in self._root.findall('image'): diff --git a/tests/util.py b/tests/util.py index 418b9d2..b957b08 100644 --- a/tests/util.py +++ b/tests/util.py @@ -1,6 +1,8 @@ # This work is licensed under the GNU GPLv2 or later. # See the COPYING file in the top-level directory. +from collections import defaultdict + import os import xml.etree.ElementTree as ET @@ -17,6 +19,7 @@ class _DataFiles(): self.schema = os.path.join(self.datadir, 'schema', 'osinfo.rng') self._all_xml_cache = [] self._oses_cache = [] + self._os_related_cache = defaultdict(list) if not os.path.exists(self.datadir): raise RuntimeError("INTERNAL_OSINFO_DB_DATA_DIR=%s " @@ -48,6 +51,32 @@ class _DataFiles(): self._oses_cache.append(osinfo.Os(osroot)) return self._oses_cache + def get_os_related(self, _os): + if _os.internal_id not in self._os_related_cache: + directly_related = [] + if _os.derives_from is not None: + for __os in self.oses(): + if _os.derives_from == __os.internal_id: + directly_related.append(__os) + break + + if _os.clones is not None: + for __os in self.oses(): + if _os.clones == __os.internal_id: + directly_related.append(__os) + break + + self._os_related_cache[_os.internal_id].extend(directly_related) + + related = [] + for __os in directly_related: + related.extend(self.get_os_related(__os)) + + for __os in related: + if __os not in self._os_related_cache[_os.internal_id]: + self._os_related_cache[_os.internal_id].append(__os) + return self._os_related_cache[_os.internal_id] + def xmls(self): return self._get_all_xml() -- 2.20.1 _______________________________________________ Libosinfo mailing list Libosinfo@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libosinfo