# Copyright (c) 2021 Cisco and/or its affiliates.
# 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.

---
# Global macros.

#### PARAMETERS
# Keep 'parameter' entries ordered alphabetically, please.
- parameter:
    name: arch-parameter
    parameters:
      - string:
          name: ARCH
          default: '{arch}'
          description: "Architecture parameter"

- parameter:
    name: archive-artifacts-parameter
    parameters:
      - string:
          name: ARCHIVE_ARTIFACTS
          default: '{artifacts}'
          description: "Artifacts to archive on the log server."

- parameter:
    name: compiler-parameter
    parameters:
      - string:
          name: CC
          default: '{cc}'
          description: "CC parameter, can be gnu or clang"

- parameter:
    name: make-parallel-jobs-parameter
    parameters:
      - string:
          name: MAKE_PARALLEL_JOBS
          default: '{make-parallel-jobs}'
          description: "The number of cores to use for builds."

- parameter:
    name: make-test-os-parameter
    parameters:
      - string:
          name: MAKE_TEST_OS
          default: '{make-test-os}'
          description: "The OS on which 'make test' is run."

- parameter:
    name: csit-fail-on-crc-mismatch-parameter
    parameters:
      - string:
          name: FDIO_CSIT_FAIL_ON_CRC_MISMATCH
          default: '{fail-on-crc-mismatch}'
          description: "If true, CRC is checked, else compatibility is tested."

- parameter:
    name: csit-perf-trial-duration-parameter
    parameters:
      - string:
          name: CSIT_PERF_TRIAL_DURATION
          default: "{csit-perf-trial-duration}"
          description: "Duration of a trial measurement in BMRR tests."

- parameter:
    name: csit-perf-trial-multiplicity-parameter
    parameters:
      - string:
          name: CSIT_PERF_TRIAL_MULTIPLICITY
          default: "{csit-perf-trial-multiplicity}"
          description: "Number of subsamples for BMRR tests."

- parameter:
    name: gerrit-csit-refspec-parameter
    parameters:
      - string:
          name: CSIT_REF
          default: ''
          # yamllint disable-line rule:line-length
          description: "GERRIT_REFSPEC parameter to override separately cloned CSIT repository, leave empty for autodetection / no override."

- parameter:
    name: gerrit-event-comment-text-parameter
    parameters:
      - string:
          name: GERRIT_EVENT_COMMENT_TEXT
          default: ''
          # yamllint disable-line rule:line-length
          description: "GERRIT_EVENT_COMMENT_TEXT parameter not given by trigger"

- parameter:
    name: gerrit-event-type-parameter
    parameters:
      - string:
          name: GERRIT_EVENT_TYPE
          default: ''
          description: "GERRIT_EVENT_TYPE parameter not given by trigger"

- parameter:
    name: gerrit-parameter
    parameters:
      - string:
          name: GERRIT_BRANCH
          default: '{branch}'
          description: "JJB configured GERRIT_BRANCH parameter"

- parameter:
    name: gerrit-project-parameter
    parameters:
      - string:
          name: GERRIT_PROJECT
          default: '{project}'
          description: "GERRIT_PROJECT parameter if not given by trigger"

- parameter:
    name: gerrit-refspec-parameter
    parameters:
      - string:
          name: GERRIT_REFSPEC
          default: '{refspec}'
          description: "GERRIT_REFSPEC parameter not given by trigger"

- parameter:
    name: is-csit-vpp-job-parameter
    parameters:
      - string:
          name: IS_CSIT_VPP_JOB
          default: '{is-csit-vpp-job}'
          description: "Parameter is True if this is a CSIT vpp job."

- parameter:
    name: maven-exec
    parameters:
      - string:
          name: MVN
          # yamllint disable-line rule:line-length
          default: '/w/tools/hudson.tasks.Maven_MavenInstallation/{maven-version}/bin/mvn'
          description: 'Maven selector to be used by shell scripts'

- parameter:
    name: maven-project-parameter
    parameters:
      - string:
          name: MAVEN_SELECTOR
          default: '{maven}'
          description: 'Maven selector to be used by shell scripts'

