# docs: https://docs.gitlab.com/ee/user/infrastructure/iac/terraform_state.html#get-started-using-gitlab-ci

image: busybox:latest

variables:
  TF_ROOT_ELASTIC: ${CI_PROJECT_DIR}/manifests/elastic
  TF_ROOT_GKE: ${CI_PROJECT_DIR}/manifests/gke
  GCLOUD_ROOT_PSC: ${CI_PROJECT_DIR}/manifests/psc

cache:
  - key: elastic
    paths:
      - ${TF_ROOT_ELASTIC}/.terraform
  - key: gke
    paths:
      - ${TF_ROOT_GKE}/.terraform

check-gke:
  stage: test
  tags:
    - docker
  image:
    name: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
    entrypoint: [""]
  variables:
    TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/gke
    TF_VAR_ec_apikey: $EC_API_KEY
    TF_VAR_project_id: $GCP_PROJECT_ID
    TF_VAR_region: $GCP_REGION
    TF_VAR_vpc_network_name: $GCP_NETWORK_NAME
    TF_VAR_vpc_subnetwork_name: $GCP_SUBNETWORK_NAME
    GCP_SA_GITLAB: $GCP_SA_GITLAB
  script: |-
    cd $TF_ROOT_GKE
    echo $GCP_SA_GITLAB > gcp-sa.json
    gitlab-terraform init 
    gitlab-terraform validate
    gitlab-terraform fmt -check
    gitlab-terraform plan
    gitlab-terraform plan-json
  artifacts:
    name: plan
    paths:
      - ${TF_ROOT_GKE}/plan.cache
    reports:
      terraform: ${TF_ROOT_GKE}/plan.json

apply-gke:
  stage: deploy
  needs:
    - check-gke
  tags:
    - docker
  image:
    name: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
    entrypoint: [""]
  variables:
    TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/gke
    TF_VAR_ec_apikey: $EC_API_KEY
    TF_VAR_project_id: $GCP_PROJECT_ID
    TF_VAR_region: $GCP_REGION
    TF_VAR_vpc_network_name: $GCP_NETWORK_NAME
    TF_VAR_vpc_subnetwork_name: $GCP_SUBNETWORK_NAME
    GCP_SA_GITLAB: $GCP_SA_GITLAB
  script: |-
    cd $TF_ROOT_GKE
    echo $GCP_SA_GITLAB > gcp-sa.json
    gitlab-terraform init 
    gitlab-terraform apply -auto-approve

gcloud-psc:
  stage: deploy
  needs:
    - apply-gke
  tags:
    - docker
  image:
    name: google/cloud-sdk:slim
    entrypoint: [""]
  variables:
    GCP_PROJECT_ID: $GCP_PROJECT_ID
    GCP_SA_GITLAB: $GCP_SA_GITLAB
    GCP_REGION: $GCP_REGION
    GCP_NETWORK_NAME: $GCP_NETWORK_NAME
    GCP_SUBNETWORK_NAME: $GCP_SUBNETWORK_NAME
    GCP_INTERNAL_IP_NAME: $GCP_INTERNAL_IP_NAME
    GCP_PSC_NAME: $GCP_PSC_NAME
    GCP_DNS_ZONE_GKE_ELASTIC: $GCP_DNS_ZONE_GKE_ELASTIC
    ELASTIC_SERVICE_ATTACHMENT_URI: $ELASTIC_SERVICE_ATTACHMENT_URI
    ELASTIC_DNS_ZONE: $ELASTIC_DNS_ZONE
  script: |-
    echo $GCP_SA_GITLAB > gcp-sa.json
    gcloud auth activate-service-account --key-file gcp-sa.json
    echo "Activate Service Account: OK"
    gcloud config set project $GCP_PROJECT_ID
    echo "Set Project: OK"
    cd $GCLOUD_ROOT_PSC
    chmod +x ./setting-psc.sh
    ./setting-psc.sh
  artifacts:
    paths:
      - ${CI_PROJECT_DIR}/pscConnectionId.env

check-elastic:
  stage: deploy
  tags:
    - docker
  needs:
    - gcloud-psc
  image:
    name: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
    entrypoint: [""]
  variables:
    TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/elastic
    TF_VAR_ec_apikey: $EC_API_KEY
  script: |-
    export TF_VAR_psc_connection_id=$(cat ${CI_PROJECT_DIR}/pscConnectionId.env | grep GCP_PSC_CONNECTION_ID | cut -d = -f2)
    cd $TF_ROOT_ELASTIC
    gitlab-terraform init 
    gitlab-terraform validate
    gitlab-terraform fmt -check
    gitlab-terraform plan
    gitlab-terraform plan-json
  artifacts:
    name: plan
    paths:
      - ${TF_ROOT_ELASTIC}/plan.cache
    reports:
      terraform: ${TF_ROOT_ELASTIC}/plan.json

apply-elastic:
  stage: deploy
  needs:
    - check-elastic
  tags:
    - docker
  image:
    name: registry.gitlab.com/gitlab-org/terraform-images/stable:latest
    entrypoint: [""]
  variables:
    TF_ADDRESS: ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/terraform/state/elastic
    TF_VAR_ec_apikey: $EC_API_KEY
  script: |-
    export TF_VAR_psc_connection_id=$(cat ${CI_PROJECT_DIR}/pscConnectionId.env | grep GCP_PSC_CONNECTION_ID | cut -d = -f2)
    cd $TF_ROOT_ELASTIC
    gitlab-terraform init 
    gitlab-terraform apply -auto-approve