tests: test_urls: Big rework

Move all the test cases to an .ini file. Various cleanups and
minor improvements throughout
This commit is contained in:
Cole Robinson 2018-01-02 14:58:57 -05:00
parent 26046c5948
commit c7ed34de63
4 changed files with 286 additions and 204 deletions

View File

@ -529,11 +529,6 @@ class TestUI(TestBaseCommand):
class TestURLFetch(TestBaseCommand):
description = "Test fetching kernels and isos from various distro trees"
user_options = TestBaseCommand.user_options + [
("path=", None, "Paths to local iso or directory or check"
" for installable distro. Comma separated"),
]
def initialize_options(self):
TestBaseCommand.initialize_options(self)
self.path = ""
@ -548,9 +543,6 @@ class TestURLFetch(TestBaseCommand):
def run(self):
self._testfiles = ["tests.test_urls"]
if self.path:
import tests
tests.URLTEST_LOCAL_MEDIA += self.path
TestBaseCommand.run(self)

View File

@ -32,10 +32,6 @@ imp.reload(cliconfig)
from tests import utils
# Variable used to store a local iso or dir path to check for a distro
# Specified via 'python setup.py test_urls --path"
URLTEST_LOCAL_MEDIA = []
virtinstall = None
virtclone = None
virtconvert = None

193
tests/test_urls.ini Normal file
View File

@ -0,0 +1,193 @@
# Goal here is generally to cover all tree variants for each distro,
# where feasible. Don't exhaustively test i686 trees since most people
# aren't using it and it slows down the test, only use it in a couple
# places. Follow the comments for what trees to keep around
##########
# Fedora #
##########
# One old fedora pair
[fedora-old]
url = https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/14/Fedora/x86_64/os/
distro = fedora14
[fedora-old-i686]
url = https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/14/Fedora/i386/os/
distro = fedora14
# Latest GA release
[fedora27]
url = http://dl.fedoraproject.org/pub/fedora/linux/releases/27/Server/x86_64/os/
distro = fedora26
# Fedora dev release can be enabled during alpha/beta cycle
#[fedora-dev]
#url = http://dl.fedoraproject.org/pub/fedora/linux/development/27/Server/x86_64/os/
#distro = fedora26
# Fedora development, distro will need to be updated regularly.
# Test for xen and boot iso for full fedora coverage
[fedora-rawhide]
url = http://dl.fedoraproject.org/pub/fedora/linux/development/rawhide/Server/x86_64/os/
distro = fedora26
testxen = 1
testbootiso = 1
##########
# CentOS #
##########
# Final centos4 trees. No distro detection, doesn't work here
[centos-4.9]
url = http://vault.centos.org/4.9/os/x86_64
# Final centos5 trees
[centos-5.11]
url = http://vault.centos.org/5.11/os/x86_64
distro = rhel5.11
# Latest centos 6 w/ i686
[centos-6-latest]
url = http://mirrors.mit.edu/centos/6/os/x86_64/
distro = centos6.9
[centos-6-latest-i686]
url = http://mirrors.mit.edu/centos/6/os/i386/
distro = centos6.9
# centos7 with exotic archs (i686 is dead)
[centos-7-latest]
url = http://mirrors.mit.edu/centos/7/os/x86_64/
distro = centos7.0
testxen = 1
testbootiso = 1
[centos-7-latest-ppc64le]
url = http://mirror.centos.org/altarch/7/os/ppc64le/
distro = centos7.0
[centos-7-latest-aarch64]
url = http://mirror.centos.org/altarch/7/os/ppc64le/
distro = centos7.0
######
# SL #
######
# Latest scientific 6
[sl-6latest]
url = http://ftp.scientificlinux.org/linux/scientific/6/x86_64/os
distro = rhel6.9
# Latest scientific 6
[sl-7latest]
url = http://ftp.scientificlinux.org/linux/scientific/7/x86_64/os
distro = rhel7.4
############
# OpenSUSE #
############
# Final opensuse10 series
[opensuse10.3]
url = http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/10.3/repo/oss
distro = opensuse10.3
# Final opensuse11 series
[opensuse11.4]
url = http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/11.4/repo/oss
distro = opensuse11.4
# Final opensuse12 series
[opensuse12.3]
url = http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/12.3/repo/oss
distro = opensuse12.3
testshortcircuit = 1
# Final opensuse13 series
[opensuse13.2]
url = http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/13.2/repo/oss
distro = opensuse13.2
# opensuse tumbleweed (rolling distro)
# Test for xen for full coverage
[opensusetumbleweed]
url = http://download.opensuse.org/tumbleweed/repo/oss/
distro = opensusetumbleweed
testxen = 1
##########
# Debian #
##########
# Debian FTP test case, for ftp:// testing. No particular reason it's
# debian. There should only be one ftp case since it's slooowwww
[debian8-ftp]
url = ftp://ftp.nluug.nl/pub/os/Linux/distr/debian/dists/jessie/main/installer-amd64/
distro = debian8
# Debian latest-1
[debian8]
url = http://ftp.us.debian.org/debian/dists/jessie/main/installer-amd64/
distro = debian8
# Debian latest, plus some exotic arch coverage
[debian9]
url = http://ftp.us.debian.org/debian/dists/stretch/main/installer-amd64/
distro = debian9
[debian9-s390x]
url = http://ftp.us.debian.org/debian/dists/stretch/main/installer-s390x/
distro = debian9
[debian9-arm64]
url = http://ftp.us.debian.org/debian/dists/stretch/main/installer-arm64/
distro = debian9
# Dialy tree, but also check for xen and boot.iso for full coverage
[debiandaily]
url = http://d-i.debian.org/daily-images/amd64/
testxen = 1
testbootiso = 1
distro = debiantesting
##########
# Ubuntu #
##########
# A couple old examples
[ubuntu8.04]
url = http://old-releases.ubuntu.com/ubuntu/dists/hardy/main/installer-amd64
distro = ubuntu8.04
testshortcircuit = 1
[ubuntu8.04-i686]
# Sneak a port parsing example in here
url = http://old-releases.ubuntu.com:80/ubuntu/dists/hardy/main/installer-i386
distro = ubuntu8.04
testshortcircuit = 1
# Latest LTS
[ubuntu16.04]
url = http://us.archive.ubuntu.com/ubuntu/dists/xenial/main/installer-amd64
distro = ubuntu16.04
# Latest release.
# Check for xen and boot iso for full coverage
[ubuntu17.10]
url = http://us.archive.ubuntu.com/ubuntu/dists/artful/main/installer-amd64
testxen = 1
testbootiso = 1
# No entry in libosinfo yet
#distro = ubuntu17.10
##########
# Mageia #
##########
# Latest release
[mageia6]
url = http://distro.ibiblio.org/mageia/distrib/6/x86_64/
# Devel tree
[mageiacauldron]
url = http://distro.ibiblio.org/mageia/distrib/cauldron/x86_64/