- parameter:
    name: mode-parameter
    parameters:
      - string:
          name: MODE
          default: '{mode}'
          description: "mode parameter to be used in shell scripts."

- parameter:
    name: os-parameter
    parameters:
      - string:
          name: OS
          default: '{os}'
          description: "OS parameter"

- parameter:
    name: project-parameter
    parameters:
      - string:
          name: PROJECT
          default: '{project}'
          # yamllint disable-line rule:line-length
          description: "JJB configured PROJECT parameter to identify a Gerrit project"

- parameter:
    name: repo-name-parameter
    parameters:
      - string:
          name: REPO_NAME
          default: '{repo-name}'
          description: 'Name of repo to which to publish packaging'

- parameter:
    name: stream-parameter
    parameters:
      - string:
          name: STREAM
          default: '{stream}'
          description: "Stream job parameter to be used in shell scripts."

- parameter:
    name: topo-parameter
    parameters:
      - string:
          name: TOPO
          default: '{topo}'
          description: "Topology parameter"
# [end] Keep 'parameter' entries ordered alphabetically, please.

#### SCMS
# Keep 'scm' entries ordered alphabetically, please.
- scm:
    name: gerrit-trigger-scm
    scm:
      - git:
          credentials-id: '{credentials-id}'
          url: '$GIT_BASE'
          refspec: '{refspec}'
          branches:
            - 'origin/$GERRIT_BRANCH'
          skip-tag: true
          choosing-strategy: '{choosing-strategy}'

- scm:
    name: gerrit-trigger-scm-recursive
    scm:
      - git:
          credentials-id: '{credentials-id}'
          url: '$GIT_BASE'
          refspec: '{refspec}'
          branches:
            - 'origin/$GERRIT_BRANCH'
          skip-tag: true
          choosing-strategy: '{choosing-strategy}'
          submodule:
            recursive: '{submodule-recursive}'

- scm:
    name: git-scm
    scm:
      - git:
          credentials-id: '{credentials-id}'
          url: '$GIT_BASE'
          refspec: ''
          branches:
            - 'origin/{branch}'
          skip-tag: true
          wipe-workspace: true
# [end] Keep 'scm' entries ordered alphabetically, please.

#### WRAPPERS
# Keep 'wrapper' entries ordered alphabetically, please.
- wrapper:
    name: build-timeout
    wrappers:
      - timeout:
          type: absolute
          timeout: 360
          fail: true

- wrapper:
    # This wrapper is required for all jobs as it configures the wrappers
    # needed by the fd.io infra.
    name: fdio-infra-wrappers
    wrappers:
      - timeout:
          type: absolute
          timeout: '{build-timeout}'
          timeout-var: 'BUILD_TIMEOUT'
          fail: true
      - timestamps
      - ssh-agent-credentials:
          users:
            - 'jenkins-gerrit-credentials'
      - jclouds:
          single-use: true
      - openstack:
          single-use: true

- wrapper:
    # This wrapper is used for all jobs that require no-activity timeouts
    name: fdio-infra-wrappers-non-activity-timeout
    wrappers:
      - timeout:
          type: no-activity
          timeout: '{build-timeout}'
          fail: true
      - timestamps
      - ssh-agent-credentials:
          users:
            - 'jenkins-gerrit-credentials'
      - jclouds:
          single-use: true
      - openstack:
          single-use: true
# [end] Keep 'wrapper' entries ordered alphabetically, please.

#### TRIGGERS
# Keep 'trigger' entries ordered alphabetically, please.
- trigger:
    name: gerrit-trigger-checkstyle
    # Comes from VPP, some verify jobs wait for checkstyle to pass.
    # This macro is to be used for such verify jobs which are voting.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'checkstyle_success'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'

