2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-10-15 08:12:02 +00:00

ci: run the provtest checks after ci_test and before the DHCP wire test

The provisioning cases go where a node meets them: after the whole
ci_test set, so they are not reconfiguring the machine underneath it, and
before the DHCP phases.

run_provtest_unit_tests runs the offline half first -- the Python suite
and a parse of every scenario -- so a file that does not even load is
reported as that rather than as a case failure, and skips rather than
fails when python3 is absent. run_prov_wire_test then runs the prov_wire
cases once, not once per backend: nothing in them depends on which DHCP
server is installed, and what a node is told over DHCP is dhcptest's
subject.
This commit is contained in:
Daniel Hilst
2026-09-11 09:01:00 -03:00
parent 711c4870db
commit a1bc164b5a
+118
View File
@@ -542,6 +542,49 @@ sub run_dhcptest_unit_tests{
return 0;
}
#--------------------------------------------------------
# Fuction name: run_provtest_unit_tests
# Description: Run the provtest offline checks: its Python unit tests and
# `provtest validate` over every shipped .conf. Both are
# unprivileged and touch no network -- the wire scenarios need a
# veth pair, a network namespace and a running xcatd, so they are
# not run here. Skipped when python3 is absent rather than
# failing the build.
# Attributes:
# Return code: 0 all checks passed, 1 otherwise
#--------------------------------------------------------
sub run_provtest_unit_tests{
my $testdir = "$unitsrc/xCAT-test/provtest";
if (! -d $testdir) {
print "[run_provtest_unit_tests] no provtest found under $testdir\n";
return 0;
}
runcmd("which python3 2>/dev/null");
if($::RUNCMD_RC){
print "[run_provtest_unit_tests] python3 is not installed, skipping\n";
return 0;
}
# The unit tests are discovered from inside tests/ because that is where
# their own context module puts the package on the path.
my $cmd = "cd $testdir/tests && python3 -m unittest discover -s . -p 'test_*.py'"
. " && cd $testdir && python3 src/provtest validate conf/*.conf";
print "[run_provtest_unit_tests] running $cmd\n";
my @output = runcmd("$cmd");
print Dumper \@output;
if($::RUNCMD_RC){
print RED "[run_provtest_unit_tests] $cmd ....[Failed]\n";
$check_result_str .= "> **PROVTEST TESTS Failed** : Please click ``Details`` label in ``Merge pull request`` box for detailed information\n";
print $check_result_str;
return 1;
}
print "[run_provtest_unit_tests] $cmd ....[Pass]\n";
$check_result_str .= "> **PROVTEST TESTS Successful**\n";
print $check_result_str;
return 0;
}
#--------------------------------------------------------
# Fuction name: check_syntax
# Description:
@@ -780,6 +823,60 @@ sub run_dhcp_wire_test{
return 0;
}
#--------------------------------------------------------
# Fuction name: run_prov_wire_test
# Description: run the provisioning wire cases.
#
# These come after the ci_test set and before the DHCP wire phase, which is
# the order a node experiences: DNS, then the loader and its config, then the
# install tree, then the discovery and xcatd protocols. They are deliberately
# not labelled ci_test, for the same reason the DHCP wire cases are not --
# while one runs, the management node has an extra veth pair and network
# namespace, a network object and four nodes it did not have, a rewritten
# zone, and possibly a web server on another port. Each case puts all of it
# back from a trap, but a ci_test case running in between would be sharing a
# machine that is mid-reconfiguration.
#
# Unlike the DHCP cases these are run once rather than once per backend:
# nothing here depends on which DHCP server is installed, and the cases that
# would -- what a node is told over DHCP -- are dhcptest's subject.
# Attributes:
# Return code: 0 if every case passed
#--------------------------------------------------------
sub run_prov_wire_test{
my @cases = list_cases("prov_wire");
unless(@cases){
print "[run_prov_wire_test] no provisioning wire cases to run\n";
$check_result_str .= "> **PROVISION WIRE TEST Skipped**: no case carries the prov_wire label\n";
print $check_result_str;
return 0;
}
my $fixture = "/opt/xcat/share/xcat/tools/autotest/testcase/provtest/provfixture.sh";
unless(-f $fixture){
print RED "[run_prov_wire_test] $fixture is missing, so the wire cases cannot be run\n";
$check_result_str .= "> **PROVISION WIRE TEST Failed**: $fixture is not installed\n";
print $check_result_str;
return 1;
}
my $conf_file = write_regression_conf("prov-wire.conf", 0);
my %counts = (pass => 0, fail => 0, failed => []);
run_cases($conf_file, \@cases, "", \%counts, "run_prov_wire_test");
my $casenum = $counts{pass} + $counts{fail};
if($counts{fail}){
my $log_str = join(",", @{$counts{failed}});
$check_result_str .= "> **PROVISION WIRE TEST Failed**: Totalcase $casenum Passed $counts{pass} Failed $counts{fail} FailedCases: $log_str. Please click ``Details`` label in ``Merge pull request`` box for detailed information\n";
print $check_result_str;
return 1;
}
$check_result_str .= "> **PROVISION WIRE TEST Successful**: Totalcase $casenum Passed $counts{pass} Failed $counts{fail}\n";
print $check_result_str;
return 0;
}
#--------------------------------------------------------
# Fuction name: run_fast_regression_test
# Description:
@@ -953,6 +1050,27 @@ if($rst){
}
mark_time("run_fast_regression_test");
#The provisioning wire cases come next: after the ci_test set, so they are not
#reconfiguring the machine underneath it, and before the DHCP phases, which is
#the order a booting node meets them in. Their offline checks run first, so a
#scenario file that does not even parse is reported as that rather than as a
#case failure.
print GREEN "\n------Running xCAT-test provtest checks ------\n";
$rst = run_provtest_unit_tests();
if($rst){
print RED "Run of xCAT-test provtest checks failed\n";
exit $rst;
}
mark_time("run_provtest_unit_tests");
print GREEN "\n------Running provisioning on-wire test ------\n";
$rst = run_prov_wire_test();
if($rst){
print RED "Run of provisioning on-wire test failed\n";
exit $rst;
}
mark_time("run_prov_wire_test");
#Run the dhcptest offline checks -- unit tests plus `dhcptest validate` -- last:
#they exercise the source tree rather than the installed copy, and nothing else
#in the run depends on them.