#!/bin/bash

# ============LICENSE_START=======================================================
#  Copyright (C) 2019 The Nordix Foundation. All rights reserved.
# ================================================================================
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
# ============LICENSE_END=========================================================

set -o errexit
set -o nounset
set -o pipefail

# This script is a wrapper around actual cloud infra engine deploy.sh script which gets
# executed when the job that uses this script gets triggered due to Gerrit change.
#
# Logic in this script should be kept at minimum and the changes should be pushed into
# the cloud infra engine deploy.sh script.

# The verify job will verify changes coming to other repositories as well such as
# infra/swconfig so it needs to be handled here in order to ensure $WORKSPACE contains
# the actual engine repo clone. This will be added later on.

# PDF and IDF are determined based on the deployment type
#   If DEPLOY_TYPE is virtual, we always use nordix-vpod1 PDF and IDF.
#   If DEPLOY_TYPE is baremetal, we use variable NODE_NAME injected by Jenkins to the job
#     in order to set PDF and IDF for the POD the job is running against.

# we don't support ONAP scenario verification because it is expensive
# TODO: we need to find a way to verify those patches in a cheaper way
if [[ "$DEPLOY_SCENARIO" =~ "onap-" ]]; then
  echo "Info: ONAP scenario verification has not been implemented yet!"
  exit 0
fi

# we don't support OpenStack scenario verification on OpenStack yet
if [[ "$DEPLOY_SCENARIO" =~ "os-" ]] && [[ "$PROVISIONER_TYPE" == "heat" ]]; then
  echo "Info: OpenStack scenario verification on OpenStack has not been implemented yet!"
  exit 0
fi

if [[ $DEPLOY_TYPE == "baremetal" ]]; then
  PDF="https://gerrit.nordix.org/gitweb?p=infra/hwconfig.git;a=blob_plain;f=pods/${NODE_NAME}-pdf.yml"
  IDF="https://gerrit.nordix.org/gitweb?p=infra/hwconfig.git;a=blob_plain;f=pods/${NODE_NAME}-idf.yml"
else
  PDF="https://gerrit.nordix.org/gitweb?p=infra/hwconfig.git;a=blob_plain;f=pods/nordix-vpod1-pdf.yml"
  IDF="https://gerrit.nordix.org/gitweb?p=infra/hwconfig.git;a=blob_plain;f=pods/nordix-vpod1-idf.yml"
fi

if [[ $PROVISIONER_TYPE == "bifrost" ]]; then
  DEPLOY_CMD="./engine/deploy.sh -c -r $PROVISIONER_TYPE -d $INSTALLER_TYPE -o $DISTRO -s $DEPLOY_SCENARIO -p $PDF -i $IDF"
elif [[ $PROVISIONER_TYPE == "heat" ]]; then
  DEPLOY_CMD="./engine/deploy.sh -c -r $PROVISIONER_TYPE -d $INSTALLER_TYPE -o $DISTRO -s $DEPLOY_SCENARIO -u /tmp/openrc -e $HEAT_ENVIRONMENT_FILE"
else
  echo "Error: Unsupported provisioner type. Must either be bifrost or heat!"
  exit 1
fi

# execute cloud engine deploy.sh script
cd $WORKSPACE
$DEPLOY_CMD

# vim: set ts=2 sw=2 expandtab:
