Feature: 11055 Support of several node groups in clusters created by OSM

Change-Id: I8c02465364c4b465a6503b19c8983e1587eaa5d4
Signed-off-by: yshah <shahithya.y@tataelxsi.co.in>
diff --git a/docker/osm-krm-functions/scripts/library/krm-functions.rc b/docker/osm-krm-functions/scripts/library/krm-functions.rc
index 1a3c0bd..1d45705 100644
--- a/docker/osm-krm-functions/scripts/library/krm-functions.rc
+++ b/docker/osm-krm-functions/scripts/library/krm-functions.rc
@@ -112,6 +112,179 @@
 }
 
 
+# Create remote NodeGroup in AWS
+function create_nodegroup() {
+  local NODEGROUP_NAME="$1"
+  local NODEGROUP_KUSTOMIZATION_NAME="$2"
+  local CLUSTER_NAME="$3"
+  local CLUSTER_TYPE="$4"
+  local PROVIDERCONFIG_NAME="${5:-default}"
+  local VM_SIZE="$6"
+  local NODE_COUNT="$7"
+  local CLUSTER_LOCATION="$8"
+  local CONFIGMAP_NAME="${9}"
+  local NODEGROUP_ROLE="${10}"
+  local PUBLIC_KEY_MGMT="${11:-"${PUBLIC_KEY_MGMT}"}"
+  local PUBLIC_KEY_NEW_CLUSTER="${12}"
+  local PRIVATE_KEY_NEW_CLUSTER="${13:-"${PRIVATE_KEY_NEW_CLUSTER}"}"
+  local AKS_RG_NAME="${14:-""}"
+  local GKE_PREEMPTIBLE_NODES="${15:-""}"
+  local FLEET_REPO_DIR="${16:-"${FLEET_REPO_DIR}"}"
+  local FLEET_REPO_URL="${17:-""}"
+  local SW_CATALOGS_REPO_DIR="${18:-"${SW_CATALOGS_REPO_DIR}"}"
+  local SW_CATALOGS_REPO_URL="${19:-""}"
+  local SKIP_BOOTSTRAP="${20:"false"}"
+  local MGMT_PROJECT_NAME="${21:-"osm_admin"}"
+  local MGMT_CLUSTER_NAME="${22:-"_management"}"
+  local BASE_TEMPLATES_PATH="${23:-"cloud-resources"}"
+  local TEMPLATE_MANIFEST_FILENAME="${24:-"nodegroup.yaml"}"
+  local MANIFEST_FILENAME="${25:-"${NODEGROUP_NAME}.yaml"}"
+
+  # Is the provider type supported?
+  local VALID_PROVIDERS=("eks" "aks" "gke")
+  CLUSTER_TYPE="${CLUSTER_TYPE,,}"
+  [[ ! ($(echo ${VALID_PROVIDERS[@]} | grep -w "${CLUSTER_TYPE}")) ]] && return 1
+
+  # Determines the source dir for the templates and the target folder in Fleet
+  local TEMPLATES_DIR="${SW_CATALOGS_REPO_DIR}/${BASE_TEMPLATES_PATH}/eks-nodegroup/templates"
+  local TARGET_FOLDER="${FLEET_REPO_DIR}/${MGMT_PROJECT_NAME}/managed-resources/${MGMT_CLUSTER_NAME}/${CLUSTER_NAME}"
+
+  local IS_NODEGROUP_ROLE=$([[ "${NODEGROUP_ROLE}" != "default" ]]; echo $?)
+  local IS_DEFAULT_NODEGROUP_ROLE=$([[ "${NODEGROUP_ROLE}" == "default" ]]; echo $?)
+
+  local PATCH_VALUE=""
+  local COMPONENT=()
+  if [[ "${IS_NODEGROUP_ROLE}" == "0" ]];
+  then
+    PATCH_VALUE=$(cat <<EOF
+patch: |
+  apiVersion: eks.aws.upbound.io/v1beta1
+  kind: NodeGroup
+  metadata:
+    name: \${nodegroup_name}
+  spec:
+    forProvider:
+      nodeRoleArn: \${role}
+EOF
+)
+  else
+    COMPONENT=("../role")
+  fi
+
+  # Pipeline of transformations to create the cluster resource
+  export NODEGROUP_KUSTOMIZATION_NAME
+  # export OVERLAY_FOLDER
+  folder2list \
+  "${TEMPLATES_DIR}" | \
+  replace_env_vars \
+    '${NODEGROUP_KUSTOMIZATION_NAME}' | \
+  patch_replace \
+    ".spec.postBuild.substitute.nodegroup_name" \
+    "${NODEGROUP_NAME}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+    ".spec.postBuild.substitute.cluster_name" \
+    "${CLUSTER_NAME}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+    ".spec.postBuild.substitute.cluster_location" \
+    "${CLUSTER_LOCATION}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+    ".spec.postBuild.substitute.vm_size" \
+    "${VM_SIZE}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+    ".spec.postBuild.substitute.node_count" \
+    "${NODE_COUNT}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+    ".spec.postBuild.substitute.providerconfig_name" \
+    "${PROVIDERCONFIG_NAME}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+    ".spec.postBuild.substituteFrom[0].name" \
+    "${CONFIGMAP_NAME}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  patch_replace \
+      ".spec.postBuild.substitute.role" \
+      "${NODEGROUP_ROLE}" \
+      "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  transform_if \
+    "${IS_NODEGROUP_ROLE}" \
+    add_patch_to_kustomization_as_list \
+      "${NODEGROUP_KUSTOMIZATION_NAME}" \
+      "${PATCH_VALUE}" | \
+  transform_if \
+    "${IS_DEFAULT_NODEGROUP_ROLE}" \
+    add_component_to_kustomization_as_list \
+      "${NODEGROUP_KUSTOMIZATION_NAME}" \
+      "${COMPONENT}" | \
+  rename_file_in_items \
+    "${TEMPLATE_MANIFEST_FILENAME}" \
+    "${MANIFEST_FILENAME}" | \
+  prepend_folder_path "${NODEGROUP_KUSTOMIZATION_NAME}/" | \
+  list2folder_cp_over \
+    "${TARGET_FOLDER}"
+}
+
+function scale_nodegroup() {
+  local NODEGROUP_NAME="$1"
+  local NODEGROUP_KUSTOMIZATION_NAME="$2"
+  local CLUSTER_NAME="$3"
+  local CLUSTER_TYPE="$4"
+  local NODE_COUNT="$5"
+  local PUBLIC_KEY_MGMT="${6:-"${PUBLIC_KEY_MGMT}"}"
+  local PUBLIC_KEY_NEW_CLUSTER="${7}"
+  local PRIVATE_KEY_NEW_CLUSTER="${8:-"${PRIVATE_KEY_NEW_CLUSTER}"}"
+  ## `FLEET_REPO_DIR` is the result of:
+  ## "{{inputs.parameters.fleet_mount_path}}/{{inputs.parameters.cloned_fleet_folder_name}}"
+  local FLEET_REPO_DIR="${9:-"${FLEET_REPO_DIR}"}"
+  local FLEET_REPO_URL="${10:-""}"
+  ## `SW_CATALOGS_REPO_DIR` is the result of:
+  ## "{{inputs.parameters.sw_catalogs_mount_path}}/{{inputs.parameters.cloned_sw_catalogs_folder_name}}"
+  local SW_CATALOGS_REPO_DIR="${11:-"${SW_CATALOGS_REPO_DIR}"}"
+  local SW_CATALOGS_REPO_URL="${12:-""}"
+  # Only change if absolutely needeed
+  local MGMT_PROJECT_NAME="${13:-"osm_admin"}"
+  local MGMT_CLUSTER_NAME="${14:-"_management"}"
+  local BASE_TEMPLATES_PATH="${15:-"cloud-resources"}"
+  local MANIFEST_FILENAME="${16:-"${NODEGROUP_NAME}"}"
+
+   # Is the provider type supported?
+  local VALID_PROVIDERS=("eks" "aks" "gke")
+  CLUSTER_TYPE="${CLUSTER_TYPE,,}"
+  [[ ! ($(echo ${VALID_PROVIDERS[@]} | grep -w "${CLUSTER_TYPE}")) ]] && return 1
+
+  # Determines the folder in Fleet
+  local TARGET_FOLDER="${FLEET_REPO_DIR}/${MGMT_PROJECT_NAME}/managed-resources/${MGMT_CLUSTER_NAME}/${CLUSTER_NAME}/${NODEGROUP_KUSTOMIZATION_NAME}"
+
+  # Pipeline of transformations to create the cluster resource
+  export NODEGROUP_KUSTOMIZATION_NAME
+  folder2list \
+    "${TARGET_FOLDER}" | \
+  patch_replace \
+    ".spec.postBuild.substitute.node_count" \
+    "${NODE_COUNT}" \
+    "| select(.kind == \"Kustomization\") | select(.metadata.name == \"${NODEGROUP_KUSTOMIZATION_NAME}\")" | \
+  list2folder_cp_over \
+    "${TARGET_FOLDER}"
+}
+
+# Delete nodegroup
+function delete_nodegroup() {
+  local NODEGROUP_KUSTOMIZATION_NAME="$1"
+  local CLUSTER_NAME="$2"
+  local PROJECT_NAME="${3:-"${MGMT_PROJECT_NAME}"}"
+  local FLEET_REPO_DIR="${4:-"${FLEET_REPO_DIR}"}"
+  local MGMT_RESOURCES_DIR="${5:-"${MGMT_RESOURCES_DIR}"}"
+
+  local NODEGROUP_DIR="${MGMT_RESOURCES_DIR}/${CLUSTER_NAME}/${NODEGROUP_KUSTOMIZATION_NAME}"
+
+  # Delete node Kustomizations
+  rm -rf "${NODEGROUP_DIR}"
+}
+
 # TODO: Deprecated
 # Create AKS cluster (without bootstrap)
 function create_cluster_aks() {