#!/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

  # Install Plugin Manager
  cd ext/
  curl -O https://repo1.maven.org/maven2/kg/apc/jmeter-plugins-manager/1.6/jmeter-plugins-manager-1.6.jar

  # Download Plugins
  cd ..
  java  -jar cmdrunner-2.2.1.jar --tool org.jmeterplugins.repository.PluginManagerCMD install-all-except jpgc-hadoop,jpgc-oauth,ulp-jmeter-autocorrelator-plugin,ulp-jmeter-videostreaming-plugin,ulp-jmeter-gwt-plugin,tilln-iso8583

  # 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