name: StackExchange/dnscontrol/build
on:
  pull_request:

env:
  cache-key: 1639697695 #Change to force cache reset `pwsh > Get-Date -UFormat %s`
  go-mod-path: /go/pkg/mod

jobs:
  build:
    runs-on: ubuntu-latest
    container:
      image: golang:1.20
    env:
      TEST_RESULTS: "/tmp/test-results"
    steps:
    - uses: actions/checkout@v3.5.0
    - name: restore_cache
      uses: actions/cache@v3.3.1
      with:
        key: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
        restore-keys: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
        path: ${{ env.go-mod-path }}
    - name: Install goreleaser
      run: go install github.com/goreleaser/goreleaser@latest
    - run: mkdir -p "$TEST_RESULTS"
    - name: Run unit tests
      run: |
        go install gotest.tools/gotestsum@latest
        gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- $PACKAGE_NAMES
    - name: Enforce Go Formatted Code
      run: "[ `go fmt ./... | wc -l` -eq 0 ]"
    - uses: actions/upload-artifact@v3.1.2
      with:
        path: "/tmp/test-results"

# For some reason goreleaser isn't correctly setting the version
# string used by "dnscontrol version".  Therefore, we're forcing the
# string using the GORELEASER_CURRENT_TAG feature.
# TODO(tlim): Use the native gorelease version mechanism.
    - name: Retrieve version
      id: version
      run: |
        echo "TAG_NAME=$(git config --global --add safe.directory /__w/dnscontrol/dnscontrol ; git describe)" >> $GITHUB_OUTPUT
    - name: Reveal version
      run: echo ${{ steps.version.outputs.TAG_NAME }}

    - name: Build binaries (if tagged)
      if: github.ref_type == 'tag'
      run: goreleaser build
      env:
        GORELEASER_CURRENT_TAG: ${{ steps.version.outputs.TAG_NAME }}
    - name: Build binaries (not tagged)
      if: github.ref_type != 'tag'
      run: goreleaser build --snapshot
      env:
        GORELEASER_CURRENT_TAG: ${{ steps.version.outputs.TAG_NAME }}
  integration-test-providers:
    needs: build
    runs-on: ubuntu-latest
    outputs:
      integration_test_providers: ${{ steps.get_integration_test_providers.outputs.integration_test_providers }}
    steps:
    - name: Set Integration Test Providers
      id: get_integration_test_providers
      shell: pwsh
      run: |
        $Providers = @()
        $EnvContext = ConvertFrom-Json -InputObject $env:ENV_CONTEXT
        $VarsContext = ConvertFrom-Json -InputObject $env:VARS_CONTEXT
        $SecretsContext = ConvertFrom-Json -InputObject $env:SECRETS_CONTEXT
        ConvertFrom-Json -InputObject $env:PROVIDERS | ForEach-Object {
          if(($null -ne $EnvContext."$($_)_DOMAIN") -or ($null -ne $VarsContext."$($_)_DOMAIN") -or ($null -ne $SecretsContext."$($_)_DOMAIN")) {
            $Providers += $_
          }
        }
        Write-Host "Integration test providers: $Providers"
        echo "integration_test_providers=$(ConvertTo-Json -InputObject $Providers -Compress)" >> $env:GITHUB_OUTPUT
      env:
        PROVIDERS: "['AZURE_DNS','BIND','CLOUDFLAREAPI','CLOUDNS','DIGITALOCEAN','GANDI_V5','GCLOUD','HEDNS','HEXONET','INWX','NAMEDOTCOM','NS1','POWERDNS','ROUTE53','TRANSIP']"
        ENV_CONTEXT: ${{ toJson(env) }}
        VARS_CONTEXT: ${{ toJson(vars) }}
        SECRETS_CONTEXT: ${{ toJson(secrets) }}
  integrtests-diff1:
    if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/main'
    needs: integration-test-providers
    runs-on: ubuntu-latest
    container:
      image: golang:1.20
      env:
        TEST_RESULTS: "/tmp/test-results"
        GOTESTSUM_FORMAT: testname

        # These providers will be tested if the env variable is set.
        # Set it to the domain name to use during the test.
        AZURE_DNS_DOMAIN: ${{ vars.AZURE_DNS_DOMAIN }}
        BIND_DOMAIN: ${{ vars.BIND_DOMAIN }}
        CLOUDFLAREAPI_DOMAIN: ${{ vars.CLOUDFLAREAPI_DOMAIN }}
        CLOUDNS_DOMAIN: ${{ vars.CLOUDNS_DOMAIN }}
        CSCGLOBAL_DOMAIN: ${{ vars.CSCGLOBAL_DOMAIN }}
        DIGITALOCEAN_DOMAIN: ${{ vars.DIGITALOCEAN_DOMAIN }}
        GANDI_V5_DOMAIN: ${{ vars.GANDI_V5_DOMAIN }}
        GCLOUD_DOMAIN: ${{ vars.GCLOUD_DOMAIN }}
        HEDNS_DOMAIN: ${{ vars.HEDNS_DOMAIN }}
        HEXONET_DOMAIN: ${{ vars.HEXONET_DOMAIN }}
        NAMEDOTCOM_DOMAIN: ${{ vars.NAMEDOTCOM_DOMAIN }}
        POWERDNS_DOMAIN: ${{ vars.POWERDNS_DOMAIN }}
        ROUTE53_DOMAIN: ${{ vars.ROUTE53_DOMAIN }}
        TRANSIP_DOMAIN: ${{ vars.TRANSIP_DOMAIN }}

        # The above providers have additional env variables they
        # need for credentials and such.

        AZURE_DNS_CLIENT_ID: ${{ secrets.AZURE_DNS_CLIENT_ID }}
        AZURE_DNS_CLIENT_SECRET: ${{ secrets.AZURE_DNS_CLIENT_SECRET }}
        AZURE_DNS_RESOURCE_GROUP: ${{ secrets.AZURE_DNS_RESOURCE_GROUP }}
        AZURE_DNS_SUBSCRIPTION_ID: ${{ secrets.AZURE_DNS_SUBSCRIPTION_ID }}
        AZURE_DNS_TENANT_ID: ${{ secrets.AZURE_DNS_TENANT_ID }}

        CLOUDFLAREAPI_ACCOUNTID: ${{ secrets.CLOUDFLAREAPI_ACCOUNTID }}
        CLOUDFLAREAPI_TOKEN: ${{ secrets.CLOUDFLAREAPI_TOKEN }}

        CLOUDNS_AUTH_ID: ${{ secrets.CLOUDNS_AUTH_ID }}
        CLOUDNS_AUTH_PASSWORD: ${{ secrets.CLOUDNS_AUTH_PASSWORD }}

        CSCGLOBAL_APIKEY: ${{ secrets.CSCGLOBAL_APIKEY }}
        CSCGLOBAL_USERTOKEN: ${{ secrets.CSCGLOBAL_USERTOKEN }}

        DIGITALOCEAN_TOKEN: ${{ secrets.DIGITALOCEAN_TOKEN }}

        GANDI_V5_APIKEY: ${{ secrets.GANDI_V5_APIKEY }}

        GCLOUD_EMAIL: ${{ secrets.GCLOUD_EMAIL }}
        GCLOUD_PRIVATEKEY: ${{ secrets.GCLOUD_PRIVATEKEY }}
        GCLOUD_PROJECT: ${{ secrets.GCLOUD_PROJECT }}
        GCLOUD_TYPE: ${{ secrets.GCLOUD_TYPE }}

        HEDNS_PASSWORD: ${{ secrets.HEDNS_PASSWORD }}
        HEDNS_TOTP_SECRET: ${{ secrets.HEDNS_TOTP_SECRET }}
        HEDNS_USERNAME: ${{ secrets.HEDNS_USERNAME }}

        HEXONET_ENTITY: ${{ secrets.HEXONET_ENTITY }}
        HEXONET_PW: ${{ secrets.HEXONET_PW }}
        HEXONET_UID: ${{ secrets.HEXONET_UID }}

        NAMEDOTCOM_KEY: ${{ secrets.NAMEDOTCOM_KEY }}
        NAMEDOTCOM_URL: ${{ secrets.NAMEDOTCOM_URL }}
        NAMEDOTCOM_USER: ${{ secrets.NAMEDOTCOM_USER }}

        POWERDNS_APIKEY: ${{ secrets.POWERDNS_APIKEY }}
        POWERDNS_APIURL: ${{ secrets.POWERDNS_APIURL }}
        POWERDNS_SERVERNAME: ${{ secrets.POWERDNS_SERVERNAME }}

        ROUTE53_KEY: ${{ secrets.ROUTE53_KEY }}
        ROUTE53_KEY_ID: ${{ secrets.ROUTE53_KEY_ID }}

        TRANSIP_ACCOUNT_NAME: ${{ secrets.TRANSIP_ACCOUNT_NAME }}
        TRANSIP_PRIVATE_KEY: ${{ secrets.TRANSIP_PRIVATE_KEY }}

    concurrency: ${{ matrix.provider }}
    strategy:
      fail-fast: false
      matrix:
        provider: ${{ fromJson(needs.integration-test-providers.outputs.integration_test_providers )}}
    steps:
    - uses: actions/checkout@v3.5.0
    - run: mkdir -p "$TEST_RESULTS"
    - name: restore_cache
      uses: actions/cache@v3.3.1
      with:
        key: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
        restore-keys: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
        path: ${{ env.go-mod-path }}
    - name: Run integration tests for ${{ matrix.provider }} provider
      run: |-
        if [ -z "$${{ matrix.provider }}_DOMAIN" ] ; then
          echo "Skip test for ${{ matrix.provider }} provider"
        else
          go install gotest.tools/gotestsum@latest
          gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- -timeout 30m -v -verbose -provider ${{ matrix.provider }} -cfworkers=false
        fi
      working-directory: integrationTest
    - uses: actions/upload-artifact@v3.1.2
      with:
        path: "/tmp/test-results"
  integrtests-diff2:
    if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/main'
    runs-on: ubuntu-latest
    container:
      image: golang:1.20
    needs:
    - integration-test-providers
    - integrtests-diff1
    env:
      TEST_RESULTS: "/tmp/test-results"
      GOTESTSUM_FORMAT: testname

      # These providers will be tested if the env variable is set.
      # Set it to the domain name to use during the test.
      AZURE_DNS_DOMAIN: ${{ vars.AZURE_DNS_DOMAIN }}
      BIND_DOMAIN: ${{ vars.BIND_DOMAIN }}
      CLOUDFLAREAPI_DOMAIN: ${{ vars.CLOUDFLAREAPI_DOMAIN }}
      CLOUDNS_DOMAIN: ${{ vars.CLOUDNS_DOMAIN }}
      CSCGLOBAL_DOMAIN: ${{ vars.CSCGLOBAL_DOMAIN }}
      DIGITALOCEAN_DOMAIN: ${{ vars.DIGITALOCEAN_DOMAIN }}
      GANDI_V5_DOMAIN: ${{ vars.GANDI_V5_DOMAIN }}
      GCLOUD_DOMAIN: ${{ vars.GCLOUD_DOMAIN }}
      HEDNS_DOMAIN: ${{ vars.HEDNS_DOMAIN }}
      HEXONET_DOMAIN: ${{ vars.HEXONET_DOMAIN }}
      NAMEDOTCOM_DOMAIN: ${{ vars.NAMEDOTCOM_DOMAIN }}
      POWERDNS_DOMAIN: ${{ vars.POWERDNS_DOMAIN }}
      ROUTE53_DOMAIN: ${{ vars.ROUTE53_DOMAIN }}
      TRANSIP_DOMAIN: ${{ vars.TRANSIP_DOMAIN }}

      # The above providers have additional env variables they
      # need for credentials and such.

      AZURE_DNS_CLIENT_ID: ${{ secrets.AZURE_DNS_CLIENT_ID }}
      AZURE_DNS_CLIENT_SECRET: ${{ secrets.AZURE_DNS_CLIENT_SECRET }}
      AZURE_DNS_RESOURCE_GROUP: ${{ secrets.AZURE_DNS_RESOURCE_GROUP }}
      AZURE_DNS_SUBSCRIPTION_ID: ${{ secrets.AZURE_DNS_SUBSCRIPTION_ID }}
      AZURE_DNS_TENANT_ID: ${{ secrets.AZURE_DNS_TENANT_ID }}

      CLOUDFLAREAPI_ACCOUNTID: ${{ secrets.CLOUDFLAREAPI_ACCOUNTID }}
      CLOUDFLAREAPI_TOKEN: ${{ secrets.CLOUDFLAREAPI_TOKEN }}

      CLOUDNS_AUTH_ID: ${{ secrets.CLOUDNS_AUTH_ID }}
      CLOUDNS_AUTH_PASSWORD: ${{ secrets.CLOUDNS_AUTH_PASSWORD }}

      CSCGLOBAL_APIKEY: ${{ secrets.CSCGLOBAL_APIKEY }}
      CSCGLOBAL_USERTOKEN: ${{ secrets.CSCGLOBAL_USERTOKEN }}

      DIGITALOCEAN_TOKEN: ${{ secrets.DIGITALOCEAN_TOKEN }}

      GANDI_V5_APIKEY: ${{ secrets.GANDI_V5_APIKEY }}

      GCLOUD_EMAIL: ${{ secrets.GCLOUD_EMAIL }}
      GCLOUD_PRIVATEKEY: ${{ secrets.GCLOUD_PRIVATEKEY }}
      GCLOUD_PROJECT: ${{ secrets.GCLOUD_PROJECT }}
      GCLOUD_TYPE: ${{ secrets.GCLOUD_TYPE }}

      HEDNS_PASSWORD: ${{ secrets.HEDNS_PASSWORD }}
      HEDNS_TOTP_SECRET: ${{ secrets.HEDNS_TOTP_SECRET }}
      HEDNS_USERNAME: ${{ secrets.HEDNS_USERNAME }}

      HEXONET_ENTITY: ${{ secrets.HEXONET_ENTITY }}
      HEXONET_PW: ${{ secrets.HEXONET_PW }}
      HEXONET_UID: ${{ secrets.HEXONET_UID }}

      NAMEDOTCOM_KEY: ${{ secrets.NAMEDOTCOM_KEY }}
      NAMEDOTCOM_URL: ${{ secrets.NAMEDOTCOM_URL }}
      NAMEDOTCOM_USER: ${{ secrets.NAMEDOTCOM_USER }}

      POWERDNS_APIKEY: ${{ secrets.POWERDNS_APIKEY }}
      POWERDNS_APIURL: ${{ secrets.POWERDNS_APIURL }}
      POWERDNS_SERVERNAME: ${{ secrets.POWERDNS_SERVERNAME }}

      ROUTE53_KEY: ${{ secrets.ROUTE53_KEY }}
      ROUTE53_KEY_ID: ${{ secrets.ROUTE53_KEY_ID }}

      TRANSIP_ACCOUNT_NAME: ${{ secrets.TRANSIP_ACCOUNT_NAME }}
      TRANSIP_PRIVATE_KEY: ${{ secrets.TRANSIP_PRIVATE_KEY }}

    concurrency: ${{ matrix.provider }}
    strategy:
      fail-fast: false
      matrix:
        provider: ${{ fromJson(needs.integration-test-providers.outputs.integration_test_providers )}}
    steps:
    - uses: actions/checkout@v3.5.0
    - run: mkdir -p "$TEST_RESULTS"
    - name: restore_cache
      uses: actions/cache@v3.3.1
      with:
        key: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
        restore-keys: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
        path: ${{ env.go-mod-path }}
    - name: Run integration tests for ${{ matrix.provider }} provider
      run: |-
        go install gotest.tools/gotestsum@latest
        if [ -n "$${{ matrix.provider }}_DOMAIN" ] ; then
          gotestsum --junitfile ${TEST_RESULTS}/gotestsum-report.xml -- -timeout 30m -v -verbose -provider ${{ matrix.provider }} -cfworkers=false -diff2
        else
          echo "Skip test for ${{ matrix.provider }} provider"
        fi
      working-directory: integrationTest
    - uses: actions/upload-artifact@v3.1.2
      with:
        path: "/tmp/test-results"
