# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.


#Action used to trigger a failed check re-run within a PR using a comment. Add this action to your workflow with an if condition 
#to check if the comment is present 
#If the check is failed this will trigger it again. If its not failed a new instance of workflow will run which will not show in the status box or checks tab in the PR and can be found in the actions tab https://github.com/apache/beam/actions

name: "Setup Kuberenetes Access"
description: Sets up kuberenetes access in gcp for the current workflow
inputs:
  cluster_name:
    description: "Name of the cluster to be created"
    required: true
    default: "io-datastores"
  k8s_namespace:
    description: "Name of the namespace to be created"
    required: true
  cluster_zone:
    description: "Zone of the cluster to be created"
    required: true
    default: "us-central1-a"
  remove_finalizer:
    description: "Remove finalizers from the cluster"
    required: false
    default: ""

runs:
  using: composite
  steps:
  - name: Check if inputs were provided
    shell: bash
    run: | 
      if [ -z "${{ inputs.k8s_namespace }}" ]; then
        echo "Kubernetes namespace not provided"
        exit 1
      fi
  - name: replace '_' with '-' in namespace
    shell: bash
    id: replace_namespace
    run: |
      TEST_NAMESPACE=$(echo "${{ inputs.k8s_namespace }}" | tr '_' '-' | tr '[:upper:]' '[:lower:]')
      echo TEST_NAMESPACE=$TEST_NAMESPACE >> $GITHUB_OUTPUT
  - name: Get the kubeconfig using gcloud
    shell: bash
    run: |
      gcloud container clusters get-credentials ${{ inputs.cluster_name }} --zone ${{ inputs.cluster_zone }} --project apache-beam-testing
  - name: Create namespace
    shell: bash
    run: | 
      kubectl create namespace ${{ steps.replace_namespace.outputs.TEST_NAMESPACE }}
  - name: Set default namespace
    shell: bash
    run: |
      kubectl config set-context --current --namespace=${{ steps.replace_namespace.outputs.TEST_NAMESPACE }}
  - name: Post cleanup
    uses: pyTooling/Actions/with-post-step@v4.2.2
    with:
      main: echo "Post Cleanup"
      post: |
        echo "Post Cleanup"
        if [ -n "${{ inputs.remove_finalizer }}" ]; then
          kubectl patch ${{ inputs.remove_finalizer }} -p '[{"op": "remove", "path": "/metadata/finalizers"}]' --type=json
        fi
        kubectl delete namespace ${{ steps.replace_namespace.outputs.TEST_NAMESPACE }}
