+
+# key might not exist yet ...
+generate_ssh_key
+export MAAS_SSH_KEY="$(cat "$(basename "${SSH_KEY}").pub")"
+
+MCP_DPDK_MODE=$([[ "$DEPLOY_SCENARIO" =~ ovs ]] && echo 1 || echo 0)
+# Expand jinja2 templates based on PDF data and env vars
+export MCP_REPO_ROOT_PATH MCP_VCP MCP_DPDK_MODE MCP_STORAGE_DIR \
+ MCP_JUMP_ARCH=$(uname -i)
+do_templates_scenario "${MCP_STORAGE_DIR}" "${TARGET_LAB}" "${TARGET_POD}" \
+ "${BASE_CONFIG_URI}" "${SCENARIO_DIR}"
+do_templates_cluster "${MCP_STORAGE_DIR}" "${TARGET_LAB}" "${TARGET_POD}" \
+ "${MCP_REPO_ROOT_PATH}" \
+ "${SCENARIO_DIR}/defaults.yaml" \
+ "${SCENARIO_DIR}/${DEPLOY_SCENARIO}.yaml"
+
+# Determine additional data (e.g. jump bridge names) based on XDF
+source "${DEPLOY_DIR}/xdf_data.sh"
+
+# Jumpserver prerequisites check
+notify "[NOTE] Using bridges: ${OPNFV_BRIDGES[*]}" 2
+jumpserver_check_requirements "${virtual_nodes[*]}" "${OPNFV_BRIDGES[@]}"
+
+# Infra setup
+if [ ${DRY_RUN} -eq 1 ]; then
+ notify "[NOTE] Dry run, skipping all deployment tasks" 2
+ exit 0
+elif [ ${USE_EXISTING_INFRA} -gt 0 ]; then
+ notify "[NOTE] Use existing infra" 2
+ check_connection
+else
+ prepare_vms "${base_image}" "${MCP_STORAGE_DIR}" "${virtual_repos_pkgs}" \
+ "${virtual_nodes[@]}"
+ create_networks "${OPNFV_BRIDGES[@]}"
+ do_sysctl_cfg
+ do_udev_cfg
+ create_vms "${MCP_STORAGE_DIR}" "${virtual_nodes_data}" "${OPNFV_BRIDGES[@]}"
+ update_mcpcontrol_network
+ start_vms "${virtual_nodes[@]}"
+ check_connection
+fi
+if [ ${USE_EXISTING_INFRA} -lt 2 ]; then
+ wait_for 5 "./salt.sh ${MCP_STORAGE_DIR}/pod_config.yml ${virtual_nodes[*]}"
+fi
+
+# Openstack cluster setup
+set +x
+if [ ${INFRA_CREATION_ONLY} -eq 1 ] || [ ${NO_DEPLOY_ENVIRONMENT} -eq 1 ]; then
+ notify "[NOTE] Skip openstack cluster setup" 2
+else
+ for state in "${cluster_states[@]}"; do
+ notify "[STATE] Applying state: ${state}" 2
+ # shellcheck disable=SC2086,2029
+ wait_for 5 "ssh ${SSH_OPTS} ${SSH_SALT} sudo \
+ CI_DEBUG=$CI_DEBUG ERASE_ENV=$ERASE_ENV \
+ /root/fuel/mcp/config/states/${state}"
+ if [ "${state}" = 'maas' ]; then
+ # For hybrid PODs (virtual + baremetal nodes), the virtual nodes
+ # should be reset to force a DHCP request from MaaS DHCP
+ reset_vms "${virtual_nodes[@]}"
+ fi
+ done
+fi
+
+./log.sh "${DEPLOY_LOG}"
+