name: Clear EFS
description: Clears the EFS of the current PR's contents

runs:
  using: "composite"
  steps:
    - run: |
        echo "SUBNET_ID=$( \
          aws ec2 describe-subnets \
            --filters Name=tag:Name,Values=$SUBNET_NAME \
            --query 'Subnets[0].SubnetId' \
            --output text)" >> $GITHUB_ENV
        echo "SG_ID=$( \
          aws ec2 describe-security-groups \
            --filters Name=group-name,Values=$SG_NAME \
            --query 'SecurityGroups[0].GroupId' \
            --output text)" >> $GITHUB_ENV
        echo "TASK_EXECUTION_ROLE_ARN=$( \
          aws iam get-role \
            --role-name ganderTaskExecutionRole \
            --query 'Role.Arn' \
            --output text)" >> $GITHUB_ENV
        echo "FS_ID=$( \
          aws efs describe-file-systems \
            --query "FileSystems[?Tags[?Key=='Name' && Value=='$FS_NAME']] | [0].FileSystemId" \
            --output text)" >> $GITHUB_ENV
      shell: bash
    - run: |
        DATA_ACCESS_POINT=$(aws efs describe-access-points \
        --query "AccessPoints[?ClientToken=='$PROJECT-$PR_NUMBER-data'] | [0].AccessPointId" \
        --output text)
        aws efs delete-access-point --access-point-id $DATA_ACCESS_POINT

        SEED_ACCESS_POINT=$(aws efs describe-access-points \
        --query "AccessPoints[?ClientToken=='$PROJECT-$PR_NUMBER-seed'] | [0].AccessPointId" \
        --output text)
        aws efs delete-access-point --access-point-id $SEED_ACCESS_POINT

      shell: bash

    - run: |
        echo "Building the deleter image..."
        DELETER_IMAGE=$ECR_REGISTRY/$ECR_REPO:$PROJECT-deleter-$PR_NUMBER
        echo $DELETER_IMAGE

        cat << SCRIPT > ./deleter-script.sh
        #!/bin/sh
        echo 'before delete, heres the root:'
        ls /efs-file-transfer/
        sleep 1
        echo 'contents of the current pr folder:'
        ls ./efs-file-transfer/$PROJECT-$PR_NUMBER
        sleep 1
        echo 'contents of the data folder:'
        ls ./efs-file-transfer/$PROJECT-$PR_NUMBER/data
        sleep 1
        echo 'contents of the seed folder:'
        ls ./efs-file-transfer/$PROJECT-$PR_NUMBER/seed
        sleep 1
        rm -rf /efs-file-transfer/$PROJECT-$PR_NUMBER
        echo 'after delete, heres the root:'
        ls /efs-file-transfer/
        sleep 1
        echo 'try to list files in /$PROJECT-$PR_NUMBER:'
        ls ./efs-file-transfer/$PROJECT-$PR_NUMBER
        sleep 1
        echo There should be an error above, No such file or directory
        SCRIPT

        docker build -t $DELETER_IMAGE -f- . <<DOCKERFILE
        FROM alpine:3.13
        RUN mkdir /efs-file-transfer
        COPY ./deleter-script.sh /startup.sh
        RUN chmod +x /startup.sh
        ENTRYPOINT ["/startup.sh"]
        DOCKERFILE

        docker push $DELETER_IMAGE
        echo "DELETER_IMAGE=$DELETER_IMAGE" >> $GITHUB_ENV
      shell: bash

    - run: |
        cat << TASKDEF > ./delete-task.json
        {
          "family": "$PROJECT-$PR_NUMBER-delete",
          "networkMode": "awsvpc",
          "executionRoleArn": "$TASK_EXECUTION_ROLE_ARN",
          "containerDefinitions": [
            {
              "name": "db-setup",
              "image": "$DELETER_IMAGE",
              "mountPoints": [
                {
                  "sourceVolume": "sql-delete",
                  "containerPath": "/efs-file-transfer"
                }
              ],
              "logConfiguration": {
                "logDriver": "awslogs",
                "options": {
                  "awslogs-create-group": "true",
                  "awslogs-region": "$REGION",
                  "awslogs-group": "gander-logs-$PROJECT-$PR_NUMBER-delete",
                  "awslogs-stream-prefix": "$PROJECT-$PR_NUMBER"
                }
              },
              "memory": 512,
              "cpu": 256
            }
          ],
          "volumes": [
            {
              "name": "sql-delete",
              "efsVolumeConfiguration": {
                "fileSystemId": "$FS_ID",
                "rootDirectory": "/"
              }
            }
          ],
          "requiresCompatibilities": ["FARGATE"],
          "cpu": "256",
          "memory": "512"
        }
        TASKDEF
      shell: bash
    - run: |
        echo "Registering Task Definition"

        echo "DELETE_TASK_DEF=$(aws ecs register-task-definition \
        --family $PROJECT-delete-$PR_NUMBER \
        --cli-input-json file://delete-task.json \
        --tags key=GanderApps,value=four_eyes \
        --query 'join(`:`,taskDefinition.[family,to_string(revision)])' \
        --output text)" >> $GITHUB_ENV
      shell: bash

    - run: |
        echo "Launching Delete Task"
        echo "DELETE_TASK=$(aws ecs run-task \
          --cluster $PROJECT \
          --task-definition $DELETE_TASK_DEF \
          --tags key=GanderApps,value=four_eyes \
          --count 1 \
          --launch-type "FARGATE" \
          --network-configuration "awsvpcConfiguration={ \
              subnets=[$SUBNET_ID], \
              securityGroups=[$SG_ID], \
              assignPublicIp=ENABLED \
            }" \
          --query 'tasks[0].taskArn' \
          --output text)" >> $GITHUB_ENV

      shell: bash
    - run: |
        echo "Awaiting task to finish..."

        aws ecs wait tasks-stopped --cluster $PROJECT \
        --tasks $DELETE_TASK

        echo "Task is finished!"

      shell: bash
    - run: |
        aws ecs deregister-task-definition \
          --task-definition $DELETE_TASK_DEF \
          --query 'taskDefinition.taskDefinitionArn'
      shell: bash
    - run: |
        ECR_DELETE_IMAGE_TAG=$PROJECT-deleter-$PR_NUMBER

        aws ecr batch-delete-image \
        --repository-name $ECR_REPO \
        --image-ids imageTag=$ECR_DELETE_IMAGE_TAG \
        --query 'imageIds[*].imageTag'
      shell: bash