View File

@ -18,182 +18,88 @@
import unittest
import time
import logging
import sys
import traceback
from tests import URLTEST_LOCAL_MEDIA
from tests import utils
from virtinst import Guest
from virtinst import urlfetcher
from virtinst import util
from virtinst.urlfetcher import FedoraDistro
from virtinst.urlfetcher import SuseDistro
from virtinst.urlfetcher import DebianDistro
from virtinst.urlfetcher import ALTLinuxDistro
from virtinst.urlfetcher import CentOSDistro
from virtinst.urlfetcher import SLDistro
from virtinst.urlfetcher import UbuntuDistro
from virtinst.urlfetcher import DebianDistro
from virtinst.urlfetcher import FedoraDistro
from virtinst.urlfetcher import GenericDistro
from virtinst.urlfetcher import MandrivaDistro
# pylint: disable=protected-access
# Access to protected member, needed to unittest stuff
ARCHIVE_FEDORA_URL = "https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/%s/Fedora/%s/os/"
DEVFEDORA_URL = "http://dl.fedoraproject.org/pub/fedora/linux/development/%s/Server/%s/os/"
FEDORA_URL = "http://dl.fedoraproject.org/pub/fedora/linux/releases/%s/Server/%s/os/"
OLD_CENTOS_URL = "http://vault.centos.org/%s/os/%s"
CENTOS_URL = "http://mirrors.mit.edu/centos/%s/os/%s/"
OLD_SCIENTIFIC_URL = "http://ftp.scientificlinux.org/linux/scientific/%s/%s/"
SCIENTIFIC_URL = "http://ftp.scientificlinux.org/linux/scientific/%s/%s/os"
OPENSUSE10 = "http://ftp.hosteurope.de/mirror/ftp.opensuse.org/discontinued/10.0"
OLD_OPENSUSE_URL = "http://ftp5.gwdg.de/pub/opensuse/discontinued/distribution/%s/repo/oss"
OPENSUSE_URL = "http://download.opensuse.org/distribution/%s/repo/oss/"
OPENSUSE_TUMBLEWEED = "http://download.opensuse.org/tumbleweed/repo/oss/"
OLD_UBUNTU_URL = "http://old-releases.ubuntu.com/ubuntu/dists/%s/main/installer-%s"
UBUNTU_URL = "http://us.archive.ubuntu.com:80/ubuntu/dists/%s/main/installer-%s"
OLD_DEBIAN_URL = "http://archive.debian.org/debian/dists/%s/main/installer-%s/"
DAILY_DEBIAN_URL = "http://d-i.debian.org/daily-images/%s/"
DEBIAN_URL = "http://ftp.us.debian.org/debian/dists/%s/main/installer-%s/"
MAGEIA_URL = "http://distro.ibiblio.org/mageia/distrib/%s/%s"
urls = {}
_distro = None
from virtinst.urlfetcher import RHELDistro
from virtinst.urlfetcher import SLDistro
from virtinst.urlfetcher import SuseDistro
from virtinst.urlfetcher import UbuntuDistro
class _DistroURL(object):
def __init__(self, url, detectdistro=None,
hasxen=True, hasbootiso=True, name=None,
testshortcircuit=False, arch="x86_64"):
def __init__(self, name, url, detectdistro,
testxen, testbootiso, testshortcircuit):
self.name = name
self.url = url
self.arch = arch
self.detectdistro = detectdistro
self.hasxen = hasxen
self.hasbootiso = hasbootiso
if name:
self.name = name
else:
self.name = self.detectdistro
if self.arch != "x86_64":
self.name += "-%s" % self.arch
self.distroclass = _distro
self.arch = self._find_arch()
self.distroclass = self._distroclass_for_name(self.name)
logging.debug("Testing for media arch=%s distroclass=%s",
self.arch, self.distroclass)
self.testxen = testxen
self.testbootiso = testbootiso
# If True, pass in the expected distro value to getDistroStore
# so it can short circuit the lookup checks
# so it can short circuit the lookup checks. Speeds up the tests
# and exercises the shortcircuit infrastructure
self.testshortcircuit = testshortcircuit
def _distroclass_for_name(self, name):
# Map the test case name to the expected urlfetcher distro
# class we should be detecting
if "fedora" in name:
return FedoraDistro
if "centos" in name:
return CentOSDistro
if "rhel" in name:
return RHELDistro
if "suse" in name:
return SuseDistro
if "debian" in name:
return DebianDistro
if name.startswith("sl-"):
return SLDistro
if "ubuntu" in name:
return UbuntuDistro
if "mageia" in name:
return MandrivaDistro
if "altlinux" in name:
return ALTLinuxDistro
if "generic" in name:
return GenericDistro
raise RuntimeError("name=%s didn't map to any distro class. Extend "
"_distroclass_for_name" % name)
def _set_distro(_d):
# Saves us from having to pass distro class to ever _add invocation
global _distro
_distro = _d
def _add(*args, **kwargs):
_d = _DistroURL(*args, **kwargs)
if _d.name in urls:
raise RuntimeError("distro=%s url=%s collides with entry in urls, "
"set a unique name" % (_d.name, _d.url))
urls[_d.name] = _d
# Goal here is generally to cover all tree variants for each distro,
# where feasible. Don't exhaustively test i686 trees since most people
# aren't using it and it slows down the test, only use it in a couple
# places. Follow the comments for what trees to keep around
_set_distro(FedoraDistro)
# One old Fedora
_add(ARCHIVE_FEDORA_URL % ("14", "x86_64"), "fedora14")
_add(ARCHIVE_FEDORA_URL % ("14", "i386"), "fedora14", arch="i686")
# 2 Latest releases
_add(FEDORA_URL % ("26", "x86_64"), "fedora26")
_add(FEDORA_URL % ("27", "x86_64"), "fedora26", name="fedora27")
# Any Dev release
# _add(DEVFEDORA_URL % ("25", "x86_64"), "fedora23", name="fedora25")
_add(DEVFEDORA_URL % ("rawhide", "x86_64"), "fedora26", name="fedora-rawhide")
_set_distro(CentOSDistro)
# One old and new centos 4. No distro detection since there's no treeinfo
_add(OLD_CENTOS_URL % ("4.0", "x86_64"), hasxen=False, name="centos-4.0")
_add(OLD_CENTOS_URL % ("4.9", "x86_64"), name="centos-4.9")
# One old centos 5
_add(OLD_CENTOS_URL % ("5.0", "x86_64"), name="centos-5.0")
# Latest centos 5 w/ i686
_add(OLD_CENTOS_URL % ("5.11", "x86_64"), "rhel5.11", name="centos-5.11")
_add(OLD_CENTOS_URL % ("5.11", "i386"), "rhel5.11",
name="centos-5.11-i686", arch="i686")
# Latest centos 6 w/ i686
_add(CENTOS_URL % ("6", "x86_64"), "centos6.9", name="centos-6-latest")
_add(CENTOS_URL % ("6", "i386"), "centos6.9",
name="centos-6-latest-i686", arch="1686")
# Latest centos 7, but no i686 as of 2014-09-06
_add(CENTOS_URL % ("7", "x86_64"), "centos7.0", name="centos-7-latest")
# Centos 7 ppc64le
_add("http://mirror.centos.org/altarch/7/os/ppc64le/",
"centos7.0", name="centos-7-ppc64", hasbootiso=False, hasxen=False)
_set_distro(SLDistro)
# Latest scientific 6
_add(SCIENTIFIC_URL % ("6", "x86_64"), "rhel6.9", name="sl-6latest")
# Latest scientific 7
_add(SCIENTIFIC_URL % ("7", "x86_64"), "rhel7.4", name="sl-7latest")
_set_distro(SuseDistro)
# Latest 10 series
_add(OLD_OPENSUSE_URL % ("10.3"), "opensuse10.3", hasbootiso=False)
# Latest 11 series
_add(OLD_OPENSUSE_URL % ("11.4"), "opensuse11.4", hasbootiso=False)
# Latest 12 series
_add(OLD_OPENSUSE_URL % ("12.2"), "opensuse12.2",
hasbootiso=False, testshortcircuit=True)
_add(OLD_OPENSUSE_URL % ("12.2"), "opensuse12.2",
hasbootiso=False, testshortcircuit=True, arch="i686")
# Latest 13.x releases
_add(OPENSUSE_URL % ("13.1"), "opensuse13.1", hasbootiso=False)
# tumbleweed (rolling distro)
_add(OPENSUSE_TUMBLEWEED, "opensusetumbleweed", hasbootiso=False)
_set_distro(DebianDistro)
# FTP test case (only one since ftp tends to be horribly slow)
_add("ftp://ftp.nluug.nl/pub/os/Linux/distr/debian/dists/jessie/main/installer-amd64/", "debian8", name="debian8-ftp")
# Debian releases rarely enough that we can just do every release since lenny
_add(OLD_DEBIAN_URL % ("lenny", "amd64"), "debian5", hasxen=False,
testshortcircuit=True)
_add(DEBIAN_URL % ("wheezy", "amd64"), "debian7")
_add(DEBIAN_URL % ("jessie", "amd64"), "debian8")
_add(DEBIAN_URL % ("jessie", "s390x"), "debian8",
hasbootiso=False, hasxen=False, arch="s390x")
# And daily builds, since we specially handle that URL
_add(DAILY_DEBIAN_URL % ("amd64"), "debiantesting", name="debiandaily")
_add(DAILY_DEBIAN_URL % ("arm64"), "debiantesting",
name="debiandailyarm64", hasxen=False)
_set_distro(UbuntuDistro)
# One old ubuntu
_add(OLD_UBUNTU_URL % ("hardy", "amd64"), "ubuntu8.04",
hasxen=False, testshortcircuit=True)
_add(OLD_UBUNTU_URL % ("hardy", "i386"), "ubuntu8.04",
hasxen=False, testshortcircuit=True, arch="1686")
# Latest LTS
_add(UBUNTU_URL % ("precise", "amd64"), "ubuntu12.04")
# Latest release
_add(UBUNTU_URL % ("xenial", "amd64"), "ubuntu16.04")
_set_distro(MandrivaDistro)
_add(MAGEIA_URL % ("5", "x86_64"), name="mageia5", hasxen=False)
def _find_arch(self):
if ("i686" in self.url or
"i386" in self.url or
"i586" in self.url):
return "i686"
if ("arm64" in self.url or
"aarch64" in self.url):
return "aarch64"
if ("ppc64el" in self.url or
"ppc64le" in self.url):
return "ppc64le"
if "s390" in self.url:
return "s390x"
if ("x86_64" in self.url or
"amd64" in self.url):
return "x86_64"
return "x86_64"
testconn = utils.open_testdefault()
hvmguest = Guest(testconn)
@ -221,12 +127,14 @@ def _storeForDistro(fetcher, guest):
raise # pylint: disable=misplaced-bare-raise
def _testURL(fetcher, distname, distroobj):
def _testURL(fetcher, distroobj):
"""
Test that our URL detection logic works for grabbing kernel, xen
kernel, and boot.iso
"""
import sys
os.environ.pop("VIRTINST_TEST_SUITE", None)
distname = distroobj.name
sys.stdout.write("\nTesting %-25s " % distname)
sys.stdout.flush()
@ -236,11 +144,14 @@ def _testURL(fetcher, distname, distroobj):
if distroobj.testshortcircuit:
hvmguest.os_variant = distroobj.detectdistro
xenguest.os_variant = distroobj.detectdistro
else:
hvmguest.os_variant = None
xenguest.os_variant = None
try:
hvmstore = _storeForDistro(fetcher, hvmguest)
xenstore = None
if distroobj.hasxen:
if distroobj.testxen:
xenstore = _storeForDistro(fetcher, xenguest)
except Exception:
raise AssertionError("\nFailed to detect URLDistro class:\n"
@ -261,7 +172,7 @@ def _testURL(fetcher, distname, distroobj):
# Make sure the stores are reporting correct distro name/variant
if (s and distroobj.detectdistro and
distroobj.detectdistro != s.os_variant):
distroobj.detectdistro != s.get_osdict_info()):
raise AssertionError(
"Detected OS did not match expected values:\n"
"found = %s\n"
@ -280,10 +191,7 @@ def _testURL(fetcher, distname, distroobj):
fetcher.acquireFile = fakeAcquireFile
# Fetch boot iso
if not distroobj.hasbootiso:
logging.debug("Known lack of boot.iso in %s tree. Skipping.",
distname)
else:
if distroobj.testbootiso:
boot = hvmstore.acquireBootDisk(hvmguest)
logging.debug("acquireBootDisk: %s", str(boot))
@ -300,9 +208,7 @@ def _testURL(fetcher, distname, distroobj):
(distname, arch))
# Fetch xen kernel
if not xenstore:
logging.debug("acquireKernel (xen): Hardcoded skipping.")
else:
if xenstore:
kern = xenstore.acquireKernel(xenguest)
logging.debug("acquireKernel (xen): %s", str(kern))
@ -311,47 +217,42 @@ def _testURL(fetcher, distname, distroobj):
(distname, arch))
def _fetch_wrapper(url, cb, *args):
fetcher = urlfetcher.fetcherForURI(url, "/tmp", meter)
def _testURLWrapper(distroobj):
fetcher = urlfetcher.fetcherForURI(distroobj.url, "/tmp", meter)
try:
fetcher.prepareLocation()
return cb(fetcher, *args)
return _testURL(fetcher, distroobj)
finally:
fetcher.cleanupLocation()
def _make_test_wrapper(url, args):
def cmdtemplate():
return _fetch_wrapper(url, _testURL, *args)
return lambda _self: cmdtemplate()
# Register tests to be picked up by unittest
# If local ISO tests requested, skip all other URL tests
class URLTests(unittest.TestCase):
pass
def _make_tests():
global urls
import ConfigParser
cfg = ConfigParser.ConfigParser()
cfg.read("tests/test_urls.ini")
if URLTEST_LOCAL_MEDIA:
urls = {}
newidx = 0
for p in URLTEST_LOCAL_MEDIA:
newidx += 1
d = _DistroURL(p, None, hasxen=False, hasbootiso=False,
name="path%s" % newidx)
d.distroclass = None
urls[d.name] = d
urls = {}
for name in cfg.sections():
vals = dict(cfg.items(name))
d = _DistroURL(name, vals["url"],
vals.get("distro", None),
vals.get("testxen", "0") == "1",
vals.get("testbootiso", "0") == "1",
vals.get("testshortcircuit", "0") == "1")
urls[d.name] = d
keys = urls.keys()
keys.sort()
for key in keys:
distroobj = urls[key]
args = (key, distroobj)
testfunc = _make_test_wrapper(distroobj.url, args)
setattr(URLTests, "testURL%s" % key, testfunc)
def _make_wrapper(d):
return lambda _self: _testURLWrapper(d)
setattr(URLTests, "testURL%s" % key.replace("-", "_"),
_make_wrapper(distroobj))
_make_tests()