- trigger:
    name: gerrit-trigger-checkstyle-nonvoting
    # Comes from VPP, some verify jobs wait for checkstyle to pass.
    # This macro is to be used for such verify jobs which are non-voting.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'checkstyle_success'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: true
            failed: true
            unstable: true
            notbuilt: true
          override-votes: true
          gerrit-build-successful-verified-value: 1
          gerrit-build-failed-verified-value: 1
          gerrit-build-unstable-verified-value: 1
          gerrit-build-notbuilt-verified-value: 1

- trigger:
    name: gerrit-trigger-csit-perftest
    # Manual trigger common for csit-vpp and vpp-csit perf jobs.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: '{trigger-word}'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: '{skip-vote}'
            failed: '{skip-vote}'
            unstable: '{skip-vote}'
            notbuilt: '{skip-vote}'

- trigger:
    name: gerrit-trigger-csit-vpp-devicetest-full
    # Comes from CSIT, for automatic jobs running device tests with VPP builds.
    # The job acts as an automatic verify job for CSIT contributions.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            # The main way the job is triggered automatically on patch upload.
            # Gated by tox job, so we do not spend resources on WiP changes.
            - comment-added-contains-event:
                comment-contains-value: 'tox_success'
            # Manual trigger to allow testing WiP changes with selected tags.
            - comment-added-contains-event:
                comment-contains-value: 'csit-devicetest'
            # A comment with "recheck" restarts tox job, so no condition here.
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: '{skip-vote}'
            failed: '{skip-vote}'
            unstable: '{skip-vote}'
            notbuilt: '{skip-vote}'

- trigger:
    name: gerrit-trigger-csit-vpp-devicetest-manual
    # Comes from CSIT, for manual jobs running "device" tests with VPP builds.
    # The job acts as a manual (optional) verify job for CSIT contributions.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'csit-devicetest'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{project}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: '{skip-vote}'
            failed: '{skip-vote}'
            unstable: '{skip-vote}'
            notbuilt: '{skip-vote}'

- trigger:
    name: gerrit-trigger-manually-triggered
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: '{comment-trigger-value}'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'

- trigger:
    name: gerrit-trigger-patch-merged
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - change-merged-event
            - comment-added-contains-event:
                comment-contains-value: 'remerge'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          # Force Jenkins always vote the values it should already have voted
          # during the prior verify phase
          override-votes: true
          gerrit-build-started-verified-value: 1
          gerrit-build-successful-verified-value: 1
          gerrit-build-failed-verified-value: 1
          gerrit-build-unstable-verified-value: 1
          gerrit-build-notbuilt-verified-value: 1
          gerrit-build-started-codereview-value: 0
          gerrit-build-successful-codereview-value: 0
          gerrit-build-failed-codereview-value: 0
          gerrit-build-unstable-codereview-value: 0
          gerrit-build-notbuilt-codereview-value: 0

- trigger:
    name: gerrit-trigger-patch-submitted
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - patchset-created-event:
                exclude-drafts: 'true'
                exclude-trivial-rebase: 'false'
                exclude-no-code-change: 'false'
            - draft-published-event
            - comment-added-contains-event:
                comment-contains-value: 'recheck'
            - comment-added-contains-event:
                comment-contains-value: 'reverify'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'

- trigger:
    name: gerrit-trigger-os-patch-merged
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'os-merge'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          # Force Jenkins always vote the values it should already have voted
          # during the prior verify phase
          override-votes: true
          gerrit-build-started-verified-value: 1
          gerrit-build-successful-verified-value: 1
          gerrit-build-failed-verified-value: 1
          gerrit-build-unstable-verified-value: 1
          gerrit-build-notbuilt-verified-value: 1
          gerrit-build-started-codereview-value: 0
          gerrit-build-successful-codereview-value: 0
          gerrit-build-failed-codereview-value: 0
          gerrit-build-unstable-codereview-value: 0
          gerrit-build-notbuilt-codereview-value: 0

- trigger:
    name: gerrit-trigger-os-trivial-patch-submitted
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'os-check'
            - comment-added-contains-event:
                comment-contains-value: 'os-verify'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'

