From 3f725da931fb7312a26d3dd5213e0198fb6a7053 Mon Sep 17 00:00:00 2001
From: sonyafenge <sonyafenge@gmail.com>
Date: Fri, 8 Jul 2022 01:56:45 +0000
Subject: [PATCH] add test-setup and test teardown

---
 hack/test-config.sh   |  48 +++++++++++++++
 hack/test-setup.sh    | 134 ++++++++++++++++++++++++++++++++++++++++++
 hack/test-teardown.sh |  81 +++++++++++++++++++++++++
 3 files changed, 263 insertions(+)
 create mode 100644 hack/test-config.sh
 create mode 100644 hack/test-setup.sh
 create mode 100644 hack/test-teardown.sh

diff --git a/hack/test-config.sh b/hack/test-config.sh
new file mode 100644
index 00000000..71f36bcf
--- /dev/null
+++ b/hack/test-config.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+# gcloud multiplexing for shared GCE/GKE tests.
+GRS_ROOT=$(dirname "${BASH_SOURCE[0]}")
+
+SIM_NUM=${SIM_NUM:-2}
+CLIENT_NUM=${CLIENT_NUM:-4}
+SERVER_NUM=${SERVER_NUM:-1}
+ZONE=${GRS_GCE_ZONE:-"us-central1-a"}
+REGION=${ZONE%-*}
+PROJECT=${GRS_GCE_project:-"workload-controller-manager"}
+INSTANCE_PREFIX=${GRS_INSTANCE_PREFIX:-grs}
+SIM_INSTANCE_PREFIX=${SIM_INSTANCE_PREFIX:-"${INSTANCE_PREFIX}-sim"}
+CLIENT_INSTANCE_PREFIX=${CLIENT_INSTANCE_PREFIX:-"${INSTANCE_PREFIX}-client"}
+SERVER_INSTANCE_PREFIX=${SERVER_INSTANCE_PREFIX:-"${INSTANCE_PREFIX}-server"}
+SIM_RESERVED_IP=${SIM_RESERVED_IP:-"35.188.145.60,35.193.92.26"}
+
+SOURCE_INSTANCE=${SOURCE_INSTANCE:-"sonya-grs-test-template"}
+SOURCE_DISK=${SOURCE_DISK:-"sonya-grs-test-template"}
+SOURCE_DISK_ZONE=${SOURCE_DISK_ZONE:-"${ZONE}"}
+IMAGE_NAME=${IMAGE_NAME:-"grs-test-image"}
+
+# simulator instance parameter
+SIM_SOURCE_INSTANCE=${SIM_SOURCE_INSTANCE:-"${SOURCE_INSTANCE}"}
+SIM_SOURCE_DISK=${SIM_SOURCE_DISK:-"${SOURCE_DISK}"}
+SIM_SOURCE_DISK_ZONE=${SIM_SOURCE_DISK_ZONE:-"${SOURCE_DISK_ZONE}"}
+SIM_IMAGE_NAME=${SIM_IMAGE_NAME:-"${IMAGE_NAME}"}
+
+
+# client instance parameter
+CLIENT_SOURCE_INSTANCE=${CLIENT_SOURCE_INSTANCE:-"${SOURCE_INSTANCE}"}
+CLIENT_SOURCE_DISK=${CLIENT_SOURCE_DISK:-"${SOURCE_DISK}"}
+CLIENT_SOURCE_DISK_ZONE=${CLIENT_SOURCE_DISK_ZONE:-"${SOURCE_DISK_ZONE}"}
+CLIENT_IMAGE_NAME=${CLIENT_IMAGE_NAME:-"${IMAGE_NAME}"}
+
+# server instance parameter
+SERVER_SOURCE_INSTANCE=${SERVER_SOURCE_INSTANCE:-"sonya-grs-resourcemanagement"}
+SERVER_SOURCE_DISK=${SERVER_SOURCE_DISK:-"sonya-grs-resourcemanagement"}
+SERVER_SOURCE_DISK_ZONE=${SERVER_SOURCE_DISK_ZONE:-"${ZONE}"}
+SERVER_IMAGE_NAME=${SERVER_IMAGE_NAME:-"grs-server-image"}
+
+#teardown parameter
+SERVER_AUTO_DELETE=${SERVER_AUTO_DELETE:-true}
+CLIENT_AUTO_DELETE=${CLIENT_AUTO_DELETE:-true}
+SIM_AUTO_DELETE=${SIM_AUTO_DELETE:-true}
+SERVERIMAGE_AUTO_DELETE=${SERVERIMAGE_AUTO_DELETE:-false}
+CLIENTIMAGE_AUTO_DELETE=${CLIENTIMAGE_AUTO_DELETE:-false}
+SIMIMAGE_AUTO_DELETE=${SIMIMAGE_AUTO_DELETE:-false}
\ No newline at end of file
diff --git a/hack/test-setup.sh b/hack/test-setup.sh
new file mode 100644
index 00000000..5d358c46
--- /dev/null
+++ b/hack/test-setup.sh
@@ -0,0 +1,134 @@
+#!/usr/bin/env bash
+
+### Only support gcloud 
+### Please ensure gcloud is installed before run this script
+
+GRS_ROOT=$(dirname "${BASH_SOURCE[0]}")
+
+source "${GRS_ROOT}/test-config.sh"
+
+function create-image {
+        local image_name="$1"
+        local source_disk="$2"
+        local source_disk_zone="$3"
+        echo "Check and create images  with image_name: ${image_name}, source_disk: ${source_disk}."
+        if gcloud compute images describe "${image_name}" --project "${PROJECT}" &>/dev/null; then
+                echo "Image name: ${image_name} already exist, using existing one."
+        else
+                gcloud compute images create \
+                        "${image_name}" \
+                        --project "${PROJECT}" \
+                        --source-disk "${source_disk}" \
+                        --source-disk-zone "${source_disk_zone}" \
+                        --quiet
+        fi
+}
+
+function create-template {
+        local template_name="$1"
+        local source_instance="$2"
+        local source_disk="$3"
+        local image_name="$4"
+        local source_instance_zone="$5"
+        echo "Check and create instance templates"
+        if gcloud compute instance-templates describe "${template_name}" --project "${PROJECT}" &>/dev/null; then
+                gcloud compute instance-templates delete \
+                "${template_name}" \
+                --project "${PROJECT}" \
+                --quiet 
+        fi
+        gcloud compute instance-templates create \
+                "${template_name}" \
+                --project "${PROJECT}" \
+                --source-instance "${source_instance}" \
+                --source-instance-zone "${source_instance_zone}" \
+                --configure-disk=device-name="${source_disk}",instantiate-from=custom-image,custom-image="projects/${PROJECT}/global/images/${image_name}" \
+                --quiet
+        
+}
+
+function create-instance-group {
+        local group_name="$1"
+        local template_name="$2"
+        local instance_num="$3"
+        echo "Check and create instance groups"
+        if gcloud compute instance-groups managed describe "${group_name}" --project "${PROJECT}" &>/dev/null; then
+                echo "Try to Delete existing instance group: ${group_name}"
+                gcloud compute instance-groups managed delete \
+                        "${group_name}" \
+                        --project "${PROJECT}" \
+                        --quiet 
+        fi
+        gcloud compute instance-groups managed create \
+                "${group_name}" \
+                --project "${PROJECT}" \
+                --zone "${ZONE}" \
+                --template "${template_name}" \
+                --size "${instance_num}" \
+                --quiet
+}
+
+function attach-ipaddress {
+        local group_name="$1"
+        echo "Attaching reserved ip address to instances"
+        instance_names=()
+        instance_names=($(gcloud compute instance-groups managed list-instances \
+        "${group_name}" --zone "${ZONE}" --project "${PROJECT}" \
+        --format='value(instance)'))
+
+        ip_index=0
+        for name in "${instance_names[@]}"; do
+                echo $name
+                gcloud compute instances delete-access-config \
+                $name \
+                --zone ${ZONE} \
+                --project "${PROJECT}" \
+                --access-config-name="External NAT"
+
+                gcloud compute instances add-access-config \
+                $name \
+                --zone ${ZONE} \
+                --project "${PROJECT}" \
+                --access-config-name "External NAT" \
+                --address "${IP_ADDRESS[$ip_index]}"
+                echo "$ip_index,${IP_ADDRESS[$ip_index]}"
+                ip_index=$(($ip_index + 1))
+        done
+}
+
+
+###############
+#   main function
+###############
+
+#verify reserved ip address number is greater then simulator vm number
+IFS=','; IP_ADDRESS=($SIM_RESERVED_IP); unset IFS;
+
+if [ ${#IP_ADDRESS[@]} -lt ${SIM_NUM} ]; then
+        echo "Reserved IP address number less then simulator vm number, Please double check."
+        exit 1
+fi
+
+if [ ${SIM_NUM} -gt 0 ]; then
+        echo "starting region simulator... "
+        create-image "${SIM_IMAGE_NAME}" "${SIM_SOURCE_DISK}" "${SIM_SOURCE_DISK_ZONE}"
+        create-template "${SIM_INSTANCE_PREFIX}-template" "${SIM_SOURCE_INSTANCE}" "${SIM_SOURCE_DISK}" "${SIM_IMAGE_NAME}" "${SIM_SOURCE_DISK_ZONE}"
+        create-instance-group "${SIM_INSTANCE_PREFIX}-instance-group" "${SIM_INSTANCE_PREFIX}-template" "${SIM_NUM}"
+        echo "attach reserved IP to region simulator"
+        attach-ipaddress "${SIM_INSTANCE_PREFIX}-instance-group"
+fi
+
+if [ ${CLIENT_NUM} -gt 0 ]; then
+        echo "starting client scheduler... "
+        create-image "${CLIENT_IMAGE_NAME}" "${CLIENT_SOURCE_DISK}" "${CLIENT_SOURCE_DISK_ZONE}"
+        create-template "${CLIENT_INSTANCE_PREFIX}-template" "${CLIENT_SOURCE_INSTANCE}" "${CLIENT_SOURCE_DISK}" "${CLIENT_IMAGE_NAME}" "${CLIENT_SOURCE_DISK_ZONE}"
+        create-instance-group "${CLIENT_INSTANCE_PREFIX}-instance-group" "${CLIENT_INSTANCE_PREFIX}-template" "${CLIENT_NUM}"
+fi
+
+if [ ${SERVER_NUM} -gt 0 ]; then
+        echo "starting resource management service... "
+        create-image "${SERVER_IMAGE_NAME}" "${SERVER_SOURCE_DISK}" "${SERVER_SOURCE_DISK_ZONE}"
+        create-template "${SERVER_INSTANCE_PREFIX}-template" "${SERVER_SOURCE_INSTANCE}" "${SERVER_SOURCE_DISK}" "${SERVER_IMAGE_NAME}" "${SERVER_SOURCE_DISK_ZONE}"
+        create-instance-group "${SERVER_INSTANCE_PREFIX}-instance-group" "${SERVER_INSTANCE_PREFIX}-template" "${SERVER_NUM}"
+fi
+
diff --git a/hack/test-teardown.sh b/hack/test-teardown.sh
new file mode 100644
index 00000000..9a25046c
--- /dev/null
+++ b/hack/test-teardown.sh
@@ -0,0 +1,81 @@
+#!/usr/bin/env bash
+
+### Only support gcloud 
+### Please ensure gcloud is installed before run this script
+GRS_ROOT=$(dirname "${BASH_SOURCE[0]}")
+
+source "${GRS_ROOT}/test-config.sh"
+
+echo "${GRS_ROOT}/test-config.sh"
+
+echo "Tear down region simulator and clients... "
+
+function delete-image {
+        local image_name="$1"
+        if gcloud compute images describe "${image_name}" --project "${PROJECT}" &>/dev/null; then
+                echo "Deleting existing instance image: ${image_name}"
+                gcloud compute images delete \
+                        "${image_name}" \
+                        --project "${PROJECT}" \
+                        --quiet 
+        fi
+}
+
+function delete-instance-template {
+        local template_name="$1"
+        if gcloud compute instance-templates describe "${template_name}" --project "${PROJECT}" &>/dev/null; then
+                echo "Try to Delete existing instance template: ${template_name}, if failed, Please manully delete instance group first!"
+                gcloud compute instance-templates delete \
+                        "${template_name}" \
+                        --project "${PROJECT}" \
+                        --quiet 
+        fi
+}
+
+function delete-instance-groups {
+        local group_name="$1"
+        if gcloud compute instance-groups managed describe "${group_name}" --project "${PROJECT}" --zone "${ZONE}" &>/dev/null; then
+                echo "Try to Delete existing instance groups: ${group_name}"
+                gcloud compute instance-groups managed delete \
+                        "${group_name}" \
+                        --project "${PROJECT}" \
+                        --zone "${ZONE}" \
+                        --quiet 
+        fi
+}
+
+
+
+###############
+#   main function
+###############
+
+if [ "${SIM_AUTO_DELETE}" == "true" ]; then
+        echo "Deleting simulator resources"
+        delete-instance-groups "${SIM_INSTANCE_PREFIX}-instance-group"
+        delete-instance-template "${SIM_INSTANCE_PREFIX}-template"
+        if [ "${SIMIMAGE_AUTO_DELETE}" == "true" ]; then
+                delete-image "${SIM_IMAGE_NAME}"
+        fi
+fi
+
+if [ "${CLIENT_AUTO_DELETE}" == "true" ]; then
+        echo "Deleting client scheduler resources"
+        delete-instance-groups "${CLIENT_INSTANCE_PREFIX}-instance-group"
+        delete-instance-template "${CLIENT_INSTANCE_PREFIX}-template"
+        if [ "${CLIENTIMAGE_AUTO_DELETE}" == "true" ]; then
+                delete-image "${CLIENT_IMAGE_NAME}"
+        fi
+fi
+
+if [ "${SERVER_AUTO_DELETE}" == "true" ]; then
+        echo "Deleting server resources"
+        delete-instance-groups "${SERVER_INSTANCE_PREFIX}-instance-group"
+        delete-instance-template "${SERVER_INSTANCE_PREFIX}-template"
+        if [ "${SERVERIMAGE_AUTO_DELETE}" == "true" ]; then
+                delete-image "${SERVER_IMAGE_NAME}"
+        fi
+fi
+
+echo "Done. All resources deleted successfully"
+