# Copyright (C) 2013, 2014 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 sys


_alldistros = {}

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/"

(WARN_RHEL5, WARN_DEBIAN, WARN_FEDORA) = range(1, 4)


def prompt():
    sys.stdout.write("(press enter to continue)")
    sys.stdout.flush()
    return sys.stdin.readline()


KSOLD = "tests/data/inject/old-kickstart.ks"
KSNEW = "tests/data/inject/new-kickstart.ks"
PRESEED = "tests/data/inject/preseed.cfg"


class Distro:
    def __init__(self, name, url, filename, warntype=WARN_FEDORA):
        self.name = name
        self.url = url
        self.warntype = warntype
        self.filename = filename

        self.kernel = None
        self.initrd = None


def _add(*args, **kwargs):
    _d = Distro(*args, **kwargs)
    _alldistros[_d.name] = _d


_add("centos5.11", "http://vault.centos.org/5.11/os/x86_64/", warntype=WARN_RHEL5, filename=KSOLD)
_add("centos6.10", "http://vault.centos.org/6.10/os/x86_64", warntype=WARN_RHEL5, filename=KSOLD)
_add("centos7latest", "http://ftp.linux.ncsu.edu/pub/CentOS/7/os/x86_64/", filename=KSNEW)
_add(
    "centos8stream",
    "http://ftp.linux.ncsu.edu/pub/CentOS/8-stream/BaseOS/x86_64/os/",
    filename=KSNEW,
)
_add("fedora35", FEDORA_URL % ("29", "x86_64"), filename=KSNEW)
_add("fedora36", DEVFEDORA_URL % ("35", "x86_64"), filename=KSNEW)
_add(
    "debian9",
    "http://ftp.us.debian.org/debian/dists/stretch/main/installer-amd64/",
    filename=PRESEED,
    warntype=WARN_DEBIAN,
)
_add(
    "debian11",
    "http://ftp.us.debian.org/debian/dists/bullseye/main/installer-amd64/",
    filename=PRESEED,
    warntype=WARN_DEBIAN,
)


def _test_distro(distro):
    os.system("clear")
    print("\n")
    if distro.warntype == WARN_RHEL5:
        print("RHEL5, RHEL6, Fedora < 17: You'll get an error about a ")
        print("bogus bootproto ITREADTHEKICKSTART. This means anaconda ")
        print("read our busted kickstart.")
    elif distro.warntype == WARN_DEBIAN:
        print(
            "Debian: Won't ask any questions, will autoconfig network, "
            "then print a big red text box about a bad mirror config."
        )
    elif distro.warntype == WARN_FEDORA:
        print("RHEL, Fedora >= 17: Chokes on the bogus URI in the early ")
        print("console screen when fetching the installer squashfs image.")

    os.environ.pop("VIRTINST_TEST_SUITE", None)
    os.environ["VIRTINST_INITRD_TEST"] = "1"

    if distro.warntype == WARN_DEBIAN:
        append = "auto=true"
    else:
        append = '"ks=file:/%s"' % os.path.basename(distro.filename)
    cmd = (
        "./virt-install --connect qemu:///system "
        "--name __virtinst__test__initrd__ --ram 2048 "
        "--transient --destroy-on-exit --disk none "
        "--location %s --initrd-inject %s "
        "--install kernel_args=%s,kernel_args_overwrite=yes" % (distro.url, distro.filename, append)
    )
    print("\n\n" + cmd)
    os.system(cmd)


def _print_intro():
    print(
        """


This is an interactive test suite.

We are going to launch various transient virt-installs, using initrd
injections, that will cause installs to quickly fail. Look for the
failure pattern to confirm that initrd injections are working as expected.

"""
    )
    prompt()


def _build_testfunc(dobj, do_setup):
    def testfunc():
        if do_setup:
            _print_intro()
        _test_distro(dobj)

    return testfunc


def _make_tests():
    idx = 0
    for dname, dobj in _alldistros.items():
        idx += 1
        name = "testInitrd%.3d_%s" % (idx, dname)

        do_setup = idx == 1
        testfunc = _build_testfunc(dobj, do_setup)
        globals()[name] = testfunc


_make_tests()