- trigger:
    name: gerrit-trigger-trivial-patch-submitted
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - patchset-created-event:
                exclude-drafts: 'true'
                exclude-trivial-rebase: 'false'
                exclude-no-code-change: 'true'
            - draft-published-event
            - comment-added-contains-event:
                comment-contains-value: 'recheck'
            - comment-added-contains-event:
                comment-contains-value: 'reverify'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'

- trigger:
    name: gerrit-trigger-trivial-patch-submitted-skip-vote
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - patchset-created-event:
                exclude-drafts: 'true'
                exclude-trivial-rebase: 'false'
                exclude-no-code-change: 'true'
            - draft-published-event
            - comment-added-contains-event:
                comment-contains-value: 'recheck'
            - comment-added-contains-event:
                comment-contains-value: 'reverify'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: true
            failed: true
            unstable: true
            notbuilt: true

- trigger:
    name: gerrit-trigger-vpp-csit-devicetest-full
    # Comes from VPP, for automated jobs running "device" tests with CSIT code.
    # The job acts as an automatic verify job for VPP contributions.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'checkstyle_success'
            - comment-added-contains-event:
                comment-contains-value: 'devicetest'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: '{skip-vote}'
            failed: '{skip-vote}'
            unstable: '{skip-vote}'
            notbuilt: '{skip-vote}'

- trigger:
    name: gerrit-trigger-vpp-csit-devicetest-manual
    # Comes from VPP, for manual jobs running "device" tests with CSIT code.
    # The job acts as a manual (optional) verify job for VPP contributions.
    triggers:
      - gerrit:
          server-name: 'Primary'
          trigger-on:
            - comment-added-contains-event:
                comment-contains-value: 'devicetest'
          projects:
            - project-compare-type: 'ANT'
              project-pattern: '{name}'
              branches:
                - branch-compare-type: 'ANT'
                  branch-pattern: '**/{branch}'
          skip-vote:
            successful: '{skip-vote}'
            failed: '{skip-vote}'
            unstable: '{skip-vote}'
            notbuilt: '{skip-vote}'
# [end] Keep 'trigger' entries ordered alphabetically, please.

#### PUBLISHERS
# Keep 'publisher' entries ordered alphabetically, please.
- publisher:
    name: archive-artifacts
    publishers:
      - archive:
          artifacts: '{artifacts}'
          allow-empty: true
          fingerprint: true
          latest-only: true

- publisher:
    name: email-notification
    publishers:
      - email-ext:
          recipients: 'nobody@projectrotterdam.info'
          reply-to: ''
          content-type: default
          # yamllint disable-line rule:line-length
          subject: '{email-prefix} $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!'
          body: |
              $PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS:

              Check console output at $BUILD_URL to view the results.
          unstable: true
          fixed: true
          send-to:
            - developers
            - recipients

- publisher:
    name: fdio-infra-publish
    # macro to finish up a build.
    #
    # Handles the following:
    #   - Shipping logs to Nexus or S3 logs repository
    #   - Cleanup workspace
    publishers:
      - postbuildscript:
          builders:
            - role: BOTH
              build-on:
                - ABORTED
                - FAILURE
                - NOT_BUILT
                - SUCCESS
                - UNSTABLE
              build-steps:
                - shell: !include-raw: scripts/post_build_executor_info.sh
                - shell: !include-raw: scripts/post_build_deploy_archives.sh
                - fdio-infra-ship-backup-logs
                - fdio-infra-ship-logs
          mark-unstable-if-failed: true
      - workspace-cleanup:
          exclude:
            # Do not clean up *.jenkins-trigger files for jobs that use a
            # properties file as input for triggering another build.
            - "**/*.jenkins-trigger"
          fail-build: false

- publisher:
    name: jacoco-report
    publishers:
      - jacoco:
          exec-pattern: '**/**.exec'
          class-pattern: '**/classes'
          source-pattern: '**/src/main/java'
          # yamllint disable-line rule:line-length
          exclusion-pattern: '**/gen**,**/generated-sources/**,**/yang-gen**,**/pax/**'
          status-update: true
          targets:
            - branch:
              healthy: 10
              unhealthy: 20
            - method:
              healthy: 50
              unhealthy: 40

