X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fcommon-functions.sh;h=af9b71038cc43639344ceadfd577c5ae02f1796b;hb=78e41283e118e234c8559e8386abaeb19ac30480;hp=055d7fa2632a20b1a61e518748425351571795fa;hpb=9a11a203fa228cad7a86ebf2cb28ae834d17decd;p=apex.git diff --git a/lib/common-functions.sh b/lib/common-functions.sh index 055d7fa2..af9b7103 100644 --- a/lib/common-functions.sh +++ b/lib/common-functions.sh @@ -2,6 +2,15 @@ # Common Functions used by OPNFV Apex # author: Tim Rozet (trozet@redhat.com) +##converts subnet mask to prefix +##params: subnet mask +function prefix2mask { + # Number of args to shift, 255..255, first non-255 byte, zeroes + set -- $(( 5 - ($1 / 8) )) 255 255 255 255 $(( (255 << (8 - ($1 % 8))) & 255 )) 0 0 0 + [ $1 -gt 1 ] && shift $1 || shift + echo ${1-0}.${2-0}.${3-0}.${4-0} +} + ##find ip of interface ##params: interface name function find_ip { @@ -140,6 +149,9 @@ function increment_ip { ##find_gateway em1 function find_gateway { local gw gw_interface + if [ -z "$1" ]; then + return 1 + fi gw=$(ip route | grep default | awk '{print $3}') gw_interface=$(ip route get $gw | awk '{print $3}') if [ -n "$1" ]; then @@ -153,6 +165,9 @@ function find_gateway { ##params: interface to find CIDR function find_cidr { local cidr network ip netmask short_mask + if [ -z "$1" ]; then + return 1 + fi ip=$(find_ip $1) netmask=$(find_netmask $1) if [[ -z "$ip" || -z "$netmask" ]]; then @@ -173,6 +188,9 @@ function find_cidr { ##params: interface to find IP function find_usable_ip_range { local interface_ip subnet_mask first_block_ip last_block_ip + if [ -z "$1" ]; then + return 1 + fi interface_ip=$(find_ip $1) subnet_mask=$(find_netmask $1) if [[ -z "$interface_ip" || -z "$subnet_mask" ]]; then @@ -187,33 +205,40 @@ function find_usable_ip_range { if [ -z "$last_block_ip" ]; then return 1 else - last_block_ip=$(subtract_ip ${last_block_ip} 20) + last_block_ip=$(subtract_ip ${last_block_ip} 21) echo "${first_block_ip},${last_block_ip}" fi } ##generates usable IP range in correct format based on CIDR -##assumes the first 20 IPs are used (by instack or otherwise) +##assumes the first 20 IPs are used (by undercloud or otherwise) ##params: cidr function generate_usable_ip_range { local first_ip first_block_ip last_block_ip - first_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + #first_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + first_ip=$(ipcalc -nmpb $1 | grep NETWORK= | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + first_ip=$(increment_ip ${first_ip} 1) first_block_ip=$(increment_ip ${first_ip} 20) - last_block_ip=$(ipcalc -nb $1 | grep HostMax: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + #last_block_ip=$(ipcalc -nb $1 | grep HostMax: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + last_block_ip=$(ipcalc -nmpb $1 | grep BROADCAST= | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + last_block_ip=$(subtract_ip ${last_block_ip} 1) if [[ -z "$first_block_ip" || -z "$last_block_ip" ]]; then return 1 else - last_block_ip=$(subtract_ip ${last_block_ip} 20) + last_block_ip=$(subtract_ip ${last_block_ip} 21) echo "${first_block_ip},${last_block_ip}" fi } -##find the instack IP address +##find the undercloud IP address ##finds first usable IP on subnet ##params: interface function find_provisioner_ip { local interface_ip + if [ -z "$1" ]; then + return 1 + fi interface_ip=$(find_ip $1) if [ -z "$interface_ip" ]; then return 1 @@ -221,11 +246,17 @@ function find_provisioner_ip { echo $(increment_ip ${interface_ip} 1) } -##generates instack IP address based on CIDR +##generates undercloud IP address based on CIDR ##params: cidr function generate_provisioner_ip { local provisioner_ip - provisioner_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + #provisioner_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + provisioner_ip=$(ipcalc -nmpb $1 | grep NETWORK= | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + if [ -z "$provisioner_ip" ]; then + return 1 + fi + provisioner_ip=$(increment_ip ${provisioner_ip} 1) + echo "$provisioner_ip" } ##finds the dhcp range available via interface @@ -233,6 +264,9 @@ function generate_provisioner_ip { ##params: interface function find_dhcp_range { local dhcp_range_start dhcp_range_end interface_ip + if [ -z "$1" ]; then + return 1 + fi interface_ip=$(find_ip $1) if [ -z "$interface_ip" ]; then return 1 @@ -247,10 +281,12 @@ function find_dhcp_range { ##params: cidr function generate_dhcp_range { local dhcp_range_start dhcp_range_end first_ip - first_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + #first_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + first_ip=$(ipcalc -nmpb $1 | grep NETWORK= | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") if [ -z "$first_ip" ]; then return 1 fi + first_ip=$(increment_ip ${first_ip} 1) dhcp_range_start=$(increment_ip ${first_ip} 1) dhcp_range_end=$(increment_ip ${dhcp_range_start} 8) echo "${dhcp_range_start},${dhcp_range_end}" @@ -261,6 +297,9 @@ function generate_dhcp_range { ##params: interface function find_introspection_range { local inspect_range_start inspect_range_end interface_ip + if [ -z "$1" ]; then + return 1 + fi interface_ip=$(find_ip $1) if [ -z "$interface_ip" ]; then return 1 @@ -275,39 +314,47 @@ function find_introspection_range { ##params: cidr function generate_introspection_range { local inspect_range_start inspect_range_end first_ip - first_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + #first_ip=$(ipcalc -nb $1 | grep HostMin: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + first_ip=$(ipcalc -nmpb $1 | grep NETWORK= | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") if [ -z "$first_ip" ]; then return 1 fi + first_ip=$(increment_ip ${first_ip} 1) inspect_range_start=$(increment_ip ${first_ip} 10) inspect_range_end=$(increment_ip ${inspect_range_start} 8) echo "${inspect_range_start},${inspect_range_end}" } ##finds the floating ip range available via interface -##uses last 20 IPs of a subnet +##uses last 20 IPs of a subnet, minus last IP ##params: interface function find_floating_ip_range { local float_range_start float_range_end interface_ip subnet_mask + if [ -z "$1" ]; then + return 1 + fi interface_ip=$(find_ip $1) subnet_mask=$(find_netmask $1) if [[ -z "$interface_ip" || -z "$subnet_mask" ]]; then return 1 fi float_range_end=$(find_last_ip_subnet ${interface_ip} ${subnet_mask}) + float_range_end=$(subtract_ip ${float_range_end} 1) float_range_start=$(subtract_ip ${float_range_end} 19) echo "${float_range_start},${float_range_end}" } ##generate the floating range available via CIDR -##uses last 20 IPs of subnet +##uses last 20 IPs of subnet, minus last IP ##params: cidr function generate_floating_ip_range { local float_range_start float_range_end last_ip - last_ip=$(ipcalc -nb $1 | grep HostMax: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + #last_ip=$(ipcalc -nb $1 | grep HostMax: | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") + last_ip=$(ipcalc -nmpb $1 | grep BROADCAST= | grep -Eo "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+") if [ -z "$last_ip" ]; then return 1 fi + last_ip=$(subtract_ip ${last_ip} 2) float_range_start=$(subtract_ip ${last_ip} 19) float_range_end=${last_ip} echo "${float_range_start},${float_range_end}" @@ -318,7 +365,7 @@ function generate_floating_ip_range { ##public indicates attaching to a public interface function attach_interface_to_ovs { local bridge interface - local if_ip if_mask if_gw if_file ovs_file + local if_ip if_mask if_gw if_file ovs_file if_prefix if [[ -z "$1" || -z "$2" ]]; then return 1 @@ -343,8 +390,14 @@ function attach_interface_to_ovs { return 1 fi + if [ -z "$if_mask" ]; then + # we can look for PREFIX here, then convert it to NETMASK + if_prefix=$(sed -n 's/^PREFIX=\(.*\)$/\1/p' ${if_file}) + if_mask=$(prefix2mask ${if_prefix}) + fi + if [[ -z "$if_ip" || -z "$if_mask" ]]; then - echo "ERROR: IPADDR or NETMASK missing for ${interface}" + echo "ERROR: IPADDR or NETMASK/PREFIX missing for ${interface}" return 1 elif [[ -z "$if_gw" && "$3" == "public_network" ]]; then echo "ERROR: GATEWAY missing for ${interface}, which is public" @@ -353,35 +406,38 @@ function attach_interface_to_ovs { # move old config file to .orig mv -f ${if_file} ${if_file}.orig - echo "DEVICE=${interface}, -TYPE=OVSPort, -PEERDNS=no, -BOOTPROTO=static, -NM_CONTROLLED=no, -ONBOOT=yes, -OVS_BRIDGE=${bridge}, + echo "DEVICE=${interface} +DEVICETYPE=ovs +TYPE=OVSPort +PEERDNS=no +BOOTPROTO=static +NM_CONTROLLED=no +ONBOOT=yes +OVS_BRIDGE=${bridge} PROMISC=yes" > ${if_file} if [ -z ${if_gw} ]; then # create bridge cfg - echo "DEVICE=${bridge}, -IPADDR=${if_ip}, -NETMASK=${if_mask}, -BOOTPROTO=static, -ONBOOT=yes, -TYPE=OVSBridge, -PROMISC=yes, + echo "DEVICE=${bridge} +DEVICETYPE=ovs +IPADDR=${if_ip} +NETMASK=${if_mask} +BOOTPROTO=static +ONBOOT=yes +TYPE=OVSBridge +PROMISC=yes PEERDNS=no" > ${ovs_file} else - echo "DEVICE=${bridge}, -IPADDR=${if_ip}, -NETMASK=${if_mask}, -BOOTPROTO=static, -ONBOOT=yes, -TYPE=OVSBridge, -PROMISC=yes, -GATEWAY=${if_gw}, + echo "DEVICE=${bridge} +DEVICETYPE=ovs +IPADDR=${if_ip} +NETMASK=${if_mask} +BOOTPROTO=static +ONBOOT=yes +TYPE=OVSBridge +PROMISC=yes +GATEWAY=${if_gw} PEERDNS=no" > ${ovs_file} fi @@ -395,7 +451,7 @@ function detach_interface_from_ovs { local bridge local port_output ports_no_orig local net_path - local if_ip if_mask if_gw + local if_ip if_mask if_gw if_prefix net_path=/etc/sysconfig/network-scripts/ if [[ -z "$1" ]]; then @@ -421,30 +477,35 @@ function detach_interface_from_ovs { if_mask=$(sed -n 's/^NETMASK=\(.*\)$/\1/p' ${if_file}) if_gw=$(sed -n 's/^GATEWAY=\(.*\)$/\1/p' ${if_file}) + if [ -z "$if_mask" ]; then + if_prefix=$(sed -n 's/^PREFIX=\(.*\)$/\1/p' ${if_file}) + if_mask=$(prefix2mask ${if_prefix}) + fi + if [[ -z "$if_ip" || -z "$if_mask" ]]; then - echo "ERROR: IPADDR or NETMASK missing for ${bridge} and no .orig file for interface ${line}" + echo "ERROR: IPADDR or PREFIX/NETMASK missing for ${bridge} and no .orig file for interface ${line}" return 1 fi if [ -z ${if_gw} ]; then # create if cfg - echo "DEVICE=${line}, -IPADDR=${if_ip}, -NETMASK=${if_mask}, -BOOTPROTO=static, -ONBOOT=yes, -TYPE=Ethernet, -NM_CONTROLLED=no, + echo "DEVICE=${line} +IPADDR=${if_ip} +NETMASK=${if_mask} +BOOTPROTO=static +ONBOOT=yes +TYPE=Ethernet +NM_CONTROLLED=no PEERDNS=no" > ${net_path}/ifcfg-${line} else - echo "DEVICE=${line}, -IPADDR=${if_ip}, -NETMASK=${if_mask}, -BOOTPROTO=static, -ONBOOT=yes, -TYPE=Ethernet, -NM_CONTROLLED=no, -GATEWAY=${if_gw}, + echo "DEVICE=${line} +IPADDR=${if_ip} +NETMASK=${if_mask} +BOOTPROTO=static +ONBOOT=yes +TYPE=Ethernet +NM_CONTROLLED=no +GATEWAY=${if_gw} PEERDNS=no" > ${net_path}/ifcfg-${line} fi break @@ -455,8 +516,47 @@ PEERDNS=no" > ${net_path}/ifcfg-${line} done <<< "$port_output" - # now remove the bridge ifcfg file - rm -f ${net_path}/ifcfg-${bridge} + # modify the bridge ifcfg file + # to remove IP params + sudo sed -i 's/IPADDR=.*//' ${net_path}/ifcfg-${bridge} + sudo sed -i 's/NETMASK=.*//' ${net_path}/ifcfg-${bridge} + sudo sed -i 's/GATEWAY=.*//' ${net_path}/ifcfg-${bridge} sudo systemctl restart network } + +# Update iptables rule for external network reach internet +# for virtual deployments +# params: external_cidr +function configure_undercloud_nat { + local external_cidr + if [[ -z "$1" ]]; then + return 1 + else + external_cidr=$1 + fi + + ssh -T ${SSH_OPTIONS[@]} "root@$UNDERCLOUD" <