#  release:
#    if: # GitHub does not currently support regular expressions inside if conditions
##         (github.ref == 'refs/tags//v[0-9]+(\.[0-9]+)*(-.*)*/') && (github.ref != 'refs/heads//.*/')
#    runs-on: ubuntu-latest
#    container:
#      image: golang:${{ env.gover }}
#    needs:
#    - build
#    env:
#      DOCKERHUB_ACCESS_TOKEN:
#      DOCKERHUB_USERNAME:
#    steps:
#    - uses: actions/checkout@v3.5.0
##     # 'setup_remote_docker' was not transformed because there is no suitable equivalent in GitHub Actions
#    - uses: "./.github/actions/docker_check"
#      with:
#        docker-password: "${{ secrets.DOCKER_PASSWORD }}"
#        docker-username: "${{ env.DOCKER_LOGIN }}"
#    - name: restore_cache
#      uses: actions/cache@v3.3.1
#      with:
#        key: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
#        restore-keys: linux-go-${{ hashFiles('go.sum') }}-${{ env.cache-key }}
#    - name: Install goreleaser
#      run: go install github.com/goreleaser/goreleaser@latest
#    - run: goreleaser release
#    - uses: actions/upload-artifact@v3.1.2
#      with:
#        path: dist
#    - uses: actions/upload-artifact@v3.1.2
#      with:
#        path: |-
#          dist/*.rpm
#          dist/*.deb
#  upload:
#    if: # GitHub does not currently support regular expressions inside if conditions
##         (github.ref == 'refs/tags//v[0-9]+(\.[0-9]+)*(-.*)*/') && (github.ref != 'refs/heads//.*/')
#    runs-on: ubuntu-latest
#    container:
#      image: python:3.10
#    needs:
#    - release
#    env:
#      CLOUDSMITH_API_KEY:
#      CLOUDSMITH_USERNAME:
#      DOCKER_LOGIN:
#      DOCKER_PASSWORD:
#    strategy:
#      matrix:
#        arch:
#        - i386
#        - x86_64
#        - arm64
#        format:
#        distro:
#    steps:
#    - uses: actions/download-artifact@v3.0.1
#      with:
#        path: "."
##     # This item has no matching transformer
##     - cloudsmith_cloudsmith_ensure_api_key:
##     # This item has no matching transformer
##     - cloudsmith_cloudsmith_install_cli:
##     # This item has no matching transformer
##     - cloudsmith_cloudsmith_publish:
#  upload_1:
#    if: # GitHub does not currently support regular expressions inside if conditions
##         (github.ref == 'refs/tags//v[0-9]+(\.[0-9]+)*(-.*)*/') && (github.ref != 'refs/heads//.*/')
#    runs-on: ubuntu-latest
#    container:
#      image: python:3.10
#    needs:
#    - release
#    env:
#      CLOUDSMITH_API_KEY:
#      CLOUDSMITH_USERNAME:
#      DOCKER_LOGIN:
#      DOCKER_PASSWORD:
#    strategy:
#      matrix:
#        arch:
#        - i386
#        - amd64
#        - arm64
#        format:
#        distro:
#    steps:
#    - uses: actions/download-artifact@v3.0.1
#      with:
#        path: "."
##     # This item has no matching transformer
##     - cloudsmith_cloudsmith_ensure_api_key:
##     # This item has no matching transformer
##     - cloudsmith_cloudsmith_install_cli:
##     # This item has no matching transformer
##     - cloudsmith_cloudsmith_publish:
