2
0
mirror of https://github.com/xcat2/xcat-core.git synced 2026-09-04 20:17:55 +00:00

Merge pull request #7792 from VersatusHPC/refactor/el-major-predicate

refactor(postscripts): centralize EL9 version check
This commit is contained in:
Daniel Hilst
2026-08-31 11:26:12 -03:00
committed by GitHub
6 changed files with 226 additions and 13 deletions
+203
View File
@@ -0,0 +1,203 @@
#!/usr/bin/env perl
use strict;
use warnings;
use File::Spec;
use File::Temp qw(tempdir);
use FindBin;
use Test::More;
my $xcatlib = File::Spec->catfile(
$FindBin::Bin, '..', '..', 'xCAT', 'postscripts', 'xcatlib.sh'
);
my $nicutils = File::Spec->catfile(
$FindBin::Bin, '..', '..', 'xCAT', 'postscripts', 'nicutils.sh'
);
my $routeop = File::Spec->catfile(
$FindBin::Bin, '..', '..', 'xCAT', 'postscripts', 'routeop'
);
sub extra_parameter_path {
my ( $osver, $report_rematch ) = @_;
$report_rematch //= '';
my $script = <<'BASH';
source "$1"
source "$2"
query_extra_params()
{
array_extra_param_names=(mtu)
array_extra_param_values=(9000)
}
grep()
{
return 0
}
sed()
{
printf '%s\n' legacy-write
}
nmcli()
{
case "$1 $2" in
'con modify') printf '%s\n' el9-nmcli ;;
'con reload') printf '%s\n' legacy-reload ;;
*) return 2 ;;
esac
}
OSVER=$3
add_extra_params_nmcli eth0 test0
if [ "$4" = rematch ]; then
printf '%s|%s|%s|%s\n' \
"${#BASH_REMATCH[@]}" \
"${BASH_REMATCH[0]-}" \
"${BASH_REMATCH[1]-}" \
"${BASH_REMATCH[2]-}"
fi
BASH
open(
my $output,
'-|',
'bash',
'--noprofile',
'--norc',
'-c',
$script,
'bash',
$xcatlib,
$nicutils,
$osver,
$report_rematch
) or die "Unable to run EL postscript workflow: $!";
my $result = do { local $/; <$output> };
close($output) or die "EL postscript workflow failed: $?";
chomp $result;
return $result;
}
sub route_path_without_current_helper {
my ($stale_library) = @_;
my $tempdir = tempdir( CLEANUP => 1 );
my $runner = File::Spec->catfile( $tempdir, 'routeop-runner' );
if ($stale_library) {
my $old_xcatlib = File::Spec->catfile( $tempdir, 'xcatlib.sh' );
open( my $library, '>', $old_xcatlib )
or die "Unable to create old xcatlib stub: $!";
print {$library} "# Older xcatlib without xcat_is_el9_or_later\n";
close($library) or die "Unable to close old xcatlib stub: $!";
}
my $script = <<'BASH';
exec 2>&1
uname()
{
printf '%s\n' "$ROUTE_TEST_UNAME"
}
nmcli()
{
return 0
}
report_route_path()
{
if [ "$ROUTE_TEST_UNSET_HELPER" = 1 ]; then
unset -f xcat_is_el9_or_later
fi
OS_name=redhat
OSVER=rhel9
if redhat_uses_nmcli_routes; then
printf '%s\n' el9-nmcli
else
printf '%s\n' legacy-route
fi
}
trap report_route_path EXIT
source "$1" noop 192.0.2.0 24 192.0.2.1 eth0
BASH
local $ENV{ROUTE_TEST_UNAME} = 'Linux';
local $ENV{ROUTE_TEST_UNSET_HELPER} = $stale_library ? 0 : 1;
open(
my $output,
'-|',
'bash',
'--noprofile',
'--norc',
'-c',
$script,
$runner,
$routeop
) or die "Unable to run routeop workflow: $!";
my $result = do { local $/; <$output> };
close($output) or die "routeop workflow failed: $?";
chomp $result;
return $result;
}
my @accepted = (
[ 'rhel9', 'RHEL 9' ],
[ 'rhels9.6', 'legacy RHEL spelling with a point release' ],
[ 'alma9', 'AlmaLinux short spelling' ],
[ 'almalinux9.5', 'AlmaLinux long spelling with a point release' ],
[ 'rocky10', 'Rocky Linux 10' ],
[ 'centos10-stream', 'CentOS 10 stream suffix' ],
[ 'ol10', 'Oracle Linux 10' ],
);
for my $case (@accepted) {
is(
extra_parameter_path( $case->[0] ),
'el9-nmcli',
"$case->[1] uses the EL9 NetworkManager path"
);
}
my @rejected = (
[ 'rhel8.10', 'RHEL 8' ],
[ 'rhels8', 'legacy RHEL 8 spelling' ],
[ 'alma8', 'AlmaLinux 8 short spelling' ],
[ 'almalinux8.10', 'AlmaLinux 8 long spelling' ],
[ 'rocky8', 'Rocky Linux 8' ],
[ 'centos8', 'CentOS 8' ],
[ 'ol8', 'Oracle Linux 8' ],
[ 'redhat9', 'unsupported Red Hat spelling' ],
[ 'ubuntu24.04', 'unrelated distribution' ],
[ '', 'missing OS version' ],
);
for my $case (@rejected) {
is(
extra_parameter_path( $case->[0] ),
"legacy-write\nlegacy-reload",
"$case->[1] uses the legacy ifcfg path"
);
}
is(
route_path_without_current_helper(0),
'el9-nmcli',
'routeop preserves EL9 routing when xcatlib is unavailable'
);
is(
route_path_without_current_helper(1),
'el9-nmcli',
'routeop preserves EL9 routing with an older xcatlib'
);
is(
extra_parameter_path( 'rhel9', 'rematch' ),
"el9-nmcli\n3|rhel9|rhel|9",
'EL9 workflow preserves successful regex captures'
);
is(
extra_parameter_path( 'rhel8', 'rematch' ),
"legacy-write\nlegacy-reload\n0|||",
'legacy workflow preserves failed regex captures'
);
done_testing();
+3 -3
View File
@@ -215,7 +215,7 @@ function configipv4(){
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
# Best-effort: apply as a native NetworkManager property if one exists.
# Arbitrary ifcfg-style keys (e.g. CONNECTED_MODE) have no NM setting and
# are (re)persisted into the keyfile [user] section after ALL IPs are
@@ -840,7 +840,7 @@ elif [ "$1" = "-s" ];then
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
nmcli con modify $con_name $name $value
else
echo "$i: name=$name value=$value"
@@ -1326,7 +1326,7 @@ fi
# in-memory model and drops anything NM does not model, so an earlier write would be lost.
# On EL10 (keyfile-only) there is no ifcfg file to hold these. We do NOT reload after, so
# the file keeps the section; NM tolerates an unknown [user] section in keyfile mode.
if [ "$str_os_type" = "redhat" ] && [ "$networkmanager_active" = "1" ] && [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if [ "$str_os_type" = "redhat" ] && [ "$networkmanager_active" = "1" ] && xcat_is_el9_or_later "$OSVER"; then
# Resolve the connection's keyfile by UUID -- NM may name it "<id>-<uuid>.nmconnection"
# (not the plain "<id>.nmconnection") when a same-named file already exists.
ep_con="xcat-${str_nic_name}"
+6 -6
View File
@@ -177,7 +177,7 @@ then
exit
fi
if [[ $OS_name != 'ubuntu' ]] && [[ ! "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if [[ $OS_name != 'ubuntu' ]] && ! xcat_is_el9_or_later "$OSVER"; then
if [ $OS_name == 'suse' ]
then
dir="/etc/sysconfig/network"
@@ -485,7 +485,7 @@ IPADDR_$ipindex=$nicip" >> $dir/ifcfg-$nic
# First ip address
if [ $ipindex -eq 1 ]
then
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
if nmcli --field connection.id con show $nic 2>&1 1>/dev/null
then # modify current connection
# ipv6
@@ -551,7 +551,7 @@ IPADDR=$nicip" > $dir/ifcfg-$nic
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
nmcli con modify $nic $name $value
else
grep -i "${name}" $dir/ifcfg-$nic
@@ -564,7 +564,7 @@ IPADDR=$nicip" > $dir/ifcfg-$nic
i=$((i+1))
done
else # not the first ip address
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
if nmcli --field connection.id con show $nic 2>&1 1>/dev/null
then # modify current connection
# ipv6
@@ -643,7 +643,7 @@ IPADDR$ipindex=$nicip"
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
echo " $i: name=$name value=$value"
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
nmcli con modify $nic $name $value
else
grep -i "${name}" $cfgfile
@@ -826,7 +826,7 @@ then
done
else
if [ $nmcli_used -eq 1 ]; then
if ! [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if ! xcat_is_el9_or_later "$OSVER"; then
nmcli con reload $dir/ifcfg-$nic
fi
nmcli con up $nic 2>&1
+3 -3
View File
@@ -1813,7 +1813,7 @@ function add_extra_params_nmcli {
con_name=$2
rc=0
if ! [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if ! xcat_is_el9_or_later "$OSVER"; then
str_conf_file="/etc/sysconfig/network-scripts/ifcfg-${con_name}"
str_conf_file_1="/etc/sysconfig/network-scripts/ifcfg-${con_name}-1"
if [ -f $str_conf_file_1 ]; then
@@ -1834,7 +1834,7 @@ function add_extra_params_nmcli {
if [ -n "$name" -a -n "$value" ]; then
# For RHEL 9, use nmcli directly, otherwise use ifcfg scheme.
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if xcat_is_el9_or_later "$OSVER"; then
nmcli con modify "$con_name" "$name" "$value"
rc+=$?
else
@@ -1853,7 +1853,7 @@ function add_extra_params_nmcli {
i=$((i+1))
done
if [[ ! "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if ! xcat_is_el9_or_later "$OSVER"; then
$nmcli con reload $str_conf_file
fi
return $rc
+5 -1
View File
@@ -267,7 +267,11 @@ redhat_uses_nmcli_routes()
[ "$OS_name" = "redhat" ] || return 1
command -v nmcli >/dev/null 2>&1 || return 1
if [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
if command -v xcat_is_el9_or_later >/dev/null 2>&1; then
if xcat_is_el9_or_later "$OSVER"; then
return 0
fi
elif [[ "$OSVER" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]; then
return 0
fi
+6
View File
@@ -17,6 +17,12 @@ function hashget(){
eval echo "\$${str_hashname}"
}
# Match the OSVER forms currently used by EL9+ postscript paths.
xcat_is_el9_or_later()
{
[[ "$1" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]
}
function debianpreconf(){
#create the config sub dir
if [ ! -d "/etc/network/interfaces.d" ];then