#
# 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.
#

{% from 'shared_jinja.yml' import alpine_tools_config with context %}
{% from 'shared_jinja.yml' import github_access with context %}
{% from 'shared_jinja.yml' import init_retry with context %}

{% macro common_instance_params(test) -%}
GCP_PROJECT: ((gcp-project))
CPUS: {{ test.CPUS }}
RAM: {{ test.RAM }}
{%- endmacro %}

{% macro common_test_params(test) -%}
  {%- if test.GRADLE_TASK_OPTIONS -%}
GRADLE_TASK_OPTIONS: {{ test.GRADLE_TASK_OPTIONS }}
  {%- endif %}
MAINTENANCE_VERSION: ((geode-build-branch ))
SERVICE_ACCOUNT: ((!concourse-gcp-account))
{%- endmacro %}

---

resource_types:
- name: maven-resource
  type: docker-image
  source:
    repository: nulldriver/maven-resource
    tag: latest
- name: concourse-metadata-resource
  type: docker-image
  source:
    password: ((!docker-password))
    repository: gcr.io/((gcp-project))/((pipeline-prefix))concourse-metadata-resource
    tag: latest
    username: ((!docker-username))

resources:
- name: geode-examples
  type: git
  source:
    uri: https://github.com/apache/geode-examples.git
    branch: {{ repository.branch }}
    depth: 10
- name: geode-ci
  type: git
  source:
    depth: 1
    uri: https://github.com/{{repository.fork}}/geode.git
    branch: {{ repository.branch }}
    paths:
    - ci/pipelines/geode-build/*
    - ci/scripts/*
- name: concourse-metadata-resource
  type: concourse-metadata-resource
  source: {}
- name: 24h
  type: time
  source: {interval: 24h}

jobs:
- name: {{examples_test.name}}
  public: true
  serial: true
  plan:
  - get: geode-ci
  - aggregate:
    - get: geode-examples
      trigger: true
    - get: 24h
      trigger: true
    - do:
      - put: concourse-metadata-resource
      {{ init_retry()|indent(6) }}
      - task: create_instance
        {{ alpine_tools_config()|indent(8) }}
          params:
            {{ common_instance_params(examples_test) | indent(12) }}
            GEODE_BRANCH: {{repository.branch}}
            GEODE_FORK: {{repository.fork}}
          run:
            path: geode-ci/ci/scripts/create_instance.sh
          inputs:
          - name: concourse-metadata-resource
          - name: geode-ci
          - name: attempts-log
            path: old
          outputs:
          - name: instance-data
          - name: attempts-log
            path: new
        timeout: 15m
        attempts: 10
      - task: rsync_code_up
        {{ alpine_tools_config()|indent(8) }}
          run:
            path: geode-ci/ci/scripts/rsync_code_up.sh
          inputs:
          - name: geode-ci
          - name: geode-examples
            path: geode
          - name: instance-data
        timeout: 5m
      - task: build
        {{ alpine_tools_config()|indent(8) }}
          params:
            JAVA_BUILD_VERSION: {{ java_build_version.version }}
            GRADLE_TASK: {{ examples_test.GRADLE_TASK }}
            {{ common_test_params(examples_test) | indent(12) }}
          run:
            path: geode-ci/ci/scripts/execute_build_examples.sh
          inputs:
          - name: geode-ci
          - name: geode-examples
            path: geode
          - name: instance-data
          outputs:
          - name: results
    ensure:
      do:
      - task: delete_instance
        {{ alpine_tools_config()|indent(8) }}
          run:
            path: geode-ci/ci/scripts/delete_instance.sh
          inputs:
          - name: geode-ci
          - name: instance-data
        timeout: 1h
