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

#@ load("templates.lib.yml",
#@      "github_resource",
#@      "gci_resource",
#@      "registry_image_resource",
#@      "bash_task",
#@      "build_job_name",
#@      "packer_job",
#@      "packer_job_name",
#@      "docker_job",
#@      "docker_job_name",
#@      "package_resource",
#@      "package_resource_name",
#@      "put_package",
#@      "version_source_job",
#@      "version_source_job_name")
#@ load("templates.lib.txt",
#@       "extract_geode_bash_task")
#@ load("@ytt:data", "data")
#@ load("@ytt:overlay", "overlay")

#@overlay/match by=overlay.all
---
resources:
  #@overlay/append
  - #@ registry_image_resource("packer-image", "hashicorp/packer")
  #@overlay/append
  - #@ github_resource("packer-source", data.values.github.owner, data.values.github.repository, data.values.repository.branch, ["packer/*"])

  #@ for build in data.values.builds:
  #@overlay/append
  - #@ gci_resource(build.source_image_family)
  #@ for config in data.values.configs:
  #@ for package in build.packages:
  #@overlay/append
  - #@ package_resource(build, config , package)
  #@ end
  #@ end
  #@ end
  #@overlay/append
  - name: github-pre-release
    type: github-release
    source:
      owner: #@ data.values.github.owner
      repository: #@ data.values.github.repository
      access_token: ((github-pr-access-token))
      release: false
      pre_release: true
    icon: github

#@overlay/match-child-defaults missing_ok=True
jobs:
  #@overlay/append
  - #@ version_source_job()
  #@overlay/append
  - #@ docker_job("task-image", "ci-source", "ci/docker/task")
  #@overlay/append
  - #@ docker_job("clang-tools-image", "ci-source", "ci/docker/clang-tools")

  #@ for build in data.values.builds:
  #@overlay/append
  - #@ packer_job(build)
  #@ for config in data.values.configs:
  #@overlay/match by="name"
  - name: #@ build_job_name(build, config)
    plan:
      #@overlay/match by=overlay.index(0)
      - in_parallel:
          steps:
            - #@overlay/match by=overlay.subset({"get": "version"})
              passed: [ version-source ]
            - #@overlay/match by=overlay.subset({"get": "source"})
              passed: [ version-source ]
      #@overlay/append
      - #@ put_package(build, config)
  #@ end
  #@ end
  #@overlay/match by="name"
  - name: check-source
    plan:
      #@overlay/match by=overlay.index(0)
      - in_parallel:
          steps:
            - #@overlay/match by=overlay.subset({"get": "version"})
              passed: [ version-source ]
            - #@overlay/match by=overlay.subset({"get": "source"})
              passed: [ version-source ]

  #@overlay/append
  - name: native-passed
    plan:
      - in_parallel:
          fail_fast: true
          steps:
            - get: version
              passed:
                #@ for build in data.values.builds:
                #@ for config in data.values.configs:
                - #@ build_job_name(build, config)
                #@ end
                #@ end
                - check-source
              trigger: true
            - get: source
              passed:
                #@ for build in data.values.builds:
                #@ for config in data.values.configs:
                - #@ build_job_name(build, config)
                #@ end
                #@ end
                - check-source
              trigger: true
            #@ for build in data.values.builds:
            #@ for config in data.values.configs:
            #@ for package in build.packages:
            - get: #@ package_resource_name(build, config, package)
              passed:
                - #@ build_job_name(build, config)
              trigger: true
            #@ end
            #@ end
            #@ end
            - do:
              - get: task-image
              - get: geode-latest
              - #@ bash_task("extract-geode", [{"name":"geode-latest"}], [{"name":"geode"}], extract_geode_bash_task(), caches=[{"path":"geode"}])

  #@overlay/append
  - name: github-pre-release
    plan:
      - in_parallel:
          fail_fast: true
          steps:
            - get: version
              passed:
                - native-passed
              trigger: true
            - get: source
              passed:
                - native-passed
              trigger: true
            #@ for build in data.values.builds:
            #@ for config in data.values.configs:
            #@ for package in build.packages:
            - get: #@ package_resource_name(build, config, package)
              passed:
                - native-passed
              trigger: true
            #@ end
            #@ end
            #@ end
      - put: github-pre-release
        params:
          commitish: source/.git/ref
          name: version/version
          tag: version/version
          tag_prefix: pre-release/v
          globs:
            - "package-*-release-*/apache-geode-native-*"

  #@overlay/append
  - name: bump-minor-version
    plan:
      - put: version
        params:
          bump: minor
          pre: #@ data.values.pipeline.pre

#@overlay/match-child-defaults missing_ok=True
groups:
  #@overlay/match by="name"
  - name: images
    jobs:
      #@ for/end build in data.values.builds:
      - #@ packer_job_name(build)
      - #@ docker_job_name("task-image")
      - #@ docker_job_name("clang-tools-image")
  #@overlay/match by="name"
  - name: all
    jobs:
      #@ for build in data.values.builds:
      #@overlay/append
      - #@ packer_job_name(build)
      #@ end
      #@overlay/append
      - #@ docker_job_name("task-image")
      #@overlay/append
      - #@ docker_job_name("clang-tools-image")
      #@overlay/append
      - #@ version_source_job_name()
      #@overlay/append
      - bump-minor-version
      #@overlay/append
      - github-pre-release
      #@overlay/append
      - native-passed
  #@overlay/match by="name"
  - name: version
    jobs:
      - #@ version_source_job_name()
      - bump-minor-version
