# Releng macros
#
# NOTE: make sure macros are listed in execution ordered.
#
# 1. parameters/properties
# 2. scm
# 3. triggers
# 4. wrappers
# 5. prebuilders (maven only, configured like Builders)
# 6. builders (maven, freestyle, matrix, etc..)
# 7. postbuilders (maven only, configured like Builders)
# 8. publishers/reporters/notifications

- parameter:
    name: project-parameter
    parameters:
        - string:
            name: PROJECT
            default: '{project}'
            description: "JJB configured PROJECT parameter to identify an opnfv Gerrit project"
        - string:
            name: GS_BASE
            default: artifacts.opnfv.org/$PROJECT
            description: "URL to Google Storage."
        - string:
            name: GS_BASE_PROXY
            default: build.opnfv.org/artifacts.opnfv.org/$PROJECT
            description: "URL to Google Storage proxy"
        - string:
            name: BRANCH
            default: '{branch}'
            description: "JJB configured BRANCH parameter (e.g. master, stable/danube)"
        - string:
            name: GERRIT_BRANCH
            default: '{branch}'
            description: "JJB configured GERRIT_BRANCH parameter (deprecated)"

- property:
    name: logrotate-default
    properties:
        - build-discarder:
            days-to-keep: 60
            num-to-keep: 200
            artifact-days-to-keep: 60
            artifact-num-to-keep: 200

- scm:
    name: git-scm
    scm:
        - git: &git-scm-defaults
            credentials-id: '$SSH_CREDENTIAL_ID'
            url: '$GIT_BASE'
            branches:
                - 'origin/$BRANCH'
            timeout: 15

- scm:
    name: git-scm-gerrit
    scm:
        - git:
            choosing-strategy: 'gerrit'
            refspec: '$GERRIT_REFSPEC'
            <<: *git-scm-defaults
- scm:
    name: git-scm-with-submodules
    scm:
        - git:
            credentials-id: '$SSH_CREDENTIAL_ID'
            url: '$GIT_BASE'
            refspec: ''
            branches:
                - 'refs/heads/{branch}'
            skip-tag: true
            wipe-workspace: true
            submodule:
                recursive: true
                timeout: 20
- trigger:
    name: 'daily-trigger-disabled'
    triggers:
        - timed: ''

- trigger:
    name: 'weekly-trigger-disabled'
    triggers:
        - timed: ''

- trigger:
    name: gerrit-trigger-patchset-created
    triggers:
        - gerrit:
            server-name: 'gerrit.opnfv.org'
            trigger-on:
                - patchset-created-event:
                    exclude-drafts: 'false'
                    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: '{project}'
                branches:
                  - branch-compare-type: 'ANT'
                    branch-pattern: '**/{branch}'
                file-paths:
                  - compare-type: 'ANT'
                    pattern: '{files}'
            skip-vote:
                successful: false
                failed: false
                unstable: false
                notbuilt: false

- trigger:
    name: gerrit-trigger-change-merged
    triggers:
        - gerrit:
            server-name: 'gerrit.opnfv.org'
            trigger-on:
                - change-merged-event
                - comment-added-contains-event:
                    comment-contains-value: 'remerge'
            projects:
              - project-compare-type: 'ANT'
                project-pattern: '{project}'
                branches:
                  - branch-compare-type: 'ANT'
                    branch-pattern: '**/{branch}'
                file-paths:
                  - compare-type: 'ANT'
                    pattern: '{files}'

- trigger:
    name: 'experimental'
    triggers:
        - gerrit:
            server-name: 'gerrit.opnfv.org'
            trigger-on:
                - comment-added-contains-event:
                    comment-contains-value: 'check-experimental'
            projects:
                - project-compare-type: 'ANT'
                  project-pattern: '{project}'
                  branches:
                      - branch-compare-type: 'ANT'
                        branch-pattern: '**/{branch}'
                  file-paths:
                      - compare-type: 'ANT'
                        pattern: 'tests/**'
            skip-vote:
                successful: true
                failed: true
                unstable: true
                notbuilt: true

- wrapper:
    name: ssh-agent-wrapper
    wrappers:
        - ssh-agent-credentials:
            users:
                - 'd42411ac011ad6f3dd2e1fa34eaa5d87f910eb2e'

