2020-07-18 03:51:54 +03:00
# Copyright (C) 2020 Red Hat, Inc.
#
# This work is licensed under the GNU GPLv2 or later.
# See the COPYING file in the top-level directory.
import os
import unittest . mock
import pytest
import virtinst
import tests . utils
import tests . urlfetcher_mock
@unittest.mock.patch.dict ( os . environ ,
{ " VIRTINST_TEST_SUITE_FORCE_LIBOSINFO " : " 0 " } )
def _test ( mockurl , distro = None , initrd = None ,
kernel = None , xen = False , iso = False , arch = None ) :
# pylint: disable=protected-access
conn = tests . utils . URIs . open_testdefault_cached ( )
guest = virtinst . Guest ( conn )
guest . os . os_type = xen and " xen " or " hvm "
if arch :
guest . os . arch = arch
url = tests . urlfetcher_mock . make_mock_input_url ( mockurl )
installer = virtinst . Installer ( guest . conn , location = url )
treemedia = installer . _treemedia
treemedia . _get_fetcher ( guest , None )
if iso :
treemedia . _cached_fetcher . _is_iso = True
detected_distro = installer . detect_distro ( guest )
assert ( distro or " " ) in ( detected_distro or " " )
# Fetch regular kernel
treecache = treemedia . _cached_data
kernels = [ p [ 0 ] for p in treecache . kernel_pairs ]
initrds = [ p [ 1 ] for p in treecache . kernel_pairs ]
if initrd :
assert any ( [ i . endswith ( initrd ) for i in initrds ] )
if kernel :
assert any ( [ k . endswith ( kernel ) for k in kernels ] )
def test_debian ( ) :
_test ( " debian/buster/main/installer-amd64 " , distro = " debian10 " ,
kernel = " linux " )
_test ( " debian/buster/main/installer-amd64 " , distro = " debian10 " ,
xen = True , kernel = " netboot/xen/vmlinuz " )
_test ( " debian/buster/main/installer-s390x " , distro = " debian10 " ,
kernel = " kernel.debian " )
_test ( " debian/buster/main/installer-ppc64el " , distro = " debian10 " ,
kernel = " vmlinux " )
_test ( " debian/buster/main/installer-arm64 " , distro = " debian10 " )
_test ( " debian/daily-images/amd64 " , distro = " debiantesting " )
_test ( " debian/debian-8.10.0-amd64-netinst.iso " ,
kernel = " linux " )
_test ( " debian/debian-8.10.0-amd64-netinst.iso " ,
iso = True , arch = " x86_64 " , kernel = " install.amd/vmlinuz " )
_test ( " debian/debian-8.10.0-s390x-netinst.iso " ,
iso = True , arch = " s390x " , kernel = " linux_vm " )
_test ( " debian/debian-8.10.0-ppc64el-netinst.iso " ,
iso = True , arch = " ppc64le " , kernel = " vmlinux " )
_test ( " debian/debian-8.10.0-i386-netinst.iso " ,
iso = True , arch = " i686 " , kernel = " install.386/vmlinuz " )
_test ( " debian/debian-8.10.0-arm64-netinst.iso " ,
iso = True , arch = " aarch64 " , kernel = " install.a64/vmlinuz " )
# Bad arch triggers a fallback path
_test ( " debian/debian-8.10.0-amd64-netinst.iso " ,
iso = True , arch = " badarch " , kernel = " install/vmlinuz " )
# Fails to detect treearch, hits certain paths
_test ( " debian/debian-8.10.0-s390x-netinst.iso " ,
kernel = " linux " )
def test_ubuntu ( ) :
_test ( " ubuntu/bionic/main/installer-amd64 " , " ubuntu18.04 " )
_test ( " ubuntu/focal/main/installer-amd64 " , " ubuntu20.04 " )
_test ( " ubuntu/ubuntu-17.10-amd64.iso " ,
iso = True , kernel = " install/vmlinuz " )
_test ( " ubuntu/ubuntu-17.10-s390x.iso " ,
iso = True , arch = " s390x " , kernel = " boot/kernel.ubuntu " )
def test_fedora ( ) :
_test ( " fedora/30 " , " fedora30 " )
_test ( " fedora/rawhide " , " fedora-unknown " )
# Fake fedora version 99 to hit certain code paths
_test ( " fedora/99 " , " fedora-unknown " )
def test_rhel ( ) :
_test ( " rhel/7.6 " , " rhel7.6 " )
# Fake rhel 7.20 to hit certain code paths
_test ( " rhel/7.20 " , " rhel7. " )
def test_centos ( ) :
_test ( " centos/6.10 " , " centos6.10 " )
_test ( " centos/sl7 " , " centos7.0 " )
def test_opensuse ( ) :
_test ( " opensuse/tumbleweed " , " opensusetumbleweed " )
_test ( " opensuse/10.3 " , " opensuse10.3 " )
_test ( " opensuse/11.4 " , " opensuse11.4 " )
_test ( " opensuse/12.3 " , " opensuse12.3 " )
_test ( " opensuse/13.2 " , " opensuse13.2 " ,
xen = True , initrd = " initrd-xen " )
# Specifically use trailing slash to hit url scraping code path
_test ( " opensuse/42.3/ " , " opensuse42.3 " )
# Fake version to trigger particular path in urldetect.py
_test ( " opensuse/15.9 " , " opensuse15 " )
# Has a bad version number which isn't in osinfo-db
_test ( " opensuse/badversion/ " , None )
def test_suse ( ) :
_test ( " suse/SLES-10-SP4-DVD-x86_64-GM-DVD1.iso " , " sles10sp4 " )
_test ( " suse/SLES-11-SP4-DVD-s390x-GM-DVD1.iso " , " sles11sp4 " ,
kernel = " vmrdr.ikr " )
_test ( " suse/SLES-11-SP4-DVD-ppc64-GM-DVD1.iso " , " sles11sp4 " ,
kernel = " linux64 " )
2020-08-26 13:44:54 +03:00
def test_mageia ( ) :
2020-08-26 13:44:56 +03:00
_test ( " mageia/5 " , " mageia5 " , initrd = " all.rdz " )
2020-08-26 13:44:54 +03:00
_test ( " mageia/8 " , initrd = " all.rdz " )
2020-07-18 03:51:54 +03:00
def test_misc ( ) :
_test ( " generic " )
with pytest . raises ( ValueError ) as e :
_test ( " empty " )
2020-08-18 21:32:41 +03:00
assert " installable distribution " in str ( e . value )
assert " mistyped " in str ( e . value )