From 1b04f923907a61187ce5ba332b1f846f6a6c2cf4 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Wed, 13 Mar 2019 18:34:59 +0800 Subject: [PATCH 1/6] implementation interface create_vlan_interface_nmcli --- xCAT/postscripts/nicutils.sh | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index 282653937..f7fce9c21 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1142,6 +1142,7 @@ function create_vlan_interface { local _netmask="" local _mtu="" local _bridge="" + local use_nmcli="" # in case it's on top of bond, we need to migrate ip from its # member vlan ports. local slave_ports="" @@ -1156,7 +1157,8 @@ function create_vlan_interface { [ "$key" = "_netmask" ] || \ [ "$key" = "_mtu" ] || \ [ "$key" = "_bridge" ] || \ - [ "$key" = "vlanid" ]; then + [ "$key" = "vlanid" ] || \ + [ "$key" = "use_nmcli" ]; then eval "$1" fi shift @@ -1192,8 +1194,13 @@ function create_vlan_interface { do if [ $i -eq 0 ]; then # alternative cmd to "vconfig add $ifname $vlanid" - $ip link add link $ifname name $ifname.$vlanid type vlan id $(( 10#$vlanid )) - log_info "$ip link add link $ifname name $ifname.$vlanid type vlan id $(( 10#$vlanid ))" + if [ ! -z "$use_nmcli" ]; then + cmd="nmcli con add type vlan con-name $ifname.$vlanid dev $ifname id $(( 10#$vlanid ))" + else + cmd="$ip link add link $ifname name $ifname.$vlanid type vlan id $(( 10#$vlanid ))" + fi + $cmd + log_info "$cmd" fi $sleep 0.5 ((i+=1)) @@ -1205,6 +1212,10 @@ function create_vlan_interface { fi # setup interface + if [ ! -z "$use_nmcli" ]; then + [ -n "$_mtu" ] && nmcli connection modify $ifname.$vlanid 802.mtu $_mtu + return 0 + fi [ -n "$_mtu" ] && $ip link set $ifname.$vlanid mtu $_mtu $ip link set $ifname.$vlanid up log_info "$ip link set $ifname.$vlanid up" @@ -1678,12 +1689,13 @@ function get_first_addr_ipv4 { # # create vlan using nmcli # -# input : ifname= slave_ports= xcatnet= _ipaddr= _netmask= _mtu= _bridge= vlanid= +# input : ifname= vlanid= # return : 0 success # ############################################################################### function create_vlan_interface_nmcli { log_info "create_vlan_interface_nmcli $@" + create_vlan_interface $@ use_nmcli=1 } ############################################################################### From 21d719ce8f175f8c44b59c0968e5b7be57025d66 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Thu, 14 Mar 2019 16:56:28 +0800 Subject: [PATCH 2/6] Update create_vlan_interface_nmcli subroutine to config vlan for nics --- xCAT/postscripts/confignetwork | 5 +- xCAT/postscripts/nicutils.sh | 97 ++++++++++++++++++++++++++++------ 2 files changed, 85 insertions(+), 17 deletions(-) diff --git a/xCAT/postscripts/confignetwork b/xCAT/postscripts/confignetwork index 48911ecea..52dc524ec 100755 --- a/xCAT/postscripts/confignetwork +++ b/xCAT/postscripts/confignetwork @@ -574,10 +574,11 @@ function configure_nicdevice { vlanid=`echo "$nic_dev" | $sed -e 's/^\(.*\)vla\?n\?\([0-9]\+\)$/\2/'` vlanname=`echo "$nic_dev" | $sed -e 's/^\(.*\)vla\?n\?\([0-9]\+\)$/\1/'` fi + ipaddrs=$(find_nic_ips $nic_dev) if [ "$networkmanager_active" = "0" ]; then - create_vlan_interface ifname=$vlanname vlanid=$vlanid + create_vlan_interface ifname=$vlanname vlanid=$vlanid ipaddrs=$ipaddrs elif [ "$networkmanager_active" = "1" ]; then - create_vlan_interface_nmcli ifname=$vlanname vlanid=$vlanid + create_vlan_interface_nmcli ifname=$vlanname vlanid=$vlanid ipaddrs=$ipaddrs fi #configure bond elif [ x"$nic_dev_type" = "xbond" ]; then diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index f7fce9c21..cc68dc3b8 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1142,7 +1142,6 @@ function create_vlan_interface { local _netmask="" local _mtu="" local _bridge="" - local use_nmcli="" # in case it's on top of bond, we need to migrate ip from its # member vlan ports. local slave_ports="" @@ -1157,8 +1156,7 @@ function create_vlan_interface { [ "$key" = "_netmask" ] || \ [ "$key" = "_mtu" ] || \ [ "$key" = "_bridge" ] || \ - [ "$key" = "vlanid" ] || \ - [ "$key" = "use_nmcli" ]; then + [ "$key" = "vlanid" ]; then eval "$1" fi shift @@ -1193,12 +1191,7 @@ function create_vlan_interface { while [ ! -f /proc/net/vlan/$ifname.$vlanid ]; do if [ $i -eq 0 ]; then - # alternative cmd to "vconfig add $ifname $vlanid" - if [ ! -z "$use_nmcli" ]; then - cmd="nmcli con add type vlan con-name $ifname.$vlanid dev $ifname id $(( 10#$vlanid ))" - else - cmd="$ip link add link $ifname name $ifname.$vlanid type vlan id $(( 10#$vlanid ))" - fi + cmd="$ip link add link $ifname name $ifname.$vlanid type vlan id $(( 10#$vlanid ))" $cmd log_info "$cmd" fi @@ -1211,11 +1204,6 @@ function create_vlan_interface { return 1 fi - # setup interface - if [ ! -z "$use_nmcli" ]; then - [ -n "$_mtu" ] && nmcli connection modify $ifname.$vlanid 802.mtu $_mtu - return 0 - fi [ -n "$_mtu" ] && $ip link set $ifname.$vlanid mtu $_mtu $ip link set $ifname.$vlanid up log_info "$ip link set $ifname.$vlanid up" @@ -1695,7 +1683,86 @@ function get_first_addr_ipv4 { ############################################################################### function create_vlan_interface_nmcli { log_info "create_vlan_interface_nmcli $@" - create_vlan_interface $@ use_nmcli=1 + local ifname="" + local vlanid="" + local ipaddrs="" + local _ipaddrs="" + local _xcatnet="" + local _netmask="" + local _mtu="" + # in case it's on top of bond, we need to migrate ip from its + # member vlan ports. + # parser input arguments + while [ -n "$1" ]; + do + key=`echo "$1" | $cut -s -d= -f1` + if [ "$key" = "ifname" ] || \ + [ "$key" = "ipaddrs" ] || \ + [ "$key" = "vlanid" ]; then + eval "$1" + fi + shift + done + + if [ -z "$vlanid" ]; then + log_error "No \"vlanid\" specificd for vlan interface. Abort!" + return 1 + fi + + _xcatnet=`query_nicnetworks_net $ifname.$vlanid` + log_info "Pickup xcatnet, \"$_xcatnet\", from NICNETWORKS for interface \"$ifname\"." + + _mtu_num=`get_network_attr $xcatnet mtu` + if [ $? -ne 0 ]; then + _mtu="" + else + _mtu="mtu $_mtu_num" + fi + + if [ ! -z "$ipaddrs" ]; then + _netmask_long=`get_network_attr $_xcatnet mask` + if [ $? -ne 0 ]; then + log_error "No valid netmask get for $ifname.$vlanid" + return 1 + else + _netmask=$(v4mask2prefix $_netmask_long) + _ipaddrs="method none ip4 $ipaddrs/$_netmask" + fi + fi + #load the 8021q module if not loaded. + load_kmod module=8021q retry=10 interval=0.5 + con_name="xcat.$ifname.$vlanid" + tmp_con_name="" + if nmcli con |grep "^$con_name " > /dev/null; then + tmp_con_name=$con_name."-tmp" + nmcli con modify $con_name connection.id $tmp_con_name + fi + cmd="nmcli con add type vlan con-name $con_name dev $ifname id $(( 10#$vlanid )) $_ipaddrs $_mtu" + $cmd + log_info "$cmd" + nmcli con up $con_name + + i=0 + while [ $i -lt 10 ]; do + con_state=`nmcli con show $con_name | grep -i state| awk '{print $2}'`; + if [ ! -z "$con_state" -a "$con_state" = "activated" ]; then + break + fi + sleep 2 + i=$((i+1)) + done + + if [ $i -ge 10 ]; then + log_error "The vlan configuration for $ifname.$vlanid can not be booted up" + nmcli con delete $con_name + if [ ! -z "$tmp_con_name" ]; then + nmcli con modify $tmp_con_name connection.id $con_name + fi + return 1 + elif [ ! -z "$tmp_con_name" ]; then + nmcli con delete $tmp_con_name + fi + return 0 } ############################################################################### From 9df406d7ddbc2eccea94c19967f054ff7c3d9d55 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Fri, 15 Mar 2019 17:12:44 +0800 Subject: [PATCH 3/6] Move the function is_connection_activate_intime out --- xCAT/postscripts/nicutils.sh | 50 ++++++++++++++++++++++++++---------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index cc68dc3b8..903fea88b 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1677,7 +1677,7 @@ function get_first_addr_ipv4 { # # create vlan using nmcli # -# input : ifname= vlanid= +# input : ifname= vlanid= ipaddrs= # return : 0 success # ############################################################################### @@ -1741,18 +1741,9 @@ function create_vlan_interface_nmcli { $cmd log_info "$cmd" nmcli con up $con_name - - i=0 - while [ $i -lt 10 ]; do - con_state=`nmcli con show $con_name | grep -i state| awk '{print $2}'`; - if [ ! -z "$con_state" -a "$con_state" = "activated" ]; then - break - fi - sleep 2 - i=$((i+1)) - done - - if [ $i -ge 10 ]; then + is_connection_activate_intime $con_name + is_active=$? + if [ "$is_active" -eq 0 ]; then log_error "The vlan configuration for $ifname.$vlanid can not be booted up" nmcli con delete $con_name if [ ! -z "$tmp_con_name" ]; then @@ -1765,6 +1756,39 @@ function create_vlan_interface_nmcli { return 0 } +############################################################################### +# +# is_connection_activate_intime +# +# input : connection_name +# time_out (optional, 40 seconds by default) +# return : 1 active +# 0 failed +# +############################################################################### + +function is_connection_activate_intime { + con_name=$1 + time_out=40 + if [ ! -z "$2" ]; then + time_out=$2 + fi + i=0 + while [ $i -lt "$time_out" ]; do + con_state=`nmcli con show $con_name | grep -i state| awk '{print $2}'`; + if [ ! -z "$con_state" -a "$con_state" = "activated" ]; then + break + fi + sleep 1 + i=$((i+1)) + done + if [ $i -ge "$time_out" ]; then + return 0 + else + return 1 + fi +} + ############################################################################### # # create bridge From 6ab4057c032aa37e2ac962f10d7124a9f6d08986 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Fri, 15 Mar 2019 23:39:37 +0800 Subject: [PATCH 4/6] Update configvlan with shared subroutines --- xCAT/postscripts/confignetwork | 6 +++++- xCAT/postscripts/nicutils.sh | 24 ++++++++++++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/xCAT/postscripts/confignetwork b/xCAT/postscripts/confignetwork index 52dc524ec..f4209500d 100755 --- a/xCAT/postscripts/confignetwork +++ b/xCAT/postscripts/confignetwork @@ -576,10 +576,14 @@ function configure_nicdevice { fi ipaddrs=$(find_nic_ips $nic_dev) if [ "$networkmanager_active" = "0" ]; then - create_vlan_interface ifname=$vlanname vlanid=$vlanid ipaddrs=$ipaddrs + create_vlan_interface ifname=$vlanname vlanid=$vlanid elif [ "$networkmanager_active" = "1" ]; then create_vlan_interface_nmcli ifname=$vlanname vlanid=$vlanid ipaddrs=$ipaddrs fi + if [ $? -ne 0 ]; then + log_error "configvlan failed." + errorcode=1 + fi #configure bond elif [ x"$nic_dev_type" = "xbond" ]; then if [ "$networkmanager_active" = "0" ]; then diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index 903fea88b..2af86e8d2 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1720,26 +1720,38 @@ function create_vlan_interface_nmcli { fi if [ ! -z "$ipaddrs" ]; then - _netmask_long=`get_network_attr $_xcatnet mask` + _netmask_long=$(get_network_attr $_xcatnet mask) if [ $? -ne 0 ]; then log_error "No valid netmask get for $ifname.$vlanid" return 1 else + ipaddr=$(get_first_addr_ipv4 $ipaddrs) + if [ $? -ne 0 ]; then + log_error "No valid IP address get for $ifname.$vlanid, please check $ipaddrs" + return 1 + fi _netmask=$(v4mask2prefix $_netmask_long) - _ipaddrs="method none ip4 $ipaddrs/$_netmask" + _ipaddrs="method none ip4 $ipaddr/$_netmask" fi fi + check_and_set_device_managed $ifname + log_info "check parent interface $ifname whether it is managed by NetworkManager" + if [ $? -ne 0 ]; then + log_error "The parent interface $ifname is unmanaged, so skip $ifname.$vlanid" + retrun 1 + fi #load the 8021q module if not loaded. load_kmod module=8021q retry=10 interval=0.5 con_name="xcat.$ifname.$vlanid" tmp_con_name="" - if nmcli con |grep "^$con_name " > /dev/null; then + is_nmcli_connection_exist $con_name + if [ $? -eq 0 ]; then tmp_con_name=$con_name."-tmp" nmcli con modify $con_name connection.id $tmp_con_name fi - cmd="nmcli con add type vlan con-name $con_name dev $ifname id $(( 10#$vlanid )) $_ipaddrs $_mtu" - $cmd - log_info "$cmd" + + nmcli con add type vlan con-name $con_name dev $ifname id $(( 10#$vlanid )) $_ipaddrs $_mtu + log_info "create NetworkManager connection for $ifname.$vlanid" nmcli con up $con_name is_connection_activate_intime $con_name is_active=$? From 59b1bb1a8fef23ef48caed637c6e38a5348172c0 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Mon, 18 Mar 2019 10:47:16 +0800 Subject: [PATCH 5/6] Update the config vlan error message --- xCAT/postscripts/confignetwork | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT/postscripts/confignetwork b/xCAT/postscripts/confignetwork index f4209500d..00aa4912e 100755 --- a/xCAT/postscripts/confignetwork +++ b/xCAT/postscripts/confignetwork @@ -581,7 +581,7 @@ function configure_nicdevice { create_vlan_interface_nmcli ifname=$vlanname vlanid=$vlanid ipaddrs=$ipaddrs fi if [ $? -ne 0 ]; then - log_error "configvlan failed." + log_error "configure VLAN failed." errorcode=1 fi #configure bond From 60c43c8435b8dcd90d3d01f1ac9aae53a2411432 Mon Sep 17 00:00:00 2001 From: ertaozh Date: Mon, 18 Mar 2019 15:46:51 +0800 Subject: [PATCH 6/6] Update create_vlan_interface_nmcli based on BaiYuan's comments --- xCAT/postscripts/nicutils.sh | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index 2af86e8d2..a67393e66 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1709,10 +1709,10 @@ function create_vlan_interface_nmcli { return 1 fi - _xcatnet=`query_nicnetworks_net $ifname.$vlanid` + _xcatnet=$(query_nicnetworks_net $ifname.$vlanid) log_info "Pickup xcatnet, \"$_xcatnet\", from NICNETWORKS for interface \"$ifname\"." - _mtu_num=`get_network_attr $xcatnet mtu` + _mtu_num=$(get_network_attr $xcatnet mtu) if [ $? -ne 0 ]; then _mtu="" else @@ -1735,36 +1735,37 @@ function create_vlan_interface_nmcli { fi fi check_and_set_device_managed $ifname - log_info "check parent interface $ifname whether it is managed by NetworkManager" if [ $? -ne 0 ]; then log_error "The parent interface $ifname is unmanaged, so skip $ifname.$vlanid" retrun 1 fi + log_info "check parent interface $ifname whether it is managed by NetworkManager" #load the 8021q module if not loaded. load_kmod module=8021q retry=10 interval=0.5 con_name="xcat.$ifname.$vlanid" tmp_con_name="" is_nmcli_connection_exist $con_name if [ $? -eq 0 ]; then - tmp_con_name=$con_name."-tmp" - nmcli con modify $con_name connection.id $tmp_con_name + tmp_con_name=$con_name"-tmp" + $nmcli con modify $con_name connection.id $tmp_con_name fi - nmcli con add type vlan con-name $con_name dev $ifname id $(( 10#$vlanid )) $_ipaddrs $_mtu + $nmcli con add type vlan con-name $con_name dev $ifname id $(( 10#$vlanid )) $_ipaddrs $_mtu log_info "create NetworkManager connection for $ifname.$vlanid" - nmcli con up $con_name + $nmcli con up $con_name is_connection_activate_intime $con_name is_active=$? if [ "$is_active" -eq 0 ]; then log_error "The vlan configuration for $ifname.$vlanid can not be booted up" - nmcli con delete $con_name + $nmcli con delete $con_name if [ ! -z "$tmp_con_name" ]; then - nmcli con modify $tmp_con_name connection.id $con_name + $nmcli con modify $tmp_con_name connection.id $con_name fi return 1 elif [ ! -z "$tmp_con_name" ]; then - nmcli con delete $tmp_con_name + $nmcli con delete $tmp_con_name fi + $ip address show dev $ifname.$vlanid | $sed -e 's/^/[vlan] >> /g' | log_lines info return 0 } @@ -1787,7 +1788,7 @@ function is_connection_activate_intime { fi i=0 while [ $i -lt "$time_out" ]; do - con_state=`nmcli con show $con_name | grep -i state| awk '{print $2}'`; + con_state=$($nmcli con show $con_name | grep -i state| awk '{print $2}'); if [ ! -z "$con_state" -a "$con_state" = "activated" ]; then break fi