- wrapper:
    name: fix-workspace-permissions
    wrappers:
        - pre-scm-buildstep:
          - shell: |
                #!/bin/bash
                sudo chown -R $USER:$USER $WORKSPACE || exit 1

- builder:
    name: build-html-and-pdf-docs-output
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/
            git clone ssh://gerrit.opnfv.org:29418/opnfvdocs docs_build/_opnfvdocs
            GERRIT_COMMENT=gerrit_comment.txt ./docs_build/_opnfvdocs/scripts/docs-build.sh

- builder:
    name: upload-under-review-docs-to-opnfv-artifacts
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/

            [[ $GERRIT_CHANGE_NUMBER =~ .+ ]]
            [[ -d docs_output ]] || exit 0

            echo
            echo "###########################"
            echo "UPLOADING DOCS UNDER REVIEW"
            echo "###########################"
            echo

            gs_base="artifacts.opnfv.org/$PROJECT/review"
            gs_path="$gs_base/$GERRIT_CHANGE_NUMBER"
            local_path="upload/$GERRIT_CHANGE_NUMBER"

            mkdir -p upload
            mv docs_output "$local_path"
            gsutil -m cp -r "$local_path" "gs://$gs_base"

            gsutil -m setmeta \
                -h "Content-Type:text/html" \
                -h "Cache-Control:private, max-age=0, no-transform" \
                "gs://$gs_path"/**.html > /dev/null 2>&1

            echo "Document link(s):" >> gerrit_comment.txt
            find "$local_path" | grep -e 'index.html$' -e 'pdf$' | \
                sed -e "s|^$local_path|    http://$gs_path|" >> gerrit_comment.txt

- builder:
    name: upload-generated-docs-to-opnfv-artifacts
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/

            [[ -d docs_output ]] || exit 0

            echo
            echo "########################"
            echo "UPLOADING GENERATED DOCS"
            echo "########################"
            echo

            echo "gs_path="$GS_URL/docs""
            echo "local_path="upload/docs""

            gs_path="$GS_URL/docs"
            local_path="upload/docs"

            mkdir -p upload
            mv docs_output "$local_path"
            ls "$local_path"

            echo "gsutil -m cp -r "$local_path"/* "gs://$gs_path""
            gsutil -m cp -r "$local_path"/* "gs://$gs_path"

            gsutil -m setmeta \
                -h "Content-Type:text/html" \
                -h "Cache-Control:private, max-age=0, no-transform" \
                "gs://$gs_path"/**.html > /dev/null 2>&1

            echo "Document link(s):" >> gerrit_comment.txt
            find "$local_path" | grep -e 'index.html$' -e 'pdf$' | \
                sed -e "s|^$local_path|    http://$gs_path|" >> gerrit_comment.txt

- builder:
    name: report-docs-build-result-to-gerrit
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/
            if [[ -e gerrit_comment.txt ]] ; then
                echo
                echo "posting review comment to gerrit..."
                echo
                cat gerrit_comment.txt
                echo
                ssh -p 29418 gerrit.opnfv.org \
                    "gerrit review -p $GERRIT_PROJECT \
                     -m '$(cat gerrit_comment.txt)' \
                     $GERRIT_PATCHSET_REVISION \
                     --notify NONE"
            fi

- builder:
    name: remove-old-docs-from-opnfv-artifacts
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/

            [[ $GERRIT_CHANGE_NUMBER =~ .+ ]]

            gs_path="artifacts.opnfv.org/$PROJECT/review/$GERRIT_CHANGE_NUMBER"

            if gsutil ls "gs://$gs_path" > /dev/null 2>&1 ; then
                echo
                echo "Deleting Out-of-dated Documents..."
                gsutil -m rm -r "gs://$gs_path"
            fi
            gs_path="artifacts.opnfv.org/review/$GERRIT_CHANGE_NUMBER"

            if gsutil ls "gs://$gs_path" > /dev/null 2>&1 ; then
                echo
                echo "Deleting Out-of-dated Documents..."
                gsutil -m rm -r "gs://$gs_path"
            fi

- builder:
    name: build-and-upload-artifacts-json-api
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            export PATH=$PATH:/usr/local/bin/

            virtualenv -p python2.7 $WORKSPACE/releng_artifacts
            source $WORKSPACE/releng_artifacts/bin/activate

            # install python packages
            pip install google-api-python-client

            # generate and upload index file
            echo "Generating Artifacts API ..."
            python $WORKSPACE/utils/opnfv-artifacts.py > index.json
            gsutil cp index.json gs://artifacts.opnfv.org/index.json

            deactivate

- builder:
    name: lint-python-code
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/

            virtualenv -p python2.7 $WORKSPACE/releng_flake8
            source $WORKSPACE/releng_flake8/bin/activate

            # install python packages
            pip install "flake8==2.6.2"

            # generate and upload lint log
            echo "Running flake8 code on $PROJECT ..."

            # Get number of flake8 violations. If none, this will be an
            # empty string: ""
            FLAKE_COUNT="$(find . \
                -path './releng_flake8' -prune -o \
                -path './.tox' -prune -o \
                -type f -name "*.py" -print | \
                xargs flake8 --exit-zero -qq --count 2>&1)"

            # Ensure we start with a clean environment
            rm -f lint.log

            if [ ! -z $FLAKE_COUNT ]; then
              echo "Flake8 Violations: $FLAKE_COUNT" > lint.log
              find . \
                  -path './releng_flake8' -prune -o \
                  -path './.tox' -prune -o \
                  -type f -name "*.py" -print | \
                  xargs flake8 --exit-zero --first >> violation.log
              SHOWN=$(wc -l violation.log | cut -d' ' -f1)
              echo -e "First $SHOWN shown\n---" >> lint.log
              cat violation.log >> lint.log
              sed -r -i '4,$s/^/ /g' lint.log
              rm violation.log
            fi

            deactivate

- builder:
    name: report-lint-result-to-gerrit
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/

            # If no violations were found, no lint log will exist.
            if [[ -e lint.log ]] ; then
                echo -e "\nposting linting report to gerrit...\n"

                cat lint.log
                echo

                ssh -p 29418 gerrit.opnfv.org \
                    "gerrit review -p $GERRIT_PROJECT \
                     -m \"$(cat lint.log)\" \
                     $GERRIT_PATCHSET_REVISION \
                     --notify NONE"

                exit 1
            fi

- builder:
    name: upload-review-docs
    builders:
        - build-html-and-pdf-docs-output
        - upload-under-review-docs-to-opnfv-artifacts
        - report-docs-build-result-to-gerrit

- builder:
    name: upload-merged-docs
    builders:
        - build-html-and-pdf-docs-output
        - upload-generated-docs-to-opnfv-artifacts
        - report-docs-build-result-to-gerrit
        - remove-old-docs-from-opnfv-artifacts

- builder:
    name: check-bash-syntax
    builders:
        - shell: "find . -name '*.sh' | xargs bash -n"

- builder:
    name: lint-yaml-code
    builders:
        - shell: |
            #!/bin/bash
            set -o errexit
            set -o pipefail
            set -o xtrace
            export PATH=$PATH:/usr/local/bin/

            # install python packages
            pip install "yamllint==1.6.0"

            # generate and upload lint log
            echo "Running yaml code on $PROJECT ..."

            # Ensure we start with a clean environment
            rm -f yaml-violation.log lint.log

            # Get number of yaml violations. If none, this will be an
            # empty string: ""
            find . \
                -type f -name "*.yml" -print \
                -o -name "*.yaml" -print | \
                xargs yamllint > yaml-violation.log || true

            if [ -s "yaml-violation.log" ]; then
              SHOWN=$(cat yaml-violation.log| grep -v "^$" |wc -l)
              echo -e "First $SHOWN shown\n---" > lint.log
              cat yaml-violation.log >> lint.log
              sed -r -i '4,$s/^/ /g' lint.log
            fi

- builder:
    name: clean-workspace-log
    builders:
        - shell: |
            find $WORKSPACE -type f -name '*.log' | xargs rm -f

- publisher:
    name: archive-artifacts
    publishers:
        - archive:
            artifacts: '{artifacts}'
            allow-empty: true
            fingerprint: true
            latest-only: true

- publisher:
    name: publish-coverage
    publishers:
      - cobertura:
          report-file: "coverage.xml"
          only-stable: "true"
          health-auto-update: "false"
          stability-auto-update: "false"
          zoom-coverage-chart: "true"
          targets:
            - files:
                healthy: 10
                unhealthy: 20
                failing: 30
            - method:
                healthy: 50
                unhealthy: 40
                failing: 30