Fixes attaching instack interfaces to host 71/5971/2
authorTim Rozet <trozet@redhat.com>
Fri, 8 Jan 2016 22:06:02 +0000 (17:06 -0500)
committerTim Rozet <trozet@redhat.com>
Sat, 9 Jan 2016 05:20:38 +0000 (00:20 -0500)
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>
ci/clean.sh
ci/deploy.sh
lib/common-functions.sh

index 89e89aa..45486de 100755 (executable)
@@ -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
index 01bf003..de3ef51 100755 (executable)
@@ -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
index 9aa97e8..055d7fa 100644 (file)
@@ -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
+}