# Copyright 2019 Google LLC
#
# Licensed 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.

steps:
- id: 'compile web app'
  name: 'gcr.io/cloud-builders/npm'
  dir: 'web'
  args: ['install']
  waitFor: ['-']

- id: 'web app unit tests'
  name: 'gcr.io/cloud-builders/npm'
  dir: 'web'
  args: ['test']
  waitFor: ['compile web app']

- id: 'build web'
  name: 'gcr.io/cloud-builders/docker'
  args: [
    'build',
    '--tag=web', 
    '--tag=gcr.io/$PROJECT_ID/web',
    '--cache-from', 'gcr.io/$PROJECT_ID/web:latest',
    'web/.',
  ]
  waitFor: ['web app unit tests'] # start immediately

- id: 'build db'
  name: 'gcr.io/cloud-builders/docker'
  args: [
    'build',
    '--tag=mysql',
    '--tag=gcr.io/$PROJECT_ID/mysql',
    '--cache-from', 'gcr.io/$PROJECT_ID/mysql:latest',
    'mysql/.',
  ]
  env:
  - "MYSQL_ROOT_PASSWORD=password"
  waitFor: ['-'] # start immediately

- id: 'make namespace'
  name: 'gcr.io/cloud-builders/kubectl'
  args: ['create','namespace','test-$BUILD_ID']
  waitFor: ['-'] # start immediately

- id: 'push web'
  name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/web']
  waitFor: ['build web']

- id: 'push db'
  name: 'gcr.io/cloud-builders/docker'
  args: ['push', 'gcr.io/$PROJECT_ID/mysql']
  waitFor: ['build db']

- id: 'patch k8s config'
  name: 'gcr.io/cloud-builders/gcloud'
  entrypoint: 'bash'
  args: ['-c','find k8s -type f | xargs sed -i "s/PROJECT_ID/$PROJECT_ID/g"']
  waitFor: ['-']

- id: 'deploy to staging'
  name: 'gcr.io/cloud-builders/kubectl'
  args: ['apply', '-f', 'k8s/', '--namespace=test-$BUILD_ID'] 
  waitFor: ['push web','push db','patch k8s config']

- id: 'get endpoint'
  name: 'gcr.io/cloud-builders/kubectl'
  entrypoint: 'bash'
  args: 
  - '-c'
  - |
    # determine which node port the service was exposed on
    get_nodeport() {
      kubectl get service cookieshop-web --namespace=test-$BUILD_ID -o=jsonpath='{.spec.ports[0].nodePort}' 
    }

    until [[ -n "$(get_nodeport)" ]]; do
        echo "querying for nodeport"
        sleep 3
    done

    echo "$(get_nodeport)" > _nodeport # save port for use in next step

    # grab the public IP of a random node
    # (why do this instead of a load balancer? b/c it's faster to instantiate)
    # (and doesn't require additional billable resources)
    # (we can reasonably expect the node to be durable enough to last until the test completes)
    get_nodeip() {
      kubectl get nodes --output jsonpath='{.items[0].status.addresses[?(@.type=="ExternalIP")].address}'
    }

    until [[ -n "$(get_nodeip)" ]]; do
        echo "querying for nodeip"
        sleep 3
    done

    echo $(get_nodeip) > _nodeip # save ip for use in next step

  waitFor: ['deploy to staging']

- id: 'integration tests'
  name: 'gcr.io/cloud-builders/curl'
  entrypoint: '/bin/bash'
  args: 
  - '-c'
  - |
    ### -r = retries; -i = interval; -k = keyword to search for ###
    ./test/test-connection.sh -r 20 -i 3 -u http://$(cat _nodeip):$(cat _nodeport)
    ./test/test-content.sh -r 20 -i 3 -u http://$(cat _nodeip):$(cat _nodeport) -k 'Chocolate Chip'
  waitFor: ['get endpoint']

- id: 'delete namespace'
  name: 'gcr.io/cloud-builders/kubectl'
  args: ['delete', 'namespaces', 'test-$BUILD_ID']
  waitFor: ['integration tests']

options:
  env:
    # location/name of GKE cluster (used by all kubectl commands)
    - CLOUDSDK_COMPUTE_ZONE=us-central1-a
    - CLOUDSDK_CONTAINER_CLUSTER=staging
