#
# 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 github_access with context %}
---

resources:
- name: once-a-day
  type: time
  source:
    interval: 24h
- name: geode-ci
  type: git
  source:
    depth: 1
    uri: https://github.com/apache/geode.git
    branch: ((geode-build-branch))
    paths:
    - ci/*
    {{ github_access() | indent(4) }}
- name: docker-geode-build-image
  type: docker-image
  source:
    username: ((docker-username))
    password: ((docker-password))
    repository: gcr.io/((gcp-project))/metric-tools
    tag: latest


{%- macro metrics_job(job_name) %}
- name: Geode{{job_name}}Metrics
  serial: true
  public: true
  plan:
  - aggregate:
    - get: docker-geode-build-image
    - get: geode-ci
    - get: once-a-day
      trigger: true
  - task: get_metrics
    image: docker-geode-build-image
    config:
      inputs:
      - name: geode-ci
      outputs:
      - name: workspace
      platform: linux
      run:
        path: /usr/bin/python3
        args:
        - geode-ci/ci/bin/concourse_job_performance.py
        - ((concourse-url))
        - ((pipeline-prefix))main
        - {{job_name}}
        - 50

{%- endmacro %}

jobs:
{{- metrics_job('Build') }}
  {%- for test in (tests) if not test.name=="StressNew" -%}
    {%- for java_test_version in (java_test_versions) %}
{{ metrics_job(test.name+'Test'+java_test_version.name) }}
    {%- endfor -%}
  {%- endfor -%}
