diff options
author | Tim Rozet <trozet@redhat.com> | 2016-01-08 17:06:02 -0500 |
---|---|---|
committer | Tim Rozet <trozet@redhat.com> | 2016-01-09 00:20:38 -0500 |
commit | 9a11a203fa228cad7a86ebf2cb28ae834d17decd (patch) | |
tree | 065a1ca971b76cb04bc1159ac52388b1ee168258 | |
parent | 194784ad1c2878a343377c7ea514ab2d8a95e06c (diff) |
Fixes attaching instack interfaces to host
This applies only to baremetal deployments. Interfaces from admin and
public networks are attached from the host to the OVS bridges brbm and
brbm2 for external connectivity.
Change-Id: If3f5b33eab267e05ee9094396daa40f37e69319a
Signed-off-by: Tim Rozet <trozet@redhat.com>
-rwxr-xr-x | ci/clean.sh | 11 | ||||
-rwxr-xr-x | ci/deploy.sh | 9 | ||||
-rw-r--r-- | lib/common-functions.sh | 148 |
3 files changed, 164 insertions, 4 deletions
diff --git a/ci/clean.sh b/ci/clean.sh index 89e89aa4..45486de0 100755 --- a/ci/clean.sh +++ b/ci/clean.sh @@ -2,7 +2,12 @@ #Clean script to uninstall provisioning server for Apex #author: Dan Radez (dradez@redhat.com) -# +#author: Tim Rozet (trozet@redhat.com) +CONFIG=/var/opt/opnfv + +##LIBRARIES +source $CONFIG/lib/common-functions.sh + vm_index=4 ovs_bridges="brbm brbm1 brbm2 brbm3" # Clean off instack VM @@ -29,7 +34,9 @@ done for bridge in ${ovs_bridges}; do virsh net-destroy ${bridge} 2> /dev/null virsh net-undefine ${bridge} 2> /dev/null - ovs-vsctl del-br ${bridge} 2> /dev/null + if detach_interface_from_ovs ${bridge}; then + ovs-vsctl del-br ${bridge} 2> /dev/null + fi done # clean pub keys from root's auth keys diff --git a/ci/deploy.sh b/ci/deploy.sh index 01bf003d..de3ef513 100755 --- a/ci/deploy.sh +++ b/ci/deploy.sh @@ -389,8 +389,13 @@ function configure_deps { for network in ${enabled_network_list}; do this_interface=$(eval echo \${${network}_bridged_interface}) # check if this a bridged interface for this network - if [[ -n "$this_interface" || "$this_interface" != "none" ]]; then - ovs-vsctl list-ports ${NET_MAP[$network]} | grep ${this_interface} || ovs-vsctl add-port ${NET_MAP[$network]} ${this_interface} + if [[ ! -z "$this_interface" || "$this_interface" != "none" ]]; then + if ! attach_interface_to_ovs ${NET_MAP[$network]} ${this_interface} ${network}; then + echo -e "${red}ERROR: Unable to bridge interface ${this_interface} to bridge ${NET_MAP[$network]} for enabled network: ${network}${reset}" + exit 1 + else + echo -e "${blue}INFO: Interface ${this_interface} bridged to bridge ${NET_MAP[$network]} for enabled network: ${network}${reset}" + fi else echo "${red}ERROR: Unable to determine interface to bridge to for enabled network: ${network}${reset}" exit 1 diff --git a/lib/common-functions.sh b/lib/common-functions.sh index 9aa97e87..055d7fa2 100644 --- a/lib/common-functions.sh +++ b/lib/common-functions.sh @@ -312,3 +312,151 @@ function generate_floating_ip_range { float_range_end=${last_ip} echo "${float_range_start},${float_range_end}" } + +##attach interface to OVS and set the network config correctly +##params: bride to attach to, interface to attach, network type (optional) +##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 + + if [[ -z "$1" || -z "$2" ]]; then + return 1 + else + bridge=$1 + interface=$2 + fi + + if ovs-vsctl list-ports ${bridge} | grep ${interface}; then + return 0 + fi + + if_file=/etc/sysconfig/network-scripts/ifcfg-${interface} + ovs_file=/etc/sysconfig/network-scripts/ifcfg-${bridge} + + if [ -e "$if_file" ]; then + if_ip=$(sed -n 's/^IPADDR=\(.*\)$/\1/p' ${if_file}) + if_mask=$(sed -n 's/^NETMASK=\(.*\)$/\1/p' ${if_file}) + if_gw=$(sed -n 's/^GATEWAY=\(.*\)$/\1/p' ${if_file}) + else + echo "ERROR: ifcfg file missing for ${interface}" + return 1 + fi + + if [[ -z "$if_ip" || -z "$if_mask" ]]; then + echo "ERROR: IPADDR or NETMASK missing for ${interface}" + return 1 + elif [[ -z "$if_gw" && "$3" == "public_network" ]]; then + echo "ERROR: GATEWAY missing for ${interface}, which is public" + return 1 + fi + + # 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}, +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, +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}, +PEERDNS=no" > ${ovs_file} + fi + + sudo systemctl restart network +} + +##detach interface from OVS and set the network config correctly +##params: bridge to detach from +##assumes only 1 real interface attached to OVS +function detach_interface_from_ovs { + local bridge + local port_output ports_no_orig + local net_path + local if_ip if_mask if_gw + + net_path=/etc/sysconfig/network-scripts/ + if [[ -z "$1" ]]; then + return 1 + else + bridge=$1 + fi + + # if no interfaces attached then return + if ! ovs-vsctl list-ports ${bridge} | grep -Ev "vnet[0-9]*"; then + return 0 + fi + + # look for .orig ifcfg files to use + port_output=$(ovs-vsctl list-ports ${bridge} | grep -Ev "vnet[0-9]*") + while read -r line; do + if [ -z "$line" ]; then + continue + elif [ -e ${net_path}/ifcfg-${line}.orig ]; then + mv -f ${net_path}/ifcfg-${line}.orig ${net_path}/ifcfg-${line} + elif [ -e ${net_path}/ifcfg-${bridge} ]; then + if_ip=$(sed -n 's/^IPADDR=\(.*\)$/\1/p' ${if_file}) + if_mask=$(sed -n 's/^NETMASK=\(.*\)$/\1/p' ${if_file}) + if_gw=$(sed -n 's/^GATEWAY=\(.*\)$/\1/p' ${if_file}) + + if [[ -z "$if_ip" || -z "$if_mask" ]]; then + echo "ERROR: IPADDR or 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, +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}, +PEERDNS=no" > ${net_path}/ifcfg-${line} + fi + break + else + echo "ERROR: Real interface ${line} attached to bridge, but no interface or ${bridge} ifcfg file exists" + return 1 + fi + + done <<< "$port_output" + + # now remove the bridge ifcfg file + rm -f ${net_path}/ifcfg-${bridge} + + sudo systemctl restart network +} |