name: Workflow

on:
  pull_request:
    branches:
      - master
  push:
    branches:
      - master

# This ensures that previous jobs for the PR are canceled when the PR is
# updated.
concurrency:
  group: ${{ github.workflow }}-${{ github.head_ref }}
  cancel-in-progress: true

jobs:

  replication:

    name: Site Replication Test
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ubuntu-latest

    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]

    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      # To build minio image, we need to clone the repository first
      - name: clone https://github.com/minio/minio
        uses: actions/checkout@master
        with:

          # Repository name with owner. For example, actions/checkout
          # Default: ${{ github.repository }}
          repository: minio/minio
          
          # Relative path under $GITHUB_WORKSPACE to place the repository
          # To have two repositories under the same test
          path: 'minio_repository'

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        run: |
          echo "The idea is to build minio image from downloaded repository";
          cd $GITHUB_WORKSPACE/minio_repository;
          echo "Get git version to build MinIO Image";
          VERSION=`git rev-parse HEAD`;
          echo $VERSION;
          echo "Create minio image";
          make docker VERSION=$VERSION;
          echo "Jumping back to console repository to run the integration test"
          cd $GITHUB_WORKSPACE;
          echo "We are going to use the built image on test-integration";
          VERSION="minio/minio:$VERSION";
          echo $VERSION;
          make test-replication MINIO_VERSION=$VERSION;
      - uses: actions/cache@v2
        id: coverage-cache-replication
        name: Coverage Cache Replication
        with:
          path: |
            ./replication/coverage/
          key: ${{ runner.os }}-replication-coverage-2-${{ github.run_id }}

  sso-integration:

    name: SSO Integration Test
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ubuntu-latest

    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]

    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      # To build minio image, we need to clone the repository first
      - name: clone https://github.com/minio/minio
        uses: actions/checkout@master
        with:

          # Repository name with owner. For example, actions/checkout
          # Default: ${{ github.repository }}
          repository: minio/minio
          
          # Relative path under $GITHUB_WORKSPACE to place the repository
          # To have two repositories under the same test
          path: 'minio_repository'

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        run: |
          echo "The idea is to build minio image from downloaded repository";
          cd $GITHUB_WORKSPACE/minio_repository;
          echo "replace github.com/minio/console => ../" >> go.mod
          echo "Get git version to build MinIO Image";
          VERSION=`git rev-parse HEAD`;
          echo $VERSION;
          echo "Create minio image";
          make docker VERSION=$VERSION;
          echo "Jumping back to console repository to run the integration test"
          cd $GITHUB_WORKSPACE;
          echo "We are going to use the built image on test-integration";
          VERSION="minio/minio:$VERSION";
          echo $VERSION;
          make test-sso-integration MINIO_VERSION=$VERSION;
      - uses: actions/cache@v2
        id: coverage-cache-sso
        name: Coverage Cache SSO
        with:
          path: |
            ./sso-integration/coverage/
          key: ${{ runner.os }}-sso-coverage-2-${{ github.run_id }}

  c-operator-api-tests:

    name: Operator API Tests
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ubuntu-latest

    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]

    steps:

      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Operator API Tests
        run: |
          curl -sLO "https://dl.k8s.io/release/v1.23.1/bin/linux/amd64/kubectl" -o kubectl
          chmod +x kubectl
          mv kubectl /usr/local/bin
          "${GITHUB_WORKSPACE}/tests/deploy-tenant.sh"
          echo "start ---> make test-operator-integration";
          make test-operator-integration;

      - uses: actions/cache@v2
        id: coverage-cache-operator
        name: Coverage Cache Operator
        with:
          path: |
            ./operator-integration/coverage/
          key: ${{ runner.os }}-coverage-2-operator-${{ github.run_id }}

  lint-job:
    name: Checking Lint
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make verifiers

  vulnerable-dependencies-checks:
    name: "Check for vulnerable dependencies"
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Build on ${{ matrix.os }}
        continue-on-error: false
        if: matrix.os == 'ubuntu-latest'
        env:
          CGO_ENABLED: 0
          GO111MODULE: on
        run: |
          sudo apt install jq -y
          sudo sysctl net.ipv6.conf.all.disable_ipv6=0
          sudo sysctl net.ipv6.conf.default.disable_ipv6=0
          nancy_version=$(curl --retry 10 -Ls -o /dev/null -w "%{url_effective}" https://github.com/sonatype-nexus-community/nancy/releases/latest | sed "s/https:\/\/github.com\/sonatype-nexus-community\/nancy\/releases\/tag\///")
          curl -L -o nancy https://github.com/sonatype-nexus-community/nancy/releases/download/${nancy_version}/nancy-${nancy_version}-linux-amd64 && chmod +x nancy
          go list -deps -json ./... | jq -s 'unique_by(.Module.Path)|.[]|select(has("Module"))|.Module' | ./nancy sleuth

  semgrep-static-code-analysis:
    name: "semgrep checks"
    runs-on: ${{ matrix.os }}
    container:
      image: "returntocorp/semgrep"
    strategy:
      matrix:
        os: [ ubuntu-latest ]
    steps:
      - name: Check out source code
        uses: actions/checkout@v2
      - name: Scanning code on ${{ matrix.os }}
        continue-on-error: false
        run: |
          semgrep --config semgrep.yaml $(pwd)/portal-ui --error

  no-warnings-and-make-assets:
    name: "React Code Has No Warnings & is Prettified, then Make Assets"
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)

      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-

      - name: Install Dependencies
        working-directory: ./portal-ui
        continue-on-error: false
        run: |
          yarn install
      - name: Check for Warnings in build output
        working-directory: ./portal-ui
        continue-on-error: false
        run: |
          ./check-warnings.sh
      - name: Check if Files are Prettified
        working-directory: ./portal-ui
        continue-on-error: false
        run: |
          ./check-prettier.sh

  reuse-golang-dependencies:
    name: reuse golang dependencies
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          go mod download

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

  all-permissions-1:
    name: Permissions Tests Part 1
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)

      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console

      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)

      - name: Run TestCafe Tests
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-1/ --skip-js-errors -c 3'

      - name: Clean up users & policies
        run: |
          make cleanup-permissions

  all-permissions-2:
    name: Permissions Tests Part 2
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)

      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console

      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)

      - name: Run TestCafe Tests
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-2/ --skip-js-errors -c 3'

      - name: Clean up users & policies
        run: |
          make cleanup-permissions

  all-permissions-3:
    name: Permissions Tests Part 3
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)

      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console

      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)

      - name: Run TestCafe Tests
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-3/ --skip-js-errors -c 3'

      - name: Clean up users & policies
        run: |
          make cleanup-permissions


  all-permissions-4:
    name: Permissions Tests Part 4
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    timeout-minutes: 5
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go
      - name: Check out code into the Go module directory
        uses: actions/checkout@v2
      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}
      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-
      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}
      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console
      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)
      - name: Run TestCafe Tests
        timeout-minutes: 5
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-4/ --skip-js-errors'

  all-permissions-5:
    name: Permissions Tests Part 5
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go
      - name: Check out code into the Go module directory
        uses: actions/checkout@v2
      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}
      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-
      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}
      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console
      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)
      - name: Run TestCafe Tests
        timeout-minutes: 5
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-5/ --skip-js-errors'

  all-permissions-6:
    name: Permissions Tests Part 6
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go
      - name: Check out code into the Go module directory
        uses: actions/checkout@v2
      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}
      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-
      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}
      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console
      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)
      - name: Run TestCafe Tests
        timeout-minutes: 5
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-6/ --skip-js-errors'

  all-permissions-7:
    name: Permissions Tests Part 7
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go
      - name: Check out code into the Go module directory
        uses: actions/checkout@v2
      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}
      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-
      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}
      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console
      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)
      - name: Run TestCafe Tests
        timeout-minutes: 5
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-7/ --skip-js-errors'

  all-permissions-8:
    name: Permissions Tests Part 8
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go
      - name: Check out code into the Go module directory
        uses: actions/checkout@v2
      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)
      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}
      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"
      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-
      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-
      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}
      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console
      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)
      - name: Run TestCafe Tests
        timeout-minutes: 5
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-8/ --skip-js-errors'

  all-permissions-9:
    name: Permissions Tests Part 9
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)

      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
            ./portal-ui/build/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console

      - name: Start Console, front-end app and initialize users/policies
        run: |
          (./console server) & (make initialize-permissions)

      - name: Run TestCafe Tests
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/permissions-9/ --skip-js-errors -c 3'

      - name: Clean up users & policies
        run: |
          make cleanup-permissions

  all-operator-tests:
    name: Operator UI Tests
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Read .nvmrc
        id: node_version
        run: echo ::set-output name=NVMRC::$(cat .nvmrc)

      - uses: actions/setup-node@v2
        with:
          node-version: ${{ env.NVMRC }}

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Get yarn cache directory path
        id: yarn-cache-dir-path
        run: echo "::set-output name=dir::$(yarn cache dir)"

      - uses: actions/cache@v2
        id: yarn-cache
        name: Yarn Cache
        with:
          path: |
            ${{ steps.yarn-cache-dir-path.outputs.dir }}
            ./portal-ui/node_modules/
          key: ${{ runner.os }}-yarn-${{ hashFiles('./portal-ui/yarn.lock') }}
          restore-keys: |
            ${{ runner.os }}-yarn-

      - uses: actions/cache@v2
        id: assets-cache
        name: Assets Cache
        with:
          path: |
            ./portal-ui/build/
          key: ${{ runner.os }}-assets-${{ github.run_id }}
          restore-keys: |
            ${{ runner.os }}-assets-

      - name: Build Console on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console

      # Runs a set of commands using the runners shell
      - name: Start Kind for Operator UI
        run: |
          "${GITHUB_WORKSPACE}/portal-ui/tests/scripts/operator.sh"

      - name: Run TestCafe Tests
        uses: DevExpress/testcafe-action@latest
        with:
          args: '"chrome:headless" portal-ui/tests/operator/ --skip-js-errors -c 3'

  compile-job:
    name: Compiles on Go ${{ matrix.go-version }} and ${{ matrix.os }}
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make console

  cross-compile-1:
    name: Cross compile
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make crosscompile arg1="'linux/ppc64le linux/mips64'"

  cross-compile-2:
    name: Cross compile 2
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make crosscompile arg1="'linux/arm64 linux/s390x'"

  cross-compile-3:
    name: Cross compile 3
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make crosscompile arg1="'darwin/amd64 freebsd/amd64'"

  cross-compile-4:
    name: Cross compile 4
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make crosscompile arg1="'windows/amd64 linux/arm'"

  cross-compile-5:
    name: Cross compile 5
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make crosscompile arg1="'linux/386 netbsd/amd64'"

  test-pkg-on-go:
    name: Test Pkg on Go ${{ matrix.go-version }} and ${{ matrix.os }}
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make test-pkg

      - uses: actions/cache@v2
        id: coverage-cache-pkg
        name: Coverage Cache Pkg
        with:
          path: |
            ./pkg/coverage/
          key: ${{ runner.os }}-coverage-pkg-2-${{ github.run_id }}

  test-restapi-on-go:
    name: Test Restapi on Go ${{ matrix.go-version }} and ${{ matrix.os }}
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make test

      - uses: actions/cache@v2
        id: coverage-cache-restapi
        name: Coverage Cache RestAPI
        with:
          path: |
            ./restapi/coverage/
          key: ${{ runner.os }}-coverage-restapi-2-${{ github.run_id }}

  test-operatorapi-on-go:
    name: Test Operatorapi on Go ${{ matrix.go-version }} and ${{ matrix.os }}
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        env:
          GO111MODULE: on
          GOOS: linux
        run: |
          make test-unit-test-operator

      - uses: actions/cache@v2
        id: coverage-cache-unittest-operatorapi
        name: Coverage Cache unit test operatorAPI
        with:
          path: |
            ./operatorapi/coverage/
          key: ${{ runner.os }}-coverage-unittest-operatorapi-2-${{ github.run_id }}

  b-integration-tests:
    name: Integration Tests with Latest Distributed MinIO
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ubuntu-latest

    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]

    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go

      - name: Check out code into the Go module directory
        uses: actions/checkout@v2

      # To build minio image, we need to clone the repository first
      - name: clone https://github.com/minio/minio
        uses: actions/checkout@master
        with:

          # Repository name with owner. For example, actions/checkout
          # Default: ${{ github.repository }}
          repository: minio/minio
          
          # Relative path under $GITHUB_WORKSPACE to place the repository
          # To have two repositories under the same test
          path: 'minio_repository'

      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - name: Build on ${{ matrix.os }}
        run: |
          echo "The idea is to build minio image from downloaded repository";
          cd $GITHUB_WORKSPACE/minio_repository;
          echo "Get git version to build MinIO Image";
          VERSION=`git rev-parse HEAD`;
          echo $VERSION;
          echo "Create minio image";
          make docker VERSION=$VERSION;
          echo "Jumping back to console repository to run the integration test"
          cd $GITHUB_WORKSPACE;
          echo "We are going to use the built image on test-integration";
          VERSION="minio/minio:$VERSION";
          echo $VERSION;
          
          echo "Create bucket for replication with versioning"
          echo "Download mc for Ubuntu"
          wget -q https://dl.min.io/client/mc/release/linux-amd64/mc
          echo "Change the permissions to execute mc command"
          chmod +x mc
          echo "Create the folder to put the all.out file"
          TARGET_BUCKET=`echo $RANDOM | md5sum | head -c 20; echo;`
          echo "TARGET_BUCKET: ${TARGET_BUCKET}"
          echo "Only run our test if play is up and running..."
          PLAY_IS_ON=`wget --spider --server-response https://play.min.io:9443/login 2>&1 | grep '200\ OK' | wc -l`
          if [ $PLAY_IS_ON == 1 ]
          then
            echo "Play is up and running, we will proceed with the test"
          else
            echo "Play is down, please report it on hack channel"
            exit
          fi
          ./mc mb --ignore-existing play/${TARGET_BUCKET}/
          ./mc version enable play/${TARGET_BUCKET}
          # Via API we are going to test:
          # mc admin bucket remote add myminio/source https://minioadmin:minioadmin@play.min.io/target --service "replication"
          # expected output is: Remote ARN = `arn:minio:replication::f5bdb8d7-541d-415e-aaf4-592979484ba9:target`.
          
          make test-integration MINIO_VERSION=$VERSION TARGET_BUCKET=$TARGET_BUCKET;

      - uses: actions/cache@v2
        id: coverage-cache
        name: Coverage Cache
        with:
          path: |
            ./integration/coverage/
          key: ${{ runner.os }}-coverage-2-${{ github.run_id }}

  react-tests:
    name: React Tests
    needs:
      - lint-job
      - no-warnings-and-make-assets
      - reuse-golang-dependencies
      - vulnerable-dependencies-checks
      - semgrep-static-code-analysis
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install modules
        working-directory: ./portal-ui
        run: yarn
      - name: Run tests
        working-directory: ./portal-ui
        run: yarn test

  coverage:
    name: "Coverage Limit Check"
    needs:
      - b-integration-tests
      - test-restapi-on-go
      - test-operatorapi-on-go
      - c-operator-api-tests
      - test-pkg-on-go
      - sso-integration
      - replication
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        go-version: [ 1.18.x, 1.19.x ]
        os: [ ubuntu-latest ]
    steps:
      - name: Set up Go ${{ matrix.go-version }} on ${{ matrix.os }}
        uses: actions/setup-go@v2
        with:
          go-version: ${{ matrix.go-version }}
        id: go
      - name: Check out code into the Go module directory
        uses: actions/checkout@v2
      - name: Check out gocovmerge as a nested repository
        uses: actions/checkout@v2
        with:
          repository: wadey/gocovmerge
          path: gocovmerge
      - uses: actions/cache@v2
        name: Go Mod Cache
        with:
          path: |
            ~/.cache/go-build
            ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache
        name: Coverage Cache
        with:
          path: |
            ./integration/coverage/
          key: ${{ runner.os }}-coverage-2-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache-sso
        name: Coverage Cache SSO
        with:
          path: |
            ./sso-integration/coverage/
          key: ${{ runner.os }}-sso-coverage-2-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache-replication
        name: Coverage Cache Replication
        with:
          path: |
            ./replication/coverage/
          key: ${{ runner.os }}-replication-coverage-2-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache-operator
        name: Coverage Cache Operator
        with:
          path: |
            ./operator-integration/coverage/
          key: ${{ runner.os }}-coverage-2-operator-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache-restapi
        name: Coverage Cache RestAPI
        with:
          path: |
            ./restapi/coverage/
          key: ${{ runner.os }}-coverage-restapi-2-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache-unittest-operatorapi
        name: Coverage Cache unit test operatorAPI
        with:
          path: |
            ./operatorapi/coverage/
          key: ${{ runner.os }}-coverage-unittest-operatorapi-2-${{ github.run_id }}

      - uses: actions/cache@v2
        id: coverage-cache-pkg
        name: Coverage Cache Pkg
        with:
          path: |
            ./pkg/coverage/
          key: ${{ runner.os }}-coverage-pkg-2-${{ github.run_id }}

      - name: Get coverage
        run: |
          echo "change directory to gocovmerge"
          cd gocovmerge
          echo "download golang x tools"
          go mod download golang.org/x/tools
          echo "go mod tidy compat mode"
          go mod tidy -compat=1.17
          echo "go build gocoverage.go"
          go build gocovmerge.go
          echo "put together the outs for final coverage resolution"
          ./gocovmerge ../integration/coverage/system.out ../replication/coverage/replication.out ../sso-integration/coverage/sso-system.out ../restapi/coverage/coverage.out ../pkg/coverage/coverage-pkg.out ../operator-integration/coverage/operator-api.out ../operatorapi/coverage/coverage-unit-test-operatorapi.out > all.out
          echo "Download mc for Ubuntu"
          wget -q https://dl.min.io/client/mc/release/linux-amd64/mc
          echo "Change the permissions to execute mc command"
          chmod +x mc
          echo "Only run our test if play is up and running since we require it for replication tests here."
          PLAY_IS_ON=`wget --spider --server-response https://play.min.io:9443/login 2>&1 | grep '200\ OK' | wc -l`
          if [ $PLAY_IS_ON == 1 ]
          then
            echo "Play is up and running, we will proceed with the play part for coverage"
            echo "Create the folder to put the all.out file"
            ./mc mb --ignore-existing play/builds/
            echo "Copy the all.out file to play bucket"
            echo ${{ github.repository }}
            echo ${{ github.event.number }}
            echo ${{ github.run_id }}
            # mc cp can fail due to lack of space: mc: <ERROR> Failed to copy `all.out`.
            # Storage backend has reached its minimum free disk threshold. Please delete a few objects to proceed.
            ./mc cp all.out play/builds/${{ github.repository }}/${{ github.event.number }}/${{ github.run_id }}/ || true
            ./mc cp all.out play/builds/${{ github.repository }}/${{ github.event.number }}/latest/ || true
            go tool cover -html=all.out -o coverage.html
            ./mc cp coverage.html play/builds/${{ github.repository }}/${{ github.event.number }}/${{ github.run_id }}/ || true
            ./mc cp coverage.html play/builds/${{ github.repository }}/${{ github.event.number }}/latest/ || true
          else
            echo "Play is down, please report it on hack channel, no coverage is going to be uploaded!!!"
          fi
          echo "grep to obtain the result"
          go tool cover -func=all.out | grep total > tmp2
          result=`cat tmp2 | awk 'END {print $3}'`
          result=${result%\%}
          threshold=53.40
          echo "Result:"
          echo "$result%"
          if (( $(echo "$result >= $threshold" |bc -l) )); then
            echo "It is equal or greater than threshold ($threshold%), passed!"
          else
            echo "It is smaller than threshold ($threshold%) value, failed!"
            exit 1
          fi
