Merge "base image: Explicitly call kpartx"
[fuel.git] / ci / deploy.sh
index 6a1d6e1..1b4dd95 100755 (executable)
@@ -15,6 +15,7 @@
 do_exit () {
     local RC=$?
     clean
+    cleanup_mounts
     if [ ${RC} -eq 0 ]; then
         notify "\n[OK] MCP: Openstack installation finished succesfully!\n\n" 2
     else
@@ -38,7 +39,7 @@ $(notify "USAGE:" 2)
   $(basename "$0") -b base-uri -l lab-name -p pod-name -s deploy-scenario \\
     [-B PXE Bridge [-B Mgmt Bridge [-B Internal Bridge [-B Public Bridge]]]] \\
     [-S storage-dir] [-L /path/to/log/file.tar.gz] \\
-    [-f [-f]] [-F] [-e] [-d] [-D]
+    [-f[f]] [-F] [-e | -E[E]] [-d] [-D]
 
 $(notify "OPTIONS:" 2)
   -b  Base-uri for the stack-configuration structure
@@ -46,6 +47,7 @@ $(notify "OPTIONS:" 2)
   -d  Dry-run
   -D  Debug logging
   -e  Do not launch environment deployment
+  -E  Remove existing VCP VMs (use twice to redeploy baremetal nodes)
   -f  Deploy on existing Salt master (use twice to also skip config sync)
   -F  Do only create a Salt master
   -h  Print this message and exit
@@ -82,6 +84,10 @@ $(notify "Input parameters to the build script are:" 2)
 -d Dry-run - Produce deploy config files, but do not execute deploy
 -D Debug logging - Enable extra logging in sh deploy scripts (set -x)
 -e Do not launch environment deployment
+-E Remove existing VCP VMs. It will destroy and undefine all VCP VMs
+   currently defined on cluster KVM nodes. If specified twice (e.g. -E -E),
+   baremetal nodes (VCP too, implicitly) will be removed, then reprovisioned.
+   Only applicable for baremetal deploys.
 -f Deploy on existing Salt master. It will skip infrastructure VM creation,
    but it will still sync reclass configuration from current repo to Salt
    Master node. If specified twice (e.g. -f -f), config sync will also be
@@ -150,8 +156,10 @@ DRY_RUN=${DRY_RUN:-0}
 USE_EXISTING_INFRA=${USE_EXISTING_INFRA:-0}
 INFRA_CREATION_ONLY=${INFRA_CREATION_ONLY:-0}
 NO_DEPLOY_ENVIRONMENT=${NO_DEPLOY_ENVIRONMENT:-0}
+ERASE_ENV=${ERASE_ENV:-0}
 
 source "${DEPLOY_DIR}/globals.sh"
+source "${DEPLOY_DIR}/lib.sh"
 
 #
 # END of variables to customize
@@ -162,7 +170,7 @@ source "${DEPLOY_DIR}/globals.sh"
 #
 set +x
 OPNFV_BRIDGE_IDX=0
-while getopts "b:B:dDfFl:L:p:s:S:he" OPTION
+while getopts "b:B:dDfEFl:L:p:s:S:he" OPTION
 do
     case $OPTION in
         b)
@@ -200,6 +208,9 @@ do
         e)
             NO_DEPLOY_ENVIRONMENT=1
             ;;
+        E)
+            ((ERASE_ENV+=1))
+            ;;
         l)
             TARGET_LAB=${OPTARG}
             ;;
@@ -236,11 +247,6 @@ if [[ "$(sudo whoami)" != 'root' ]]; then
     exit 1
 fi
 
-if ! virsh list >/dev/null 2>&1; then
-    notify "[ERROR] This script requires hypervisor access\n" 1>&2
-    exit 1
-fi
-
 # Validate mandatory arguments are set
 if [ -z "${TARGET_LAB}" ] || [ -z "${TARGET_POD}" ] || \
    [ -z "${DEPLOY_SCENARIO}" ]; then
@@ -265,16 +271,29 @@ pushd "${DEPLOY_DIR}" > /dev/null
 
 # Install required packages
 [ -n "$(command -v apt-get)" ] && sudo apt-get install -y \
-  git make rsync mkisofs curl virtinst cpu-checker qemu-kvm uuid-runtime
+  git make rsync mkisofs curl virtinst cpu-checker qemu-kvm uuid-runtime \
+  libvirt-bin cloud-guest-utils e2fsprogs kpartx
 [ -n "$(command -v yum)" ] && sudo yum install -y --skip-broken \
-  git make rsync genisoimage curl virt-install qemu-kvm util-linux
+  git make rsync genisoimage curl virt-install qemu-kvm util-linux \
+  libvirt cloud-utils-growpart e2fsprogs kpartx
 
 # For baremetal, python is indirectly required for PDF parsing
 if [ "${DEPLOY_TYPE}" = 'baremetal' ]; then
   [ -n "$(command -v apt-get)" ] && sudo apt-get install -y \
