From b55bc05a20d4ac8c294dd26fbbaa8c7f90732ad8 Mon Sep 17 00:00:00 2001 From: bybai Date: Mon, 18 Mar 2019 02:24:28 -0400 Subject: [PATCH 1/4] refine create bridge using nmcli --- xCAT/postscripts/confignetwork | 9 +- xCAT/postscripts/nicutils.sh | 155 ++++++++++++++++++++++++++++++++- 2 files changed, 160 insertions(+), 4 deletions(-) diff --git a/xCAT/postscripts/confignetwork b/xCAT/postscripts/confignetwork index 602919b5c..e33002bb0 100755 --- a/xCAT/postscripts/confignetwork +++ b/xCAT/postscripts/confignetwork @@ -523,7 +523,7 @@ function configure_nicdevice { echo "++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" nic_pair=`echo "$nics_pair" |sed -n "${num}p"` echo "configure nic and its device : $nic_pair" - + ipaddrs=$(find_nic_ips $nic_dev) #ignore bmc interfaces. They're allowed in the nics table to generate DNS/hostname records, but they #can't be configured here (it's done in bmcsetup if [ x"$nic_dev_type" = "xbmc" ]; then @@ -532,7 +532,6 @@ function configure_nicdevice { #configure standalone ethernet nic elif [ x"$nic_dev_type" = "xethernet" ]; then xcatnet=`query_nicnetworks_net $nic_dev` - ipaddrs=`find_nic_ips $nic_dev` if [ -n "$ipaddrs" ]; then log_info "configure $nic_dev" log_info "call: configeth $nic_dev $ipaddrs $xcatnet" @@ -562,7 +561,11 @@ function configure_nicdevice { if [ "$networkmanager_active" = "0" ]; then create_bridge_interface ifname=$nic_dev _brtype=$nic_dev_type _port=$base_nic_dev _pretype=$base_nic_type elif [ "$networkmanager_active" = "1" ]; then - create_bridge_interface_nmcli ifname=$nic_dev _brtype=$nic_dev_type _port=$base_nic_dev _pretype=$base_nic_type + create_bridge_interface_nmcli ifname=$nic_dev _brtype=$nic_dev_type _port=$base_nic_dev _pretype=$base_nic_type _ipaddr=$ipaddrs + if [ $? -ne 0 ]; then + log_error "create bridge interface $ifname failed" + errorcode=1; + fi fi fi #configure vlan diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index bc6dc1b47..8674601a5 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1618,12 +1618,165 @@ function create_vlan_interface_nmcli { # # create bridge # -# input : ifname= xcatnet= _ipaddr= _netmask= _port= _pretype= _brtype= _mtu= _bridge= +# input : ifname= _ipaddr= _port= _pretype= _brtype= +# success: return 0 # ############################################################################### function create_bridge_interface_nmcli { log_info "create_bridge_interface_nmcli $@" + local ifname="" #current bridge + local _brtype="" + local _pretype="" + local _port="" #pre nic + local _mtu="" + local xcatnet="" + local _ipaddr="" + rc=0 + # parser input arguments + while [ -n "$1" ]; + do + key=`echo "$1" | $cut -s -d= -f1` + if [ "$key" = "ifname" ] || \ + [ "$key" = "_brtype" ] || \ + [ "$key" = "_pretype" ] || \ + [ "$key" = "_port" ] || \ + [ "$key" = "_ipaddr" ]; then + eval "$1" + fi + shift + done + # query "nicnetworks" table about its target "xcatnet" + if [ -n "$ifname" -a -z "$xcatnet" ]; then + xcatnet=`query_nicnetworks_net $ifname` + log_info "Pickup xcatnet, \"$xcatnet\", from NICNETWORKS for interface \"$ifname\"." + fi + # Query mtu value from "networks" table + _mtu_num=`get_network_attr $xcatnet mtu` + if [ -n "$_mtu_num" ]; then + _mtu="mtu $_mtu_num" + fi + + # Query mask value from "networks" table + _netmask=`get_network_attr $xcatnet mask` + if [ $? -ne 0 ]; then + log_error "No valid netmask get for $ifname" + return 1 + fi + # Calculate prefix based on mask + str_prefix=$(v4mask2prefix $_netmask) + + # Get first valid ip from nics.nicips + ipv4_addr=$(get_first_addr_ipv4 $_ipaddr) + if [ $? -ne 0 ]; then + log_error "No valid IP address get for $ifname, please check $ipaddrs" + return 1 + fi + # Check and set slave device status + # If slave device failed to managed, return 1 + check_and_set_device_managed $_port + if [ $? -ne 0 ]; then + return 1 + fi + # Create bridge connection + xcat_con_name="xcat"$ifname + tmp_con_name=$xcat_con_name"-tmp" + if [ x"$_brtype" = "xbridge" ]; then + is_nmcli_connection_exist $xcat_con_name + if [ $? -eq 0 ] ; then + log_info "$xcat_con_name exists, rename old $xcat_con_name to $tmp_con_name" + $nmcli con modify $xcat_con_name connection.id $tmp_con_name + if [ $? -ne 0 ] ; then + log_error "$nmcli rename $xcat_con_name failed" + return 1 + fi + fi + log_info "create bridge connection $xcat_con_name" + $nmcli con add type bridge con-name $xcat_con_name ifname $ifname + if [ $? -ne 0 ]; then + log_error "nmcli failed to add bridge $ifname" + return 1 + fi + elif [ x"$_brtype" == "xbridge_ovs" ]; then + log_error "OVSBridge is not supported." + return 1 + fi + + # Create slaves connection + xcat_slave_con="xcat_br_"$_port + tmp_slave_con_name=$xcat_slave_con"-tmp" + if [ x"$_pretype" = "xethernet" -o x"$_pretype" = "xvlan" -o x"$_pretype" = "xbond" ]; then + is_nmcli_connection_exist $xcat_slave_con + if [ $? -eq 0 ] ; then + log_info "$xcat_slave_con exists, rename old connetion $xcat_slave_con to $tmp_slave_con_name" + $nmcli con modify $xcat_slave_con connection.id $tmp_slave_con_name + if [ $? -ne 0 ] ; then + log_error "$nmcli rename $xcat_slave_con failed" + return 1 + fi + fi + log_info "create $_pretype slaves connetcion $xcat_slave_con for bridge" + $nmcli con add type $_pretype con-name $xcat_slave_con ifname $_port master $ifname; + if [ $? -ne 0 ]; then + log_error "nmcli failed to add bridge slave $_port" + return 1 + fi + else + log_error "create $_pretype slaves for bridge is not supported" + return 1 + fi + + # Add ip to bridge + if [ -n "$ipv4_addr" ]; then + log_info "add ip $ipv4_addr/$str_prefix to bridge" + $nmcli con mod $xcat_con_name ipv4.method manual ipv4.addresses $ipv4_addr/$str_prefix; + fi + + # Configure MTU + if [ -n "$_mtu" ]; then + $nmcli con mod $xcat_con_name $_mtu + if [ $? -ne 0 ]; then + log_error "$nmcli con mod $xcat_con_name $_mtu failed" + rc=1 + fi + fi + + # bring up interface formally + log_info "$nmcli con up $xcat_slave_con; $nmcli con up $xcat_con_name" + lines=`$nmcli con up $xcat_slave_con; $nmcli con up $xcat_con_name` + rc=$? + + # If bridge interface is active, delete tmp old connection + # If bridge interface is not active, delete new bridge and slave connection, and restore old connection + is_connection_activate_intime $xcat_con_name + is_active=$? + if [ "$is_active" -eq 0 ]; then + log_error "$nmcli con up $xcat_con_name failed with return code equals to $rc" + $nmcli con delete $xcat_con_name + is_nmcli_connection_exist $tmp_con_name + if [ $? -eq 0 ]; then + nmcli con modify $tmp_con_name connection.id $xcat_con_name + fi + $nmcli con delete $xcat_slave_con + is_nmcli_connection_exist $tmp_slave_con_name + if [ $? -eq 0 ]; then + nmcli con modify $xcat_slave_con connection.id $tmp_slave_con_name + fi + else + is_nmcli_connection_exist $tmp_con_name + if [ $? -eq 0 ]; then + $nmcli con delete $tmp_con_name + fi + is_nmcli_connection_exist $tmp_slave_con_name + if [ $? -eq 0 ]; then + $nmcli con delete $tmp_slave_con_name + fi + wait_for_ifstate $ifname UP 200 10 + rc=$? + $ip address show dev $ifname| $sed -e 's/^/[bridge] >> /g' | log_lines info + fi + + return $rc } ############################################################################################################################# From cb1985566a2fa3a16072b2de5be06f669e2e4c62 Mon Sep 17 00:00:00 2001 From: bybai Date: Mon, 18 Mar 2019 04:39:04 -0400 Subject: [PATCH 2/4] polished --- xCAT/postscripts/nicutils.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index 8674601a5..9b386dbca 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1771,7 +1771,7 @@ function create_bridge_interface_nmcli { if [ $? -eq 0 ]; then $nmcli con delete $tmp_slave_con_name fi - wait_for_ifstate $ifname UP 200 10 + wait_for_ifstate $ifname UP 20 40 rc=$? $ip address show dev $ifname| $sed -e 's/^/[bridge] >> /g' | log_lines info fi From cfa62c0b9e05f3c4a54ae361a5fce1b3e88292f3 Mon Sep 17 00:00:00 2001 From: bybai Date: Mon, 18 Mar 2019 06:43:22 -0400 Subject: [PATCH 3/4] polished based on comments --- xCAT/postscripts/confignetwork | 2 +- xCAT/postscripts/nicutils.sh | 28 +++++++++++++++++++--------- 2 files changed, 20 insertions(+), 10 deletions(-) diff --git a/xCAT/postscripts/confignetwork b/xCAT/postscripts/confignetwork index e33002bb0..fc3ca011d 100755 --- a/xCAT/postscripts/confignetwork +++ b/xCAT/postscripts/confignetwork @@ -563,7 +563,7 @@ function configure_nicdevice { elif [ "$networkmanager_active" = "1" ]; then create_bridge_interface_nmcli ifname=$nic_dev _brtype=$nic_dev_type _port=$base_nic_dev _pretype=$base_nic_type _ipaddr=$ipaddrs if [ $? -ne 0 ]; then - log_error "create bridge interface $ifname failed" + log_error "create bridge interface $nic_dev failed" errorcode=1; fi fi diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index 9b386dbca..437941d4f 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1646,19 +1646,19 @@ function create_bridge_interface_nmcli { shift done # query "nicnetworks" table about its target "xcatnet" - if [ -n "$ifname" -a -z "$xcatnet" ]; then - xcatnet=`query_nicnetworks_net $ifname` + if [ -n "$ifname" ]; then + xcatnet=$(query_nicnetworks_net $ifname) log_info "Pickup xcatnet, \"$xcatnet\", from NICNETWORKS for interface \"$ifname\"." fi # Query mtu value from "networks" table - _mtu_num=`get_network_attr $xcatnet mtu` + _mtu_num=$(get_network_attr $xcatnet mtu) if [ -n "$_mtu_num" ]; then _mtu="mtu $_mtu_num" fi # Query mask value from "networks" table - _netmask=`get_network_attr $xcatnet mask` + _netmask=$(get_network_attr $xcatnet mask) if [ $? -ne 0 ]; then log_error "No valid netmask get for $ifname" return 1 @@ -1695,10 +1695,15 @@ function create_bridge_interface_nmcli { $nmcli con add type bridge con-name $xcat_con_name ifname $ifname if [ $? -ne 0 ]; then log_error "nmcli failed to add bridge $ifname" + is_nmcli_connection_exist $tmp_con_name + if [ $? -eq 0 ] ; then + $nmcli con modify $tmp_con_name connection.id $xcat_con_name + fi + $nmcli con delete $xcat_con_name return 1 fi - elif [ x"$_brtype" == "xbridge_ovs" ]; then - log_error "OVSBridge is not supported." + else + log_error "$_brtype is not supported." return 1 fi @@ -1716,9 +1721,14 @@ function create_bridge_interface_nmcli { fi fi log_info "create $_pretype slaves connetcion $xcat_slave_con for bridge" - $nmcli con add type $_pretype con-name $xcat_slave_con ifname $_port master $ifname; + $nmcli con add type $_pretype con-name $xcat_slave_con ifname $_port master $ifname $_mtu if [ $? -ne 0 ]; then log_error "nmcli failed to add bridge slave $_port" + is_nmcli_connection_exist $tmp_slave_con_name + if [ $? -eq 0 ] ; then + $nmcli con modify $xcat_slave_con connection.id $tmp_slave_con_name + fi + $nmcli con delete $xcat_slave_con return 1 fi else @@ -1751,7 +1761,7 @@ function create_bridge_interface_nmcli { is_connection_activate_intime $xcat_con_name is_active=$? if [ "$is_active" -eq 0 ]; then - log_error "$nmcli con up $xcat_con_name failed with return code equals to $rc" + log_error "$nmcli con up $xcat_con_name failed with return code equals to $is_active" $nmcli con delete $xcat_con_name is_nmcli_connection_exist $tmp_con_name if [ $? -eq 0 ]; then @@ -1760,7 +1770,7 @@ function create_bridge_interface_nmcli { $nmcli con delete $xcat_slave_con is_nmcli_connection_exist $tmp_slave_con_name if [ $? -eq 0 ]; then - nmcli con modify $xcat_slave_con connection.id $tmp_slave_con_name + nmcli con modify $tmp_slave_con_name connection.id $xcat_slave_con fi else is_nmcli_connection_exist $tmp_con_name From 2ce52cdb9e14b5e8f17fcf3bd6ad9750396bc65d Mon Sep 17 00:00:00 2001 From: bybai Date: Mon, 18 Mar 2019 09:59:30 -0400 Subject: [PATCH 4/4] polished --- xCAT/postscripts/nicutils.sh | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/xCAT/postscripts/nicutils.sh b/xCAT/postscripts/nicutils.sh index 437941d4f..4e568a044 100755 --- a/xCAT/postscripts/nicutils.sh +++ b/xCAT/postscripts/nicutils.sh @@ -1646,10 +1646,8 @@ function create_bridge_interface_nmcli { shift done # query "nicnetworks" table about its target "xcatnet" - if [ -n "$ifname" ]; then - xcatnet=$(query_nicnetworks_net $ifname) - log_info "Pickup xcatnet, \"$xcatnet\", from NICNETWORKS for interface \"$ifname\"." - fi + xcatnet=$(query_nicnetworks_net $ifname) + log_info "Pickup xcatnet, \"$xcatnet\", from NICNETWORKS for interface \"$ifname\"." # Query mtu value from "networks" table _mtu_num=$(get_network_attr $xcatnet mtu) @@ -1699,7 +1697,6 @@ function create_bridge_interface_nmcli { if [ $? -eq 0 ] ; then $nmcli con modify $tmp_con_name connection.id $xcat_con_name fi - $nmcli con delete $xcat_con_name return 1 fi else @@ -1726,9 +1723,8 @@ function create_bridge_interface_nmcli { log_error "nmcli failed to add bridge slave $_port" is_nmcli_connection_exist $tmp_slave_con_name if [ $? -eq 0 ] ; then - $nmcli con modify $xcat_slave_con connection.id $tmp_slave_con_name + $nmcli con modify $tmp_slave_con_name connection.id $xcat_slave_con fi - $nmcli con delete $xcat_slave_con return 1 fi else