108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| From b41f086d40bd0703f1776589dd4ea5579d0fd520 Mon Sep 17 00:00:00 2001
 | |
| Message-Id: <b41f086d40bd0703f1776589dd4ea5579d0fd520@dist-git>
 | |
| From: Pavel Hrdina <phrdina@redhat.com>
 | |
| Date: Fri, 6 Sep 2019 18:06:08 +0200
 | |
| Subject: [PATCH] osdict: Always return the most generic tree
 | |
| MIME-Version: 1.0
 | |
| Content-Type: text/plain; charset=UTF-8
 | |
| Content-Transfer-Encoding: 8bit
 | |
| 
 | |
| From: Fabiano Fidêncio <fidencio@redhat.com>
 | |
| 
 | |
| Some OSes, as Fedora, have variants (which we rely to be standardised on
 | |
| osinfo-db side), which we can use to return the most generic tree
 | |
| possible, in case no profile is specified, in order to avoid failing to
 | |
| install a "Workstation" system because a "Server" variant tree was used.
 | |
| 
 | |
| https://bugzilla.redhat.com/show_bug.cgi?id=1749865
 | |
| 
 | |
| Signed-off-by: Fabiano Fidêncio <fidencio@redhat.com>
 | |
| (cherry picked from commit 0f1acc9f8f392eaf5edd30ce239728afd1f924cf)
 | |
| Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
 | |
| ---
 | |
|  tests/osdict.py    |  4 ++++
 | |
|  virtinst/osdict.py | 39 ++++++++++++++++++++++++++++++++++-----
 | |
|  2 files changed, 38 insertions(+), 5 deletions(-)
 | |
| 
 | |
| diff --git a/tests/osdict.py b/tests/osdict.py
 | |
| index eb0d4f86..9fb477bd 100644
 | |
| --- a/tests/osdict.py
 | |
| +++ b/tests/osdict.py
 | |
| @@ -52,11 +52,15 @@ class TestOSDB(unittest.TestCase):
 | |
|  
 | |
|      def test_tree_url(self):
 | |
|          f26 = OSDB.lookup_os("fedora26")
 | |
| +        f29 = OSDB.lookup_os("fedora29")
 | |
|          winxp = OSDB.lookup_os("winxp")
 | |
|  
 | |
|          # Valid tree URL
 | |
|          assert "fedoraproject.org" in f26.get_location("x86_64")
 | |
|  
 | |
| +        # Most generic tree URL
 | |
| +        assert "Everything" in f29.get_location("x86_64")
 | |
| +
 | |
|          # Has tree URLs, but none for arch
 | |
|          try:
 | |
|              f26.get_location("ia64")
 | |
| diff --git a/virtinst/osdict.py b/virtinst/osdict.py
 | |
| index 64d8bdb8..a53e4249 100644
 | |
| --- a/virtinst/osdict.py
 | |
| +++ b/virtinst/osdict.py
 | |
| @@ -592,8 +592,36 @@ class _OsVariant(object):
 | |
|  
 | |
|          return "inst.repo"
 | |
|  
 | |
| +    def _get_generic_location(self, treelist, arch, profile):
 | |
| +        if not hasattr(Libosinfo.Tree, "get_os_variants"):
 | |
| +            for tree in treelist:
 | |
| +                if tree.get_architecture() == arch:
 | |
| +                    return tree.get_url()
 | |
| +            return None
 | |
| +
 | |
| +        fallback_tree = None
 | |
| +        if not profile:
 | |
| +            profile = "Everything"
 | |
| +
 | |
| +        for tree in treelist:
 | |
| +            if tree.get_architecture() != arch:
 | |
| +                continue
 | |
| +
 | |
| +            variant_list = tree.get_os_variants()
 | |
| +            if variant_list.get_length() == 0:
 | |
| +                return tree.get_url()
 | |
| +
 | |
| +            fallback_tree = tree
 | |
| +            for i in range(variant_list.get_length()):
 | |
| +                variant = variant_list.get_nth(i)
 | |
| +                if profile in variant.get_name():
 | |
| +                    return tree.get_url()
 | |
| +
 | |
| +        if fallback_tree:
 | |
| +            return fallback_tree.get_url()
 | |
| +        return None
 | |
|  
 | |
| -    def get_location(self, arch):
 | |
| +    def get_location(self, arch, profile=None):
 | |
|          treelist = []
 | |
|          if self._os:
 | |
|              treelist = list(_OsinfoIter(self._os.get_tree_list()))
 | |
| @@ -605,10 +633,11 @@ class _OsVariant(object):
 | |
|          # Some distros have more than one URL for a specific architecture,
 | |
|          # which is the case for Fedora and different variants (Server,
 | |
|          # Workstation). Later on, we'll have to differentiate that and return
 | |
| -        # the right one.
 | |
| -        for tree in treelist:
 | |
| -            if tree.get_architecture() == arch:
 | |
| -                return tree.get_url()
 | |
| +        # the right one. However, for now, let's just rely on returning the
 | |
| +        # most generic tree possible.
 | |
| +        location = self._get_generic_location(treelist, arch, profile)
 | |
| +        if location:
 | |
| +            return location
 | |
|  
 | |
|          raise RuntimeError(
 | |
|              _("OS '%s' does not have a URL location for the %s architecture") %
 | |
| -- 
 | |
| 2.23.0
 | |
| 
 |