summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Rozet <trozet@redhat.com>2016-01-09 18:26:50 +0000
committerGerrit Code Review <gerrit@172.30.200.206>2016-01-09 18:26:50 +0000
commit8a46a78ddd2460358416c3cfec1de86002b0e018 (patch)
tree5666c36806d7395d61ee3147d050e92b997b3ffe
parentc43b4a2afad26f7b8f58ecfa3cb17304fa94dd8b (diff)
parent9a11a203fa228cad7a86ebf2cb28ae834d17decd (diff)
Merge "Fixes attaching instack interfaces to host"
-rwxr-xr-xci/clean.sh11
-rwxr-xr-xci/deploy.sh9
-rw-r--r--lib/common-functions.sh148
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 4e9cfde0..7dc42012 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
+}