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

feat(openeuler): use native NetworkManager configuration

Reuse NetworkManager for persistent routes, bond setup and connection
properties on openEuler. Preserve ifcfg handling where the connection still
uses it. Propagate route failures to local callers.
This commit is contained in:
Vinícius Ferrão
2026-09-14 23:15:14 -03:00
parent f31c75fd78
commit 2652cb152f
7 changed files with 106 additions and 15 deletions
+32
View File
@@ -597,6 +597,30 @@ sub route_exists {
return 0;
}
sub run_routeop {
my ($callback, $op, $net, $mask, $gw_ip, $ifname) = @_;
my $installdir = xCAT::TableUtils->getInstallDir();
my $host = hostname();
my $result = eval {
xCAT::Utils::runcmd3(command => [
"$installdir/postscripts/routeop", $op, $net, $mask,
$gw_ip // '', $ifname // ''
]);
};
if (!$result) {
$callback->({ error => ["$host: Unable to run routeop: $@"] });
return 1;
}
if ($result->{output}) {
$callback->({ data => [map { "$host: $_" } split(/\n/, $result->{output})] });
}
if ($result->{exitcode}) {
$callback->({ error => ["$host: routeop failed with exit code $result->{exitcode}: " . ($result->{errors} // '')] });
return 1;
}
return 0;
}
# sets the route with given parameters
sub set_route {
my $callback = shift;
@@ -606,6 +630,10 @@ sub set_route {
my $gw = shift;
my $ifname = shift;
if (xCAT::Utils->isLinux() && xCAT::Utils->osver() =~ /^openeuler/) {
return run_routeop($callback, "add", $net, $mask, $gw_ip, $ifname);
}
my $host = hostname();
#print "set_route get called\n";
@@ -694,6 +722,10 @@ sub delete_route {
my $gw = shift;
my $ifname = shift;
if (xCAT::Utils->isLinux() && xCAT::Utils->osver() =~ /^openeuler/) {
return run_routeop($callback, "delete", $net, $mask, $gw_ip, $ifname);
}
my $host = hostname();
#print "delete_route get called\n";
+18 -1
View File
@@ -68,7 +68,7 @@ str_cfg_dir=''
str_temp=''
if [ "$str_os_type" = "linux" ];then
str_temp=`echo $OSVER | grep -E '(sles|suse)'`
if [ -f "/etc/redhat-release" ];then
if [ -f "/etc/redhat-release" ] || xcat_is_openeuler "$OSVER"; then
str_os_type="redhat"
str_cfg_dir="/etc/sysconfig/network-scripts"
elif [ -f "/etc/SuSE-release" -o -n "$str_temp" ];then
@@ -191,6 +191,23 @@ fi
showmsg "IP information for $str_bond_name: IP=$str_bond_ip; network=$str_bond_net; netmask=$str_bond_mask"
if xcat_is_openeuler "$OSVER"; then
. "$str_dir_name/nicutils.sh"
check_NetworkManager_or_network_service
if [ $? -ne 1 ]; then
showmsg "NetworkManager must be active to configure a bond on openEuler" "error"
exit 1
fi
networkmanager_active=1
str_bond_ports=$(IFS=,; echo "${array_bond_slaves[*]}")
str_bond_options=${array_bond_opts[*]}
create_bond_interface_nmcli "bondname=$str_bond_name" \
"slave_ports=$str_bond_ports" "slave_type=ethernet" \
"_ipaddr=$str_bond_ip" "_netmask=$str_bond_mask" \
"_bonding_opts=${str_bond_options// /,}"
exit $?
fi
# Create bond config file
str_master_file="${str_cfg_dir}/ifcfg-${str_bond_name}"
+3 -3
View File
@@ -543,7 +543,7 @@ function configipv4(){
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
if xcat_is_el9_or_later "$OSVER"; then
if xcat_uses_nm_keyfile "$OSVER" "$con_name"; 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
@@ -1220,7 +1220,7 @@ elif [ "$1" = "-s" ];then
do
name="${array_extra_param_names[$i]}"
value="${array_extra_param_values[$i]}"
if xcat_is_el9_or_later "$OSVER"; then
if xcat_uses_nm_keyfile "$OSVER" "$con_name"; then
nmcli con modify $con_name $name $value
else
echo "$i: name=$name value=$value"
@@ -1732,7 +1732,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" ] && xcat_is_el9_or_later "$OSVER"; then
if [ "$str_os_type" = "redhat" ] && [ "$networkmanager_active" = "1" ] && xcat_uses_nm_keyfile "$OSVER" "$con_name"; 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}"
+1 -1
View File
@@ -38,7 +38,7 @@ is_redhat=0
is_debian=0
is_sles=0
str_temp=`echo $OSVER | grep -E '(sles|suse)'`
if [ -f "/etc/redhat-release" ];then
if [ -f "/etc/redhat-release" ] || xcat_is_openeuler "$OSVER"; then
is_redhat=1
nwdir="/etc/sysconfig/network-scripts"
elif [ -f "/etc/SuSE-release" -o -n "$str_temp" ];then
+14 -10
View File
@@ -1841,7 +1841,7 @@ function add_extra_params_nmcli {
con_name=$2
rc=0
if ! xcat_is_el9_or_later "$OSVER"; then
if ! xcat_uses_nm_keyfile "$OSVER" "$con_name"; 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
@@ -1862,7 +1862,7 @@ function add_extra_params_nmcli {
if [ -n "$name" -a -n "$value" ]; then
# For RHEL 9, use nmcli directly, otherwise use ifcfg scheme.
if xcat_is_el9_or_later "$OSVER"; then
if xcat_uses_nm_keyfile "$OSVER" "$con_name"; then
nmcli con modify "$con_name" "$name" "$value"
rc+=$?
else
@@ -1881,7 +1881,7 @@ function add_extra_params_nmcli {
i=$((i+1))
done
if ! xcat_is_el9_or_later "$OSVER"; then
if ! xcat_uses_nm_keyfile "$OSVER" "$con_name"; then
$nmcli con reload $str_conf_file
fi
return $rc
@@ -2170,6 +2170,8 @@ function create_bond_interface_nmcli {
key=$(echo "$1" | $cut -s -d= -f1)
if [ "$key" = "bondname" ] || \
[ "$key" = "_ipaddr" ] || \
[ "$key" = "_netmask" ] || \
[ "$key" = "_bonding_opts" ] || \
[ "$key" = "slave_ports" ] || \
[ "$key" = "next_nic" ] || \
[ "$key" = "slave_type" ]; then
@@ -2180,12 +2182,12 @@ function create_bond_interface_nmcli {
if [ "$slave_type" = "ethernet" ]; then
slave_type="Ethernet"
# - "802.3ad" mode requires a switch that is 802.3ad compliant.
_bonding_opts="mode=802.3ad,miimon=100"
_bonding_opts=${_bonding_opts:-mode=802.3ad,miimon=100}
elif [ "$slave_type" = "infiniband" ]; then
slave_type="Infiniband"
_bonding_opts="mode=1,miimon=100,fail_over_mac=1"
_bonding_opts=${_bonding_opts:-mode=1,miimon=100,fail_over_mac=1}
else
_bonding_opts="mode=active-backup"
_bonding_opts=${_bonding_opts:-mode=active-backup}
fi
if [ -n "$_ipaddr" ]; then
# query "nicnetworks" table about its target "xcatnet"
@@ -2199,10 +2201,12 @@ function create_bond_interface_nmcli {
fi
# Query mask value from "networks" table
_netmask=$(get_network_attr $xcatnet mask)
if [ $? -ne 0 ]; then
log_error "No valid netmask get for $bondname"
return 1
if [ -z "$_netmask" ]; then
_netmask=$(get_network_attr $xcatnet mask)
if [ $? -ne 0 ]; then
log_error "No valid netmask get for $bondname"
return 1
fi
fi
# Calculate prefix based on mask
+13
View File
@@ -1048,6 +1048,19 @@ rm_persistent_route()
if command -v xcat_is_openeuler >/dev/null 2>&1 && xcat_is_openeuler "$OSVER"; then
case "$op" in
add|delete|replace)
nmcli_persistent_route "$op" "$net" "$mask" "$gw" "$ifname"
route_rc=$?
[ $route_rc -eq 0 ] || exit $route_rc
route_dev=$(route_ifname "$net" "$gw" "$ifname")
nmcli device reapply "$route_dev"
exit $?
;;
esac
fi
if [ "$op" = "add" ]; then
result=$(route_exists $net $mask $gw)
if [ "$result" = "0" ]; then
+25
View File
@@ -23,6 +23,31 @@ xcat_is_el9_or_later()
[[ "$1" =~ ^(rhel|rhels|alma|almalinux|rocky|centos|ol)(9|1[0-9]) ]]
}
xcat_is_openeuler()
{
case "$1" in
openeuler*) return 0 ;;
?*) return 1 ;;
esac
grep -Eq '^ID="?openEuler"?$' /etc/os-release 2>/dev/null
}
xcat_uses_nm_keyfile()
{
xcat_is_el9_or_later "$1" && return 0
[ "$networkmanager_active" = "1" ] && xcat_is_openeuler "$1" || return 1
local uuid
local filename
uuid=$(nmcli -g connection.uuid connection show "$2" 2>/dev/null)
[ -n "$uuid" ] || return 1
filename=$(nmcli -t -f UUID,FILENAME connection show 2>/dev/null | sed -n "s/^$uuid://p")
case "$filename" in
/etc/NetworkManager/system-connections/*|/run/NetworkManager/system-connections/*|/var/run/NetworkManager/system-connections/*)
return 0 ;;
*) return 1 ;;
esac
}
function debianpreconf(){
#create the config sub dir
if [ ! -d "/etc/network/interfaces.d" ];then