Fix check if node type is baremetal for novcp
[fuel.git] / mcp / scripts / lib.sh
index cc65f9e..20d466f 100644 (file)
@@ -1,5 +1,5 @@
 #!/bin/bash -e
-# shellcheck disable=SC2155,SC1001
+# shellcheck disable=SC2155,SC1001,SC2015
 ##############################################################################
 # Copyright (c) 2017 Mirantis Inc., Enea AB and others.
 # All rights reserved. This program and the accompanying materials
@@ -313,12 +313,48 @@ function prepare_vms {
   fi
 }
 
+function jumpserver_check_requirements {
+  local vnodes=$1; shift
+  local br=("$@")
+  local err_br_not_found='Linux bridge not found!'
+  local err_br_virsh_net='is a virtual network, Linux bridge expected!'
+  local warn_br_endpoint="Endpoints might be inaccessible from external hosts!"
+  # MaaS requires a Linux bridge for PXE/admin
+  if [[ "${vnodes}" =~ mas01 ]]; then
+    if ! brctl showmacs "${br[0]}" >/dev/null 2>&1; then
+      notify_e "[ERROR] PXE/admin (${br[0]}) ${err_br_not_found}"
+    fi
+    # Assume virsh network name matches bridge name (true if created by us)
+    if virsh net-info "${br[0]}" >/dev/null 2>&1; then
+      notify_e "[ERROR] ${br[0]} ${err_br_virsh_net}"
+    fi
+  fi
+  # If virtual nodes are present, public should be a Linux bridge
+  if [ "$(echo "${vnodes}" | wc -w)" -gt 2 ]; then
+    if ! brctl showmacs "${br[3]}" >/dev/null 2>&1; then
+      if [[ "${vnodes}" =~ mas01 ]]; then
+        # Baremetal nodes *require* a proper public network
+        notify_e "[ERROR] Public (${br[3]}) ${err_br_not_found}"
+      else
+        notify_n "[WARN] Public (${br[3]}) ${err_br_not_found}" 3
+        notify_n "[WARN] ${warn_br_endpoint}" 3
+      fi
+    fi
+    if virsh net-info "${br[3]}" >/dev/null 2>&1; then
+      if [[ "${vnodes}" =~ mas01 ]]; then
+        notify_e "[ERROR] ${br[3]} ${err_br_virsh_net}"
+      else
+        notify_n "[WARN] ${br[3]} ${err_br_virsh_net}" 3
+        notify_n "[WARN] ${warn_br_endpoint}" 3
+      fi
+    fi
+  fi
+}
+
 function create_networks {
   local vnode_networks=("$@")
   # create required networks, including constant "mcpcontrol"
-  # FIXME(alav): since we renamed "pxe" to "mcpcontrol", we need to make sure
-  # we delete the old "pxe" virtual network, or it would cause IP conflicts.
-  for net in "pxe" "mcpcontrol" "${vnode_networks[@]}"; do
+  for net in "mcpcontrol" "${vnode_networks[@]}"; do
     if virsh net-info "${net}" >/dev/null 2>&1; then
       virsh net-destroy "${net}" || true
       virsh net-undefine "${net}"
@@ -449,12 +485,11 @@ function wait_for {
     for attempt in $(seq "${total_attempts}"); do
       echo "[wait_for] Attempt ${attempt}/${total_attempts%.*} for: ${cmdstr}"
       if [ "${total_attempts%.*}" = "${total_attempts}" ]; then
-        # shellcheck disable=SC2015
         eval "${cmdstr}" && echo "[wait_for] OK: ${cmdstr}" && return 0 || true
       else
-        !(eval "${cmdstr}" || echo __fuel_wf_failure__) |& tee /dev/stderr | \
-          grep -Eq '(Not connected|No response|__fuel_wf_failure__)' && \
-          echo "[wait_for] OK: ${cmdstr}" && return 0 || true
+        ! (eval "${cmdstr}" || echo 'No response') |& tee /dev/stderr | \
+           grep -Eq '(Not connected|No response)' && \
+           echo "[wait_for] OK: ${cmdstr}" && return 0 || true
       fi
       sleep "${sleep_time}"
     done
@@ -466,10 +501,13 @@ function wait_for {
 function do_sysctl_cfg {
   local _conf='/etc/sysctl.d/99-opnfv-fuel-bridge.conf'
   # https://wiki.libvirt.org/page/Net.bridge.bridge-nf-call_and_sysctl.conf
-  echo 'net.bridge.bridge-nf-call-arptables = 0' |& sudo tee "${_conf}"
-  echo 'net.bridge.bridge-nf-call-iptables = 0'  |& sudo tee -a "${_conf}"
-  echo 'net.bridge.bridge-nf-call-ip6tables = 0' |& sudo tee -a "${_conf}"
-  sudo sysctl -q -p "${_conf}"
+  if modprobe br_netfilter bridge; then
+    echo 'net.bridge.bridge-nf-call-arptables = 0' |& sudo tee "${_conf}"
+    echo 'net.bridge.bridge-nf-call-iptables = 0'  |& sudo tee -a "${_conf}"
+    echo 'net.bridge.bridge-nf-call-ip6tables = 0' |& sudo tee -a "${_conf}"
+    # Some distros / sysadmins explicitly blacklist br_netfilter
+    sudo sysctl -q -p "${_conf}" || true
+  fi
 }
 
 function get_nova_compute_pillar_data {
@@ -495,7 +533,6 @@ function do_templates() {
   BASE_CONFIG_IDF="${lab_config_uri}/labs/${target_lab}/idf-${target_pod}.yaml"
   LOCAL_PDF="${image_dir}/$(basename "${BASE_CONFIG_PDF}")"
   LOCAL_IDF="${image_dir}/$(basename "${BASE_CONFIG_IDF}")"
-  LOCAL_PDF_RECLASS="${image_dir}/pod_config.yml"
 
   # Two-stage expansion, first stage handles pod_config and scenarios only
   if [ -n "${scenario_dir}" ]; then
@@ -508,7 +545,7 @@ function do_templates() {
     elif ! curl -o "${LOCAL_IDF}" "${BASE_CONFIG_IDF}"; then
       notify_e "[ERROR] Could not retrieve IDF (Installer Descriptor File)!"
     elif ! "${PHAROS_GEN_CFG}" -y "${LOCAL_PDF}" \
-        -j "${PHAROS_INSTALLER_ADAPTER}" > "${LOCAL_PDF_RECLASS}"; then
+        -j "${PHAROS_INSTALLER_ADAPTER}" > "${image_dir}/pod_config.yml"; then
       notify_e "[ERROR] Could not convert PDF+IDF to reclass model input!"
     fi
     template_dirs="${scenario_dir}"