mirror of
https://pagure.io/fedora-qa/os-autoinst-distri-fedora.git
synced 2024-11-21 13:33:08 +00:00
b97c019ae9
Summary: T617 makes some good points about the language tags; this is my suggestion for an improvement. It requires a bit of cleverness in unregister_prefix_tags(), but the upshot is that you don't need to know to set any special tags when creating needles, a needle with no language-related tags will be considered as valid for all languages. You have to explicitly add LANGUAGE- tag(s) to a needle for the language filtering to 'kick in' in any way. If a needle has at least one LANGUAGE- tag, it will be filtered unless it has the appropriate tag for the job's specified language (default is still 'english'). With this approach, only needles which we specifically want to *only* match their tagged language(s) need the tags, so we can drop all those -ALL tags. We're using LANGUAGE- instead of ENV-LANGUAGE- now because the ENV- tag names denote tags that are treated slightly specially by openQA, and this is not one. We cannot cleanly use ENV-INSTLANG because openQA has a hardwired default of 'en_US' for that. Test Plan: Check both English and French tests still work as intended. Reviewers: jskladan, garretraziel Reviewed By: garretraziel Subscribers: tflink Differential Revision: https://phab.qadevel.cloud.fedoraproject.org/D589
197 lines
8.0 KiB
Perl
197 lines
8.0 KiB
Perl
# Copyright (C) 2014 SUSE Linux GmbH
|
|
#
|
|
# This program is free software; you can redistribute it and/or modify
|
|
# it under the terms of the GNU General Public License as published by
|
|
# the Free Software Foundation; either version 2 of the License, or
|
|
# (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU General Public License along
|
|
# with this program; if not, write to the Free Software Foundation, Inc.,
|
|
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
use strict;
|
|
use testapi;
|
|
use autotest;
|
|
use needle;
|
|
|
|
# distribution-specific implementations of expected methods
|
|
my $distri = testapi::get_var("CASEDIR") . '/lib/fedoradistribution.pm';
|
|
require $distri;
|
|
testapi::set_distribution(fedoradistribution->new());
|
|
|
|
# Stolen from openSUSE.
|
|
sub unregister_needle_tags($) {
|
|
my $tag = shift;
|
|
my @a = @{ needle::tags($tag) };
|
|
for my $n (@a) { $n->unregister(); }
|
|
}
|
|
|
|
# The purpose of this function is to un-register all needles which have
|
|
# at least one tag that starts with a given string (the 'prefix'), if
|
|
# it does not have any tag that matches the pattern 'prefix-value', for
|
|
# any of the values given in an array. The first argument passed must
|
|
# be the prefix; the second must be a reference to the array of values.
|
|
# For instance, if the 'prefix' is LANGUAGE and the 'values' are
|
|
# ENGLISH and FRENCH, this function would un-reference a needle which
|
|
# had only the tag 'LANGUAGE-DUTCH', but it would keep a needle which
|
|
# had the tag 'LANGUAGE-ENGLISH', or a needle with no tag starting in
|
|
# 'LANGUAGE-' at all.
|
|
sub unregister_prefix_tags {
|
|
my ($prefix, $valueref) = @_;
|
|
NEEDLE: for my $needle ( needle::all() ) {
|
|
my $unregister = 0;
|
|
for my $tag ( @{$needle->{'tags'}} ) {
|
|
if ($tag =~ /^\Q$prefix/) {
|
|
# We have at least one tag matching the prefix, so we
|
|
# *MAY* want to un-register the needle
|
|
$unregister = 1;
|
|
for my $value ( @{$valueref} ) {
|
|
# At any point if we hit a prefix-value match, we
|
|
# know we need to keep this needle and can skip
|
|
# to the next
|
|
next NEEDLE if ($tag eq "$prefix-$value");
|
|
}
|
|
}
|
|
}
|
|
# We get here if we hit no prefix-value match, but we only want
|
|
# to unregister the needle if we hit any prefix match, i.e. if
|
|
# 'unregister' is 1.
|
|
$needle->unregister() if ($unregister);
|
|
}
|
|
}
|
|
|
|
sub cleanup_needles() {
|
|
if (!get_var('LIVE') and !get_var('CANNED')) {
|
|
## Unregister smaller hub needles. Live and 'canned' installers have
|
|
## a smaller hub with no repository spokes. On other images we want
|
|
## to wait for repository setup to complete, but if we match that
|
|
## spoke's "ready" icon, it breaks live and canned because they
|
|
## don't have that spoke. So we have a needle which doesn't match
|
|
## on that icon, but we unregister it for other installs so they
|
|
## don't match on it too soon.
|
|
unregister_needle_tags("INSTALLER-smallhub");
|
|
}
|
|
|
|
# Unregister non-language-appropriate needles. See unregister_except_
|
|
# tags for details; basically all needles with at least one LANGUAGE-
|
|
# tag will be unregistered unless they match the current langauge.
|
|
my $langref = [ get_var('LANGUAGE') || 'english' ];
|
|
unregister_prefix_tags('LANGUAGE', $langref);
|
|
}
|
|
$needle::cleanuphandler = \&cleanup_needles;
|
|
|
|
if (get_var('LIVE')) {
|
|
# No package set selection for lives.
|
|
set_var('PACKAGE_SET', "default");
|
|
}
|
|
|
|
# if user set ENTRYPOINT, run required test directly
|
|
# (good for tests where it doesn't make sense to use _boot_to_anaconda, _software_selection etc.)
|
|
if (get_var("ENTRYPOINT"))
|
|
{
|
|
autotest::loadtest get_var('CASEDIR')."/tests/".get_var("ENTRYPOINT").".pm";
|
|
}
|
|
elsif (get_var("UPGRADE"))
|
|
{
|
|
# all upgrade tests consist of: preinstall phase (where packages are upgraded and
|
|
# dnf-plugin-system-upgrade is installed), run phase (where upgrade is run) and postinstall
|
|
# phase (where is checked if fedora was upgraded successfully)
|
|
autotest::loadtest get_var('CASEDIR')."/tests/upgrade_preinstall.pm";
|
|
autotest::loadtest get_var('CASEDIR')."/tests/upgrade_run.pm";
|
|
# UPGRADE can be set to "minimal", "encrypted", "desktop"...
|
|
autotest::loadtest get_var('CASEDIR')."/tests/upgrade_postinstall_".get_var("UPGRADE").".pm";
|
|
}
|
|
else
|
|
{
|
|
# normal installation test consists of several phases, from which some of them are
|
|
# loaded automatically and others are loaded based on what env variables are set
|
|
|
|
# generally speaking, install test consists of: boot phase, customization phase, installation
|
|
# and reboot phase, postinstall phase
|
|
|
|
# boot phase is loaded automatically every time
|
|
autotest::loadtest get_var('CASEDIR')."/tests/_boot_to_anaconda.pm";
|
|
|
|
# with kickstart tests, booting to anaconda is the only thing required (kickstart file handles
|
|
# everything else)
|
|
unless (get_var("KICKSTART"))
|
|
{
|
|
|
|
## Installation source
|
|
if (get_var('MIRRORLIST_GRAPHICAL') || get_var("REPOSITORY_GRAPHICAL")){
|
|
autotest::loadtest get_var('CASEDIR')."/tests/install_source_graphical.pm";
|
|
}
|
|
if (get_var("REPOSITORY_VARIATION")){
|
|
autotest::loadtest get_var('CASEDIR')."/tests/install_source_variation.pm";
|
|
}
|
|
|
|
## Select package set. Minimal is the default, if 'default' is specified, skip selection.
|
|
autotest::loadtest get_var('CASEDIR')."/tests/_software_selection.pm";
|
|
|
|
## Disk partitioning.
|
|
# If PARTITIONING is set, we pick the storage test
|
|
# to run based on the value (usually we run the test with the name
|
|
# that matches the value, except for a couple of commented cases).
|
|
my $storage = '';
|
|
my $partitioning = get_var('PARTITIONING');
|
|
# if PARTITIONING is unset, or one of [...], use disk_guided_empty,
|
|
# which is the simplest / 'default' case.
|
|
if (! $partitioning || $partitioning ~~ ['guided_empty', 'guided_free_space']) {
|
|
$storage = get_var('CASEDIR')."/tests/disk_guided_empty.pm";
|
|
}
|
|
else {
|
|
$storage = get_var('CASEDIR')."/tests/disk_".$partitioning.".pm";
|
|
}
|
|
autotest::loadtest $storage;
|
|
|
|
if (get_var("ENCRYPT_PASSWORD")){
|
|
autotest::loadtest get_var('CASEDIR')."/tests/disk_guided_encrypted.pm";
|
|
}
|
|
|
|
# Start installation, set user & root passwords, reboot
|
|
# install and reboot phase is loaded automatically every time (except when KICKSTART is set)
|
|
autotest::loadtest get_var('CASEDIR')."/tests/_do_install_and_reboot.pm";
|
|
}
|
|
|
|
# Unlock encrypted storage volumes, if necessary. The test name here
|
|
# follows the 'storage post-install' convention, but must be run earlier.
|
|
if (get_var("ENCRYPT_PASSWORD")){
|
|
autotest::loadtest get_var('CASEDIR')."/tests/disk_guided_encrypted_postinstall.pm";
|
|
}
|
|
|
|
# Appropriate login method for install type
|
|
if (get_var("DESKTOP")) {
|
|
autotest::loadtest get_var('CASEDIR')."/tests/_graphical_wait_login.pm";
|
|
}
|
|
else {
|
|
autotest::loadtest get_var('CASEDIR')."/tests/_console_wait_login.pm";
|
|
}
|
|
|
|
# from now on, we have fully installed and booted system with root/specified user logged in
|
|
|
|
# If there is a post-install test to verify storage configuration worked
|
|
# correctly, run it. Again we determine the test name based on the value
|
|
# of PARTITIONING
|
|
my $storagepost = '';
|
|
if (get_var('PARTITIONING')) {
|
|
my $loc = get_var('CASEDIR')."/tests/disk_".get_var('PARTITIONING')."_postinstall.pm";
|
|
$storagepost = $loc if (-e $loc);
|
|
}
|
|
autotest::loadtest $storagepost if ($storagepost);
|
|
|
|
if (get_var("UEFI")) {
|
|
autotest::loadtest get_var('CASEDIR')."/tests/uefi_postinstall.pm";
|
|
}
|
|
}
|
|
|
|
|
|
|
|
1;
|
|
|
|
# vim: set sw=4 et:
|