#!/bin/bash
# ============LICENSE_START=======================================================
#  Copyright (C) 2023 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=========================================================

# This script will be used to automatically trigger the S3P
# tests for policy components.

# Start Kubernetes
function start_kubernetes() {
  bash run-k8s-csit.sh install
  bash resources/scripts/get-cluster-info.sh
}

function install_jmeter() {

  #NOTE: $TESTDIR is set by the component triggering this script
  cd ${TESTDIR}/automate-performance

  sudo apt-get update

  # Install curl
  sudo apt install curl -y

  # Install JDK
  sudo apt install -y default-jdk

  # Install JMeter
  curl -O https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-5.6.2.tgz
  tar -xvf apache-jmeter-5.6.2.tgz
  mv apache-jmeter-5.6.2 apache-jmeter

  # Define your desired heap size values
  echo 'export JVM_ARGS="-Xms2g -Xmx4g"' > apache-jmeter/bin/setenv.sh
  echo 'export HEAP="-Xms1G -Xmx2G -XX:MaxMetaspaceSize=512m"' >> apache-jmeter/bin/setenv.sh


  # Remove unnecessary files
  rm -rf apache-jmeter/docs apache-jmeter/printable_docs

  # Install CMD Runner
  cd apache-jmeter/lib
  curl -O https://repo1.maven.org/maven2/kg/apc/cmdrunner/2.2.1/cmdrunner-2.2.1.jar

  # Move JMeter to /opt
  sudo cp -r ../../apache-jmeter /opt/

  # Add JMeter Path Variable
  export JMETER_HOME="/opt/apache-jmeter"
  export PATH="$JMETER_HOME/bin:$PATH"
}

function on_exit() {
  # TODO: Generate report
  echo "Generating report..."
}

function teardown() {
  echo "Removing temp directories.."

  rm -r ${TESTDIR}/automate-performance

  echo "Removed directories"

  echo "Tearing down kubernetes cluster..."
  bash run-k8s-csit.sh uninstall

  # DELETE created services
  microk8s kubectl get svc | awk '/svc/{system("microk8s kubectl delete svc " $1)}'
}

#===MAIN===#

if [ $1 == "run" ]
then

  echo "==========================="
  echo "Starting K8s Environment"
  echo "==========================="
  start_kubernetes

  echo "==========================="
  echo "Installing JMeter"
  echo "==========================="
  install_jmeter

  # Run the JMX test plan
  echo "==========================="
  echo "Executing tests"
  echo "==========================="
  cd ${TESTDIR}/automate-performance || exit
  nohup jmeter -n -t $2 -l s3pTestResults.jtl

  # TODO: Generate report on on_exit()

elif [ $1 == "uninstall" ]
then
  echo "Uninstalling environment and removing temp folders..."
  teardown
else
  echo "Invalid arguments provided. Usage: $0 [option..] {run | uninstall}"
fi