-    python python-ipaddress python-jinja2
+    python python-ipaddress python-jinja2 python-yaml
   [ -n "$(command -v yum)" ] && sudo yum install -y --skip-broken \
-    python python-ipaddress python-jinja2
+    python python-ipaddress python-jinja2 python-yaml
+fi
+
+# AArch64 VMs use AAVMF (guest UEFI)
+if [ "$(uname -m)" = 'aarch64' ]; then
+  [ -n "$(command -v apt-get)" ] && sudo apt-get install -y qemu-efi
+  [ -n "$(command -v yum)" ] && sudo yum install -y --skip-broken AAVMF
+fi
+
+if ! virsh list >/dev/null 2>&1; then
+    notify "[ERROR] This script requires hypervisor access\n" 1>&2
+    exit 1
 fi
 
 # Clone git submodules and apply our patches
@@ -323,7 +342,6 @@ fi
 
 # Get required infra deployment data
 set +x
-source lib.sh
 eval "$(parse_yaml "${SCENARIO_DIR}/defaults-$(uname -i).yaml")"
 eval "$(parse_yaml "${SCENARIO_DIR}/${DEPLOY_TYPE}/${DEPLOY_SCENARIO}.yaml")"
 eval "$(parse_yaml "${LOCAL_PDF_RECLASS}")"
@@ -341,8 +359,25 @@ for node in "${virtual_nodes[@]}"; do
 done
 virtual_nodes_data=${virtual_nodes_data%|}
 
+# Serialize repos, packages to (pre-)install/remove for:
+# - foundation node VM base image (virtual: all VMs, baremetal: cfg01|mas01)
+# - virtualized control plane VM base image (only when VCP is used)
+base_image_flavors=common
+if [[ "${cluster_states[*]}" =~ virtual_control ]]; then
+  base_image_flavors+=" control"
+fi
+for sc in ${base_image_flavors}; do
+  for va in apt_keys apt_repos pkg_install pkg_remove; do
+    key=virtual_${sc}_${va}
+    eval "${key}=\${${key}[@]// /|}"
+    eval "${key}=\${${key}// /,}"
+    virtual_repos_pkgs+="${!key}^"
+  done
+done
+virtual_repos_pkgs=${virtual_repos_pkgs%^}
+
 # Expand reclass and virsh network templates
-for tp in "${RECLASS_CLUSTER_DIR}/all-mcp-ocata-common/opnfv/"*.template \
+for tp in "${RECLASS_CLUSTER_DIR}/all-mcp-arch-common/opnfv/"*.template \
     net_*.template; do
         eval "cat <<-EOF
                $(<"${tp}")
@@ -351,9 +386,7 @@ done
 
 # Convert Pharos-compatible PDF to reclass network definitions
 if [ "${DEPLOY_TYPE}" = 'baremetal' ]; then
-    find "${RECLASS_CLUSTER_DIR}/${CLUSTER_DOMAIN%.local}" \
-         "${RECLASS_CLUSTER_DIR}/${DEPLOY_TYPE}-mcp-ocata-common" \
-         -name '*.j2' | while read -r tp
+    find "${RECLASS_CLUSTER_DIR}" -name '*.j2' | while read -r tp
     do
         if ! "${PHAROS_GEN_CONFIG_SCRIPT}" -y "${LOCAL_PDF}" \
           -j "${tp}" > "${tp%.j2}"; then
@@ -396,7 +429,8 @@ elif [ ${USE_EXISTING_INFRA} -gt 0 ]; then
     check_connection
 else
     generate_ssh_key
-    prepare_vms "${base_image}" "${STORAGE_DIR}" "${virtual_nodes[@]}"
+    prepare_vms "${base_image}" "${STORAGE_DIR}" "${virtual_repos_pkgs}" \
+      "${virtual_nodes[@]}"
     create_networks "${OPNFV_BRIDGES[@]}"
     create_vms "${STORAGE_DIR}" "${virtual_nodes_data}" "${OPNFV_BRIDGES[@]}"
     update_mcpcontrol_network
@@ -415,8 +449,9 @@ else
     for state in "${cluster_states[@]}"; do
         notify "[STATE] Applying state: ${state}\n" 2
         # shellcheck disable=SC2086,2029
-        wait_for 5 "ssh ${SSH_OPTS} ${SSH_SALT} \
-            sudo /root/fuel/mcp/config/states/${state}"
+        wait_for 5 "ssh ${SSH_OPTS} ${SSH_SALT} sudo \
+            CI_DEBUG=$CI_DEBUG ERASE_ENV=$ERASE_ENV \
+            /root/fuel/mcp/config/states/${state}"
     done
 fi