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): class TestURLFetch(TestBaseCommand):
description = "Test fetching kernels and isos from various distro trees" 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): def initialize_options(self):
TestBaseCommand.initialize_options(self) TestBaseCommand.initialize_options(self)
self.path = "" self.path = ""
@ -548,9 +543,6 @@ class TestURLFetch(TestBaseCommand):
def run(self): def run(self):
self._testfiles = ["tests.test_urls"] self._testfiles = ["tests.test_urls"]
if self.path:
import tests
tests.URLTEST_LOCAL_MEDIA += self.path
TestBaseCommand.run(self) TestBaseCommand.run(self)

View File

@ -32,10 +32,6 @@ imp.reload(cliconfig)
from tests import utils 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 virtinstall = None
virtclone = None virtclone = None
virtconvert = 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 unittest
import time import time
import logging import logging
import sys
import traceback import traceback
from tests import URLTEST_LOCAL_MEDIA
from tests import utils from tests import utils
from virtinst import Guest from virtinst import Guest
from virtinst import urlfetcher from virtinst import urlfetcher
from virtinst import util from virtinst import util
from virtinst.urlfetcher import FedoraDistro from virtinst.urlfetcher import ALTLinuxDistro
from virtinst.urlfetcher import SuseDistro
from virtinst.urlfetcher import DebianDistro
from virtinst.urlfetcher import CentOSDistro from virtinst.urlfetcher import CentOSDistro
from virtinst.urlfetcher import SLDistro from virtinst.urlfetcher import DebianDistro
from virtinst.urlfetcher import UbuntuDistro from virtinst.urlfetcher import FedoraDistro
from virtinst.urlfetcher import GenericDistro
from virtinst.urlfetcher import MandrivaDistro from virtinst.urlfetcher import MandrivaDistro
from virtinst.urlfetcher import RHELDistro
from virtinst.urlfetcher import SLDistro
# pylint: disable=protected-access from virtinst.urlfetcher import SuseDistro
# Access to protected member, needed to unittest stuff from virtinst.urlfetcher import UbuntuDistro
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
class _DistroURL(object): class _DistroURL(object):
def __init__(self, url, detectdistro=None, def __init__(self, name, url, detectdistro,
hasxen=True, hasbootiso=True, name=None, testxen, testbootiso, testshortcircuit):
testshortcircuit=False, arch="x86_64"): self.name = name
self.url = url self.url = url
self.arch = arch
self.detectdistro = detectdistro self.detectdistro = detectdistro
self.hasxen = hasxen self.arch = self._find_arch()
self.hasbootiso = hasbootiso self.distroclass = self._distroclass_for_name(self.name)
if name: logging.debug("Testing for media arch=%s distroclass=%s",
self.name = name self.arch, self.distroclass)
else:
self.name = self.detectdistro self.testxen = testxen
if self.arch != "x86_64": self.testbootiso = testbootiso
self.name += "-%s" % self.arch
self.distroclass = _distro
# If True, pass in the expected distro value to getDistroStore # 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 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): def _find_arch(self):
# Saves us from having to pass distro class to ever _add invocation if ("i686" in self.url or
global _distro "i386" in self.url or
_distro = _d "i586" in self.url):
return "i686"
if ("arm64" in self.url or
def _add(*args, **kwargs): "aarch64" in self.url):
_d = _DistroURL(*args, **kwargs) return "aarch64"
if _d.name in urls: if ("ppc64el" in self.url or
raise RuntimeError("distro=%s url=%s collides with entry in urls, " "ppc64le" in self.url):
"set a unique name" % (_d.name, _d.url)) return "ppc64le"
urls[_d.name] = _d if "s390" in self.url:
return "s390x"
if ("x86_64" in self.url or
# Goal here is generally to cover all tree variants for each distro, "amd64" in self.url):
# where feasible. Don't exhaustively test i686 trees since most people return "x86_64"
# aren't using it and it slows down the test, only use it in a couple return "x86_64"
# 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)
testconn = utils.open_testdefault() testconn = utils.open_testdefault()
hvmguest = Guest(testconn) hvmguest = Guest(testconn)
@ -221,12 +127,14 @@ def _storeForDistro(fetcher, guest):
raise # pylint: disable=misplaced-bare-raise 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 Test that our URL detection logic works for grabbing kernel, xen
kernel, and boot.iso kernel, and boot.iso
""" """
import sys os.environ.pop("VIRTINST_TEST_SUITE", None)
distname = distroobj.name
sys.stdout.write("\nTesting %-25s " % distname) sys.stdout.write("\nTesting %-25s " % distname)
sys.stdout.flush() sys.stdout.flush()
@ -236,11 +144,14 @@ def _testURL(fetcher, distname, distroobj):
if distroobj.testshortcircuit: if distroobj.testshortcircuit:
hvmguest.os_variant = distroobj.detectdistro hvmguest.os_variant = distroobj.detectdistro
xenguest.os_variant = distroobj.detectdistro xenguest.os_variant = distroobj.detectdistro
else:
hvmguest.os_variant = None
xenguest.os_variant = None
try: try:
hvmstore = _storeForDistro(fetcher, hvmguest) hvmstore = _storeForDistro(fetcher, hvmguest)
xenstore = None xenstore = None
if distroobj.hasxen: if distroobj.testxen:
xenstore = _storeForDistro(fetcher, xenguest) xenstore = _storeForDistro(fetcher, xenguest)
except Exception: except Exception:
raise AssertionError("\nFailed to detect URLDistro class:\n" 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 # Make sure the stores are reporting correct distro name/variant
if (s and distroobj.detectdistro and if (s and distroobj.detectdistro and
distroobj.detectdistro != s.os_variant): distroobj.detectdistro != s.get_osdict_info()):
raise AssertionError( raise AssertionError(
"Detected OS did not match expected values:\n" "Detected OS did not match expected values:\n"
"found = %s\n" "found = %s\n"
@ -280,10 +191,7 @@ def _testURL(fetcher, distname, distroobj):
fetcher.acquireFile = fakeAcquireFile fetcher.acquireFile = fakeAcquireFile
# Fetch boot iso # Fetch boot iso
if not distroobj.hasbootiso: if distroobj.testbootiso:
logging.debug("Known lack of boot.iso in %s tree. Skipping.",
distname)
else:
boot = hvmstore.acquireBootDisk(hvmguest) boot = hvmstore.acquireBootDisk(hvmguest)
logging.debug("acquireBootDisk: %s", str(boot)) logging.debug("acquireBootDisk: %s", str(boot))
@ -300,9 +208,7 @@ def _testURL(fetcher, distname, distroobj):
(distname, arch)) (distname, arch))
# Fetch xen kernel # Fetch xen kernel
if not xenstore: if xenstore:
logging.debug("acquireKernel (xen): Hardcoded skipping.")
else:
kern = xenstore.acquireKernel(xenguest) kern = xenstore.acquireKernel(xenguest)
logging.debug("acquireKernel (xen): %s", str(kern)) logging.debug("acquireKernel (xen): %s", str(kern))
@ -311,47 +217,42 @@ def _testURL(fetcher, distname, distroobj):
(distname, arch)) (distname, arch))
def _fetch_wrapper(url, cb, *args): def _testURLWrapper(distroobj):
fetcher = urlfetcher.fetcherForURI(url, "/tmp", meter) fetcher = urlfetcher.fetcherForURI(distroobj.url, "/tmp", meter)
try: try:
fetcher.prepareLocation() fetcher.prepareLocation()
return cb(fetcher, *args) return _testURL(fetcher, distroobj)
finally: finally:
fetcher.cleanupLocation() 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 # Register tests to be picked up by unittest
# If local ISO tests requested, skip all other URL tests
class URLTests(unittest.TestCase): class URLTests(unittest.TestCase):
pass pass
def _make_tests(): def _make_tests():
global urls import ConfigParser
cfg = ConfigParser.ConfigParser()
cfg.read("tests/test_urls.ini")
if URLTEST_LOCAL_MEDIA: urls = {}
urls = {} for name in cfg.sections():
newidx = 0 vals = dict(cfg.items(name))
for p in URLTEST_LOCAL_MEDIA: d = _DistroURL(name, vals["url"],
newidx += 1 vals.get("distro", None),
vals.get("testxen", "0") == "1",
d = _DistroURL(p, None, hasxen=False, hasbootiso=False, vals.get("testbootiso", "0") == "1",
name="path%s" % newidx) vals.get("testshortcircuit", "0") == "1")
d.distroclass = None urls[d.name] = d
urls[d.name] = d
keys = urls.keys() keys = urls.keys()
keys.sort() keys.sort()
for key in keys: for key in keys:
distroobj = urls[key] distroobj = urls[key]
args = (key, distroobj) def _make_wrapper(d):
testfunc = _make_test_wrapper(distroobj.url, args) return lambda _self: _testURLWrapper(d)
setattr(URLTests, "testURL%s" % key, testfunc) setattr(URLTests, "testURL%s" % key.replace("-", "_"),
_make_wrapper(distroobj))
_make_tests() _make_tests()