Merge "[baremetal] ODL: Move ODL VCP VM to kvm02"
[fuel.git] / ci / deploy.sh
index e980505..19ae23c 100755 (executable)
@@ -14,7 +14,7 @@
 #
 do_exit () {
     local RC=$?
-    clean
+    cleanup_mounts > /dev/null 2>&1
     if [ ${RC} -eq 0 ]; then
         notify "\n[OK] MCP: Openstack installation finished succesfully!\n\n" 2
     else
@@ -38,7 +38,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,11 +46,13 @@ $(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
   -l  Lab-name
   -p  Pod-name
+  -P  Skip installation of package dependencies
   -s  Deploy-scenario short-name
   -S  Storage dir for VM images
   -L  Deployment log path and file name
@@ -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
@@ -91,6 +97,10 @@ $(notify "Input parameters to the build script are:" 2)
 -L Deployment log path and name, eg. -L /home/jenkins/job.log.tar.gz
 -l Lab name as defined in the configuration directory, e.g. lf
 -p POD name as defined in the configuration directory, e.g. pod2
+-P Skip installing dependency distro packages on current host
+   This flag should only be used if you have kept back older packages that
+   would be upgraded and that is undesirable on the current system.
+   Note that without the required packages, deploy will fail.
 -s Deployment-scenario, this points to a short deployment scenario name, which
    has to be defined in config directory (e.g. os-odl-nofeature-ha).
 -S Storage dir for VM images, default is mcp/deploy/images
@@ -122,16 +132,6 @@ notify() {
 # END of colored notification wrapper
 ##############################################################################
 
-##############################################################################
-# BEGIN of deployment clean-up
-#
-clean() {
-    echo "Cleaning up deploy tmp directories"
-}
-#
-# END of deployment clean-up
-##############################################################################
-
 ##############################################################################
 # BEGIN of variables to customize
 #
@@ -147,11 +147,14 @@ BASE_CONFIG_URI="file://${REPO_ROOT_PATH}/mcp/config"
 
 # Customize deploy workflow
 DRY_RUN=${DRY_RUN:-0}
+USE_EXISTING_PKGS=${USE_EXISTING_PKGS:-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 +165,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:Ps:S:he" OPTION
 do
     case $OPTION in
         b)
@@ -200,6 +203,9 @@ do
         e)
             NO_DEPLOY_ENVIRONMENT=1
             ;;
+        E)
+            ((ERASE_ENV+=1))
+            ;;
         l)
             TARGET_LAB=${OPTARG}
             ;;
@@ -212,6 +218,9 @@ do
                 DEPLOY_TYPE='virtual'
             fi
             ;;
+        P)
+            USE_EXISTING_PKGS=1
+            ;;
         s)
             DEPLOY_SCENARIO=${OPTARG}
             ;;
@@ -252,32 +261,27 @@ trap do_exit SIGINT SIGTERM EXIT
 # Set no restrictive umask so that Jenkins can remove any residuals
 umask 0000
 
-clean
-
 pushd "${DEPLOY_DIR}" > /dev/null
 # Prepare the deploy config files based on lab/pod information, deployment
 # scenario, etc.
 
-# 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 \
-  libvirt-bin
-[ -n "$(command -v yum)" ] && sudo yum install -y --skip-broken \
-  git make rsync genisoimage curl virt-install qemu-kvm util-linux \
-  libvirt
-
-# 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-yaml
-  [ -n "$(command -v yum)" ] && sudo yum install -y --skip-broken \
-    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
+# Install required packages on jump server
+if [ ${USE_EXISTING_PKGS} -eq 1 ]; then
+    notify "[NOTE] Skipping distro pkg installation\n" 2 1>&2
+else
+    notify "[NOTE] Installing required distro pkgs\n" 2 1>&2
+    if [ -n "$(command -v apt-get)" ]; then
+      pkg_type='deb'; pkg_cmd='sudo apt-get install -y'
+    else
+      pkg_type='rpm'; pkg_cmd='sudo yum install -y --skip-broken'
+    fi
+    eval "$(parse_yaml "./requirements_${pkg_type}.yaml")"
+    for section in 'common' "${DEPLOY_TYPE}" "$(uname -m)"; do
+      section_var="requirements_pkg_${section}[*]"
+      pkg_list+=" ${!section_var}"
+    done
+    # shellcheck disable=SC2086
+    ${pkg_cmd} ${pkg_list}
 fi
 
 if ! virsh list >/dev/null 2>&1; then
@@ -331,7 +335,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}")"
@@ -349,8 +352,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}")
@@ -359,9 +379,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
@@ -374,7 +392,7 @@ fi
 # Map PDF networks 'admin', 'mgmt', 'private' and 'public' to bridge names
 BR_NAMES=('admin' 'mgmt' 'private' 'public')
 BR_NETS=( \
-    "${parameters__param_opnfv_maas_pxe_address}" \
+    "${paramaters__param_opnfv_infra_maas_pxe_address}" \
     "${parameters__param_opnfv_infra_config_address}" \
     "${parameters__param_opnfv_openstack_compute_node01_tenant_address}" \
     "${parameters__param_opnfv_openstack_compute_node01_external_address}" \
@@ -404,7 +422,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
@@ -423,8 +442,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