- publisher:
    name: retry-build-on-builder-error
    publishers:
      - naginator:
          max-failed-builds: 1

- publisher:
    name: robot-report
    publishers:
      - robot:
          output-path: '{output-path}'
          other-files: ''
# [end] Keep 'publisher' entries ordered alphabetically, please.

#### BUILDERS
# Keep 'builder' entries ordered alphabetically, please.
- builder:
    name: ci-management-check-unicode
    builders:
      - shell: |
          $WORKSPACE/scripts/check-unicode.sh jjb/

- property:
    name: fdio-infra-properties
    properties:
      - build-discarder:
          days-to-keep: '{build-days-to-keep}'
          num-to-keep: '{build-num-to-keep}'

- builder:
    name: fdio-infra-ship-backup-logs
    builders:
      - config-file-provider:
          files:
            - file-id: "jenkins-s3-log-ship"
              variable: $HOME/.aws/credentials
      - shell: !include-raw:
          - scripts/logs_publish.sh
      - shell: !include-raw:
          - ../global-jjb/shell/logs-clear-credentials.sh

- builder:
    name: fdio-infra-ship-logs
    builders:
      # Ensure no pre-existing .netrc files are overriding logs config
      - lf-provide-maven-settings-cleanup
      - config-file-provider:
          files:
            - file-id: "jenkins-log-archives-settings"
              variable: "SETTINGS_FILE"
      - conditional-step:
          condition-kind: regex-match
          regex: "^.*logs-s3.*"
          label: $S3_BUCKET
          on-evaluation-failure: dont-run
          steps:
            - config-file-provider:
                files:
                  - file-id: "jenkins-s3-log-ship"
                    target: $HOME/.aws/credentials
      - lf-infra-create-netrc:
          server-id: logs
      - shell: !include-raw:
          - ../global-jjb/shell/logs-deploy.sh
      - shell: !include-raw:
          - ../global-jjb/shell/logs-clear-credentials.sh
      - description-setter:
          regexp: "(^Nexus build logs: .*)"

- builder:
    name: packer-validate
    builders:
      - config-file-provider:
          files:
            - file-id: 'packer-cloud-env'
              variable: 'CLOUDENV'
      # yamllint disable rule:line-length
      - shell: |
          #!/bin/bash
          cd packer
          varfiles="../packer/vars/*"
          templates="../packer/templates/*"
          provision="../packer/provision/*.sh"
          for v in $varfiles; do
              [[ "${v##*/}" =~ ^(cloud-env.*)$ ]] && continue
              for t in $templates; do
                  export PACKER_LOG="yes" && \
                  export PACKER_LOG_PATH="packer-validate-${v##*/}-${t##*/}.log" && \
                              packer.io validate -var-file=$CLOUDENV \
                              -var-file=$v $t
                  if [ $? -ne 0 ]; then
                     break
                  fi
              done
          done
          for p in $provision; do
              /bin/bash -n $p > provision-validate-${p##*/}.log 2>&1
              if [ $? -ne 0 ]; then
                 break
              fi
          done
      # yamllint enable

- builder:
    name: packer-build
    builders:
      - config-file-provider:
          files:
            - file-id: 'packer-cloud-env'
              variable: 'CLOUDENV'
      - shell: |
          #!/bin/bash
          cd packer
          export PACKER_LOG="yes" && \
          export PACKER_LOG_PATH="packer-build.log" && \
                      packer.io build -var-file=$CLOUDENV \
                      -var-file=../packer/vars/{platform}.json \
                      ../packer/templates/{template}.json

- builder:
    name: provide-maven-settings
    builders:
      - config-file-provider:
          files:
            - file-id: '{global-settings-file}'
              variable: 'GLOBAL_SETTINGS_FILE'
            - file-id: '{settings-file}'
              variable: 'SETTINGS_FILE'
# [end] Keep 'builder' entries ordered alphabetically, please.