mirror of
				https://github.com/kubernetes-sigs/external-dns.git
				synced 2025-11-04 04:31:00 +01:00 
			
		
		
		
	Merge branch 'kubernetes-sigs:master' into #2610-handle-zone-lookup
This commit is contained in:
		
						commit
						6c67358049
					
				
							
								
								
									
										6
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
								
							@ -9,7 +9,11 @@ updates:
 | 
				
			|||||||
    directory: "/" # Location of package manifests
 | 
					    directory: "/" # Location of package manifests
 | 
				
			||||||
    schedule:
 | 
					    schedule:
 | 
				
			||||||
      interval: "daily"
 | 
					      interval: "daily"
 | 
				
			||||||
  - package-ecosystem: ""github-actions" 
 | 
					  - package-ecosystem: "github-actions"
 | 
				
			||||||
 | 
					    directory: "/"
 | 
				
			||||||
 | 
					    schedule:
 | 
				
			||||||
 | 
					      interval: "daily"
 | 
				
			||||||
 | 
					  - package-ecosystem: "docker" # Keep Docker dependencies up to date
 | 
				
			||||||
    directory: "/"
 | 
					    directory: "/"
 | 
				
			||||||
    schedule:
 | 
					    schedule:
 | 
				
			||||||
      interval: "daily"
 | 
					      interval: "daily"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										4
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								.github/workflows/ci.yml
									
									
									
									
										vendored
									
									
								
							@ -14,13 +14,13 @@ jobs:
 | 
				
			|||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Set up Go 1.x
 | 
					    - name: Set up Go 1.x
 | 
				
			||||||
      uses: actions/setup-go@v2
 | 
					      uses: actions/setup-go@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        go-version: 1.18
 | 
					        go-version: 1.18
 | 
				
			||||||
      id: go
 | 
					      id: go
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Check out code into the Go module directory
 | 
					    - name: Check out code into the Go module directory
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Install CI
 | 
					    - name: Install CI
 | 
				
			||||||
      run: |
 | 
					      run: |
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										10
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							@ -26,15 +26,15 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
    - name: Checkout repository
 | 
					    - name: Checkout repository
 | 
				
			||||||
      uses: actions/checkout@v2
 | 
					      uses: actions/checkout@v3
 | 
				
			||||||
    - name: Install go version
 | 
					    - name: Install go version
 | 
				
			||||||
      uses: actions/setup-go@v2
 | 
					      uses: actions/setup-go@v3
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        go-version: '^1.16'
 | 
					        go-version: '^1.18'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Initializes the CodeQL tools for scanning.
 | 
					    # Initializes the CodeQL tools for scanning.
 | 
				
			||||||
    - name: Initialize CodeQL
 | 
					    - name: Initialize CodeQL
 | 
				
			||||||
      uses: github/codeql-action/init@v1
 | 
					      uses: github/codeql-action/init@v2
 | 
				
			||||||
      with:
 | 
					      with:
 | 
				
			||||||
        languages: ${{ matrix.language }}
 | 
					        languages: ${{ matrix.language }}
 | 
				
			||||||
        # If you wish to specify custom queries, you can do so here or in a config file.
 | 
					        # If you wish to specify custom queries, you can do so here or in a config file.
 | 
				
			||||||
@ -46,4 +46,4 @@ jobs:
 | 
				
			|||||||
        make build
 | 
					        make build
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    - name: Perform CodeQL Analysis
 | 
					    - name: Perform CodeQL Analysis
 | 
				
			||||||
      uses: github/codeql-action/analyze@v1
 | 
					      uses: github/codeql-action/analyze@v2
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/docs.yml
									
									
									
									
										vendored
									
									
								
							@ -10,7 +10,7 @@ jobs:
 | 
				
			|||||||
    name: Release Docs
 | 
					    name: Release Docs
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - uses: actions/checkout@v2
 | 
					      - uses: actions/checkout@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          fetch-depth: 0
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -20,9 +20,9 @@ jobs:
 | 
				
			|||||||
          cache: "pip"
 | 
					          cache: "pip"
 | 
				
			||||||
          cache-dependency-path: "./docs/scripts/requirements.txt"
 | 
					          cache-dependency-path: "./docs/scripts/requirements.txt"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - uses: actions/setup-go@v2
 | 
					      - uses: actions/setup-go@v3
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          go-version: ^1.17
 | 
					          go-version: ^1.18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - run: |
 | 
					      - run: |
 | 
				
			||||||
          pip install -r docs/scripts/requirements.txt
 | 
					          pip install -r docs/scripts/requirements.txt
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										29
									
								
								.github/workflows/lint-test-chart.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										29
									
								
								.github/workflows/lint-test-chart.yaml
									
									
									
									
										vendored
									
									
								
							@ -9,33 +9,36 @@ jobs:
 | 
				
			|||||||
  lint-test:
 | 
					  lint-test:
 | 
				
			||||||
    if: github.repository == 'kubernetes-sigs/external-dns'
 | 
					    if: github.repository == 'kubernetes-sigs/external-dns'
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    defaults:
 | 
				
			||||||
 | 
					      run:
 | 
				
			||||||
 | 
					        shell: bash
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout
 | 
					      - name: Checkout
 | 
				
			||||||
        uses: actions/checkout@v2
 | 
					        uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          fetch-depth: 0
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Run Artifact Hub lint
 | 
					      - name: Run Artifact Hub lint
 | 
				
			||||||
        shell: bash
 | 
					 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set -euo pipefail
 | 
					          set -euo pipefail
 | 
				
			||||||
          curl -Lo ah_linux_amd64.tar.gz https://github.com/artifacthub/hub/releases/download/v1.6.0/ah_1.6.0_linux_amd64.tar.gz
 | 
					          curl -Lo ah_linux_amd64.tar.gz https://github.com/artifacthub/hub/releases/download/v1.9.0/ah_1.9.0_linux_amd64.tar.gz
 | 
				
			||||||
          tar -xzvf ah_linux_amd64.tar.gz ah
 | 
					          tar -xzvf ah_linux_amd64.tar.gz ah
 | 
				
			||||||
          ./ah lint --kind helm || exit 1
 | 
					          ./ah lint --kind helm || exit 1
 | 
				
			||||||
          rm -f ./ah ./ah_linux_amd64.tar.gz
 | 
					          rm -f ./ah ./ah_linux_amd64.tar.gz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Set up Helm
 | 
					      - name: Set-up Helm
 | 
				
			||||||
        uses: azure/setup-helm@v1
 | 
					        uses: azure/setup-helm@b5b231a831f96336bbfeccc1329990f0005c5bb1
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          version: 3.*
 | 
					          token: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					          version: latest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Set up Python
 | 
					      - name: Set-up Python
 | 
				
			||||||
        uses: actions/setup-python@v2
 | 
					        uses: actions/setup-python@b55428b1882923874294fa556849718a1d7f2ca5
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          python-version: 3.7
 | 
					          python-version: "3.x"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Set up chart-testing
 | 
					      - name: Set-up chart-testing
 | 
				
			||||||
        uses: helm/chart-testing-action@v2.2.0
 | 
					        uses: helm/chart-testing-action@dae259e86a35ff09145c0805e2d7dd3f7207064a
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Run chart-testing (list-changed)
 | 
					      - name: Run chart-testing (list-changed)
 | 
				
			||||||
        id: list-changed
 | 
					        id: list-changed
 | 
				
			||||||
@ -48,8 +51,8 @@ jobs:
 | 
				
			|||||||
      - name: Run chart-testing (lint)
 | 
					      - name: Run chart-testing (lint)
 | 
				
			||||||
        run: ct lint --check-version-increment=false
 | 
					        run: ct lint --check-version-increment=false
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Create Kind cluster
 | 
					      - name: Set-up Kind cluster
 | 
				
			||||||
        uses: helm/kind-action@v1.2.0
 | 
					        uses: helm/kind-action@d08cf6ff1575077dee99962540d77ce91c62387d
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          wait: 120s
 | 
					          wait: 120s
 | 
				
			||||||
        if: steps.list-changed.outputs.changed == 'true'
 | 
					        if: steps.list-changed.outputs.changed == 'true'
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										18
									
								
								.github/workflows/release-chart.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										18
									
								
								.github/workflows/release-chart.yaml
									
									
									
									
										vendored
									
									
								
							@ -11,15 +11,17 @@ jobs:
 | 
				
			|||||||
  release:
 | 
					  release:
 | 
				
			||||||
    if: github.repository == 'kubernetes-sigs/external-dns'
 | 
					    if: github.repository == 'kubernetes-sigs/external-dns'
 | 
				
			||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
 | 
					    defaults:
 | 
				
			||||||
 | 
					      run:
 | 
				
			||||||
 | 
					        shell: bash
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout
 | 
					      - name: Checkout
 | 
				
			||||||
        uses: actions/checkout@v2
 | 
					        uses: actions/checkout@2541b1294d2704b0964813337f33b291d3f8596b
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          fetch-depth: 0
 | 
					          fetch-depth: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Get chart version
 | 
					      - name: Get chart version
 | 
				
			||||||
        id: chart_version
 | 
					        id: chart_version
 | 
				
			||||||
        shell: bash
 | 
					 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set -euo pipefail
 | 
					          set -euo pipefail
 | 
				
			||||||
          chart_version="$(grep -Po "(?<=^version: ).+" charts/external-dns/Chart.yaml)"
 | 
					          chart_version="$(grep -Po "(?<=^version: ).+" charts/external-dns/Chart.yaml)"
 | 
				
			||||||
@ -27,13 +29,12 @@ jobs:
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
      - name: Get changelog entry
 | 
					      - name: Get changelog entry
 | 
				
			||||||
        id: changelog_reader
 | 
					        id: changelog_reader
 | 
				
			||||||
        uses: mindsers/changelog-reader-action@v2
 | 
					        uses: mindsers/changelog-reader-action@5bfb30f7871d5c4cde50cd897314f37578043394
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          path: charts/external-dns/CHANGELOG.md
 | 
					          path: charts/external-dns/CHANGELOG.md
 | 
				
			||||||
          version: "v${{ steps.chart_version.outputs.version }}"
 | 
					          version: "v${{ steps.chart_version.outputs.version }}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Create release notes
 | 
					      - name: Create release notes
 | 
				
			||||||
        shell: bash
 | 
					 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          set -euo pipefail
 | 
					          set -euo pipefail
 | 
				
			||||||
          cat <<"EOF" > charts/external-dns/_release-notes.md
 | 
					          cat <<"EOF" > charts/external-dns/_release-notes.md
 | 
				
			||||||
@ -45,13 +46,14 @@ jobs:
 | 
				
			|||||||
          git config user.name "$GITHUB_ACTOR"
 | 
					          git config user.name "$GITHUB_ACTOR"
 | 
				
			||||||
          git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
 | 
					          git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Install Helm
 | 
					      - name: Set-up Helm
 | 
				
			||||||
        uses: azure/setup-helm@v1
 | 
					        uses: azure/setup-helm@b5b231a831f96336bbfeccc1329990f0005c5bb1
 | 
				
			||||||
        with:
 | 
					        with:
 | 
				
			||||||
          version: v3.6.3
 | 
					          token: ${{ secrets.GITHUB_TOKEN }}
 | 
				
			||||||
 | 
					          version: latest
 | 
				
			||||||
 | 
					
 | 
				
			||||||
      - name: Run chart-releaser
 | 
					      - name: Run chart-releaser
 | 
				
			||||||
        uses: helm/chart-releaser-action@v1.3.0
 | 
					        uses: helm/chart-releaser-action@a3454e46a6f5ac4811069a381e646961dda2e1bf
 | 
				
			||||||
        env:
 | 
					        env:
 | 
				
			||||||
          CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
 | 
					          CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
 | 
				
			||||||
          CR_RELEASE_NAME_TEMPLATE: "external-dns-helm-chart-{{ .Version }}"
 | 
					          CR_RELEASE_NAME_TEMPLATE: "external-dns-helm-chart-{{ .Version }}"
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								.github/workflows/trivy.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/trivy.yml
									
									
									
									
										vendored
									
									
								
							@ -7,7 +7,7 @@ jobs:
 | 
				
			|||||||
    runs-on: ubuntu-latest
 | 
					    runs-on: ubuntu-latest
 | 
				
			||||||
    steps:
 | 
					    steps:
 | 
				
			||||||
      - name: Checkout code
 | 
					      - name: Checkout code
 | 
				
			||||||
        uses: actions/checkout@v2
 | 
					        uses: actions/checkout@v3
 | 
				
			||||||
      - name: Build an image from Dockerfile
 | 
					      - name: Build an image from Dockerfile
 | 
				
			||||||
        run: |
 | 
					        run: |
 | 
				
			||||||
          make build.docker
 | 
					          make build.docker
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										2
									
								
								OWNERS
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								OWNERS
									
									
									
									
									
								
							@ -5,11 +5,13 @@ approvers:
 | 
				
			|||||||
  - raffo
 | 
					  - raffo
 | 
				
			||||||
  - njuettner
 | 
					  - njuettner
 | 
				
			||||||
  - seanmalloy
 | 
					  - seanmalloy
 | 
				
			||||||
 | 
					  - szuecs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
reviewers:
 | 
					reviewers:
 | 
				
			||||||
  - njuettner
 | 
					  - njuettner
 | 
				
			||||||
  - raffo
 | 
					  - raffo
 | 
				
			||||||
  - seanmalloy
 | 
					  - seanmalloy
 | 
				
			||||||
 | 
					  - szuecs
 | 
				
			||||||
 | 
					
 | 
				
			||||||
emeritus_approvers:
 | 
					emeritus_approvers:
 | 
				
			||||||
  - hjacobs
 | 
					  - hjacobs
 | 
				
			||||||
 | 
				
			|||||||
@ -55,7 +55,7 @@ ExternalDNS allows you to keep selected zones (via `--domain-filter`) synchroniz
 | 
				
			|||||||
* [Akamai Edge DNS](https://learn.akamai.com/en-us/products/cloud_security/edge_dns.html)
 | 
					* [Akamai Edge DNS](https://learn.akamai.com/en-us/products/cloud_security/edge_dns.html)
 | 
				
			||||||
* [GoDaddy](https://www.godaddy.com)
 | 
					* [GoDaddy](https://www.godaddy.com)
 | 
				
			||||||
* [Gandi](https://www.gandi.net)
 | 
					* [Gandi](https://www.gandi.net)
 | 
				
			||||||
* [UKFast SafeDNS](https://my.ukfast.co.uk/safedns/)
 | 
					* [ANS Group SafeDNS](https://portal.ans.co.uk/safedns/)
 | 
				
			||||||
* [IBM Cloud DNS](https://www.ibm.com/cloud/dns)
 | 
					* [IBM Cloud DNS](https://www.ibm.com/cloud/dns)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
From this release, ExternalDNS can become aware of the records it is managing (enabled via `--registry=txt`), therefore ExternalDNS can safely manage non-empty hosted zones. We strongly encourage you to use `v0.5` (or greater) with `--registry=txt` enabled and `--txt-owner-id` set to a unique value that doesn't change for the lifetime of your cluster. You might also want to run ExternalDNS in a dry run mode (`--dry-run` flag) to see the changes to be submitted to your DNS Provider API.
 | 
					From this release, ExternalDNS can become aware of the records it is managing (enabled via `--registry=txt`), therefore ExternalDNS can safely manage non-empty hosted zones. We strongly encourage you to use `v0.5` (or greater) with `--registry=txt` enabled and `--txt-owner-id` set to a unique value that doesn't change for the lifetime of your cluster. You might also want to run ExternalDNS in a dry run mode (`--dry-run` flag) to see the changes to be submitted to your DNS Provider API.
 | 
				
			||||||
 | 
				
			|||||||
@ -10,10 +10,29 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 | 
				
			|||||||
<!-- ## [UNRELEASED]
 | 
					<!-- ## [UNRELEASED]
 | 
				
			||||||
### Added
 | 
					### Added
 | 
				
			||||||
### Changed
 | 
					### Changed
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
### Deprecated
 | 
					### Deprecated
 | 
				
			||||||
### Removed -->
 | 
					### Removed -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## [UNRELEASED]
 | 
					## [v1.11.0] - 2022-08-10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Added
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Added support to configure `dnsPolicy` on the Helm chart deployment. [@michelzanini](https://github.com/michelzanini)
 | 
				
			||||||
 | 
					- Added ability to customise the deployment strategy. [mac-chaffee](https://github.com/mac-chaffee)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Changed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Updated _ExternalDNS_ version to [v0.12.2](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.12.2). [@stevehipwell](https://github.com/stevehipwell)
 | 
				
			||||||
 | 
					- Changed default deployment strategy to `Recreate`. [mac-chaffee](https://github.com/mac-chaffee)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [v1.10.1] - 2022-07-11
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					### Fixed
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					- Fixed incorrect addition of `namespace` to `ClusterRole` & `ClusterRoleBinding`. [@stevehipwell](https://github.com/stevehipwell)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## [v1.10.0] - 2022-07-08
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Added
 | 
					### Added
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -2,10 +2,11 @@ apiVersion: v2
 | 
				
			|||||||
name: external-dns
 | 
					name: external-dns
 | 
				
			||||||
description: ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers.
 | 
					description: ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers.
 | 
				
			||||||
type: application
 | 
					type: application
 | 
				
			||||||
version: 1.10.0
 | 
					version: 1.11.0
 | 
				
			||||||
appVersion: 0.12.0
 | 
					appVersion: 0.12.2
 | 
				
			||||||
keywords:
 | 
					keywords:
 | 
				
			||||||
  - kubernetes
 | 
					  - kubernetes
 | 
				
			||||||
 | 
					  - externaldns
 | 
				
			||||||
  - external-dns
 | 
					  - external-dns
 | 
				
			||||||
  - dns
 | 
					  - dns
 | 
				
			||||||
  - service
 | 
					  - service
 | 
				
			||||||
@ -20,20 +21,10 @@ maintainers:
 | 
				
			|||||||
annotations:
 | 
					annotations:
 | 
				
			||||||
  artifacthub.io/changes: |
 | 
					  artifacthub.io/changes: |
 | 
				
			||||||
    - kind: added
 | 
					    - kind: added
 | 
				
			||||||
      description: "Added commonLabels value to allow the addition of labels to all resources."
 | 
					      description: "Added support to configure dnsPolicy on the Helm chart deployment."
 | 
				
			||||||
    - kind: added
 | 
					    - kind: added
 | 
				
			||||||
      description: "Added support for Process Namespace Sharing via the shareProcessNamespace value."
 | 
					      description: "Added ability to customise the deployment strategy."
 | 
				
			||||||
      links:
 | 
					 | 
				
			||||||
        - name: GitHub Issue #2715
 | 
					 | 
				
			||||||
          url: https://github.com/kubernetes-sigs/external-dns/pull/2715
 | 
					 | 
				
			||||||
        - name: Process Namespace Sharing
 | 
					 | 
				
			||||||
          url: https://kubernetes.io/docs/tasks/configure-pod-container/share-process-namespace/
 | 
					 | 
				
			||||||
    - kind: changed
 | 
					    - kind: changed
 | 
				
			||||||
      description: "Update ExternalDNS version to v0.12.0"
 | 
					      description: "Updated ExternalDNS version to v0.12.2."
 | 
				
			||||||
    - kind: changed
 | 
					    - kind: changed
 | 
				
			||||||
      description: "Set resource namespaces to {{ .Release.Namespace }} in the templates instead of waiting until apply time for inference."
 | 
					      description: "Changed default deployment strategy to Recreate."
 | 
				
			||||||
    - kind: fixed
 | 
					 | 
				
			||||||
      description: "Fixed rbac.additionalPermissions default value."
 | 
					 | 
				
			||||||
      links:
 | 
					 | 
				
			||||||
        - name: GitHub Issue #2796
 | 
					 | 
				
			||||||
          url: https://github.com/kubernetes-sigs/external-dns/pull/2796
 | 
					 | 
				
			||||||
 | 
				
			|||||||
@ -69,3 +69,4 @@ The following table lists the configurable parameters of the _ExternalDNS_ chart
 | 
				
			|||||||
| `domainFilters`                   | Limit possible target zones by domain suffixes.                                                                                                                                                                                                                                                                       | `[]`                                   |
 | 
					| `domainFilters`                   | Limit possible target zones by domain suffixes.                                                                                                                                                                                                                                                                       | `[]`                                   |
 | 
				
			||||||
| `provider`                        | DNS provider where the DNS records will be created, for the available providers and how to configure them see the [README](https://github.com/kubernetes-sigs/external-dns#deploying-to-a-cluster).                                                                                                                   | `aws`                                  |
 | 
					| `provider`                        | DNS provider where the DNS records will be created, for the available providers and how to configure them see the [README](https://github.com/kubernetes-sigs/external-dns#deploying-to-a-cluster).                                                                                                                   | `aws`                                  |
 | 
				
			||||||
| `extraArgs`                       | Extra arguments to pass to the _external-dns_ container, these are needed for provider specific arguments.                                                                                                                                                                                                            | `[]`                                   |
 | 
					| `extraArgs`                       | Extra arguments to pass to the _external-dns_ container, these are needed for provider specific arguments.                                                                                                                                                                                                            | `[]`                                   |
 | 
				
			||||||
 | 
					| `deploymentStrategy`              | .spec.strategy of the external-dns Deployment. Defaults to 'Recreate' since multiple external-dns pods may conflict with each other.                                                                                                                                                                                  | `{type: Recreate}`                     |
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ apiVersion: rbac.authorization.k8s.io/v1
 | 
				
			|||||||
kind: ClusterRole
 | 
					kind: ClusterRole
 | 
				
			||||||
metadata:
 | 
					metadata:
 | 
				
			||||||
  name: {{ template "external-dns.fullname" . }}
 | 
					  name: {{ template "external-dns.fullname" . }}
 | 
				
			||||||
  namespace: {{ .Release.Namespace }}
 | 
					 | 
				
			||||||
  labels:
 | 
					  labels:
 | 
				
			||||||
    {{- include "external-dns.labels" . | nindent 4 }}
 | 
					    {{- include "external-dns.labels" . | nindent 4 }}
 | 
				
			||||||
rules:
 | 
					rules:
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,6 @@ apiVersion: rbac.authorization.k8s.io/v1
 | 
				
			|||||||
kind: ClusterRoleBinding
 | 
					kind: ClusterRoleBinding
 | 
				
			||||||
metadata:
 | 
					metadata:
 | 
				
			||||||
  name: {{ printf "%s-viewer" (include "external-dns.fullname" .) }}
 | 
					  name: {{ printf "%s-viewer" (include "external-dns.fullname" .) }}
 | 
				
			||||||
  namespace: {{ .Release.Namespace }}
 | 
					 | 
				
			||||||
  labels:
 | 
					  labels:
 | 
				
			||||||
    {{- include "external-dns.labels" . | nindent 4 }}
 | 
					    {{- include "external-dns.labels" . | nindent 4 }}
 | 
				
			||||||
roleRef:
 | 
					roleRef:
 | 
				
			||||||
 | 
				
			|||||||
@ -14,6 +14,8 @@ spec:
 | 
				
			|||||||
  selector:
 | 
					  selector:
 | 
				
			||||||
    matchLabels:
 | 
					    matchLabels:
 | 
				
			||||||
      {{- include "external-dns.selectorLabels" . | nindent 6 }}
 | 
					      {{- include "external-dns.selectorLabels" . | nindent 6 }}
 | 
				
			||||||
 | 
					  strategy:
 | 
				
			||||||
 | 
					    {{- toYaml .Values.deploymentStrategy | nindent 4 }}
 | 
				
			||||||
  template:
 | 
					  template:
 | 
				
			||||||
    metadata:
 | 
					    metadata:
 | 
				
			||||||
      labels:
 | 
					      labels:
 | 
				
			||||||
@ -44,6 +46,9 @@ spec:
 | 
				
			|||||||
      {{- with .Values.terminationGracePeriodSeconds }}
 | 
					      {{- with .Values.terminationGracePeriodSeconds }}
 | 
				
			||||||
      terminationGracePeriodSeconds: {{ . }}
 | 
					      terminationGracePeriodSeconds: {{ . }}
 | 
				
			||||||
      {{- end }}
 | 
					      {{- end }}
 | 
				
			||||||
 | 
					      {{- with .Values.dnsPolicy }}
 | 
				
			||||||
 | 
					      dnsPolicy: {{ . }}
 | 
				
			||||||
 | 
					      {{- end }}
 | 
				
			||||||
      containers:
 | 
					      containers:
 | 
				
			||||||
        - name: external-dns
 | 
					        - name: external-dns
 | 
				
			||||||
          {{- with .Values.securityContext }}
 | 
					          {{- with .Values.securityContext }}
 | 
				
			||||||
 | 
				
			|||||||
@ -49,6 +49,10 @@ securityContext:
 | 
				
			|||||||
  capabilities:
 | 
					  capabilities:
 | 
				
			||||||
    drop: ["ALL"]
 | 
					    drop: ["ALL"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# Defaults to `ClusterFirst`.
 | 
				
			||||||
 | 
					# Valid values are: `ClusterFirstWithHostNet`, `ClusterFirst`, `Default` or `None`.
 | 
				
			||||||
 | 
					dnsPolicy:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
priorityClassName: ""
 | 
					priorityClassName: ""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
terminationGracePeriodSeconds:
 | 
					terminationGracePeriodSeconds:
 | 
				
			||||||
@ -121,3 +125,6 @@ domainFilters: []
 | 
				
			|||||||
provider: aws
 | 
					provider: aws
 | 
				
			||||||
 | 
					
 | 
				
			||||||
extraArgs: []
 | 
					extraArgs: []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					deploymentStrategy:
 | 
				
			||||||
 | 
					  type: Recreate
 | 
				
			||||||
 | 
				
			|||||||
@ -167,6 +167,9 @@ func (c *Controller) RunOnce(ctx context.Context) error {
 | 
				
			|||||||
		deprecatedRegistryErrors.Inc()
 | 
							deprecatedRegistryErrors.Inc()
 | 
				
			||||||
		return err
 | 
							return err
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						missingRecords := c.Registry.MissingRecords()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	registryEndpointsTotal.Set(float64(len(records)))
 | 
						registryEndpointsTotal.Set(float64(len(records)))
 | 
				
			||||||
	regARecords := filterARecords(records)
 | 
						regARecords := filterARecords(records)
 | 
				
			||||||
	registryARecords.Set(float64(len(regARecords)))
 | 
						registryARecords.Set(float64(len(regARecords)))
 | 
				
			||||||
@ -185,6 +188,29 @@ func (c *Controller) RunOnce(ctx context.Context) error {
 | 
				
			|||||||
	verifiedARecords.Set(float64(len(vRecords)))
 | 
						verifiedARecords.Set(float64(len(vRecords)))
 | 
				
			||||||
	endpoints = c.Registry.AdjustEndpoints(endpoints)
 | 
						endpoints = c.Registry.AdjustEndpoints(endpoints)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if len(missingRecords) > 0 {
 | 
				
			||||||
 | 
							// Add missing records before the actual plan is applied.
 | 
				
			||||||
 | 
							// This prevents the problems when the missing TXT record needs to be
 | 
				
			||||||
 | 
							// created and deleted/upserted in the same batch.
 | 
				
			||||||
 | 
							missingRecordsPlan := &plan.Plan{
 | 
				
			||||||
 | 
								Policies:           []plan.Policy{c.Policy},
 | 
				
			||||||
 | 
								Missing:            missingRecords,
 | 
				
			||||||
 | 
								DomainFilter:       endpoint.MatchAllDomainFilters{c.DomainFilter, c.Registry.GetDomainFilter()},
 | 
				
			||||||
 | 
								PropertyComparator: c.Registry.PropertyValuesEqual,
 | 
				
			||||||
 | 
								ManagedRecords:     c.ManagedRecordTypes,
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							missingRecordsPlan = missingRecordsPlan.Calculate()
 | 
				
			||||||
 | 
							if missingRecordsPlan.Changes.HasChanges() {
 | 
				
			||||||
 | 
								err = c.Registry.ApplyChanges(ctx, missingRecordsPlan.Changes)
 | 
				
			||||||
 | 
								if err != nil {
 | 
				
			||||||
 | 
									registryErrorsTotal.Inc()
 | 
				
			||||||
 | 
									deprecatedRegistryErrors.Inc()
 | 
				
			||||||
 | 
									return err
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								log.Info("All missing records are created")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plan := &plan.Plan{
 | 
						plan := &plan.Plan{
 | 
				
			||||||
		Policies:           []plan.Policy{c.Policy},
 | 
							Policies:           []plan.Policy{c.Policy},
 | 
				
			||||||
		Current:            records,
 | 
							Current:            records,
 | 
				
			||||||
@ -242,7 +268,11 @@ func filterARecords(endpoints []*endpoint.Endpoint) []string {
 | 
				
			|||||||
func (c *Controller) ScheduleRunOnce(now time.Time) {
 | 
					func (c *Controller) ScheduleRunOnce(now time.Time) {
 | 
				
			||||||
	c.nextRunAtMux.Lock()
 | 
						c.nextRunAtMux.Lock()
 | 
				
			||||||
	defer c.nextRunAtMux.Unlock()
 | 
						defer c.nextRunAtMux.Unlock()
 | 
				
			||||||
	c.nextRunAt = now.Add(c.MinEventSyncInterval)
 | 
						// schedule only if a reconciliation is not already planned
 | 
				
			||||||
 | 
						// to happen in the following c.MinEventSyncInterval
 | 
				
			||||||
 | 
						if !c.nextRunAt.Before(now.Add(c.MinEventSyncInterval)) {
 | 
				
			||||||
 | 
							c.nextRunAt = now.Add(c.MinEventSyncInterval)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (c *Controller) ShouldRunOnce(now time.Time) bool {
 | 
					func (c *Controller) ShouldRunOnce(now time.Time) bool {
 | 
				
			||||||
 | 
				
			|||||||
@ -19,12 +19,13 @@ package controller
 | 
				
			|||||||
import (
 | 
					import (
 | 
				
			||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"errors"
 | 
						"errors"
 | 
				
			||||||
	"github.com/prometheus/client_golang/prometheus"
 | 
					 | 
				
			||||||
	"math"
 | 
						"math"
 | 
				
			||||||
	"reflect"
 | 
						"reflect"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
	"time"
 | 
						"time"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/prometheus/client_golang/prometheus"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"sigs.k8s.io/external-dns/endpoint"
 | 
						"sigs.k8s.io/external-dns/endpoint"
 | 
				
			||||||
	"sigs.k8s.io/external-dns/internal/testutils"
 | 
						"sigs.k8s.io/external-dns/internal/testutils"
 | 
				
			||||||
	"sigs.k8s.io/external-dns/pkg/apis/externaldns"
 | 
						"sigs.k8s.io/external-dns/pkg/apis/externaldns"
 | 
				
			||||||
@ -236,6 +237,17 @@ func TestShouldRunOnce(t *testing.T) {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	// But not two times
 | 
						// But not two times
 | 
				
			||||||
	assert.False(t, ctrl.ShouldRunOnce(now))
 | 
						assert.False(t, ctrl.ShouldRunOnce(now))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Multiple ingresses or services changes, closer than MinInterval from each other
 | 
				
			||||||
 | 
						firstChangeTime := now
 | 
				
			||||||
 | 
						secondChangeTime := firstChangeTime.Add(time.Second)
 | 
				
			||||||
 | 
						// First change
 | 
				
			||||||
 | 
						ctrl.ScheduleRunOnce(firstChangeTime)
 | 
				
			||||||
 | 
						// Second change
 | 
				
			||||||
 | 
						ctrl.ScheduleRunOnce(secondChangeTime)
 | 
				
			||||||
 | 
						// Should not postpone the reconciliation further than firstChangeTime + MinInterval
 | 
				
			||||||
 | 
						now = now.Add(ctrl.MinEventSyncInterval)
 | 
				
			||||||
 | 
						assert.True(t, ctrl.ShouldRunOnce(now))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func testControllerFiltersDomains(t *testing.T, configuredEndpoints []*endpoint.Endpoint, domainFilter endpoint.DomainFilterInterface, providerEndpoints []*endpoint.Endpoint, expectedChanges []*plan.Changes) {
 | 
					func testControllerFiltersDomains(t *testing.T, configuredEndpoints []*endpoint.Endpoint, domainFilter endpoint.DomainFilterInterface, providerEndpoints []*endpoint.Endpoint, expectedChanges []*plan.Changes) {
 | 
				
			||||||
@ -270,6 +282,51 @@ func testControllerFiltersDomains(t *testing.T, configuredEndpoints []*endpoint.
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type noopRegistryWithMissing struct {
 | 
				
			||||||
 | 
						*registry.NoopRegistry
 | 
				
			||||||
 | 
						missingRecords []*endpoint.Endpoint
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *noopRegistryWithMissing) MissingRecords() []*endpoint.Endpoint {
 | 
				
			||||||
 | 
						return r.missingRecords
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func testControllerFiltersDomainsWithMissing(t *testing.T, configuredEndpoints []*endpoint.Endpoint, domainFilter endpoint.DomainFilterInterface, providerEndpoints, missingEndpoints []*endpoint.Endpoint, expectedChanges []*plan.Changes) {
 | 
				
			||||||
 | 
						t.Helper()
 | 
				
			||||||
 | 
						cfg := externaldns.NewConfig()
 | 
				
			||||||
 | 
						cfg.ManagedDNSRecordTypes = []string{endpoint.RecordTypeA, endpoint.RecordTypeCNAME}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						source := new(testutils.MockSource)
 | 
				
			||||||
 | 
						source.On("Endpoints").Return(configuredEndpoints, nil)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Fake some existing records in our DNS provider and validate some desired changes.
 | 
				
			||||||
 | 
						provider := &filteredMockProvider{
 | 
				
			||||||
 | 
							RecordsStore: providerEndpoints,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						noop, err := registry.NewNoopRegistry(provider)
 | 
				
			||||||
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r := &noopRegistryWithMissing{
 | 
				
			||||||
 | 
							NoopRegistry:   noop,
 | 
				
			||||||
 | 
							missingRecords: missingEndpoints,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ctrl := &Controller{
 | 
				
			||||||
 | 
							Source:             source,
 | 
				
			||||||
 | 
							Registry:           r,
 | 
				
			||||||
 | 
							Policy:             &plan.SyncPolicy{},
 | 
				
			||||||
 | 
							DomainFilter:       domainFilter,
 | 
				
			||||||
 | 
							ManagedRecordTypes: cfg.ManagedDNSRecordTypes,
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.NoError(t, ctrl.RunOnce(context.Background()))
 | 
				
			||||||
 | 
						assert.Equal(t, 1, provider.RecordsCallCount)
 | 
				
			||||||
 | 
						require.Len(t, provider.ApplyChangesCalls, len(expectedChanges))
 | 
				
			||||||
 | 
						for i, change := range expectedChanges {
 | 
				
			||||||
 | 
							assert.Equal(t, *change, *provider.ApplyChangesCalls[i])
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestControllerSkipsEmptyChanges(t *testing.T) {
 | 
					func TestControllerSkipsEmptyChanges(t *testing.T) {
 | 
				
			||||||
	testControllerFiltersDomains(
 | 
						testControllerFiltersDomains(
 | 
				
			||||||
		t,
 | 
							t,
 | 
				
			||||||
@ -517,3 +574,57 @@ func TestARecords(t *testing.T) {
 | 
				
			|||||||
	assert.Equal(t, math.Float64bits(2), valueFromMetric(sourceARecords))
 | 
						assert.Equal(t, math.Float64bits(2), valueFromMetric(sourceARecords))
 | 
				
			||||||
	assert.Equal(t, math.Float64bits(1), valueFromMetric(registryARecords))
 | 
						assert.Equal(t, math.Float64bits(1), valueFromMetric(registryARecords))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TestMissingRecordsApply validates that the missing records result in the dedicated plan apply.
 | 
				
			||||||
 | 
					func TestMissingRecordsApply(t *testing.T) {
 | 
				
			||||||
 | 
						testControllerFiltersDomainsWithMissing(
 | 
				
			||||||
 | 
							t,
 | 
				
			||||||
 | 
							[]*endpoint.Endpoint{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									DNSName:    "record1.used.tld",
 | 
				
			||||||
 | 
									RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
									Targets:    endpoint.Targets{"1.2.3.4"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									DNSName:    "record2.used.tld",
 | 
				
			||||||
 | 
									RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
									Targets:    endpoint.Targets{"8.8.8.8"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							endpoint.NewDomainFilter([]string{"used.tld"}),
 | 
				
			||||||
 | 
							[]*endpoint.Endpoint{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									DNSName:    "record1.used.tld",
 | 
				
			||||||
 | 
									RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
									Targets:    endpoint.Targets{"1.2.3.4"},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[]*endpoint.Endpoint{
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									DNSName:    "a-record1.used.tld",
 | 
				
			||||||
 | 
									RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
									Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							[]*plan.Changes{
 | 
				
			||||||
 | 
								// Missing record had its own plan applied.
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Create: []*endpoint.Endpoint{
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											DNSName:    "a-record1.used.tld",
 | 
				
			||||||
 | 
											RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
											Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
								{
 | 
				
			||||||
 | 
									Create: []*endpoint.Endpoint{
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											DNSName:    "record2.used.tld",
 | 
				
			||||||
 | 
											RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
											Targets:    endpoint.Targets{"8.8.8.8"},
 | 
				
			||||||
 | 
										},
 | 
				
			||||||
 | 
									},
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -284,6 +284,9 @@ Conversely, to force the public IP: `external-dns.alpha.kubernetes.io/access=pub
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
If this annotation is not set, and the node has both public and private IP addresses, then the public IP will be used by default.
 | 
					If this annotation is not set, and the node has both public and private IP addresses, then the public IP will be used by default.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Some loadbalancer implementations assign multiple IP addresses as external addresses. You can filter the generated targets by their networks
 | 
				
			||||||
 | 
					using `--target-net-filter=10.0.0.0/8` or `--exclude-target-net=10.0.0.0/8`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Can external-dns manage(add/remove) records in a hosted zone which is setup in different AWS account?
 | 
					### Can external-dns manage(add/remove) records in a hosted zone which is setup in different AWS account?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Yes, give it the correct cross-account/assume-role permissions and use the `--aws-assume-role` flag https://github.com/kubernetes-sigs/external-dns/pull/524#issue-181256561
 | 
					Yes, give it the correct cross-account/assume-role permissions and use the `--aws-assume-role` flag https://github.com/kubernetes-sigs/external-dns/pull/524#issue-181256561
 | 
				
			||||||
 | 
				
			|||||||
@ -8,6 +8,7 @@ It contains record type it manages, e.g.:
 | 
				
			|||||||
Prefix and suffix are extended with %{record_type} template where the user can control how prefixed/suffixed records should look like.
 | 
					Prefix and suffix are extended with %{record_type} template where the user can control how prefixed/suffixed records should look like.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
In order to maintain compatibility, both records will be maintained for some time, in order to have downgrade possibility.  
 | 
					In order to maintain compatibility, both records will be maintained for some time, in order to have downgrade possibility.  
 | 
				
			||||||
 | 
					The controller will try to create the "new format" TXT records if they are not present to ease the migration from the versions < 0.12.0.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Later on, the old format will be dropped and only the new format will be kept (<record_type>-<endpoint_name>).
 | 
					Later on, the old format will be dropped and only the new format will be kept (<record_type>-<endpoint_name>).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
# Setting up ExternalDNS for Services on UKFast's SafeDNS
 | 
					# Setting up ExternalDNS for Services on ANS Group's SafeDNS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
This tutorial describes how to setup ExternalDNS for usage within a Kubernetes cluster using SafeDNS.
 | 
					This tutorial describes how to setup ExternalDNS for usage within a Kubernetes cluster using SafeDNS.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -9,14 +9,14 @@ Make sure to use **>=0.11.0** version of ExternalDNS for this tutorial.
 | 
				
			|||||||
If you want to learn about how to use the SafeDNS service read the following tutorials:
 | 
					If you want to learn about how to use the SafeDNS service read the following tutorials:
 | 
				
			||||||
To learn more about the use of SafeDNS in general, see the following page:
 | 
					To learn more about the use of SafeDNS in general, see the following page:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[UKFast's SafeDNS documentation](https://docs.ukfast.co.uk/domains/safedns/index.html).
 | 
					[ANS Group's SafeDNS documentation](https://docs.ukfast.co.uk/domains/safedns/index.html).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
## Creating SafeDNS credentials
 | 
					## Creating SafeDNS credentials
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Generate a fresh API token for use with ExternalDNS, following the instructions
 | 
					Generate a fresh API token for use with ExternalDNS, following the instructions
 | 
				
			||||||
at the UKFast developer [Getting-Started](https://developers.ukfast.io/getting-started)
 | 
					at the ANS Group developer [Getting-Started](https://developers.ukfast.io/getting-started)
 | 
				
			||||||
page. You will need to grant read/write access to the SafeDNS API. No access to
 | 
					page. You will need to grant read/write access to the SafeDNS API. No access to
 | 
				
			||||||
any other UKFast service is required.
 | 
					any other ANS Group service is required.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
The environment variable `SAFEDNS_TOKEN` must have a value of this token to run
 | 
					The environment variable `SAFEDNS_TOKEN` must have a value of this token to run
 | 
				
			||||||
ExternalDNS with SafeDNS integration.
 | 
					ExternalDNS with SafeDNS integration.
 | 
				
			||||||
@ -426,7 +426,7 @@ spec:
 | 
				
			|||||||
          env:
 | 
					          env:
 | 
				
			||||||
            - name: AWS_DEFAULT_REGION
 | 
					            - name: AWS_DEFAULT_REGION
 | 
				
			||||||
              value: us-east-1 # change to region where EKS is installed
 | 
					              value: us-east-1 # change to region where EKS is installed
 | 
				
			||||||
      # # Uncommend below if using static credentials
 | 
					      # # Uncomment below if using static credentials
 | 
				
			||||||
      #       - name: AWS_SHARED_CREDENTIALS_FILE
 | 
					      #       - name: AWS_SHARED_CREDENTIALS_FILE
 | 
				
			||||||
      #        value: /.aws/credentials
 | 
					      #        value: /.aws/credentials
 | 
				
			||||||
      #     volumeMounts:
 | 
					      #     volumeMounts:
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										99
									
								
								endpoint/target_filter.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								endpoint/target_filter.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,99 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2017 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package endpoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"net"
 | 
				
			||||||
 | 
						"strings"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						log "github.com/sirupsen/logrus"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TargetFilterInterface defines the interface to select matching targets for a specific provider or runtime
 | 
				
			||||||
 | 
					type TargetFilterInterface interface {
 | 
				
			||||||
 | 
						Match(target string) bool
 | 
				
			||||||
 | 
						IsConfigured() bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TargetNetFilter holds a lists of valid target names
 | 
				
			||||||
 | 
					type TargetNetFilter struct {
 | 
				
			||||||
 | 
						// FilterNets define what targets to match
 | 
				
			||||||
 | 
						FilterNets []*net.IPNet
 | 
				
			||||||
 | 
						// excludeNets define what targets not to match
 | 
				
			||||||
 | 
						excludeNets []*net.IPNet
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// prepareTargetFilters provides consistent trimming for filters/exclude params
 | 
				
			||||||
 | 
					func prepareTargetFilters(filters []string) []*net.IPNet {
 | 
				
			||||||
 | 
						fs := make([]*net.IPNet, 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, filter := range filters {
 | 
				
			||||||
 | 
							filter = strings.TrimSpace(filter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							_, filterNet, err := net.ParseCIDR(filter)
 | 
				
			||||||
 | 
							if err != nil {
 | 
				
			||||||
 | 
								log.Errorf("Invalid target net filter: %s", filter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							fs = append(fs, filterNet)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return fs
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewTargetNetFilterWithExclusions returns a new TargetNetFilter, given a list of matches and exclusions
 | 
				
			||||||
 | 
					func NewTargetNetFilterWithExclusions(targetFilterNets []string, excludeNets []string) TargetNetFilter {
 | 
				
			||||||
 | 
						return TargetNetFilter{FilterNets: prepareTargetFilters(targetFilterNets), excludeNets: prepareTargetFilters(excludeNets)}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewTargetNetFilter returns a new TargetNetFilter given a comma separated list of targets
 | 
				
			||||||
 | 
					func NewTargetNetFilter(targetFilterNets []string) TargetNetFilter {
 | 
				
			||||||
 | 
						return TargetNetFilter{FilterNets: prepareTargetFilters(targetFilterNets)}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Match checks whether a target can be found in the TargetNetFilter.
 | 
				
			||||||
 | 
					func (tf TargetNetFilter) Match(target string) bool {
 | 
				
			||||||
 | 
						return matchTargetNetFilter(tf.FilterNets, target, true) && !matchTargetNetFilter(tf.excludeNets, target, false)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// matchTargetNetFilter determines if any `filters` match `target`.
 | 
				
			||||||
 | 
					// If no `filters` are provided, behavior depends on `emptyval`
 | 
				
			||||||
 | 
					// (empty `tf.filters` matches everything, while empty `tf.exclude` excludes nothing)
 | 
				
			||||||
 | 
					func matchTargetNetFilter(filters []*net.IPNet, target string, emptyval bool) bool {
 | 
				
			||||||
 | 
						if len(filters) == 0 {
 | 
				
			||||||
 | 
							return emptyval
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, filter := range filters {
 | 
				
			||||||
 | 
							ip := net.ParseIP(target)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if filter.Contains(ip) {
 | 
				
			||||||
 | 
								return true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return false
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// IsConfigured returns true if TargetFilter is configured, false otherwise
 | 
				
			||||||
 | 
					func (tf TargetNetFilter) IsConfigured() bool {
 | 
				
			||||||
 | 
						if len(tf.FilterNets) == 1 {
 | 
				
			||||||
 | 
							return tf.FilterNets[0].Network() != ""
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return len(tf.FilterNets) > 0
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										153
									
								
								endpoint/target_filter_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										153
									
								
								endpoint/target_filter_test.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,153 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2017 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package endpoint
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					type targetFilterTest struct {
 | 
				
			||||||
 | 
						targetFilter []string
 | 
				
			||||||
 | 
						exclusions   []string
 | 
				
			||||||
 | 
						targets      []string
 | 
				
			||||||
 | 
						expected     bool
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var targetFilterTests = []targetFilterTest{
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							[]string{"10.0.0.0/8"},
 | 
				
			||||||
 | 
							[]string{},
 | 
				
			||||||
 | 
							[]string{"10.1.2.3"},
 | 
				
			||||||
 | 
							true,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							[]string{" 10.0.0.0/8 "},
 | 
				
			||||||
 | 
							[]string{},
 | 
				
			||||||
 | 
							[]string{"10.1.2.3"},
 | 
				
			||||||
 | 
							true,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							[]string{"0"},
 | 
				
			||||||
 | 
							[]string{},
 | 
				
			||||||
 | 
							[]string{"10.1.2.3"},
 | 
				
			||||||
 | 
							true,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							[]string{"10.0.0.0/8"},
 | 
				
			||||||
 | 
							[]string{},
 | 
				
			||||||
 | 
							[]string{"1.1.1.1"},
 | 
				
			||||||
 | 
							false,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							[]string{},
 | 
				
			||||||
 | 
							[]string{"10.0.0.0/8"},
 | 
				
			||||||
 | 
							[]string{"1.1.1.1"},
 | 
				
			||||||
 | 
							true,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
						{
 | 
				
			||||||
 | 
							[]string{},
 | 
				
			||||||
 | 
							[]string{"10.0.0.0/8"},
 | 
				
			||||||
 | 
							[]string{"10.1.2.3"},
 | 
				
			||||||
 | 
							false,
 | 
				
			||||||
 | 
						},
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestTargetFilterMatch(t *testing.T) {
 | 
				
			||||||
 | 
						for i, tt := range targetFilterTests {
 | 
				
			||||||
 | 
							if len(tt.exclusions) > 0 {
 | 
				
			||||||
 | 
								t.Logf("NewTargetFilter() doesn't support exclusions - skipping test %+v", tt)
 | 
				
			||||||
 | 
								continue
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							targetFilter := NewTargetNetFilter(tt.targetFilter)
 | 
				
			||||||
 | 
							for _, target := range tt.targets {
 | 
				
			||||||
 | 
								assert.Equal(t, tt.expected, targetFilter.Match(target), "should not fail: %v in test-case #%v", target, i)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestTargetFilterWithExclusions(t *testing.T) {
 | 
				
			||||||
 | 
						for i, tt := range targetFilterTests {
 | 
				
			||||||
 | 
							if len(tt.exclusions) == 0 {
 | 
				
			||||||
 | 
								tt.exclusions = append(tt.exclusions, "")
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							targetFilter := NewTargetNetFilterWithExclusions(tt.targetFilter, tt.exclusions)
 | 
				
			||||||
 | 
							for _, target := range tt.targets {
 | 
				
			||||||
 | 
								assert.Equal(t, tt.expected, targetFilter.Match(target), "should not fail: %v in test-case #%v", target, i)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestTargetFilterMatchWithEmptyFilter(t *testing.T) {
 | 
				
			||||||
 | 
						for _, tt := range targetFilterTests {
 | 
				
			||||||
 | 
							targetFilter := TargetNetFilter{}
 | 
				
			||||||
 | 
							for i, target := range tt.targets {
 | 
				
			||||||
 | 
								assert.True(t, targetFilter.Match(target), "should not fail: %v in test-case #%v", target, i)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMatchTargetFilterReturnsProperEmptyVal(t *testing.T) {
 | 
				
			||||||
 | 
						emptyFilters := []string{}
 | 
				
			||||||
 | 
						assert.Equal(t, true, matchFilter(emptyFilters, "sometarget.com", true))
 | 
				
			||||||
 | 
						assert.Equal(t, false, matchFilter(emptyFilters, "sometarget.com", false))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestTargetFilterIsConfigured(t *testing.T) {
 | 
				
			||||||
 | 
						for _, tt := range []struct {
 | 
				
			||||||
 | 
							filters  []string
 | 
				
			||||||
 | 
							exclude  []string
 | 
				
			||||||
 | 
							expected bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								[]string{""},
 | 
				
			||||||
 | 
								[]string{""},
 | 
				
			||||||
 | 
								false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								[]string{"    "},
 | 
				
			||||||
 | 
								[]string{"    "},
 | 
				
			||||||
 | 
								false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								[]string{"", ""},
 | 
				
			||||||
 | 
								[]string{""},
 | 
				
			||||||
 | 
								false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								[]string{"10/8"},
 | 
				
			||||||
 | 
								[]string{"  "},
 | 
				
			||||||
 | 
								false,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								[]string{"10.0.0.0/8"},
 | 
				
			||||||
 | 
								[]string{"  "},
 | 
				
			||||||
 | 
								true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								[]string{" 10.0.0.0/8 "},
 | 
				
			||||||
 | 
								[]string{" ignored "},
 | 
				
			||||||
 | 
								true,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						} {
 | 
				
			||||||
 | 
							t.Run("test IsConfigured", func(t *testing.T) {
 | 
				
			||||||
 | 
								tf := NewTargetNetFilterWithExclusions(tt.filters, tt.exclude)
 | 
				
			||||||
 | 
								assert.Equal(t, tt.expected, tf.IsConfigured())
 | 
				
			||||||
 | 
							})
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										79
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										79
									
								
								go.mod
									
									
									
									
									
								
							@ -3,21 +3,22 @@ module sigs.k8s.io/external-dns
 | 
				
			|||||||
go 1.18
 | 
					go 1.18
 | 
				
			||||||
 | 
					
 | 
				
			||||||
require (
 | 
					require (
 | 
				
			||||||
	cloud.google.com/go/compute v1.5.0
 | 
						cloud.google.com/go/compute v1.9.0
 | 
				
			||||||
	github.com/Azure/azure-sdk-for-go v61.5.0+incompatible
 | 
						github.com/Azure/azure-sdk-for-go v61.5.0+incompatible
 | 
				
			||||||
	github.com/Azure/go-autorest/autorest v0.11.21
 | 
						github.com/Azure/go-autorest/autorest v0.11.21
 | 
				
			||||||
	github.com/Azure/go-autorest/autorest/adal v0.9.20
 | 
						github.com/Azure/go-autorest/autorest/adal v0.9.20
 | 
				
			||||||
	github.com/Azure/go-autorest/autorest/to v0.4.0
 | 
						github.com/Azure/go-autorest/autorest/to v0.4.0
 | 
				
			||||||
	github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.8.1
 | 
						github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.11.0
 | 
				
			||||||
	github.com/IBM/go-sdk-core/v5 v5.6.5
 | 
						github.com/IBM/go-sdk-core/v5 v5.8.0
 | 
				
			||||||
	github.com/IBM/networking-go-sdk v0.24.0
 | 
						github.com/IBM/networking-go-sdk v0.32.0
 | 
				
			||||||
	github.com/StackExchange/dnscontrol v0.2.8
 | 
						github.com/StackExchange/dnscontrol v0.2.8
 | 
				
			||||||
	github.com/akamai/AkamaiOPEN-edgegrid-golang v1.1.1
 | 
						github.com/akamai/AkamaiOPEN-edgegrid-golang v1.1.1
 | 
				
			||||||
	github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 // indirect
 | 
						github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 // indirect
 | 
				
			||||||
	github.com/alecthomas/colour v0.1.0 // indirect
 | 
						github.com/alecthomas/colour v0.1.0 // indirect
 | 
				
			||||||
	github.com/alecthomas/kingpin v2.2.5+incompatible
 | 
						github.com/alecthomas/kingpin v2.2.5+incompatible
 | 
				
			||||||
	github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483
 | 
						github.com/aliyun/alibaba-cloud-sdk-go v1.61.1742
 | 
				
			||||||
	github.com/aws/aws-sdk-go v1.42.52
 | 
						github.com/ans-group/sdk-go v1.8.1
 | 
				
			||||||
 | 
						github.com/aws/aws-sdk-go v1.44.81
 | 
				
			||||||
	github.com/bodgit/tsig v1.2.0
 | 
						github.com/bodgit/tsig v1.2.0
 | 
				
			||||||
	github.com/cloudflare/cloudflare-go v0.25.0
 | 
						github.com/cloudflare/cloudflare-go v0.25.0
 | 
				
			||||||
	github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381
 | 
						github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381
 | 
				
			||||||
@ -29,7 +30,7 @@ require (
 | 
				
			|||||||
	github.com/ffledgling/pdns-go v0.0.0-20180219074714-524e7daccd99
 | 
						github.com/ffledgling/pdns-go v0.0.0-20180219074714-524e7daccd99
 | 
				
			||||||
	github.com/go-gandi/go-gandi v0.0.0-20200921091836-0d8a64b9cc09
 | 
						github.com/go-gandi/go-gandi v0.0.0-20200921091836-0d8a64b9cc09
 | 
				
			||||||
	github.com/golang/sync v0.0.0-20180314180146-1d60e4601c6f
 | 
						github.com/golang/sync v0.0.0-20180314180146-1d60e4601c6f
 | 
				
			||||||
	github.com/google/go-cmp v0.5.7
 | 
						github.com/google/go-cmp v0.5.8
 | 
				
			||||||
	github.com/gophercloud/gophercloud v0.25.0
 | 
						github.com/gophercloud/gophercloud v0.25.0
 | 
				
			||||||
	github.com/hooklift/gowsdl v0.5.0
 | 
						github.com/hooklift/gowsdl v0.5.0
 | 
				
			||||||
	github.com/infobloxopen/infoblox-go-client/v2 v2.1.2-0.20220407114022-6f4c71443168
 | 
						github.com/infobloxopen/infoblox-go-client/v2 v2.1.2-0.20220407114022-6f4c71443168
 | 
				
			||||||
@ -48,26 +49,25 @@ require (
 | 
				
			|||||||
	github.com/projectcontour/contour v1.21.1
 | 
						github.com/projectcontour/contour v1.21.1
 | 
				
			||||||
	github.com/prometheus/client_golang v1.12.2
 | 
						github.com/prometheus/client_golang v1.12.2
 | 
				
			||||||
	github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20210127161313-bd30bebeac4f
 | 
						github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20210127161313-bd30bebeac4f
 | 
				
			||||||
	github.com/sirupsen/logrus v1.8.1
 | 
						github.com/sirupsen/logrus v1.9.0
 | 
				
			||||||
	github.com/stretchr/testify v1.7.0
 | 
						github.com/stretchr/testify v1.7.0
 | 
				
			||||||
	github.com/transip/gotransip/v6 v6.14.0
 | 
						github.com/transip/gotransip/v6 v6.17.0
 | 
				
			||||||
	github.com/ukfast/sdk-go v1.4.34
 | 
					 | 
				
			||||||
	github.com/ultradns/ultradns-sdk-go v0.0.0-20200616202852-e62052662f60
 | 
						github.com/ultradns/ultradns-sdk-go v0.0.0-20200616202852-e62052662f60
 | 
				
			||||||
	github.com/vinyldns/go-vinyldns v0.0.0-20200211145900-fe8a3d82e556
 | 
						github.com/vinyldns/go-vinyldns v0.0.0-20200211145900-fe8a3d82e556
 | 
				
			||||||
	github.com/vultr/govultr/v2 v2.14.1
 | 
						github.com/vultr/govultr/v2 v2.17.2
 | 
				
			||||||
	go.etcd.io/etcd/api/v3 v3.5.4
 | 
						go.etcd.io/etcd/api/v3 v3.5.4
 | 
				
			||||||
	go.etcd.io/etcd/client/v3 v3.5.2
 | 
						go.etcd.io/etcd/client/v3 v3.5.2
 | 
				
			||||||
	go.uber.org/ratelimit v0.2.0
 | 
						go.uber.org/ratelimit v0.2.0
 | 
				
			||||||
	golang.org/x/net v0.0.0-20220412020605-290c469a71a5
 | 
						golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e
 | 
				
			||||||
	golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5
 | 
						golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2
 | 
				
			||||||
	golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
 | 
						golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f
 | 
				
			||||||
	google.golang.org/api v0.74.0
 | 
						google.golang.org/api v0.93.0
 | 
				
			||||||
	gopkg.in/ns1/ns1-go.v2 v2.0.0-20190322154155-0dafb5275fd1
 | 
						gopkg.in/ns1/ns1-go.v2 v2.0.0-20190322154155-0dafb5275fd1
 | 
				
			||||||
	gopkg.in/yaml.v2 v2.4.0
 | 
						gopkg.in/yaml.v2 v2.4.0
 | 
				
			||||||
	istio.io/api v0.0.0-20210128181506-0c4b8e54850f
 | 
						istio.io/api v0.0.0-20210128181506-0c4b8e54850f
 | 
				
			||||||
	istio.io/client-go v0.0.0-20210128182905-ee2edd059e02
 | 
						istio.io/client-go v0.0.0-20210128182905-ee2edd059e02
 | 
				
			||||||
	k8s.io/api v0.24.1
 | 
						k8s.io/api v0.24.4
 | 
				
			||||||
	k8s.io/apimachinery v0.24.1
 | 
						k8s.io/apimachinery v0.24.4
 | 
				
			||||||
	k8s.io/client-go v0.24.1
 | 
						k8s.io/client-go v0.24.1
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -83,6 +83,7 @@ require (
 | 
				
			|||||||
	github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
 | 
						github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d // indirect
 | 
				
			||||||
	github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 // indirect
 | 
						github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 // indirect
 | 
				
			||||||
	github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
 | 
						github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 // indirect
 | 
				
			||||||
 | 
						github.com/ans-group/go-durationstring v1.2.0 // indirect
 | 
				
			||||||
	github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
 | 
						github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef // indirect
 | 
				
			||||||
	github.com/beorn7/perks v1.0.1 // indirect
 | 
						github.com/beorn7/perks v1.0.1 // indirect
 | 
				
			||||||
	github.com/cespare/xxhash/v2 v2.1.2 // indirect
 | 
						github.com/cespare/xxhash/v2 v2.1.2 // indirect
 | 
				
			||||||
@ -94,7 +95,7 @@ require (
 | 
				
			|||||||
	github.com/fsnotify/fsnotify v1.5.1 // indirect
 | 
						github.com/fsnotify/fsnotify v1.5.1 // indirect
 | 
				
			||||||
	github.com/go-logr/logr v1.2.0 // indirect
 | 
						github.com/go-logr/logr v1.2.0 // indirect
 | 
				
			||||||
	github.com/go-openapi/errors v0.19.8 // indirect
 | 
						github.com/go-openapi/errors v0.19.8 // indirect
 | 
				
			||||||
	github.com/go-openapi/strfmt v0.20.1 // indirect
 | 
						github.com/go-openapi/strfmt v0.20.2 // indirect
 | 
				
			||||||
	github.com/go-playground/locales v0.13.0 // indirect
 | 
						github.com/go-playground/locales v0.13.0 // indirect
 | 
				
			||||||
	github.com/go-playground/universal-translator v0.17.0 // indirect
 | 
						github.com/go-playground/universal-translator v0.17.0 // indirect
 | 
				
			||||||
	github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 // indirect
 | 
						github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 // indirect
 | 
				
			||||||
@ -106,13 +107,12 @@ require (
 | 
				
			|||||||
	github.com/golang/protobuf v1.5.2 // indirect
 | 
						github.com/golang/protobuf v1.5.2 // indirect
 | 
				
			||||||
	github.com/google/go-querystring v1.1.0 // indirect
 | 
						github.com/google/go-querystring v1.1.0 // indirect
 | 
				
			||||||
	github.com/google/gofuzz v1.2.0 // indirect
 | 
						github.com/google/gofuzz v1.2.0 // indirect
 | 
				
			||||||
	github.com/google/uuid v1.1.2 // indirect
 | 
						github.com/google/uuid v1.3.0 // indirect
 | 
				
			||||||
	github.com/googleapis/gax-go/v2 v2.2.0 // indirect
 | 
						github.com/googleapis/gax-go/v2 v2.4.0 // indirect
 | 
				
			||||||
	github.com/googleapis/gnostic v0.5.5 // indirect
 | 
					 | 
				
			||||||
	github.com/hashicorp/errwrap v1.0.0 // indirect
 | 
						github.com/hashicorp/errwrap v1.0.0 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
 | 
						github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-multierror v1.1.1 // indirect
 | 
						github.com/hashicorp/go-multierror v1.1.1 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-retryablehttp v0.7.0 // indirect
 | 
						github.com/hashicorp/go-retryablehttp v0.7.1 // indirect
 | 
				
			||||||
	github.com/hashicorp/go-uuid v1.0.2 // indirect
 | 
						github.com/hashicorp/go-uuid v1.0.2 // indirect
 | 
				
			||||||
	github.com/imdario/mergo v0.3.12 // indirect
 | 
						github.com/imdario/mergo v0.3.12 // indirect
 | 
				
			||||||
	github.com/jcmturner/aescts/v2 v2.0.0 // indirect
 | 
						github.com/jcmturner/aescts/v2 v2.0.0 // indirect
 | 
				
			||||||
@ -125,7 +125,6 @@ require (
 | 
				
			|||||||
	github.com/jmespath/go-jmespath v0.4.0 // indirect
 | 
						github.com/jmespath/go-jmespath v0.4.0 // indirect
 | 
				
			||||||
	github.com/json-iterator/go v1.1.12 // indirect
 | 
						github.com/json-iterator/go v1.1.12 // indirect
 | 
				
			||||||
	github.com/leodido/go-urn v1.2.0 // indirect
 | 
						github.com/leodido/go-urn v1.2.0 // indirect
 | 
				
			||||||
	github.com/mattn/go-isatty v0.0.14 // indirect
 | 
					 | 
				
			||||||
	github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
 | 
						github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 // indirect
 | 
				
			||||||
	github.com/mitchellh/go-homedir v1.1.0 // indirect
 | 
						github.com/mitchellh/go-homedir v1.1.0 // indirect
 | 
				
			||||||
	github.com/mitchellh/mapstructure v1.4.3 // indirect
 | 
						github.com/mitchellh/mapstructure v1.4.3 // indirect
 | 
				
			||||||
@ -144,7 +143,6 @@ require (
 | 
				
			|||||||
	github.com/spf13/pflag v1.0.5 // indirect
 | 
						github.com/spf13/pflag v1.0.5 // indirect
 | 
				
			||||||
	github.com/stretchr/objx v0.3.0 // indirect
 | 
						github.com/stretchr/objx v0.3.0 // indirect
 | 
				
			||||||
	github.com/terra-farm/udnssdk v1.3.5 // indirect
 | 
						github.com/terra-farm/udnssdk v1.3.5 // indirect
 | 
				
			||||||
	github.com/ukfast/go-durationstring v1.1.0 // indirect
 | 
					 | 
				
			||||||
	go.etcd.io/etcd/client/pkg/v3 v3.5.2 // indirect
 | 
						go.etcd.io/etcd/client/pkg/v3 v3.5.2 // indirect
 | 
				
			||||||
	go.mongodb.org/mongo-driver v1.5.1 // indirect
 | 
						go.mongodb.org/mongo-driver v1.5.1 // indirect
 | 
				
			||||||
	go.opencensus.io v0.23.0 // indirect
 | 
						go.opencensus.io v0.23.0 // indirect
 | 
				
			||||||
@ -153,16 +151,16 @@ require (
 | 
				
			|||||||
	go.uber.org/zap v1.19.1 // indirect
 | 
						go.uber.org/zap v1.19.1 // indirect
 | 
				
			||||||
	golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect
 | 
						golang.org/x/crypto v0.0.0-20220427172511-eb4f295cb31f // indirect
 | 
				
			||||||
	golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
 | 
						golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3 // indirect
 | 
				
			||||||
	golang.org/x/sys v0.0.0-20220412211240-33da011f77ad // indirect
 | 
						golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
 | 
				
			||||||
	golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
 | 
						golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
 | 
				
			||||||
	golang.org/x/text v0.3.7 // indirect
 | 
						golang.org/x/text v0.3.7 // indirect
 | 
				
			||||||
	golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
 | 
						golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 // indirect
 | 
				
			||||||
	golang.org/x/tools v0.1.10 // indirect
 | 
						golang.org/x/tools v0.1.10 // indirect
 | 
				
			||||||
	golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f // indirect
 | 
						golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect
 | 
				
			||||||
	google.golang.org/appengine v1.6.7 // indirect
 | 
						google.golang.org/appengine v1.6.7 // indirect
 | 
				
			||||||
	google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb // indirect
 | 
						google.golang.org/genproto v0.0.0-20220804142021-4e6b2dfa6612 // indirect
 | 
				
			||||||
	google.golang.org/grpc v1.45.0 // indirect
 | 
						google.golang.org/grpc v1.48.0 // indirect
 | 
				
			||||||
	google.golang.org/protobuf v1.28.0 // indirect
 | 
						google.golang.org/protobuf v1.28.1 // indirect
 | 
				
			||||||
	gopkg.in/go-playground/validator.v9 v9.31.0 // indirect
 | 
						gopkg.in/go-playground/validator.v9 v9.31.0 // indirect
 | 
				
			||||||
	gopkg.in/inf.v0 v0.9.1 // indirect
 | 
						gopkg.in/inf.v0 v0.9.1 // indirect
 | 
				
			||||||
	gopkg.in/ini.v1 v1.66.3 // indirect
 | 
						gopkg.in/ini.v1 v1.66.3 // indirect
 | 
				
			||||||
@ -183,36 +181,15 @@ require (
 | 
				
			|||||||
require (
 | 
					require (
 | 
				
			||||||
	github.com/PuerkitoBio/purell v1.1.1 // indirect
 | 
						github.com/PuerkitoBio/purell v1.1.1 // indirect
 | 
				
			||||||
	github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
 | 
						github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
 | 
				
			||||||
	github.com/ahmetb/gen-crd-api-reference-docs v0.3.0 // indirect
 | 
					 | 
				
			||||||
	github.com/emicklei/go-restful v2.9.5+incompatible // indirect
 | 
						github.com/emicklei/go-restful v2.9.5+incompatible // indirect
 | 
				
			||||||
	github.com/fatih/color v1.13.0 // indirect
 | 
					 | 
				
			||||||
	github.com/go-openapi/jsonpointer v0.19.5 // indirect
 | 
						github.com/go-openapi/jsonpointer v0.19.5 // indirect
 | 
				
			||||||
	github.com/go-openapi/jsonreference v0.19.5 // indirect
 | 
						github.com/go-openapi/jsonreference v0.19.5 // indirect
 | 
				
			||||||
	github.com/go-openapi/swag v0.19.14 // indirect
 | 
						github.com/go-openapi/swag v0.19.14 // indirect
 | 
				
			||||||
	github.com/gobuffalo/flect v0.2.3 // indirect
 | 
					 | 
				
			||||||
	github.com/google/gnostic v0.5.7-v3refs // indirect
 | 
						github.com/google/gnostic v0.5.7-v3refs // indirect
 | 
				
			||||||
	github.com/hashicorp/hcl v1.0.0 // indirect
 | 
						github.com/googleapis/enterprise-certificate-proxy v0.1.0 // indirect
 | 
				
			||||||
	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 | 
					 | 
				
			||||||
	github.com/josharian/intern v1.0.0 // indirect
 | 
						github.com/josharian/intern v1.0.0 // indirect
 | 
				
			||||||
	github.com/magiconair/properties v1.8.5 // indirect
 | 
					 | 
				
			||||||
	github.com/mailru/easyjson v0.7.6 // indirect
 | 
						github.com/mailru/easyjson v0.7.6 // indirect
 | 
				
			||||||
	github.com/mattn/go-colorable v0.1.12 // indirect
 | 
					 | 
				
			||||||
	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 | 
						github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
 | 
				
			||||||
	github.com/pelletier/go-toml v1.9.4 // indirect
 | 
					 | 
				
			||||||
	github.com/rs/zerolog v1.26.1 // indirect
 | 
					 | 
				
			||||||
	github.com/russross/blackfriday/v2 v2.1.0 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/afero v1.8.0 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/cast v1.4.1 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/cobra v1.3.0 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/jwalterweatherman v1.1.0 // indirect
 | 
					 | 
				
			||||||
	github.com/spf13/viper v1.10.1 // indirect
 | 
					 | 
				
			||||||
	github.com/subosito/gotenv v1.2.0 // indirect
 | 
					 | 
				
			||||||
	github.com/vektra/mockery/v2 v2.10.0 // indirect
 | 
					 | 
				
			||||||
	k8s.io/apiextensions-apiserver v0.23.0 // indirect
 | 
					 | 
				
			||||||
	k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c // indirect
 | 
					 | 
				
			||||||
	k8s.io/klog v1.0.0 // indirect
 | 
					 | 
				
			||||||
	sigs.k8s.io/controller-tools v0.6.2 // indirect
 | 
					 | 
				
			||||||
	sigs.k8s.io/kustomize/kyaml v0.10.17 // indirect
 | 
					 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
replace k8s.io/klog/v2 => github.com/Raffo/knolog v0.0.0-20211016155154-e4d5e0cc970a
 | 
					replace k8s.io/klog/v2 => github.com/Raffo/knolog v0.0.0-20211016155154-e4d5e0cc970a
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										201
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										201
									
								
								go.sum
									
									
									
									
									
								
							@ -31,6 +31,7 @@ cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Ud
 | 
				
			|||||||
cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
 | 
					cloud.google.com/go v0.98.0/go.mod h1:ua6Ush4NALrHk5QXDWnjvZHN93OuF0HfuEPq9I1X0cM=
 | 
				
			||||||
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
 | 
					cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
 | 
				
			||||||
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
 | 
					cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
 | 
				
			||||||
 | 
					cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
 | 
				
			||||||
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 | 
					cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
 | 
				
			||||||
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 | 
					cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
 | 
				
			||||||
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
 | 
					cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
 | 
				
			||||||
@ -39,12 +40,17 @@ cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4g
 | 
				
			|||||||
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 | 
					cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
 | 
				
			||||||
cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
 | 
					cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
 | 
				
			||||||
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
 | 
					cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
 | 
				
			||||||
cloud.google.com/go/compute v1.5.0 h1:b1zWmYuuHz7gO9kDcM/EpHGr06UgsYNRpNJzI2kFiLM=
 | 
					 | 
				
			||||||
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
 | 
					cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
 | 
				
			||||||
 | 
					cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
 | 
				
			||||||
 | 
					cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
 | 
				
			||||||
 | 
					cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
 | 
				
			||||||
 | 
					cloud.google.com/go/compute v1.9.0 h1:ED/FP4xv8GJw63v556/ASNc1CeeLUO2Bs8nzaHchkHg=
 | 
				
			||||||
 | 
					cloud.google.com/go/compute v1.9.0/go.mod h1:lWv1h/zUWTm/LozzfTJhBSkd6ShQq8la8VeeuOEGxfY=
 | 
				
			||||||
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 | 
					cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
 | 
				
			||||||
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 | 
					cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
 | 
				
			||||||
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 | 
					cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
 | 
				
			||||||
cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
 | 
					cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
 | 
				
			||||||
 | 
					cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
 | 
				
			||||||
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 | 
					cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
 | 
				
			||||||
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 | 
					cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
 | 
				
			||||||
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 | 
					cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
 | 
				
			||||||
@ -55,12 +61,12 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl
 | 
				
			|||||||
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 | 
					cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
 | 
				
			||||||
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 | 
					cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
 | 
				
			||||||
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
 | 
					cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
 | 
				
			||||||
 | 
					cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
 | 
				
			||||||
code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f h1:UrKzEwTgeiff9vxdrfdqxibzpWjxLnuXDI5m6z3GJAk=
 | 
					code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f h1:UrKzEwTgeiff9vxdrfdqxibzpWjxLnuXDI5m6z3GJAk=
 | 
				
			||||||
code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:sk5LnIjB/nIEU7yP5sDQExVm62wu0pBh3yrElngUisI=
 | 
					code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f/go.mod h1:sk5LnIjB/nIEU7yP5sDQExVm62wu0pBh3yrElngUisI=
 | 
				
			||||||
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
					dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
 | 
				
			||||||
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
 | 
					gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
 | 
				
			||||||
git.lukeshu.com/go/libsystemd v0.5.3/go.mod h1:FfDoP0i92r4p5Vn4NCLxvjkd7rCOe6otPa4L6hZg9WM=
 | 
					git.lukeshu.com/go/libsystemd v0.5.3/go.mod h1:FfDoP0i92r4p5Vn4NCLxvjkd7rCOe6otPa4L6hZg9WM=
 | 
				
			||||||
github.com/0x4c6565/genie v1.0.0/go.mod h1:fDOjW0hFamMWOIkh4irf2D/TZpXXWMFtpP8MfgK0N3c=
 | 
					 | 
				
			||||||
github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 | 
					github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 | 
				
			||||||
github.com/Azure/azure-sdk-for-go v56.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 | 
					github.com/Azure/azure-sdk-for-go v56.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
 | 
				
			||||||
github.com/Azure/azure-sdk-for-go v61.5.0+incompatible h1:OSHSFeNm7D1InGsQrFjyN9hpxD5Ec60PdsWWudCpah4=
 | 
					github.com/Azure/azure-sdk-for-go v61.5.0+incompatible h1:OSHSFeNm7D1InGsQrFjyN9hpxD5Ec60PdsWWudCpah4=
 | 
				
			||||||
@ -108,12 +114,12 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym
 | 
				
			|||||||
github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 | 
					github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 | 
				
			||||||
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 | 
					github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
 | 
				
			||||||
github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 | 
					github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
 | 
				
			||||||
github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.8.1 h1:Nvwzsp7e0j9hj7JQ0ZJ0UkD6XMaryA/G4zDbJsRmGnw=
 | 
					github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.11.0 h1:75KEvjN+5lXcFzvW7RBoZY1YALJSNctcXFEfUyFz5Vo=
 | 
				
			||||||
github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.8.1/go.mod h1:RiUvKuHKTBmBApDMUQzBL14pQUGKcx/IioKQPIcRQjs=
 | 
					github.com/IBM-Cloud/ibm-cloud-cli-sdk v0.11.0/go.mod h1:+GAqrO/rFsYnhzTIxYLXCHxHVZyrtzBLyKjV6hi73YQ=
 | 
				
			||||||
github.com/IBM/go-sdk-core/v5 v5.6.5 h1:zXlt5x/udqZTD617SKUQzPDON4x5y0+22vNxsdCGYpg=
 | 
					github.com/IBM/go-sdk-core/v5 v5.8.0 h1:Bn9BxTaKYKWpd+BDpVsL6XOOJl4QDgxux4gSdWi31vE=
 | 
				
			||||||
github.com/IBM/go-sdk-core/v5 v5.6.5/go.mod h1:tt/B9rxLkRtglE7pvqLuYikgCXaZFL3btdruJaoUeek=
 | 
					github.com/IBM/go-sdk-core/v5 v5.8.0/go.mod h1:+YbdhrjCHC84ls4MeBp+Hj4NZCni+tDAc0XQUqRO9Jc=
 | 
				
			||||||
github.com/IBM/networking-go-sdk v0.24.0 h1:3AE23TBbcsB/2c15kuHuAnXlUom5FHMqxGxBRA94WS8=
 | 
					github.com/IBM/networking-go-sdk v0.32.0 h1:QWd7CxC+Wzap+zWFfXMjbqB5LpvrB1KvNtIbKrWIkhA=
 | 
				
			||||||
github.com/IBM/networking-go-sdk v0.24.0/go.mod h1:vX/4URo6J6e6QCDhsntk6OAA4G27jp+v3+ZMb9WyBQY=
 | 
					github.com/IBM/networking-go-sdk v0.32.0/go.mod h1:tVxXclpQs8nQJYPTr9ZPNC1voaPNQLy8iy/72oVfFtM=
 | 
				
			||||||
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 | 
					github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
 | 
				
			||||||
github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
 | 
					github.com/MakeNowJust/heredoc v0.0.0-20170808103936-bb23615498cd/go.mod h1:64YHyfSL2R96J44Nlwm39UHepQbyR5q10x7iYa1ks2E=
 | 
				
			||||||
github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 | 
					github.com/Masterminds/goutils v1.1.0/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=
 | 
				
			||||||
@ -157,7 +163,6 @@ github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/
 | 
				
			|||||||
github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 | 
					github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c=
 | 
				
			||||||
github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
 | 
					github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM=
 | 
				
			||||||
github.com/ahmetb/gen-crd-api-reference-docs v0.2.1-0.20201224172655-df869c1245d4/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8=
 | 
					github.com/ahmetb/gen-crd-api-reference-docs v0.2.1-0.20201224172655-df869c1245d4/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8=
 | 
				
			||||||
github.com/ahmetb/gen-crd-api-reference-docs v0.3.0 h1:+XfOU14S4bGuwyvCijJwhhBIjYN+YXS18jrCY2EzJaY=
 | 
					 | 
				
			||||||
github.com/ahmetb/gen-crd-api-reference-docs v0.3.0/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8=
 | 
					github.com/ahmetb/gen-crd-api-reference-docs v0.3.0/go.mod h1:TdjdkYhlOifCQWPs1UdTma97kQQMozf5h26hTuG70u8=
 | 
				
			||||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 | 
					github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 | 
				
			||||||
github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 | 
					github.com/ajstarks/svgo v0.0.0-20210923152817-c3b6e2f0c527/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 | 
				
			||||||
@ -181,12 +186,16 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d h1:UQZhZ2O0vMHr2c
 | 
				
			|||||||
github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 | 
					github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
 | 
				
			||||||
github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 h1:P5U+E4x5OkVEKQDklVPmzs71WM56RTTRqV4OrDC//Y4=
 | 
					github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 h1:P5U+E4x5OkVEKQDklVPmzs71WM56RTTRqV4OrDC//Y4=
 | 
				
			||||||
github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5/go.mod h1:976q2ETgjT2snVCf2ZaBnyBbVoPERGjUz+0sofzEfro=
 | 
					github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5/go.mod h1:976q2ETgjT2snVCf2ZaBnyBbVoPERGjUz+0sofzEfro=
 | 
				
			||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483 h1:J8HaD+Zpfi1gcel3HCKpoHHEsrcuRrZlSnx7R9SCf5I=
 | 
					github.com/aliyun/alibaba-cloud-sdk-go v1.61.1742 h1:1pBiWcgrwB5LN52SXAn6rHN3dIBOTQ+7Mk+ctQ0/+ZA=
 | 
				
			||||||
github.com/aliyun/alibaba-cloud-sdk-go v1.61.1483/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
 | 
					github.com/aliyun/alibaba-cloud-sdk-go v1.61.1742/go.mod h1:RcDobYh8k5VP6TNybz9m++gL3ijVI5wueVr0EM10VsU=
 | 
				
			||||||
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI=
 | 
					github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129 h1:MzBOUgng9orim59UnfUTLRjMpd09C5uEVQ6RPGeCaVI=
 | 
				
			||||||
github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
 | 
					github.com/andres-erbsen/clock v0.0.0-20160526145045-9e14626cd129/go.mod h1:rFgpPQZYZ8vdbc+48xibu8ALc3yeyd64IhHS+PU6Yyg=
 | 
				
			||||||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 | 
					github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
 | 
				
			||||||
github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6/go.mod h1:+lx6/Aqd1kLJ1GQfkvOnaZ1WGmLpMpbprPuIOOZX30U=
 | 
					github.com/andybalholm/brotli v0.0.0-20190621154722-5f990b63d2d6/go.mod h1:+lx6/Aqd1kLJ1GQfkvOnaZ1WGmLpMpbprPuIOOZX30U=
 | 
				
			||||||
 | 
					github.com/ans-group/go-durationstring v1.2.0 h1:UJIuQATkp0t1rBvZsHRwki33YHV9E+Ulro+3NbMB7MM=
 | 
				
			||||||
 | 
					github.com/ans-group/go-durationstring v1.2.0/go.mod h1:QGF9Mdpq9058QXaut8r55QWu6lcHX6i/GvF1PZVkV6o=
 | 
				
			||||||
 | 
					github.com/ans-group/sdk-go v1.8.1 h1:PHPcYHujevWvCMiI7ujXvvrYHf5zpHIcZw7FfJ1rXw0=
 | 
				
			||||||
 | 
					github.com/ans-group/sdk-go v1.8.1/go.mod h1:XSKXEDfKobnDtZoyia5DhJxxaDMcCjr76e1KJ9dU/xc=
 | 
				
			||||||
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 | 
					github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 | 
				
			||||||
github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 | 
					github.com/antlr/antlr4/runtime/Go/antlr v0.0.0-20210826220005-b48c857c3a0e/go.mod h1:F7bn7fEU90QkQ3tnmaTx3LTKLEDqnwWODIYppRQ5hnY=
 | 
				
			||||||
github.com/aokoli/goutils v1.1.0/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ=
 | 
					github.com/aokoli/goutils v1.1.0/go.mod h1:SijmP0QR8LtwsmDs8Yii5Z/S4trXFGFC2oO5g9DP+DQ=
 | 
				
			||||||
@ -215,8 +224,8 @@ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
 | 
				
			|||||||
github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
 | 
					github.com/aws/aws-sdk-go v1.30.27/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
 | 
				
			||||||
github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
 | 
					github.com/aws/aws-sdk-go v1.34.28/go.mod h1:H7NKnBqNVzoTJpGfLrQkkD+ytBA93eiDYi/+8rV9s48=
 | 
				
			||||||
github.com/aws/aws-sdk-go v1.40.14/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
 | 
					github.com/aws/aws-sdk-go v1.40.14/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q=
 | 
				
			||||||
github.com/aws/aws-sdk-go v1.42.52 h1:/+TZ46+0qu9Ph/UwjVrU3SG8OBi87uJLrLiYRNZKbHQ=
 | 
					github.com/aws/aws-sdk-go v1.44.81 h1:C8oBZ+a+ka0qk3Q24MohQIFq0tkbO8IAu5tfpAMKVWE=
 | 
				
			||||||
github.com/aws/aws-sdk-go v1.42.52/go.mod h1:OGr6lGMAKGlG9CVrYnWYDKIyb829c6EVBRjxqjmPepc=
 | 
					github.com/aws/aws-sdk-go v1.44.81/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo=
 | 
				
			||||||
github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 | 
					github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
 | 
				
			||||||
github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
					github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM=
 | 
				
			||||||
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
					github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
 | 
				
			||||||
@ -251,7 +260,6 @@ github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA
 | 
				
			|||||||
github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 | 
					github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 | 
				
			||||||
github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 | 
					github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA=
 | 
				
			||||||
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
					github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY=
 | 
					 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
					github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
 | 
					github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
 | 
				
			||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
					github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
 | 
				
			||||||
@ -332,7 +340,6 @@ github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2
 | 
				
			|||||||
github.com/datawire/ambassador v1.6.0 h1:4KduhY/wqtv0jK8sMVQNtENHy9fmoXugsuFp/UrM0Ts=
 | 
					github.com/datawire/ambassador v1.6.0 h1:4KduhY/wqtv0jK8sMVQNtENHy9fmoXugsuFp/UrM0Ts=
 | 
				
			||||||
github.com/datawire/ambassador v1.6.0/go.mod h1:mV5EhoG/NnHBsffmLnjrq+x4ZNkYDWFZXW9R+AueUiE=
 | 
					github.com/datawire/ambassador v1.6.0/go.mod h1:mV5EhoG/NnHBsffmLnjrq+x4ZNkYDWFZXW9R+AueUiE=
 | 
				
			||||||
github.com/datawire/pf v0.0.0-20180510150411-31a823f9495a/go.mod h1:H8uUmE8qqo7z9u30MYB9riLyRckPHOPBk9ZdCuH+dQQ=
 | 
					github.com/datawire/pf v0.0.0-20180510150411-31a823f9495a/go.mod h1:H8uUmE8qqo7z9u30MYB9riLyRckPHOPBk9ZdCuH+dQQ=
 | 
				
			||||||
github.com/dave/jennifer v1.4.1/go.mod h1:7jEdnm+qBcxl8PC0zyp7vxcpSRnzXSt9r39tpTVGlwA=
 | 
					 | 
				
			||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
					github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
				
			||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
					github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
				
			||||||
@ -346,8 +353,6 @@ github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11
 | 
				
			|||||||
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
					github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 | 
				
			||||||
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
					github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
 | 
				
			||||||
github.com/digitalocean/godo v1.64.2/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU=
 | 
					github.com/digitalocean/godo v1.64.2/go.mod h1:p7dOjjtSBqCTUksqtA5Fd3uaKs9kyTq2xcz76ulEJRU=
 | 
				
			||||||
github.com/digitalocean/godo v1.75.0 h1:UijUv60I095CqJqGKdjY2RTPnnIa4iFddmq+1wfyS4Y=
 | 
					 | 
				
			||||||
github.com/digitalocean/godo v1.75.0/go.mod h1:GBmu8MkjZmNARE7IXRPmkbbnocNN8+uBm0xbEVw2LCs=
 | 
					 | 
				
			||||||
github.com/digitalocean/godo v1.81.0 h1:sjb3fOfPfSlUQUK22E87BcI8Zx2qtnF7VUCCO4UK3C8=
 | 
					github.com/digitalocean/godo v1.81.0 h1:sjb3fOfPfSlUQUK22E87BcI8Zx2qtnF7VUCCO4UK3C8=
 | 
				
			||||||
github.com/digitalocean/godo v1.81.0/go.mod h1:BPCqvwbjbGqxuUnIKB4EvS/AX7IDnNmt5fwvIkWo+ew=
 | 
					github.com/digitalocean/godo v1.81.0/go.mod h1:BPCqvwbjbGqxuUnIKB4EvS/AX7IDnNmt5fwvIkWo+ew=
 | 
				
			||||||
github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
 | 
					github.com/dnaeon/go-vcr v1.0.1 h1:r8L/HqC0Hje5AXMu1ooW8oyQyOFv4GxqpL0nRP7SLLY=
 | 
				
			||||||
@ -396,6 +401,7 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m
 | 
				
			|||||||
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 | 
					github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
 | 
					github.com/envoyproxy/go-control-plane v0.10.1/go.mod h1:AY7fTTXNdv/aJ2O5jwpxAPOWUZ7hQAEvzN5Pf27BkQQ=
 | 
				
			||||||
github.com/envoyproxy/go-control-plane v0.10.2-0.20220112105034-1553555e45ad/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 | 
					github.com/envoyproxy/go-control-plane v0.10.2-0.20220112105034-1553555e45ad/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 | 
				
			||||||
 | 
					github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.3.0-java.0.20200609174644-bd816e4522c1/go.mod h1:bjmEhrMDubXDd0uKxnWwRmgSsiEv2CkJliIHnj6ETm8=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.3.0-java.0.20200609174644-bd816e4522c1/go.mod h1:bjmEhrMDubXDd0uKxnWwRmgSsiEv2CkJliIHnj6ETm8=
 | 
				
			||||||
github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
 | 
					github.com/envoyproxy/protoc-gen-validate v0.6.2/go.mod h1:2t7qjJNvHPx8IjnBOzl9E9/baC+qXE/TeeyBRzgJDws=
 | 
				
			||||||
@ -412,7 +418,6 @@ github.com/exponent-io/jsonpath v0.0.0-20151013193312-d6023ce2651d/go.mod h1:ZZM
 | 
				
			|||||||
github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
 | 
					github.com/fatih/camelcase v1.0.0/go.mod h1:yN2Sb0lFhZJUdVvtELVWefmrXpuZESvPmqwoZc+/fpc=
 | 
				
			||||||
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
					github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
 | 
				
			||||||
github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 | 
					github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 | 
				
			||||||
github.com/fatih/color v1.12.0 h1:mRhaKNwANqRgUBGKmnI5ZxEk7QXmjQeCcuYFMX2bfcc=
 | 
					 | 
				
			||||||
github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 | 
					github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM=
 | 
				
			||||||
github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 | 
					github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w=
 | 
				
			||||||
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 | 
					github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
 | 
				
			||||||
@ -521,8 +526,8 @@ github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pL
 | 
				
			|||||||
github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 | 
					github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
					github.com/go-openapi/strfmt v0.19.3/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
					github.com/go-openapi/strfmt v0.19.5/go.mod h1:eftuHTlB/dI8Uq8JJOyRlieZf+WkkxUuk0dgdHXr2Qk=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.20.1 h1:1VgxvehFne1mbChGeCmZ5pc0LxUf6yaACVSIYAR91Xc=
 | 
					github.com/go-openapi/strfmt v0.20.2 h1:6XZL+fF4VZYFxKQGLAUB358hOrRh/wS51uWEtlONADE=
 | 
				
			||||||
github.com/go-openapi/strfmt v0.20.1/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk=
 | 
					github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk=
 | 
				
			||||||
github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
 | 
					github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I=
 | 
				
			||||||
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
					github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
 | 
				
			||||||
@ -535,10 +540,8 @@ github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2K
 | 
				
			|||||||
github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
 | 
					github.com/go-openapi/validate v0.19.5/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
 | 
				
			||||||
github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
 | 
					github.com/go-openapi/validate v0.19.8/go.mod h1:8DJv2CVJQ6kGNpFW6eV9N3JviE1C85nY1c2z52x1Gk4=
 | 
				
			||||||
github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
 | 
					github.com/go-pdf/fpdf v0.5.0/go.mod h1:HzcnA+A23uwogo0tp9yU+l3V+KXhiESpt1PMayhOh5M=
 | 
				
			||||||
github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM=
 | 
					 | 
				
			||||||
github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
 | 
					github.com/go-playground/locales v0.13.0 h1:HyWk6mgj5qFqCT5fjGBuRArbVDfE4hi8+e8ceBS/t7Q=
 | 
				
			||||||
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
 | 
					github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
 | 
				
			||||||
github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY=
 | 
					 | 
				
			||||||
github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
 | 
					github.com/go-playground/universal-translator v0.17.0 h1:icxd5fm+REJzpZx7ZfpaD876Lmtgy7VtROAbHHXk8no=
 | 
				
			||||||
github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
 | 
					github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
 | 
				
			||||||
github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY=
 | 
					github.com/go-resty/resty/v2 v2.1.1-0.20191201195748-d7b97669fe48 h1:JVrqSeQfdhYRFk24TvhTZWU0q8lfCojxZQFi3Ou7+uY=
 | 
				
			||||||
@ -564,7 +567,6 @@ github.com/gobuffalo/flect v0.1.1/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj
 | 
				
			|||||||
github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
					github.com/gobuffalo/flect v0.1.3/go.mod h1:8JCgGVbRjJhVgD6399mQr4fx5rRfGKVzFjbj6RE/9UI=
 | 
				
			||||||
github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
 | 
					github.com/gobuffalo/flect v0.2.0/go.mod h1:W3K3X9ksuZfir8f/LrfVtWmCDQFfayuylOJ7sz/Fj80=
 | 
				
			||||||
github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
 | 
					github.com/gobuffalo/flect v0.2.2/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
 | 
				
			||||||
github.com/gobuffalo/flect v0.2.3 h1:f/ZukRnSNA/DUpSNDadko7Qc0PhGvsew35p/2tu+CRY=
 | 
					 | 
				
			||||||
github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
 | 
					github.com/gobuffalo/flect v0.2.3/go.mod h1:vmkQwuZYhN5Pc4ljYQZzP+1sq+NEkK+lh20jmEmX3jc=
 | 
				
			||||||
github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
					github.com/gobuffalo/genny v0.0.0-20190329151137-27723ad26ef9/go.mod h1:rWs4Z12d1Zbf19rlsn0nurr75KqhYp52EAGGxTbBhNk=
 | 
				
			||||||
github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
					github.com/gobuffalo/genny v0.0.0-20190403191548-3ca520ef0d9e/go.mod h1:80lIj3kVJWwOrXWWMRzzdhW3DsrdjILVil/SFKBzF28=
 | 
				
			||||||
@ -675,8 +677,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 | 
				
			|||||||
github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
					github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
 | 
				
			||||||
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
 | 
					 | 
				
			||||||
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 | 
					github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
 | 
				
			||||||
 | 
					github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
 | 
				
			||||||
github.com/google/go-github/v39 v39.0.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE=
 | 
					github.com/google/go-github/v39 v39.0.0/go.mod h1:C1s8C5aCC9L+JXIYpJM5GYytdX52vC1bLvHEF1IhBrE=
 | 
				
			||||||
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 | 
					github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
 | 
				
			||||||
github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 | 
					github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
 | 
				
			||||||
@ -710,26 +713,30 @@ github.com/google/shlex v0.0.0-20181106134648-c34317bd91bf/go.mod h1:RpwtwJQFrIE
 | 
				
			|||||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
 | 
					github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
 | 
				
			||||||
github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
github.com/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y=
 | 
					 | 
				
			||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
					github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
 | 
				
			||||||
 | 
					github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
 | 
				
			||||||
 | 
					github.com/googleapis/enterprise-certificate-proxy v0.0.0-20220520183353-fd19c99a87aa/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
				
			||||||
 | 
					github.com/googleapis/enterprise-certificate-proxy v0.1.0 h1:zO8WHNx/MYiAKJ3d5spxZXZE6KHmIQGQcAzwUzV7qQw=
 | 
				
			||||||
 | 
					github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY7t0e+Ei9b45FFGA3fBs3x36SsCg1hq8=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
					github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
					github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
 | 
					github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
 | 
					github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.2.0 h1:s7jOdKSaksJVOxE0Y/S32otcfiP+UQ0cL8/GTKaONwE=
 | 
					 | 
				
			||||||
github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
 | 
					github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
 | 
				
			||||||
 | 
					github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
 | 
				
			||||||
 | 
					github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk=
 | 
				
			||||||
 | 
					github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
 | 
				
			||||||
github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 | 
					github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 | 
				
			||||||
github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 | 
					github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY=
 | 
				
			||||||
github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
 | 
					github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU=
 | 
				
			||||||
github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 | 
					github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg=
 | 
				
			||||||
github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 | 
					github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU=
 | 
				
			||||||
github.com/googleapis/gnostic v0.5.5 h1:9fHAtK0uDfpveeqqo1hkEZJcFvYXAiCN3UutL8F9xHw=
 | 
					 | 
				
			||||||
github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 | 
					github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA=
 | 
				
			||||||
 | 
					github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4=
 | 
				
			||||||
github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 | 
					github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
 | 
				
			||||||
github.com/gookit/color v1.2.3/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
 | 
					github.com/gookit/color v1.2.3/go.mod h1:AhIE+pS6D4Ql0SQWbBeXPHw7gY0/sjHoA4s/n1KB7xg=
 | 
				
			||||||
github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 | 
					github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8=
 | 
				
			||||||
github.com/gophercloud/gophercloud v0.22.0 h1:9lFISNLafZcecT0xUveIMt3IafexC6DIV9ek1SZdSMw=
 | 
					 | 
				
			||||||
github.com/gophercloud/gophercloud v0.22.0/go.mod h1:wRtmUelyIIv3CSSDI47aUwbs075O6i+LY+pXsKCBsb4=
 | 
					 | 
				
			||||||
github.com/gophercloud/gophercloud v0.25.0 h1:C3Oae7y0fUVQGSsBrb3zliAjdX+riCSEh4lNMejFNI4=
 | 
					github.com/gophercloud/gophercloud v0.25.0 h1:C3Oae7y0fUVQGSsBrb3zliAjdX+riCSEh4lNMejFNI4=
 | 
				
			||||||
github.com/gophercloud/gophercloud v0.25.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c=
 | 
					github.com/gophercloud/gophercloud v0.25.0/go.mod h1:Q8fZtyi5zZxPS/j9aj3sSxtvj41AdQMDwyo1myduD5c=
 | 
				
			||||||
github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
					github.com/gopherjs/gopherjs v0.0.0-20180628210949-0892b62f0d9f/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
 | 
				
			||||||
@ -773,7 +780,6 @@ github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FK
 | 
				
			|||||||
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
 | 
					github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
 | 
				
			||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 | 
					github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
					github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
					github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
 | 
					github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
 | 
				
			||||||
github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 | 
					github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
 | 
				
			||||||
@ -781,7 +787,6 @@ github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9
 | 
				
			|||||||
github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 | 
					github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
					github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
					github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
				
			||||||
github.com/hashicorp/go-hclog v0.16.1 h1:IVQwpTGNRRIHafnTs2dQLIk4ENtneRIEEJWOVDqz99o=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
					github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
				
			||||||
github.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo=
 | 
					github.com/hashicorp/go-hclog v1.0.0 h1:bkKf0BeBXcSYa7f5Fyi9gMuQ8gNsxeiNpZjR6VxNZeo=
 | 
				
			||||||
github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
					github.com/hashicorp/go-hclog v1.0.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
 | 
				
			||||||
@ -799,8 +804,9 @@ github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn
 | 
				
			|||||||
github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
 | 
					github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.2/go.mod h1:gEx6HMUGxYYhJScX7W1Il64m6cc2C1mDaW3NQ9sY1FY=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
					github.com/hashicorp/go-retryablehttp v0.6.6/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.7.0 h1:eu1EI/mbirUgP5C8hVsTNaGZreBDlYiwC1FZWkvQPQ4=
 | 
					 | 
				
			||||||
github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
					github.com/hashicorp/go-retryablehttp v0.7.0/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-retryablehttp v0.7.1 h1:sUiuQAnLlbvmExtFQs72iFW/HXeUn8Z1aJLQ4LJJbTQ=
 | 
				
			||||||
 | 
					github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY=
 | 
				
			||||||
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 | 
					github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
 | 
				
			||||||
github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 | 
					github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 | 
				
			||||||
github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 | 
					github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
 | 
				
			||||||
@ -818,7 +824,6 @@ github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ
 | 
				
			|||||||
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
					github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
					github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
				
			||||||
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
					github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
 | 
					 | 
				
			||||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
					github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 | 
				
			||||||
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
					github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
 | 
				
			||||||
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 | 
					github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
 | 
				
			||||||
@ -852,7 +857,6 @@ github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH
 | 
				
			|||||||
github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 | 
					github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 | 
				
			||||||
github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 | 
					github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU=
 | 
				
			||||||
github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 | 
					github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA=
 | 
				
			||||||
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
 | 
					 | 
				
			||||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
					github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
 | 
				
			||||||
github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
 | 
					github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo=
 | 
				
			||||||
github.com/infobloxopen/infoblox-go-client/v2 v2.1.2-0.20220407114022-6f4c71443168 h1:EXKtVoP/44ckXpw3v2/vrtMEdKx/PA+YBl+REoV27XQ=
 | 
					github.com/infobloxopen/infoblox-go-client/v2 v2.1.2-0.20220407114022-6f4c71443168 h1:EXKtVoP/44ckXpw3v2/vrtMEdKx/PA+YBl+REoV27XQ=
 | 
				
			||||||
@ -937,7 +941,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
 | 
				
			|||||||
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
					github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
 | 
				
			||||||
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
 | 
					github.com/lann/builder v0.0.0-20180802200727-47ae307949d0/go.mod h1:dXGbAdH5GtBTC4WfIxhKZfyBF/HBFgRZSWwZ9g/He9o=
 | 
				
			||||||
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
 | 
					github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0/go.mod h1:vmVJ0l/dxyfGW6FmdpVm2joNMFikkuWg0EoCKLGUMNw=
 | 
				
			||||||
github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw=
 | 
					 | 
				
			||||||
github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
 | 
					github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y=
 | 
				
			||||||
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
 | 
					github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
 | 
				
			||||||
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
					github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 | 
				
			||||||
@ -959,7 +962,6 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q
 | 
				
			|||||||
github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
 | 
					github.com/magefile/mage v1.10.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
 | 
				
			||||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
					github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
				
			||||||
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
					github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 | 
				
			||||||
github.com/magiconair/properties v1.8.5 h1:b6kJs+EmPFMYGkow9GiUyCyOvIwYetYJ3fSaWak/Gls=
 | 
					 | 
				
			||||||
github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 | 
					github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
					github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
 | 
				
			||||||
@ -979,7 +981,6 @@ github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaO
 | 
				
			|||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
					github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
					github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
 | 
					 | 
				
			||||||
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
					github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
					github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 | 
				
			||||||
github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
 | 
					github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40=
 | 
				
			||||||
@ -1032,7 +1033,6 @@ github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:F
 | 
				
			|||||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
					github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
					github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
					github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag=
 | 
					 | 
				
			||||||
github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
					github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
 | 
					github.com/mitchellh/mapstructure v1.4.3 h1:OVowDSCllw/YjdLkam3/sm7wEtOy59d8ndGgCcyj8cs=
 | 
				
			||||||
github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
					github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
 | 
				
			||||||
@ -1110,7 +1110,6 @@ github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7J
 | 
				
			|||||||
github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
 | 
					github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
 | 
				
			||||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
					github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
				
			||||||
github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
					github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
				
			||||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
 | 
					 | 
				
			||||||
github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
 | 
					github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48=
 | 
				
			||||||
github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
 | 
					github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY=
 | 
				
			||||||
github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
 | 
					github.com/onsi/gomega v1.14.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0=
 | 
				
			||||||
@ -1160,7 +1159,6 @@ github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtP
 | 
				
			|||||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
					github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 | 
				
			||||||
github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 | 
					github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
 | 
				
			||||||
github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
					github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
				
			||||||
github.com/pelletier/go-toml v1.9.4 h1:tjENF6MfZAg8e4ZmZTeWaWiT2vXtsoO6+iuOjFhECwM=
 | 
					 | 
				
			||||||
github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
					github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c=
 | 
				
			||||||
github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 | 
					github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac=
 | 
				
			||||||
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 | 
					github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
 | 
				
			||||||
@ -1185,8 +1183,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
 | 
				
			|||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 | 
					github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
 | 
				
			||||||
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
 | 
					github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
 | 
				
			||||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 | 
					github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
 | 
				
			||||||
github.com/projectcontour/contour v1.20.1 h1:HpGlFhy+qH25b0SJDQmMCNORFEXTaEwVK9K/TJc4Xkc=
 | 
					 | 
				
			||||||
github.com/projectcontour/contour v1.20.1/go.mod h1:AEl8+/Hs8w4xC7LE5pReiUUaqLXUka/+daJ1mE7sp1E=
 | 
					 | 
				
			||||||
github.com/projectcontour/contour v1.21.1 h1:Lg7zVoEcQJO/qOsWSBP7EEpgzNaMcZ3+LHoyjlZP3Pk=
 | 
					github.com/projectcontour/contour v1.21.1 h1:Lg7zVoEcQJO/qOsWSBP7EEpgzNaMcZ3+LHoyjlZP3Pk=
 | 
				
			||||||
github.com/projectcontour/contour v1.21.1/go.mod h1:vSI1H0qtwmvVenPsGSsZVRn75aIXoFPf7TTvyjnoGOU=
 | 
					github.com/projectcontour/contour v1.21.1/go.mod h1:vSI1H0qtwmvVenPsGSsZVRn75aIXoFPf7TTvyjnoGOU=
 | 
				
			||||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
					github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
 | 
				
			||||||
@ -1200,7 +1196,6 @@ github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3O
 | 
				
			|||||||
github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4=
 | 
					github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4=
 | 
				
			||||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 | 
					github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
 | 
				
			||||||
github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 | 
					github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 | 
				
			||||||
github.com/prometheus/client_golang v1.11.1 h1:+4eQaD7vAZ6DsfsxB15hbE0odUjGI5ARs9yskGu1v4s=
 | 
					 | 
				
			||||||
github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 | 
					github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
 | 
				
			||||||
github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
 | 
					github.com/prometheus/client_golang v1.12.2 h1:51L9cDoUHVrXx4zWYlcLQIZ+d+VXHgqnYKkIuq4g/34=
 | 
				
			||||||
github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
 | 
					github.com/prometheus/client_golang v1.12.2/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY=
 | 
				
			||||||
@ -1222,7 +1217,6 @@ github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt2
 | 
				
			|||||||
github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
 | 
					github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
 | 
				
			||||||
github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 | 
					github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
 | 
				
			||||||
github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
 | 
					github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
 | 
				
			||||||
github.com/prometheus/common v0.28.0 h1:vGVfV9KrDTvWt5boZO0I19g2E3CsWfpPPKZM9dt3mEw=
 | 
					 | 
				
			||||||
github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 | 
					github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 | 
				
			||||||
github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
 | 
					github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4=
 | 
				
			||||||
github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 | 
					github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
 | 
				
			||||||
@ -1237,7 +1231,6 @@ github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+Gx
 | 
				
			|||||||
github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
					github.com/prometheus/procfs v0.0.11/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
					github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
					github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU=
 | 
				
			||||||
github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4=
 | 
					 | 
				
			||||||
github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
					github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
				
			||||||
github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
 | 
					github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU=
 | 
				
			||||||
github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
					github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA=
 | 
				
			||||||
@ -1252,17 +1245,12 @@ github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE
 | 
				
			|||||||
github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
					github.com/rogpeppe/go-internal v1.4.0/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
 | 
					github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k=
 | 
				
			||||||
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
					github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
 | 
				
			||||||
github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ=
 | 
					 | 
				
			||||||
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 | 
					github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
 | 
				
			||||||
github.com/rs/zerolog v1.18.0/go.mod h1:9nvC1axdVrAHcu/s9taAVfBuIdTZLVQmKQyvrUjF5+I=
 | 
					 | 
				
			||||||
github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc=
 | 
					 | 
				
			||||||
github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc=
 | 
					github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc=
 | 
				
			||||||
github.com/rubenv/sql-migrate v0.0.0-20200212082348-64f95ea68aa3/go.mod h1:rtQlpHw+eR6UrqaS3kX1VYeaCxzCVdimDS7g5Ln4pPc=
 | 
					github.com/rubenv/sql-migrate v0.0.0-20200212082348-64f95ea68aa3/go.mod h1:rtQlpHw+eR6UrqaS3kX1VYeaCxzCVdimDS7g5Ln4pPc=
 | 
				
			||||||
github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg=
 | 
					github.com/rubenv/sql-migrate v0.0.0-20200616145509-8d140a17f351/go.mod h1:DCgfY80j8GYL7MLEfvcpSFvjD0L5yZq/aZUJmhZklyg=
 | 
				
			||||||
github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo=
 | 
					 | 
				
			||||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
					github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
 | 
					 | 
				
			||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
					github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
 | 
				
			||||||
github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
 | 
					github.com/ruudk/golang-pdf417 v0.0.0-20181029194003-1af4ab5afa58/go.mod h1:6lfFZQK844Gfx8o5WFuvpxWRwnSoipWe/p622j1v06w=
 | 
				
			||||||
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
 | 
					github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245/go.mod h1:pQAZKsJ8yyVxGRWYNEm9oFB8ieLgKFnamEyDmSA0BRk=
 | 
				
			||||||
@ -1290,8 +1278,9 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd
 | 
				
			|||||||
github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
					github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
 | 
				
			||||||
github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
					github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
				
			||||||
github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A=
 | 
					github.com/sirupsen/logrus v1.8.0/go.mod h1:4GuYW9TZmE769R5STWrRakJc4UqQ3+QQ95fyz7ENv1A=
 | 
				
			||||||
github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE=
 | 
					 | 
				
			||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
					github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0=
 | 
				
			||||||
 | 
					github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
 | 
				
			||||||
github.com/smartystreets/assertions v0.0.0-20180725160413-e900ae048470/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
					github.com/smartystreets/assertions v0.0.0-20180725160413-e900ae048470/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
				
			||||||
github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
					github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
 | 
				
			||||||
github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
 | 
					github.com/smartystreets/assertions v1.0.1/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
 | 
				
			||||||
@ -1314,11 +1303,9 @@ github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B
 | 
				
			|||||||
github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 | 
					github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
 | 
				
			||||||
github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 | 
					github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4=
 | 
				
			||||||
github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 | 
					github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I=
 | 
				
			||||||
github.com/spf13/afero v1.8.0 h1:5MmtuhAgYeU6qpa7w7bP0dv6MBYuup0vekhSpSkoq60=
 | 
					 | 
				
			||||||
github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
 | 
					github.com/spf13/afero v1.8.0/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
 | 
				
			||||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
					github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
				
			||||||
github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
					github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
				
			||||||
github.com/spf13/cast v1.4.1 h1:s0hze+J0196ZfEMTs80N7UlFt0BDuQ7Q+JDnHiMWKdA=
 | 
					 | 
				
			||||||
github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
					github.com/spf13/cast v1.4.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
 | 
				
			||||||
github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
					github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
					github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ=
 | 
				
			||||||
@ -1327,10 +1314,8 @@ github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHN
 | 
				
			|||||||
github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
 | 
					github.com/spf13/cobra v1.1.1/go.mod h1:WnodtKOvamDL/PwE2M4iKs8aMDBZ5Q5klgD3qfVJQMI=
 | 
				
			||||||
github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
 | 
					github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo=
 | 
				
			||||||
github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
 | 
					github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk=
 | 
				
			||||||
github.com/spf13/cobra v1.3.0 h1:R7cSvGu+Vv+qX0gW5R/85dx2kmmJT5z5NM8ifdYjdn0=
 | 
					 | 
				
			||||||
github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
 | 
					github.com/spf13/cobra v1.3.0/go.mod h1:BrRVncBjOJa/eUcVVm9CE+oC6as8k+VYr4NY7WCi9V4=
 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
					github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
 | 
					 | 
				
			||||||
github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 | 
					github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
 | 
				
			||||||
github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
					github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
 | 
				
			||||||
@ -1343,7 +1328,6 @@ github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/y
 | 
				
			|||||||
github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
					github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg=
 | 
				
			||||||
github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
 | 
					github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns=
 | 
				
			||||||
github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
 | 
					github.com/spf13/viper v1.10.0/go.mod h1:SoyBPwAtKDzypXNDFKN5kzH7ppppbGZtls1UpIy5AsM=
 | 
				
			||||||
github.com/spf13/viper v1.10.1 h1:nuJZuYpG7gTj/XqiUwg8bA0cp1+M2mC3J4g5luUYBKk=
 | 
					 | 
				
			||||||
github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
 | 
					github.com/spf13/viper v1.10.1/go.mod h1:IGlFPqhNAPKRxohIzWpI5QEy4kuI7tcl5WvR+8qy1rU=
 | 
				
			||||||
github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
 | 
					github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8=
 | 
				
			||||||
github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
 | 
					github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw=
 | 
				
			||||||
@ -1361,7 +1345,6 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5
 | 
				
			|||||||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
					github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
				
			||||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
					github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
 | 
				
			||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
					github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 | 
				
			||||||
github.com/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s=
 | 
					 | 
				
			||||||
github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
					github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 | 
				
			||||||
github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
					github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww=
 | 
				
			||||||
github.com/terra-farm/udnssdk v1.3.5 h1:MNR3adfuuEK/l04+jzo8WW/0fnorY+nW515qb3vEr6I=
 | 
					github.com/terra-farm/udnssdk v1.3.5 h1:MNR3adfuuEK/l04+jzo8WW/0fnorY+nW515qb3vEr6I=
 | 
				
			||||||
@ -1371,17 +1354,13 @@ github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhV
 | 
				
			|||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
					github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
 | 
				
			||||||
github.com/transip/gotransip/v6 v6.14.0 h1:TOZYH+9W64ZqH2S/7MoPXGcJ3EyBSjBoMUsLMsA59JA=
 | 
					github.com/transip/gotransip/v6 v6.17.0 h1:2RCyqYqz5+Ej8z96EyE4sf6tQrrfEBaFDO0LliSl6+8=
 | 
				
			||||||
github.com/transip/gotransip/v6 v6.14.0/go.mod h1:pQZ36hWWRahCUXkFWlx9Hs711gLd8J4qdgLdRzmtY+g=
 | 
					github.com/transip/gotransip/v6 v6.17.0/go.mod h1:pQZ36hWWRahCUXkFWlx9Hs711gLd8J4qdgLdRzmtY+g=
 | 
				
			||||||
github.com/tsaarni/certyaml v0.6.2/go.mod h1:fMHgNcBc7APv85tYQQ5186Qx+OeUDmLbGHZTRI988RM=
 | 
					github.com/tsaarni/certyaml v0.6.2/go.mod h1:fMHgNcBc7APv85tYQQ5186Qx+OeUDmLbGHZTRI988RM=
 | 
				
			||||||
github.com/tsaarni/x500dn v0.0.0-20210331182804-14283c7f5a16/go.mod h1:RquKZ5rERbzqRQDFuh2zsgR1W1FH006YRw2pHIuMzvw=
 | 
					github.com/tsaarni/x500dn v0.0.0-20210331182804-14283c7f5a16/go.mod h1:RquKZ5rERbzqRQDFuh2zsgR1W1FH006YRw2pHIuMzvw=
 | 
				
			||||||
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 | 
					github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
 | 
				
			||||||
github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
					github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
 | 
				
			||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 | 
					github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
 | 
				
			||||||
github.com/ukfast/go-durationstring v1.1.0 h1:Ki0ubc5jqSt7XuAs+gkPNpHYolIwbcsRW4LS239tIHA=
 | 
					 | 
				
			||||||
github.com/ukfast/go-durationstring v1.1.0/go.mod h1:Ci81n51kfxlKUIaLY9cINIKRO94VTqV+iCGbOMTb0V8=
 | 
					 | 
				
			||||||
github.com/ukfast/sdk-go v1.4.34 h1:xuNbJ+WxsUqBfrm6eEdnTi6GcKL3R1cLxSN0jMk+4Rc=
 | 
					 | 
				
			||||||
github.com/ukfast/sdk-go v1.4.34/go.mod h1:vxlI1IHy2pp04AYqRMm0MHWSWOF0lwTkPJXHxTDLPok=
 | 
					 | 
				
			||||||
github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 | 
					github.com/ulikunitz/xz v0.5.6/go.mod h1:2bypXElzHzzJZwzH67Y6wb67pO62Rzfn7BSiF4ABRW8=
 | 
				
			||||||
github.com/ultradns/ultradns-sdk-go v0.0.0-20200616202852-e62052662f60 h1:n7unetnX8WWTc0U85h/0+dJoLWLqoaJwowXB9RkBdxU=
 | 
					github.com/ultradns/ultradns-sdk-go v0.0.0-20200616202852-e62052662f60 h1:n7unetnX8WWTc0U85h/0+dJoLWLqoaJwowXB9RkBdxU=
 | 
				
			||||||
github.com/ultradns/ultradns-sdk-go v0.0.0-20200616202852-e62052662f60/go.mod h1:43vmy6GEvRuVMpGEWfJ/JoEM6RIqUQI1/tb8JqZR1zI=
 | 
					github.com/ultradns/ultradns-sdk-go v0.0.0-20200616202852-e62052662f60/go.mod h1:43vmy6GEvRuVMpGEWfJ/JoEM6RIqUQI1/tb8JqZR1zI=
 | 
				
			||||||
@ -1392,13 +1371,11 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX
 | 
				
			|||||||
github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
 | 
					github.com/urfave/cli/v2 v2.1.1/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ=
 | 
				
			||||||
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
 | 
					github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
 | 
				
			||||||
github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
 | 
					github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw=
 | 
				
			||||||
github.com/vektra/mockery/v2 v2.9.4/go.mod h1:2gU4Cf/f8YyC8oEaSXfCnZBMxMjMl/Ko205rlP0fO90=
 | 
					 | 
				
			||||||
github.com/vektra/mockery/v2 v2.10.0 h1:MiiQWxwdq7/ET6dCXLaJzSGEN17k758H7JHS9kOdiks=
 | 
					 | 
				
			||||||
github.com/vektra/mockery/v2 v2.10.0/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4=
 | 
					github.com/vektra/mockery/v2 v2.10.0/go.mod h1:m/WO2UzWzqgVX3nvqpRQq70I4Z7jbSCRhdmkgtp+Ab4=
 | 
				
			||||||
github.com/vinyldns/go-vinyldns v0.0.0-20200211145900-fe8a3d82e556 h1:UbVjBjgJUYGD8MlobEdOR+yTeNqaNa2Gf1/nskVNCSE=
 | 
					github.com/vinyldns/go-vinyldns v0.0.0-20200211145900-fe8a3d82e556 h1:UbVjBjgJUYGD8MlobEdOR+yTeNqaNa2Gf1/nskVNCSE=
 | 
				
			||||||
github.com/vinyldns/go-vinyldns v0.0.0-20200211145900-fe8a3d82e556/go.mod h1:RWc47jtnVuQv6+lY3c768WtXCas/Xi+U5UFc5xULmYg=
 | 
					github.com/vinyldns/go-vinyldns v0.0.0-20200211145900-fe8a3d82e556/go.mod h1:RWc47jtnVuQv6+lY3c768WtXCas/Xi+U5UFc5xULmYg=
 | 
				
			||||||
github.com/vultr/govultr/v2 v2.14.1 h1:Z4nd9mXNQ5wd63aw0MZOalFeTkJ8L6Sed3PTqagp4TA=
 | 
					github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs=
 | 
				
			||||||
github.com/vultr/govultr/v2 v2.14.1/go.mod h1:JjUljQdSZx+MELCAJvZ/JH32bJotmflnsyS0NOjb8Jg=
 | 
					github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI=
 | 
				
			||||||
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 | 
					github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
 | 
				
			||||||
github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 | 
					github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs=
 | 
				
			||||||
github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 | 
					github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM=
 | 
				
			||||||
@ -1423,7 +1400,6 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1
 | 
				
			|||||||
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
 | 
					github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
 | 
				
			||||||
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
 | 
					github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
 | 
				
			||||||
github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
 | 
					github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg=
 | 
				
			||||||
github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q=
 | 
					 | 
				
			||||||
github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 | 
					github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0=
 | 
				
			||||||
go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
				
			||||||
go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
					go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
 | 
				
			||||||
@ -1640,7 +1616,6 @@ golang.org/x/net v0.0.0-20200602114024-627f9648deb9/go.mod h1:qpuaurCH72eLCgpAm/
 | 
				
			|||||||
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
					golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
 | 
				
			||||||
golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
					golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
				
			||||||
golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
					golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
				
			||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
					golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 | 
				
			||||||
@ -1666,12 +1641,14 @@ golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qx
 | 
				
			|||||||
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
					golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
				
			||||||
golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
					golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
				
			||||||
golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
					golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
				
			||||||
golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
					golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
				
			||||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
					golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
				
			||||||
golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
					golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
				
			||||||
golang.org/x/net v0.0.0-20220412020605-290c469a71a5 h1:bRb386wvrE+oBNdF1d/Xh9mQrfQ4ecYhW5qJ5GvTGT4=
 | 
					 | 
				
			||||||
golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
					golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e h1:TsQ7F31D3bUCLeqPT0u+yjp1guoArKaNKmCr22PYgTQ=
 | 
				
			||||||
 | 
					golang.org/x/net v0.0.0-20220624214902-1bab6f366d9e/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
					golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					golang.org/x/oauth2 v0.0.0-20190130055435-99b60b757ec1/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
					golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 | 
				
			||||||
@ -1692,10 +1669,11 @@ golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ
 | 
				
			|||||||
golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
					golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
					golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
					golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a h1:qfl7ob3DIEs3Ml9oLuPwY2N04gymzAW04WsUQHIClgM=
 | 
					 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
					golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5 h1:OSnWWcOd/CtWQC2cYSBgbTSJv3ciqd8r54ySIW2y3RE=
 | 
					 | 
				
			||||||
golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
					golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
 | 
				
			||||||
 | 
					golang.org/x/oauth2 v0.0.0-20220608161450-d0670ef3b1eb/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
 | 
				
			||||||
 | 
					golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2 h1:+jnHzr9VPj32ykQVai5DNahi9+NSp7yYuCsl5eAQtL0=
 | 
				
			||||||
 | 
					golang.org/x/oauth2 v0.0.0-20220622183110-fd043fe589d2/go.mod h1:jaDAt6Dkxork7LmZnYtzbRWj0W47D86a3TGe0YHBvmE=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
@ -1707,8 +1685,9 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ
 | 
				
			|||||||
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
 | 
					 | 
				
			||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
					golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f h1:Ax0t5p6N38Ga0dThY21weqDEyz2oklo4IvDkpigvkD8=
 | 
				
			||||||
 | 
					golang.org/x/sync v0.0.0-20220601150217-0de741cfad7f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180425194835-bb9c189858d9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180425194835-bb9c189858d9/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
					golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 | 
				
			||||||
@ -1827,8 +1806,14 @@ golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBc
 | 
				
			|||||||
golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
					golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
					golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
					golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad h1:ntjMns5wyP/fN65tdBD4g8J5w8n015+iIIs9rtjXkY0=
 | 
					 | 
				
			||||||
golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
					golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220610221304-9f5ed59c137d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
 | 
				
			||||||
 | 
					golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 | 
				
			||||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 | 
					golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
 | 
				
			||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
					golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
				
			||||||
golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
					golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 | 
				
			||||||
@ -1855,7 +1840,6 @@ golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxb
 | 
				
			|||||||
golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20210611083556-38a9dc6acbc6/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs=
 | 
					 | 
				
			||||||
golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
 | 
					golang.org/x/time v0.0.0-20220210224613-90d013bbcef8 h1:vVKdlvoWBphwdxWKrFZEuM0kGgGLxUOYcY4U/2Vjg44=
 | 
				
			||||||
golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
					golang.org/x/time v0.0.0-20220210224613-90d013bbcef8/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 | 
				
			||||||
@ -1887,7 +1871,6 @@ golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgw
 | 
				
			|||||||
golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
					golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
					golang.org/x/tools v0.0.0-20190920225731-5eefd052ad72/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
 | 
				
			||||||
@ -1918,7 +1901,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK
 | 
				
			|||||||
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
					golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
					golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
					golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					 | 
				
			||||||
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
					golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
					golang.org/x/tools v0.0.0-20200505023115-26f46d2f7ef8/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 | 
				
			||||||
@ -1955,8 +1937,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 | 
				
			|||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f h1:GGU+dLjvlC3qDwqYgL6UgRmHXhOOgns0bZu2Ty5mm6U=
 | 
					 | 
				
			||||||
golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
					golang.org/x/xerrors v0.0.0-20220411194840-2f41105eb62f/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f h1:uF6paiQQebLeSXkrTqHqz0MXhXXS1KgF41eUdBNvxK0=
 | 
				
			||||||
 | 
					golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
 | 
				
			||||||
gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
 | 
					gomodules.xyz/jsonpatch/v2 v2.0.1/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
 | 
				
			||||||
gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
 | 
					gomodules.xyz/jsonpatch/v2 v2.1.0/go.mod h1:IhYNNY4jnS53ZnfE4PAmpKtDpTCj1JFXc+3mwe7XcUU=
 | 
				
			||||||
gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
 | 
					gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY=
 | 
				
			||||||
@ -2006,8 +1990,13 @@ google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tD
 | 
				
			|||||||
google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
 | 
					google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
 | 
				
			||||||
google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
 | 
					google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
 | 
				
			||||||
google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
 | 
					google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
 | 
				
			||||||
google.golang.org/api v0.74.0 h1:ExR2D+5TYIrMphWgs5JCgwRhEDlPDXXrLwHHMgPHTXE=
 | 
					 | 
				
			||||||
google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
 | 
					google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
 | 
				
			||||||
 | 
					google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
 | 
				
			||||||
 | 
					google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
 | 
				
			||||||
 | 
					google.golang.org/api v0.80.0/go.mod h1:xY3nI94gbvBrE0J6NHXhxOmW97HG7Khjkku6AFB3Hyg=
 | 
				
			||||||
 | 
					google.golang.org/api v0.84.0/go.mod h1:NTsGnUFJMYROtiquksZHBWtHfeMC7iYthki7Eq3pa8o=
 | 
				
			||||||
 | 
					google.golang.org/api v0.93.0 h1:T2xt9gi0gHdxdnRkVQhT8mIvPaXKNsDNWz+L696M66M=
 | 
				
			||||||
 | 
					google.golang.org/api v0.93.0/go.mod h1:+Sem1dnrKlrXMR/X0bPnMWyluQe4RsNoYfmNLhOIkzw=
 | 
				
			||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
					google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
 | 
				
			||||||
google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
					google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
 | 
				
			||||||
@ -2064,6 +2053,7 @@ google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6D
 | 
				
			|||||||
google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
					google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
					google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
					google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20210329143202-679c6ae281ee/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 | 
					google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
 | 
					google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 | 
					google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
 | 
				
			||||||
@ -2095,8 +2085,20 @@ google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2
 | 
				
			|||||||
google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
					google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
					google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
					google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
 | 
				
			||||||
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb h1:0m9wktIpOxGw+SSKmydXWB3Z3GTfcPP6+q75HCQa6HI=
 | 
					 | 
				
			||||||
google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
 | 
					google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220518221133-4f43b3371335/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220523171625-347a074981d8/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220608133413-ed9918b62aac/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220616135557-88e70c0c3a90/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220624142145-8cd45d7dbd1f/go.mod h1:KEWEmljWE5zPzLBa/oHl6DaEt9LmfH6WtH1OHIvleBA=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220804142021-4e6b2dfa6612 h1:NX3L5YesD5qgxxrPHdKqHH38Ao0AG6poRXG+JljPsGU=
 | 
				
			||||||
 | 
					google.golang.org/genproto v0.0.0-20220804142021-4e6b2dfa6612/go.mod h1:iHe1svFLAZg9VWz891+QbRMwUv9O/1Ww+/mngYeThbc=
 | 
				
			||||||
google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 | 
					google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 | 
				
			||||||
google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 | 
					google.golang.org/grpc v1.14.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw=
 | 
				
			||||||
google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 | 
					google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
 | 
				
			||||||
@ -2135,8 +2137,12 @@ google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9K
 | 
				
			|||||||
google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
					google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
				
			||||||
google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
					google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
				
			||||||
google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
					google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
 | 
				
			||||||
google.golang.org/grpc v1.45.0 h1:NEpgUqV3Z+ZjkqMsxMg11IaDrXY4RY6CQukSGK0uI1M=
 | 
					 | 
				
			||||||
google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
 | 
					google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.47.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.48.0 h1:rQOsyJ/8+ufEDJd/Gdsz7HG220Mh9HAhFHRGnIjda0w=
 | 
				
			||||||
 | 
					google.golang.org/grpc v1.48.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
 | 
				
			||||||
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 | 
					google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
					google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
 | 
				
			||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
					google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
 | 
				
			||||||
@ -2150,10 +2156,10 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
 | 
				
			|||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
					google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
 | 
				
			||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 | 
					google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
 | 
				
			||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
					google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
				
			||||||
google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
					google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
 | 
				
			||||||
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
 | 
					 | 
				
			||||||
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
					google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w=
 | 
				
			||||||
 | 
					google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
 | 
				
			||||||
gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 | 
					gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U=
 | 
				
			||||||
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
					gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 | 
				
			||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
					gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 | 
				
			||||||
@ -2170,7 +2176,6 @@ gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o=
 | 
				
			|||||||
gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
 | 
					gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo=
 | 
				
			||||||
gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
 | 
					gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM=
 | 
				
			||||||
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
 | 
					gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
 | 
				
			||||||
gopkg.in/go-playground/validator.v9 v9.27.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
 | 
					 | 
				
			||||||
gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M=
 | 
					gopkg.in/go-playground/validator.v9 v9.31.0 h1:bmXmP2RSNtFES+bn4uYuHT7iJFJv7Vj+an+ZQdDaD1M=
 | 
				
			||||||
gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
 | 
					gopkg.in/go-playground/validator.v9 v9.31.0/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ=
 | 
				
			||||||
gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=
 | 
					gopkg.in/gorp.v1 v1.7.2/go.mod h1:Wo3h+DBQZIxATwftsglhdD/62zRFPhGhTiu5jUJmCaw=
 | 
				
			||||||
@ -2181,7 +2186,6 @@ gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
 | 
				
			|||||||
gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.66.2 h1:XfR1dOYubytKy4Shzc2LHrrGhU0lDCfDGG1yLPmpgsI=
 | 
					 | 
				
			||||||
gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.66.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w=
 | 
					gopkg.in/ini.v1 v1.66.3 h1:jRskFVxYaMGAMUbN0UZ7niA9gzL9B49DOqE78vg0k3w=
 | 
				
			||||||
gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
					gopkg.in/ini.v1 v1.66.3/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
 | 
				
			||||||
@ -2212,8 +2216,6 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
 | 
				
			|||||||
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
					gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 | 
				
			||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
					gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 | 
				
			||||||
gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
					gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
 | 
				
			||||||
@ -2250,10 +2252,9 @@ k8s.io/api v0.21.3/go.mod h1:hUgeYHUbBp23Ue4qdX9tR8/ANi/g3ehylAqDn9NWVOg=
 | 
				
			|||||||
k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY=
 | 
					k8s.io/api v0.22.1/go.mod h1:bh13rkTp3F1XEaLGykbyRD2QaTTzPm0e/BMd8ptFONY=
 | 
				
			||||||
k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg=
 | 
					k8s.io/api v0.23.0/go.mod h1:8wmDdLBHBNxtOIytwLstXt5E9PddnZb0GaMcqsvDBpg=
 | 
				
			||||||
k8s.io/api v0.23.1/go.mod h1:WfXnOnwSqNtG62Y1CdjoMxh7r7u9QXGCkA1u0na2jgo=
 | 
					k8s.io/api v0.23.1/go.mod h1:WfXnOnwSqNtG62Y1CdjoMxh7r7u9QXGCkA1u0na2jgo=
 | 
				
			||||||
k8s.io/api v0.23.3 h1:KNrME8KHGr12Ozjf8ytOewKzZh6hl/hHUZeHddT3a38=
 | 
					 | 
				
			||||||
k8s.io/api v0.23.3/go.mod h1:w258XdGyvCmnBj/vGzQMj6kzdufJZVUwEM1U2fRJwSQ=
 | 
					 | 
				
			||||||
k8s.io/api v0.24.1 h1:BjCMRDcyEYz03joa3K1+rbshwh1Ay6oB53+iUx2H8UY=
 | 
					 | 
				
			||||||
k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ=
 | 
					k8s.io/api v0.24.1/go.mod h1:JhoOvNiLXKTPQ60zh2g0ewpA+bnEYf5q44Flhquh4vQ=
 | 
				
			||||||
 | 
					k8s.io/api v0.24.4 h1:I5Y645gJ8zWKawyr78lVfDQkZrAViSbeRXsPZWTxmXk=
 | 
				
			||||||
 | 
					k8s.io/api v0.24.4/go.mod h1:42pVfA0NRxrtJhZQOvRSyZcJihzAdU59WBtTjYcB0/M=
 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo=
 | 
					k8s.io/apiextensions-apiserver v0.18.0/go.mod h1:18Cwn1Xws4xnWQNC00FLq1E350b9lUF+aOdIWDOZxgo=
 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
 | 
					k8s.io/apiextensions-apiserver v0.18.2/go.mod h1:q3faSnRGmYimiocj6cHQ1I3WpLqmDgJFlKL37fC4ZvY=
 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.18.4/go.mod h1:NYeyeYq4SIpFlPxSAB6jHPIdvu3hL0pc36wuRChybio=
 | 
					k8s.io/apiextensions-apiserver v0.18.4/go.mod h1:NYeyeYq4SIpFlPxSAB6jHPIdvu3hL0pc36wuRChybio=
 | 
				
			||||||
@ -2263,7 +2264,6 @@ k8s.io/apiextensions-apiserver v0.21.0/go.mod h1:gsQGNtGkc/YoDG9loKI0V+oLZM4ljRP
 | 
				
			|||||||
k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA=
 | 
					k8s.io/apiextensions-apiserver v0.21.1/go.mod h1:KESQFCGjqVcVsZ9g0xX5bacMjyX5emuWcS2arzdEouA=
 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.21.2/go.mod h1:+Axoz5/l3AYpGLlhJDfcVQzCerVYq3K3CvDMvw6X1RA=
 | 
					k8s.io/apiextensions-apiserver v0.21.2/go.mod h1:+Axoz5/l3AYpGLlhJDfcVQzCerVYq3K3CvDMvw6X1RA=
 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE=
 | 
					k8s.io/apiextensions-apiserver v0.21.3/go.mod h1:kl6dap3Gd45+21Jnh6utCx8Z2xxLm8LGDkprcd+KbsE=
 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.23.0 h1:uii8BYmHYiT2ZTAJxmvc3X8UhNYMxl2A0z0Xq3Pm+WY=
 | 
					 | 
				
			||||||
k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4=
 | 
					k8s.io/apiextensions-apiserver v0.23.0/go.mod h1:xIFAEEDlAZgpVBl/1VSjGDmLoXAWRG40+GsWhKhAxY4=
 | 
				
			||||||
k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 | 
					k8s.io/apimachinery v0.18.0/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 | 
				
			||||||
k8s.io/apimachinery v0.18.1/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 | 
					k8s.io/apimachinery v0.18.1/go.mod h1:9SnR/e11v5IbyPCGbvJViimtJ0SwHG4nfZFjU77ftcA=
 | 
				
			||||||
@ -2279,10 +2279,9 @@ k8s.io/apimachinery v0.21.3/go.mod h1:H/IM+5vH9kZRNJ4l3x/fXP/5bOPJaVP/guptnZPeCF
 | 
				
			|||||||
k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
 | 
					k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0=
 | 
				
			||||||
k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc=
 | 
					k8s.io/apimachinery v0.23.0/go.mod h1:fFCTTBKvKcwTPFzjlcxp91uPFZr+JA0FubU4fLzzFYc=
 | 
				
			||||||
k8s.io/apimachinery v0.23.1/go.mod h1:SADt2Kl8/sttJ62RRsi9MIV4o8f5S3coArm0Iu3fBno=
 | 
					k8s.io/apimachinery v0.23.1/go.mod h1:SADt2Kl8/sttJ62RRsi9MIV4o8f5S3coArm0Iu3fBno=
 | 
				
			||||||
k8s.io/apimachinery v0.23.3 h1:7IW6jxNzrXTsP0c8yXz2E5Yx/WTzVPTsHIx/2Vm0cIk=
 | 
					 | 
				
			||||||
k8s.io/apimachinery v0.23.3/go.mod h1:BEuFMMBaIbcOqVIJqNZJXGFTP4W6AycEpb5+m/97hrM=
 | 
					 | 
				
			||||||
k8s.io/apimachinery v0.24.1 h1:ShD4aDxTQKN5zNf8K1RQ2u98ELLdIW7jEnlO9uAMX/I=
 | 
					 | 
				
			||||||
k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
 | 
					k8s.io/apimachinery v0.24.1/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
 | 
				
			||||||
 | 
					k8s.io/apimachinery v0.24.4 h1:S0Ur3J/PbivTcL43EdSdPhqCqKla2NIuneNwZcTDeGQ=
 | 
				
			||||||
 | 
					k8s.io/apimachinery v0.24.4/go.mod h1:82Bi4sCzVBdpYjyI4jY6aHX+YCUchUIrZrXKedjd2UM=
 | 
				
			||||||
k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw=
 | 
					k8s.io/apiserver v0.18.0/go.mod h1:3S2O6FeBBd6XTo0njUrLxiqk8GNy6wWOftjhJcXYnjw=
 | 
				
			||||||
k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
 | 
					k8s.io/apiserver v0.18.2/go.mod h1:Xbh066NqrZO8cbsoenCwyDJ1OSi8Ag8I2lezeHxzwzw=
 | 
				
			||||||
k8s.io/apiserver v0.18.4/go.mod h1:q+zoFct5ABNnYkGIaGQ3bcbUNdmPyOCoEBcg51LChY8=
 | 
					k8s.io/apiserver v0.18.4/go.mod h1:q+zoFct5ABNnYkGIaGQ3bcbUNdmPyOCoEBcg51LChY8=
 | 
				
			||||||
@ -2310,7 +2309,6 @@ k8s.io/client-go v0.21.2/go.mod h1:HdJ9iknWpbl3vMGtib6T2PyI/VYxiZfq936WNVHBRrA=
 | 
				
			|||||||
k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU=
 | 
					k8s.io/client-go v0.21.3/go.mod h1:+VPhCgTsaFmGILxR/7E1N0S+ryO010QBeNCv5JwRGYU=
 | 
				
			||||||
k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
 | 
					k8s.io/client-go v0.22.1/go.mod h1:BquC5A4UOo4qVDUtoc04/+Nxp1MeHcVc1HJm1KmG8kk=
 | 
				
			||||||
k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA=
 | 
					k8s.io/client-go v0.23.0/go.mod h1:hrDnpnK1mSr65lHHcUuIZIXDgEbzc7/683c6hyG4jTA=
 | 
				
			||||||
k8s.io/client-go v0.23.1 h1:Ma4Fhf/p07Nmj9yAB1H7UwbFHEBrSPg8lviR24U2GiQ=
 | 
					 | 
				
			||||||
k8s.io/client-go v0.23.1/go.mod h1:6QSI8fEuqD4zgFK0xbdwfB/PthBsIxCJMa3s17WlcO0=
 | 
					k8s.io/client-go v0.23.1/go.mod h1:6QSI8fEuqD4zgFK0xbdwfB/PthBsIxCJMa3s17WlcO0=
 | 
				
			||||||
k8s.io/client-go v0.24.1 h1:w1hNdI9PFrzu3OlovVeTnf4oHDt+FJLd9Ndluvnb42E=
 | 
					k8s.io/client-go v0.24.1 h1:w1hNdI9PFrzu3OlovVeTnf4oHDt+FJLd9Ndluvnb42E=
 | 
				
			||||||
k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8=
 | 
					k8s.io/client-go v0.24.1/go.mod h1:f1kIDqcEYmwXS/vTbbhopMUbhKp2JhOeVTfxgaCIlF8=
 | 
				
			||||||
@ -2344,13 +2342,11 @@ k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8
 | 
				
			|||||||
k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
					k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
				
			||||||
k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
					k8s.io/gengo v0.0.0-20201203183100-97869a43a9d9/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
				
			||||||
k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
					k8s.io/gengo v0.0.0-20201214224949-b6c5ce23f027/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
				
			||||||
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c h1:GohjlNKauSai7gN4wsJkeZ3WAJx4Sh+oT/b5IYn5suA=
 | 
					 | 
				
			||||||
k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
					k8s.io/gengo v0.0.0-20210813121822-485abfe95c7c/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E=
 | 
				
			||||||
k8s.io/helm v2.16.9+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI=
 | 
					k8s.io/helm v2.16.9+incompatible/go.mod h1:LZzlS4LQBHfciFOurYBFkCMTaZ0D1l+p0teMg7TSULI=
 | 
				
			||||||
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
					k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
				
			||||||
k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
					k8s.io/klog v0.2.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
				
			||||||
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
					k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
 | 
				
			||||||
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
 | 
					 | 
				
			||||||
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 | 
					k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
 | 
				
			||||||
k8s.io/kube-aggregator v0.21.3/go.mod h1:9OIUuR5KIsNZYP/Xsh4HBsaqbS7ICJpRz3XSKtKajRc=
 | 
					k8s.io/kube-aggregator v0.21.3/go.mod h1:9OIUuR5KIsNZYP/Xsh4HBsaqbS7ICJpRz3XSKtKajRc=
 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 | 
					k8s.io/kube-openapi v0.0.0-20200121204235-bf4fb3bd569c/go.mod h1:GRQhZsXIAJ1xR0C9bd8UpWHZ5plfAS9fzPjJuQ6JL3E=
 | 
				
			||||||
@ -2359,7 +2355,6 @@ k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAG
 | 
				
			|||||||
k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
 | 
					k8s.io/kube-openapi v0.0.0-20210305001622-591a79e4bda7/go.mod h1:wXW5VT87nVfh/iLV8FpR2uDvrFyomxbtb1KivDbvPTE=
 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
 | 
					k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
 | 
					k8s.io/kube-openapi v0.0.0-20210527164424-3c818078ee3d/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw=
 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65 h1:E3J9oCLlaobFUqsjG9DfKbP2BmgwBL2p7pn0A3dG9W4=
 | 
					 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
 | 
					k8s.io/kube-openapi v0.0.0-20211115234752-e816edb12b65/go.mod h1:sX9MT8g7NVZM5lVL/j8QyCCJe8YSMW30QvGZWaCIDIk=
 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
 | 
					k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42 h1:Gii5eqf+GmIEwGNKQYQClCayuJCe2/4fZUvF7VG99sU=
 | 
				
			||||||
k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
 | 
					k8s.io/kube-openapi v0.0.0-20220328201542-3ee0da9b0b42/go.mod h1:Z/45zLw8lUo4wdiUkI+v/ImEGAvu3WatcZl3lPMR4Rk=
 | 
				
			||||||
@ -2381,8 +2376,6 @@ k8s.io/utils v0.0.0-20210722164352-7f3ee0f31471/go.mod h1:jPW/WVKK9YHAvNhRxK0md/
 | 
				
			|||||||
k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
					k8s.io/utils v0.0.0-20210802155522-efc7438f0176/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
				
			||||||
k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
					k8s.io/utils v0.0.0-20210820185131-d34e5cb4466e/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
				
			||||||
k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
					k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
				
			||||||
k8s.io/utils v0.0.0-20211116205334-6203023598ed h1:ck1fRPWPJWsMd8ZRFsWc6mh/zHp5fZ/shhbrgPUxDAE=
 | 
					 | 
				
			||||||
k8s.io/utils v0.0.0-20211116205334-6203023598ed/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
					 | 
				
			||||||
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=
 | 
					k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9 h1:HNSDgDCrr/6Ly3WEGKZftiE7IY19Vz2GdbOCyI4qqhc=
 | 
				
			||||||
k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
					k8s.io/utils v0.0.0-20220210201930-3a6ce19ff2f9/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA=
 | 
				
			||||||
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
					rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
 | 
				
			||||||
@ -2404,18 +2397,13 @@ sigs.k8s.io/controller-runtime v0.11.0/go.mod h1:KKwLiTooNGu+JmLZGn9Sl3Gjmfj66eM
 | 
				
			|||||||
sigs.k8s.io/controller-tools v0.3.1-0.20200517180335-820a4a27ea84/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI=
 | 
					sigs.k8s.io/controller-tools v0.3.1-0.20200517180335-820a4a27ea84/go.mod h1:enhtKGfxZD1GFEoMgP8Fdbu+uKQ/cq1/WGJhdVChfvI=
 | 
				
			||||||
sigs.k8s.io/controller-tools v0.5.0/go.mod h1:JTsstrMpxs+9BUj6eGuAaEb6SDSPTeVtUyp0jmnAM/I=
 | 
					sigs.k8s.io/controller-tools v0.5.0/go.mod h1:JTsstrMpxs+9BUj6eGuAaEb6SDSPTeVtUyp0jmnAM/I=
 | 
				
			||||||
sigs.k8s.io/controller-tools v0.6.0/go.mod h1:baRMVPrctU77F+rfAuH2uPqW93k6yQnZA2dhUOr7ihc=
 | 
					sigs.k8s.io/controller-tools v0.6.0/go.mod h1:baRMVPrctU77F+rfAuH2uPqW93k6yQnZA2dhUOr7ihc=
 | 
				
			||||||
sigs.k8s.io/controller-tools v0.6.2 h1:+Y8L0UsAugDipGRw8lrkPoAi6XqlQVZuf1DQHME3PgU=
 | 
					 | 
				
			||||||
sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8=
 | 
					sigs.k8s.io/controller-tools v0.6.2/go.mod h1:oaeGpjXn6+ZSEIQkUe/+3I40PNiDYp9aeawbt3xTgJ8=
 | 
				
			||||||
sigs.k8s.io/gateway-api v0.3.0/go.mod h1:Wb8bx7QhGVZxOSEU3i9vw/JqTB5Nlai9MLMYVZeDmRQ=
 | 
					sigs.k8s.io/gateway-api v0.3.0/go.mod h1:Wb8bx7QhGVZxOSEU3i9vw/JqTB5Nlai9MLMYVZeDmRQ=
 | 
				
			||||||
sigs.k8s.io/gateway-api v0.4.1 h1:Tof9/PNSZXyfDuTTe1XFvaTlvBRE6bKq1kmV6jj6rQE=
 | 
					 | 
				
			||||||
sigs.k8s.io/gateway-api v0.4.1/go.mod h1:r3eiNP+0el+NTLwaTfOrCNXy8TukC+dIM3ggc+fbNWk=
 | 
					 | 
				
			||||||
sigs.k8s.io/gateway-api v0.4.3 h1:9kdHAcfkyP7jVMSFshc8EYEKNLlFM7hbZL8vCKcMwps=
 | 
					sigs.k8s.io/gateway-api v0.4.3 h1:9kdHAcfkyP7jVMSFshc8EYEKNLlFM7hbZL8vCKcMwps=
 | 
				
			||||||
sigs.k8s.io/gateway-api v0.4.3/go.mod h1:r3eiNP+0el+NTLwaTfOrCNXy8TukC+dIM3ggc+fbNWk=
 | 
					sigs.k8s.io/gateway-api v0.4.3/go.mod h1:r3eiNP+0el+NTLwaTfOrCNXy8TukC+dIM3ggc+fbNWk=
 | 
				
			||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6 h1:fD1pz4yfdADVNfFmcP2aBEtudwUQ1AlLnRBALr33v3s=
 | 
					 | 
				
			||||||
sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
 | 
					sigs.k8s.io/json v0.0.0-20211020170558-c049b76a60c6/go.mod h1:p4QtZmO4uMYipTQNzagwnNoseA6OxSUutVw05NhYDRs=
 | 
				
			||||||
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
 | 
					sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2 h1:kDi4JBNAsJWfz1aEXhO8Jg87JJaPNLh5tIzYHgStQ9Y=
 | 
				
			||||||
sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
 | 
					sigs.k8s.io/json v0.0.0-20211208200746-9f7c6b3444d2/go.mod h1:B+TnT182UBxE84DiCz4CVE26eOSDAeYCpfDnC2kdKMY=
 | 
				
			||||||
sigs.k8s.io/kustomize v2.0.3+incompatible h1:JUufWFNlI44MdtnjUqVnvh29rR37PQFzPbLXqhyOyX0=
 | 
					 | 
				
			||||||
sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
 | 
					sigs.k8s.io/kustomize v2.0.3+incompatible/go.mod h1:MkjgH3RdOWrievjo6c9T245dYlB5QeXV4WCbnt/PEpU=
 | 
				
			||||||
sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY=
 | 
					sigs.k8s.io/kustomize/api v0.8.5/go.mod h1:M377apnKT5ZHJS++6H4rQoCHmWtt6qTpp3mbe7p6OLY=
 | 
				
			||||||
sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY=
 | 
					sigs.k8s.io/kustomize/api v0.8.8/go.mod h1:He1zoK0nk43Pc6NlV085xDXDXTNprtcyKZVm3swsdNY=
 | 
				
			||||||
@ -2424,7 +2412,6 @@ sigs.k8s.io/kustomize/cmd/config v0.9.10/go.mod h1:Mrby0WnRH7hA6OwOYnYpfpiY0WJIM
 | 
				
			|||||||
sigs.k8s.io/kustomize/kustomize/v4 v4.0.5/go.mod h1:C7rYla7sI8EnxHE/xEhRBSHMNfcL91fx0uKmUlUhrBk=
 | 
					sigs.k8s.io/kustomize/kustomize/v4 v4.0.5/go.mod h1:C7rYla7sI8EnxHE/xEhRBSHMNfcL91fx0uKmUlUhrBk=
 | 
				
			||||||
sigs.k8s.io/kustomize/kustomize/v4 v4.1.2/go.mod h1:PxBvo4WGYlCLeRPL+ziT64wBXqbgfcalOS/SXa/tcyo=
 | 
					sigs.k8s.io/kustomize/kustomize/v4 v4.1.2/go.mod h1:PxBvo4WGYlCLeRPL+ziT64wBXqbgfcalOS/SXa/tcyo=
 | 
				
			||||||
sigs.k8s.io/kustomize/kyaml v0.10.15/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg=
 | 
					sigs.k8s.io/kustomize/kyaml v0.10.15/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg=
 | 
				
			||||||
sigs.k8s.io/kustomize/kyaml v0.10.17 h1:4zrV0ym5AYa0e512q7K3Wp1u7mzoWW0xR3UHJcGWGIg=
 | 
					 | 
				
			||||||
sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg=
 | 
					sigs.k8s.io/kustomize/kyaml v0.10.17/go.mod h1:mlQFagmkm1P+W4lZJbJ/yaxMd8PqMRSC4cPcfUVt5Hg=
 | 
				
			||||||
sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 | 
					sigs.k8s.io/structured-merge-diff/v3 v3.0.0-20200116222232-67a7b8c61874/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 | 
				
			||||||
sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 | 
					sigs.k8s.io/structured-merge-diff/v3 v3.0.0/go.mod h1:PlARxl6Hbt/+BC80dRLi1qAmnMqwqDg62YvvVkZjemw=
 | 
				
			||||||
 | 
				
			|||||||
@ -2,8 +2,8 @@ apiVersion: kustomize.config.k8s.io/v1beta1
 | 
				
			|||||||
kind: Kustomization
 | 
					kind: Kustomization
 | 
				
			||||||
 | 
					
 | 
				
			||||||
images:
 | 
					images:
 | 
				
			||||||
  - name: k8s.gcr.io/external-dns/external-dns
 | 
					  - name: registry.k8s.io/external-dns/external-dns
 | 
				
			||||||
    newTag: v0.12.0
 | 
					    newTag: v0.12.2
 | 
				
			||||||
 | 
					
 | 
				
			||||||
resources:
 | 
					resources:
 | 
				
			||||||
  - ./external-dns-deployment.yaml
 | 
					  - ./external-dns-deployment.yaml
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										9
									
								
								main.go
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								main.go
									
									
									
									
									
								
							@ -153,8 +153,12 @@ func main() {
 | 
				
			|||||||
		log.Fatal(err)
 | 
							log.Fatal(err)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Filter targets
 | 
				
			||||||
 | 
						targetFilter := endpoint.NewTargetNetFilterWithExclusions(cfg.TargetNetFilter, cfg.ExcludeTargetNets)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Combine multiple sources into a single, deduplicated source.
 | 
						// Combine multiple sources into a single, deduplicated source.
 | 
				
			||||||
	endpointsSource := source.NewDedupSource(source.NewMultiSource(sources, sourceCfg.DefaultTargets))
 | 
						endpointsSource := source.NewDedupSource(source.NewMultiSource(sources, sourceCfg.DefaultTargets))
 | 
				
			||||||
 | 
						endpointsSource = source.NewTargetFilterSource(endpointsSource, targetFilter)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// RegexDomainFilter overrides DomainFilter
 | 
						// RegexDomainFilter overrides DomainFilter
 | 
				
			||||||
	var domainFilter endpoint.DomainFilter
 | 
						var domainFilter endpoint.DomainFilter
 | 
				
			||||||
@ -196,6 +200,7 @@ func main() {
 | 
				
			|||||||
				BatchChangeInterval:  cfg.AWSBatchChangeInterval,
 | 
									BatchChangeInterval:  cfg.AWSBatchChangeInterval,
 | 
				
			||||||
				EvaluateTargetHealth: cfg.AWSEvaluateTargetHealth,
 | 
									EvaluateTargetHealth: cfg.AWSEvaluateTargetHealth,
 | 
				
			||||||
				AssumeRole:           cfg.AWSAssumeRole,
 | 
									AssumeRole:           cfg.AWSAssumeRole,
 | 
				
			||||||
 | 
									AssumeRoleExternalID: cfg.AWSAssumeRoleExternalID,
 | 
				
			||||||
				APIRetries:           cfg.AWSAPIRetries,
 | 
									APIRetries:           cfg.AWSAPIRetries,
 | 
				
			||||||
				PreferCNAME:          cfg.AWSPreferCNAME,
 | 
									PreferCNAME:          cfg.AWSPreferCNAME,
 | 
				
			||||||
				DryRun:               cfg.DryRun,
 | 
									DryRun:               cfg.DryRun,
 | 
				
			||||||
@ -208,7 +213,7 @@ func main() {
 | 
				
			|||||||
			log.Infof("Registry \"%s\" cannot be used with AWS Cloud Map. Switching to \"aws-sd\".", cfg.Registry)
 | 
								log.Infof("Registry \"%s\" cannot be used with AWS Cloud Map. Switching to \"aws-sd\".", cfg.Registry)
 | 
				
			||||||
			cfg.Registry = "aws-sd"
 | 
								cfg.Registry = "aws-sd"
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		p, err = awssd.NewAWSSDProvider(domainFilter, cfg.AWSZoneType, cfg.AWSAssumeRole, cfg.DryRun, cfg.AWSSDServiceCleanup, cfg.TXTOwnerID)
 | 
							p, err = awssd.NewAWSSDProvider(domainFilter, cfg.AWSZoneType, cfg.AWSAssumeRole, cfg.AWSAssumeRoleExternalID, cfg.DryRun, cfg.AWSSDServiceCleanup, cfg.TXTOwnerID)
 | 
				
			||||||
	case "azure-dns", "azure":
 | 
						case "azure-dns", "azure":
 | 
				
			||||||
		p, err = azure.NewAzureProvider(cfg.AzureConfigFile, domainFilter, zoneNameFilter, zoneIDFilter, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.DryRun)
 | 
							p, err = azure.NewAzureProvider(cfg.AzureConfigFile, domainFilter, zoneNameFilter, zoneIDFilter, cfg.AzureResourceGroup, cfg.AzureUserAssignedIdentityClientID, cfg.DryRun)
 | 
				
			||||||
	case "azure-private-dns":
 | 
						case "azure-private-dns":
 | 
				
			||||||
@ -341,7 +346,7 @@ func main() {
 | 
				
			|||||||
	case "noop":
 | 
						case "noop":
 | 
				
			||||||
		r, err = registry.NewNoopRegistry(p)
 | 
							r, err = registry.NewNoopRegistry(p)
 | 
				
			||||||
	case "txt":
 | 
						case "txt":
 | 
				
			||||||
		r, err = registry.NewTXTRegistry(p, cfg.TXTPrefix, cfg.TXTSuffix, cfg.TXTOwnerID, cfg.TXTCacheInterval, cfg.TXTWildcardReplacement)
 | 
							r, err = registry.NewTXTRegistry(p, cfg.TXTPrefix, cfg.TXTSuffix, cfg.TXTOwnerID, cfg.TXTCacheInterval, cfg.TXTWildcardReplacement, cfg.ManagedDNSRecordTypes)
 | 
				
			||||||
	case "aws-sd":
 | 
						case "aws-sd":
 | 
				
			||||||
		r, err = registry.NewAWSSDRegistry(p.(*awssd.AWSSDProvider), cfg.TXTOwnerID)
 | 
							r, err = registry.NewAWSSDRegistry(p.(*awssd.AWSSDProvider), cfg.TXTOwnerID)
 | 
				
			||||||
	default:
 | 
						default:
 | 
				
			||||||
 | 
				
			|||||||
@ -78,11 +78,14 @@ type Config struct {
 | 
				
			|||||||
	RegexDomainExclusion              *regexp.Regexp
 | 
						RegexDomainExclusion              *regexp.Regexp
 | 
				
			||||||
	ZoneNameFilter                    []string
 | 
						ZoneNameFilter                    []string
 | 
				
			||||||
	ZoneIDFilter                      []string
 | 
						ZoneIDFilter                      []string
 | 
				
			||||||
 | 
						TargetNetFilter                   []string
 | 
				
			||||||
 | 
						ExcludeTargetNets                 []string
 | 
				
			||||||
	AlibabaCloudConfigFile            string
 | 
						AlibabaCloudConfigFile            string
 | 
				
			||||||
	AlibabaCloudZoneType              string
 | 
						AlibabaCloudZoneType              string
 | 
				
			||||||
	AWSZoneType                       string
 | 
						AWSZoneType                       string
 | 
				
			||||||
	AWSZoneTagFilter                  []string
 | 
						AWSZoneTagFilter                  []string
 | 
				
			||||||
	AWSAssumeRole                     string
 | 
						AWSAssumeRole                     string
 | 
				
			||||||
 | 
						AWSAssumeRoleExternalID           string
 | 
				
			||||||
	AWSBatchChangeSize                int
 | 
						AWSBatchChangeSize                int
 | 
				
			||||||
	AWSBatchChangeInterval            time.Duration
 | 
						AWSBatchChangeInterval            time.Duration
 | 
				
			||||||
	AWSEvaluateTargetHealth           bool
 | 
						AWSEvaluateTargetHealth           bool
 | 
				
			||||||
@ -223,10 +226,13 @@ var defaultConfig = &Config{
 | 
				
			|||||||
	ExcludeDomains:              []string{},
 | 
						ExcludeDomains:              []string{},
 | 
				
			||||||
	RegexDomainFilter:           regexp.MustCompile(""),
 | 
						RegexDomainFilter:           regexp.MustCompile(""),
 | 
				
			||||||
	RegexDomainExclusion:        regexp.MustCompile(""),
 | 
						RegexDomainExclusion:        regexp.MustCompile(""),
 | 
				
			||||||
 | 
						TargetNetFilter:             []string{},
 | 
				
			||||||
 | 
						ExcludeTargetNets:           []string{},
 | 
				
			||||||
	AlibabaCloudConfigFile:      "/etc/kubernetes/alibaba-cloud.json",
 | 
						AlibabaCloudConfigFile:      "/etc/kubernetes/alibaba-cloud.json",
 | 
				
			||||||
	AWSZoneType:                 "",
 | 
						AWSZoneType:                 "",
 | 
				
			||||||
	AWSZoneTagFilter:            []string{},
 | 
						AWSZoneTagFilter:            []string{},
 | 
				
			||||||
	AWSAssumeRole:               "",
 | 
						AWSAssumeRole:               "",
 | 
				
			||||||
 | 
						AWSAssumeRoleExternalID:     "",
 | 
				
			||||||
	AWSBatchChangeSize:          1000,
 | 
						AWSBatchChangeSize:          1000,
 | 
				
			||||||
	AWSBatchChangeInterval:      time.Second,
 | 
						AWSBatchChangeInterval:      time.Second,
 | 
				
			||||||
	AWSEvaluateTargetHealth:     true,
 | 
						AWSEvaluateTargetHealth:     true,
 | 
				
			||||||
@ -405,6 +411,8 @@ func (cfg *Config) ParseFlags(args []string) error {
 | 
				
			|||||||
	app.Flag("service-type-filter", "The service types to take care about (default: all, expected: ClusterIP, NodePort, LoadBalancer or ExternalName)").StringsVar(&cfg.ServiceTypeFilter)
 | 
						app.Flag("service-type-filter", "The service types to take care about (default: all, expected: ClusterIP, NodePort, LoadBalancer or ExternalName)").StringsVar(&cfg.ServiceTypeFilter)
 | 
				
			||||||
	app.Flag("managed-record-types", "Comma separated list of record types to manage (default: A, CNAME) (supported records: CNAME, A, NS").Default("A", "CNAME").StringsVar(&cfg.ManagedDNSRecordTypes)
 | 
						app.Flag("managed-record-types", "Comma separated list of record types to manage (default: A, CNAME) (supported records: CNAME, A, NS").Default("A", "CNAME").StringsVar(&cfg.ManagedDNSRecordTypes)
 | 
				
			||||||
	app.Flag("default-targets", "Set globally default IP address that will apply as a target instead of source addresses. Specify multiple times for multiple targets (optional)").StringsVar(&cfg.DefaultTargets)
 | 
						app.Flag("default-targets", "Set globally default IP address that will apply as a target instead of source addresses. Specify multiple times for multiple targets (optional)").StringsVar(&cfg.DefaultTargets)
 | 
				
			||||||
 | 
						app.Flag("target-net-filter", "Limit possible targets by a net filter; specify multiple times for multiple possible nets (optional)").StringsVar(&cfg.TargetNetFilter)
 | 
				
			||||||
 | 
						app.Flag("exclude-target-net", "Exclude target nets (optional)").StringsVar(&cfg.ExcludeTargetNets)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Flags related to providers
 | 
						// Flags related to providers
 | 
				
			||||||
	app.Flag("provider", "The DNS provider where the DNS records will be created (required, options: aws, aws-sd, godaddy, google, azure, azure-dns, azure-private-dns, bluecat, cloudflare, rcodezero, digitalocean, dnsimple, akamai, infoblox, dyn, designate, coredns, skydns, ibmcloud, inmemory, ovh, pdns, oci, exoscale, linode, rfc2136, ns1, transip, vinyldns, rdns, scaleway, vultr, ultradns, gandi, safedns)").Required().PlaceHolder("provider").EnumVar(&cfg.Provider, "aws", "aws-sd", "google", "azure", "azure-dns", "azure-private-dns", "alibabacloud", "cloudflare", "rcodezero", "digitalocean", "dnsimple", "akamai", "infoblox", "dyn", "designate", "coredns", "skydns", "ibmcloud", "inmemory", "ovh", "pdns", "oci", "exoscale", "linode", "rfc2136", "ns1", "transip", "vinyldns", "rdns", "scaleway", "vultr", "ultradns", "godaddy", "bluecat", "gandi", "safedns")
 | 
						app.Flag("provider", "The DNS provider where the DNS records will be created (required, options: aws, aws-sd, godaddy, google, azure, azure-dns, azure-private-dns, bluecat, cloudflare, rcodezero, digitalocean, dnsimple, akamai, infoblox, dyn, designate, coredns, skydns, ibmcloud, inmemory, ovh, pdns, oci, exoscale, linode, rfc2136, ns1, transip, vinyldns, rdns, scaleway, vultr, ultradns, gandi, safedns)").Required().PlaceHolder("provider").EnumVar(&cfg.Provider, "aws", "aws-sd", "google", "azure", "azure-dns", "azure-private-dns", "alibabacloud", "cloudflare", "rcodezero", "digitalocean", "dnsimple", "akamai", "infoblox", "dyn", "designate", "coredns", "skydns", "ibmcloud", "inmemory", "ovh", "pdns", "oci", "exoscale", "linode", "rfc2136", "ns1", "transip", "vinyldns", "rdns", "scaleway", "vultr", "ultradns", "godaddy", "bluecat", "gandi", "safedns")
 | 
				
			||||||
@ -423,6 +431,7 @@ func (cfg *Config) ParseFlags(args []string) error {
 | 
				
			|||||||
	app.Flag("aws-zone-type", "When using the AWS provider, filter for zones of this type (optional, options: public, private)").Default(defaultConfig.AWSZoneType).EnumVar(&cfg.AWSZoneType, "", "public", "private")
 | 
						app.Flag("aws-zone-type", "When using the AWS provider, filter for zones of this type (optional, options: public, private)").Default(defaultConfig.AWSZoneType).EnumVar(&cfg.AWSZoneType, "", "public", "private")
 | 
				
			||||||
	app.Flag("aws-zone-tags", "When using the AWS provider, filter for zones with these tags").Default("").StringsVar(&cfg.AWSZoneTagFilter)
 | 
						app.Flag("aws-zone-tags", "When using the AWS provider, filter for zones with these tags").Default("").StringsVar(&cfg.AWSZoneTagFilter)
 | 
				
			||||||
	app.Flag("aws-assume-role", "When using the AWS provider, assume this IAM role. Useful for hosted zones in another AWS account. Specify the full ARN, e.g. `arn:aws:iam::123455567:role/external-dns` (optional)").Default(defaultConfig.AWSAssumeRole).StringVar(&cfg.AWSAssumeRole)
 | 
						app.Flag("aws-assume-role", "When using the AWS provider, assume this IAM role. Useful for hosted zones in another AWS account. Specify the full ARN, e.g. `arn:aws:iam::123455567:role/external-dns` (optional)").Default(defaultConfig.AWSAssumeRole).StringVar(&cfg.AWSAssumeRole)
 | 
				
			||||||
 | 
						app.Flag("aws-assume-role-external-id", "When using the AWS provider and assuming a role then specify this external ID` (optional)").Default(defaultConfig.AWSAssumeRoleExternalID).StringVar(&cfg.AWSAssumeRoleExternalID)
 | 
				
			||||||
	app.Flag("aws-batch-change-size", "When using the AWS provider, set the maximum number of changes that will be applied in each batch.").Default(strconv.Itoa(defaultConfig.AWSBatchChangeSize)).IntVar(&cfg.AWSBatchChangeSize)
 | 
						app.Flag("aws-batch-change-size", "When using the AWS provider, set the maximum number of changes that will be applied in each batch.").Default(strconv.Itoa(defaultConfig.AWSBatchChangeSize)).IntVar(&cfg.AWSBatchChangeSize)
 | 
				
			||||||
	app.Flag("aws-batch-change-interval", "When using the AWS provider, set the interval between batch changes.").Default(defaultConfig.AWSBatchChangeInterval.String()).DurationVar(&cfg.AWSBatchChangeInterval)
 | 
						app.Flag("aws-batch-change-interval", "When using the AWS provider, set the interval between batch changes.").Default(defaultConfig.AWSBatchChangeInterval.String()).DurationVar(&cfg.AWSBatchChangeInterval)
 | 
				
			||||||
	app.Flag("aws-evaluate-target-health", "When using the AWS provider, set whether to evaluate the health of a DNS target (default: enabled, disable with --no-aws-evaluate-target-health)").Default(strconv.FormatBool(defaultConfig.AWSEvaluateTargetHealth)).BoolVar(&cfg.AWSEvaluateTargetHealth)
 | 
						app.Flag("aws-evaluate-target-health", "When using the AWS provider, set whether to evaluate the health of a DNS target (default: enabled, disable with --no-aws-evaluate-target-health)").Default(strconv.FormatBool(defaultConfig.AWSEvaluateTargetHealth)).BoolVar(&cfg.AWSEvaluateTargetHealth)
 | 
				
			||||||
 | 
				
			|||||||
@ -57,6 +57,7 @@ var (
 | 
				
			|||||||
		AWSZoneType:                 "",
 | 
							AWSZoneType:                 "",
 | 
				
			||||||
		AWSZoneTagFilter:            []string{""},
 | 
							AWSZoneTagFilter:            []string{""},
 | 
				
			||||||
		AWSAssumeRole:               "",
 | 
							AWSAssumeRole:               "",
 | 
				
			||||||
 | 
							AWSAssumeRoleExternalID:     "",
 | 
				
			||||||
		AWSBatchChangeSize:          1000,
 | 
							AWSBatchChangeSize:          1000,
 | 
				
			||||||
		AWSBatchChangeInterval:      time.Second,
 | 
							AWSBatchChangeInterval:      time.Second,
 | 
				
			||||||
		AWSEvaluateTargetHealth:     true,
 | 
							AWSEvaluateTargetHealth:     true,
 | 
				
			||||||
@ -153,10 +154,13 @@ var (
 | 
				
			|||||||
		RegexDomainExclusion:        regexp.MustCompile("xapi\\.(example\\.org|company\\.com)$"),
 | 
							RegexDomainExclusion:        regexp.MustCompile("xapi\\.(example\\.org|company\\.com)$"),
 | 
				
			||||||
		ZoneNameFilter:              []string{"yapi.example.org", "yapi.company.com"},
 | 
							ZoneNameFilter:              []string{"yapi.example.org", "yapi.company.com"},
 | 
				
			||||||
		ZoneIDFilter:                []string{"/hostedzone/ZTST1", "/hostedzone/ZTST2"},
 | 
							ZoneIDFilter:                []string{"/hostedzone/ZTST1", "/hostedzone/ZTST2"},
 | 
				
			||||||
 | 
							TargetNetFilter:             []string{"10.0.0.0/9", "10.1.0.0/9"},
 | 
				
			||||||
 | 
							ExcludeTargetNets:           []string{"1.0.0.0/9", "1.1.0.0/9"},
 | 
				
			||||||
		AlibabaCloudConfigFile:      "/etc/kubernetes/alibaba-cloud.json",
 | 
							AlibabaCloudConfigFile:      "/etc/kubernetes/alibaba-cloud.json",
 | 
				
			||||||
		AWSZoneType:                 "private",
 | 
							AWSZoneType:                 "private",
 | 
				
			||||||
		AWSZoneTagFilter:            []string{"tag=foo"},
 | 
							AWSZoneTagFilter:            []string{"tag=foo"},
 | 
				
			||||||
		AWSAssumeRole:               "some-other-role",
 | 
							AWSAssumeRole:               "some-other-role",
 | 
				
			||||||
 | 
							AWSAssumeRoleExternalID:     "pg2000",
 | 
				
			||||||
		AWSBatchChangeSize:          100,
 | 
							AWSBatchChangeSize:          100,
 | 
				
			||||||
		AWSBatchChangeInterval:      time.Second * 2,
 | 
							AWSBatchChangeInterval:      time.Second * 2,
 | 
				
			||||||
		AWSEvaluateTargetHealth:     false,
 | 
							AWSEvaluateTargetHealth:     false,
 | 
				
			||||||
@ -323,9 +327,14 @@ func TestParseFlags(t *testing.T) {
 | 
				
			|||||||
				"--zone-name-filter=yapi.company.com",
 | 
									"--zone-name-filter=yapi.company.com",
 | 
				
			||||||
				"--zone-id-filter=/hostedzone/ZTST1",
 | 
									"--zone-id-filter=/hostedzone/ZTST1",
 | 
				
			||||||
				"--zone-id-filter=/hostedzone/ZTST2",
 | 
									"--zone-id-filter=/hostedzone/ZTST2",
 | 
				
			||||||
 | 
									"--target-net-filter=10.0.0.0/9",
 | 
				
			||||||
 | 
									"--target-net-filter=10.1.0.0/9",
 | 
				
			||||||
 | 
									"--exclude-target-net=1.0.0.0/9",
 | 
				
			||||||
 | 
									"--exclude-target-net=1.1.0.0/9",
 | 
				
			||||||
				"--aws-zone-type=private",
 | 
									"--aws-zone-type=private",
 | 
				
			||||||
				"--aws-zone-tags=tag=foo",
 | 
									"--aws-zone-tags=tag=foo",
 | 
				
			||||||
				"--aws-assume-role=some-other-role",
 | 
									"--aws-assume-role=some-other-role",
 | 
				
			||||||
 | 
									"--aws-assume-role-external-id=pg2000",
 | 
				
			||||||
				"--aws-batch-change-size=100",
 | 
									"--aws-batch-change-size=100",
 | 
				
			||||||
				"--aws-batch-change-interval=2s",
 | 
									"--aws-batch-change-interval=2s",
 | 
				
			||||||
				"--aws-api-retries=13",
 | 
									"--aws-api-retries=13",
 | 
				
			||||||
@ -426,6 +435,8 @@ func TestParseFlags(t *testing.T) {
 | 
				
			|||||||
				"EXTERNAL_DNS_EXCLUDE_DOMAINS":                 "xapi.example.org\nxapi.company.com",
 | 
									"EXTERNAL_DNS_EXCLUDE_DOMAINS":                 "xapi.example.org\nxapi.company.com",
 | 
				
			||||||
				"EXTERNAL_DNS_REGEX_DOMAIN_FILTER":             "(example\\.org|company\\.com)$",
 | 
									"EXTERNAL_DNS_REGEX_DOMAIN_FILTER":             "(example\\.org|company\\.com)$",
 | 
				
			||||||
				"EXTERNAL_DNS_REGEX_DOMAIN_EXCLUSION":          "xapi\\.(example\\.org|company\\.com)$",
 | 
									"EXTERNAL_DNS_REGEX_DOMAIN_EXCLUSION":          "xapi\\.(example\\.org|company\\.com)$",
 | 
				
			||||||
 | 
									"EXTERNAL_DNS_TARGET_NET_FILTER":               "10.0.0.0/9\n10.1.0.0/9",
 | 
				
			||||||
 | 
									"EXTERNAL_DNS_EXCLUDE_TARGET_NET":              "1.0.0.0/9\n1.1.0.0/9",
 | 
				
			||||||
				"EXTERNAL_DNS_PDNS_SERVER":                     "http://ns.example.com:8081",
 | 
									"EXTERNAL_DNS_PDNS_SERVER":                     "http://ns.example.com:8081",
 | 
				
			||||||
				"EXTERNAL_DNS_PDNS_API_KEY":                    "some-secret-key",
 | 
									"EXTERNAL_DNS_PDNS_API_KEY":                    "some-secret-key",
 | 
				
			||||||
				"EXTERNAL_DNS_PDNS_TLS_ENABLED":                "1",
 | 
									"EXTERNAL_DNS_PDNS_TLS_ENABLED":                "1",
 | 
				
			||||||
@ -438,6 +449,7 @@ func TestParseFlags(t *testing.T) {
 | 
				
			|||||||
				"EXTERNAL_DNS_AWS_ZONE_TYPE":                   "private",
 | 
									"EXTERNAL_DNS_AWS_ZONE_TYPE":                   "private",
 | 
				
			||||||
				"EXTERNAL_DNS_AWS_ZONE_TAGS":                   "tag=foo",
 | 
									"EXTERNAL_DNS_AWS_ZONE_TAGS":                   "tag=foo",
 | 
				
			||||||
				"EXTERNAL_DNS_AWS_ASSUME_ROLE":                 "some-other-role",
 | 
									"EXTERNAL_DNS_AWS_ASSUME_ROLE":                 "some-other-role",
 | 
				
			||||||
 | 
									"EXTERNAL_DNS_AWS_ASSUME_ROLE_EXTERNAL_ID":     "pg2000",
 | 
				
			||||||
				"EXTERNAL_DNS_AWS_BATCH_CHANGE_SIZE":           "100",
 | 
									"EXTERNAL_DNS_AWS_BATCH_CHANGE_SIZE":           "100",
 | 
				
			||||||
				"EXTERNAL_DNS_AWS_BATCH_CHANGE_INTERVAL":       "2s",
 | 
									"EXTERNAL_DNS_AWS_BATCH_CHANGE_INTERVAL":       "2s",
 | 
				
			||||||
				"EXTERNAL_DNS_AWS_EVALUATE_TARGET_HEALTH":      "0",
 | 
									"EXTERNAL_DNS_AWS_EVALUATE_TARGET_HEALTH":      "0",
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										11
									
								
								plan/plan.go
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								plan/plan.go
									
									
									
									
									
								
							@ -37,6 +37,8 @@ type Plan struct {
 | 
				
			|||||||
	Current []*endpoint.Endpoint
 | 
						Current []*endpoint.Endpoint
 | 
				
			||||||
	// List of desired records
 | 
						// List of desired records
 | 
				
			||||||
	Desired []*endpoint.Endpoint
 | 
						Desired []*endpoint.Endpoint
 | 
				
			||||||
 | 
						// List of missing records to be created, use for the migrations (e.g. old-new TXT format)
 | 
				
			||||||
 | 
						Missing []*endpoint.Endpoint
 | 
				
			||||||
	// Policies under which the desired changes are calculated
 | 
						// Policies under which the desired changes are calculated
 | 
				
			||||||
	Policies []Policy
 | 
						Policies []Policy
 | 
				
			||||||
	// List of changes necessary to move towards desired state
 | 
						// List of changes necessary to move towards desired state
 | 
				
			||||||
@ -170,6 +172,11 @@ func (p *Plan) Calculate() *Plan {
 | 
				
			|||||||
		changes = pol.Apply(changes)
 | 
							changes = pol.Apply(changes)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// Handle the migration of the TXT records created before the new format (introduced in v0.12.0)
 | 
				
			||||||
 | 
						if len(p.Missing) > 0 {
 | 
				
			||||||
 | 
							changes.Create = append(changes.Create, filterRecordsForPlan(p.Missing, p.DomainFilter, append(p.ManagedRecords, endpoint.RecordTypeTXT))...)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	plan := &Plan{
 | 
						plan := &Plan{
 | 
				
			||||||
		Current:        p.Current,
 | 
							Current:        p.Current,
 | 
				
			||||||
		Desired:        p.Desired,
 | 
							Desired:        p.Desired,
 | 
				
			||||||
@ -250,7 +257,7 @@ func filterRecordsForPlan(records []*endpoint.Endpoint, domainFilter endpoint.Do
 | 
				
			|||||||
			log.Debugf("ignoring record %s that does not match domain filter", record.DNSName)
 | 
								log.Debugf("ignoring record %s that does not match domain filter", record.DNSName)
 | 
				
			||||||
			continue
 | 
								continue
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		if isManagedRecord(record.RecordType, managedRecords) {
 | 
							if IsManagedRecord(record.RecordType, managedRecords) {
 | 
				
			||||||
			filtered = append(filtered, record)
 | 
								filtered = append(filtered, record)
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -293,7 +300,7 @@ func CompareBoolean(defaultValue bool, name, current, previous string) bool {
 | 
				
			|||||||
	return v1 == v2
 | 
						return v1 == v2
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func isManagedRecord(record string, managedRecords []string) bool {
 | 
					func IsManagedRecord(record string, managedRecords []string) bool {
 | 
				
			||||||
	for _, r := range managedRecords {
 | 
						for _, r := range managedRecords {
 | 
				
			||||||
		if record == r {
 | 
							if record == r {
 | 
				
			||||||
			return true
 | 
								return true
 | 
				
			||||||
 | 
				
			|||||||
@ -48,6 +48,9 @@ type PlanTestSuite struct {
 | 
				
			|||||||
	domainFilterFiltered2            *endpoint.Endpoint
 | 
						domainFilterFiltered2            *endpoint.Endpoint
 | 
				
			||||||
	domainFilterFiltered3            *endpoint.Endpoint
 | 
						domainFilterFiltered3            *endpoint.Endpoint
 | 
				
			||||||
	domainFilterExcluded             *endpoint.Endpoint
 | 
						domainFilterExcluded             *endpoint.Endpoint
 | 
				
			||||||
 | 
						domainFilterFilteredTXT1         *endpoint.Endpoint
 | 
				
			||||||
 | 
						domainFilterFilteredTXT2         *endpoint.Endpoint
 | 
				
			||||||
 | 
						domainFilterExcludedTXT          *endpoint.Endpoint
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *PlanTestSuite) SetupTest() {
 | 
					func (suite *PlanTestSuite) SetupTest() {
 | 
				
			||||||
@ -203,6 +206,21 @@ func (suite *PlanTestSuite) SetupTest() {
 | 
				
			|||||||
		Targets:    endpoint.Targets{"1.1.1.1"},
 | 
							Targets:    endpoint.Targets{"1.1.1.1"},
 | 
				
			||||||
		RecordType: "A",
 | 
							RecordType: "A",
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
						suite.domainFilterFilteredTXT1 = &endpoint.Endpoint{
 | 
				
			||||||
 | 
							DNSName:    "a-foo.domain.tld",
 | 
				
			||||||
 | 
							Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
							RecordType: "TXT",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						suite.domainFilterFilteredTXT2 = &endpoint.Endpoint{
 | 
				
			||||||
 | 
							DNSName:    "cname-bar.domain.tld",
 | 
				
			||||||
 | 
							Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
							RecordType: "TXT",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						suite.domainFilterExcludedTXT = &endpoint.Endpoint{
 | 
				
			||||||
 | 
							DNSName:    "cname-bar.otherdomain.tld",
 | 
				
			||||||
 | 
							Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
							RecordType: "TXT",
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (suite *PlanTestSuite) TestSyncFirstRound() {
 | 
					func (suite *PlanTestSuite) TestSyncFirstRound() {
 | 
				
			||||||
@ -667,6 +685,22 @@ func (suite *PlanTestSuite) TestDomainFiltersUpdate() {
 | 
				
			|||||||
	validateEntries(suite.T(), changes.Delete, expectedDelete)
 | 
						validateEntries(suite.T(), changes.Delete, expectedDelete)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (suite *PlanTestSuite) TestMissing() {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						missing := []*endpoint.Endpoint{suite.domainFilterFilteredTXT1, suite.domainFilterFilteredTXT2, suite.domainFilterExcludedTXT}
 | 
				
			||||||
 | 
						expectedCreate := []*endpoint.Endpoint{suite.domainFilterFilteredTXT1, suite.domainFilterFilteredTXT2}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						p := &Plan{
 | 
				
			||||||
 | 
							Policies:       []Policy{&SyncPolicy{}},
 | 
				
			||||||
 | 
							Missing:        missing,
 | 
				
			||||||
 | 
							DomainFilter:   endpoint.NewDomainFilter([]string{"domain.tld"}),
 | 
				
			||||||
 | 
							ManagedRecords: []string{endpoint.RecordTypeA, endpoint.RecordTypeCNAME},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						changes := p.Calculate().Changes
 | 
				
			||||||
 | 
						validateEntries(suite.T(), changes.Create, expectedCreate)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestPlan(t *testing.T) {
 | 
					func TestPlan(t *testing.T) {
 | 
				
			||||||
	suite.Run(t, new(PlanTestSuite))
 | 
						suite.Run(t, new(PlanTestSuite))
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -170,6 +170,7 @@ type AWSConfig struct {
 | 
				
			|||||||
	BatchChangeInterval  time.Duration
 | 
						BatchChangeInterval  time.Duration
 | 
				
			||||||
	EvaluateTargetHealth bool
 | 
						EvaluateTargetHealth bool
 | 
				
			||||||
	AssumeRole           string
 | 
						AssumeRole           string
 | 
				
			||||||
 | 
						AssumeRoleExternalID string
 | 
				
			||||||
	APIRetries           int
 | 
						APIRetries           int
 | 
				
			||||||
	PreferCNAME          bool
 | 
						PreferCNAME          bool
 | 
				
			||||||
	DryRun               bool
 | 
						DryRun               bool
 | 
				
			||||||
@ -198,8 +199,15 @@ func NewAWSProvider(awsConfig AWSConfig) (*AWSProvider, error) {
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if awsConfig.AssumeRole != "" {
 | 
						if awsConfig.AssumeRole != "" {
 | 
				
			||||||
		log.Infof("Assuming role: %s", awsConfig.AssumeRole)
 | 
							if awsConfig.AssumeRoleExternalID != "" {
 | 
				
			||||||
		session.Config.WithCredentials(stscreds.NewCredentials(session, awsConfig.AssumeRole))
 | 
								log.Infof("Assuming role: %s with external id %s", awsConfig.AssumeRole, awsConfig.AssumeRoleExternalID)
 | 
				
			||||||
 | 
								session.Config.WithCredentials(stscreds.NewCredentials(session, awsConfig.AssumeRole, func(p *stscreds.AssumeRoleProvider) {
 | 
				
			||||||
 | 
									p.ExternalID = &awsConfig.AssumeRoleExternalID
 | 
				
			||||||
 | 
								}))
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								log.Infof("Assuming role: %s", awsConfig.AssumeRole)
 | 
				
			||||||
 | 
								session.Config.WithCredentials(stscreds.NewCredentials(session, awsConfig.AssumeRole))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	provider := &AWSProvider{
 | 
						provider := &AWSProvider{
 | 
				
			||||||
 | 
				
			|||||||
@ -88,7 +88,7 @@ type AWSSDProvider struct {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewAWSSDProvider initializes a new AWS Cloud Map based Provider.
 | 
					// NewAWSSDProvider initializes a new AWS Cloud Map based Provider.
 | 
				
			||||||
func NewAWSSDProvider(domainFilter endpoint.DomainFilter, namespaceType string, assumeRole string, dryRun, cleanEmptyService bool, ownerID string) (*AWSSDProvider, error) {
 | 
					func NewAWSSDProvider(domainFilter endpoint.DomainFilter, namespaceType string, assumeRole string, assumeRoleExternalID string, dryRun, cleanEmptyService bool, ownerID string) (*AWSSDProvider, error) {
 | 
				
			||||||
	config := aws.NewConfig()
 | 
						config := aws.NewConfig()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	config = config.WithHTTPClient(
 | 
						config = config.WithHTTPClient(
 | 
				
			||||||
@ -109,8 +109,15 @@ func NewAWSSDProvider(domainFilter endpoint.DomainFilter, namespaceType string,
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if assumeRole != "" {
 | 
						if assumeRole != "" {
 | 
				
			||||||
		log.Infof("Assuming role: %s", assumeRole)
 | 
							if assumeRoleExternalID != "" {
 | 
				
			||||||
		sess.Config.WithCredentials(stscreds.NewCredentials(sess, assumeRole))
 | 
								log.Infof("Assuming role %q with external ID %q", assumeRole, assumeRoleExternalID)
 | 
				
			||||||
 | 
								sess.Config.WithCredentials(stscreds.NewCredentials(sess, assumeRole, func(p *stscreds.AssumeRoleProvider) {
 | 
				
			||||||
 | 
									p.ExternalID = &assumeRoleExternalID
 | 
				
			||||||
 | 
								}))
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								log.Infof("Assuming role: %s", assumeRole)
 | 
				
			||||||
 | 
								sess.Config.WithCredentials(stscreds.NewCredentials(sess, assumeRole))
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	sess.Handlers.Build.PushBack(request.MakeAddToUserAgentHandler("ExternalDNS", externaldns.Version))
 | 
						sess.Handlers.Build.PushBack(request.MakeAddToUserAgentHandler("ExternalDNS", externaldns.Version))
 | 
				
			||||||
 | 
				
			|||||||
@ -531,7 +531,8 @@ func (p *ProviderConfig) recordSet(ep *endpoint.Endpoint, getObject bool, target
 | 
				
			|||||||
		obj.Ipv4Addr = ep.Targets[targetIndex]
 | 
							obj.Ipv4Addr = ep.Targets[targetIndex]
 | 
				
			||||||
		obj.View = p.view
 | 
							obj.View = p.view
 | 
				
			||||||
		if getObject {
 | 
							if getObject {
 | 
				
			||||||
			err = p.client.GetObject(obj, "", nil, &res)
 | 
								queryParams := ibclient.NewQueryParams(false, map[string]string{"name": obj.Name})
 | 
				
			||||||
 | 
								err = p.client.GetObject(obj, "", queryParams, &res)
 | 
				
			||||||
			if err != nil && !isNotFoundError(err) {
 | 
								if err != nil && !isNotFoundError(err) {
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -547,7 +548,8 @@ func (p *ProviderConfig) recordSet(ep *endpoint.Endpoint, getObject bool, target
 | 
				
			|||||||
		obj.Ipv4Addr = ep.Targets[targetIndex]
 | 
							obj.Ipv4Addr = ep.Targets[targetIndex]
 | 
				
			||||||
		obj.View = p.view
 | 
							obj.View = p.view
 | 
				
			||||||
		if getObject {
 | 
							if getObject {
 | 
				
			||||||
			err = p.client.GetObject(obj, "", nil, &res)
 | 
								queryParams := ibclient.NewQueryParams(false, map[string]string{"name": obj.PtrdName})
 | 
				
			||||||
 | 
								err = p.client.GetObject(obj, "", queryParams, &res)
 | 
				
			||||||
			if err != nil && !isNotFoundError(err) {
 | 
								if err != nil && !isNotFoundError(err) {
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -563,7 +565,8 @@ func (p *ProviderConfig) recordSet(ep *endpoint.Endpoint, getObject bool, target
 | 
				
			|||||||
		obj.Canonical = ep.Targets[0]
 | 
							obj.Canonical = ep.Targets[0]
 | 
				
			||||||
		obj.View = p.view
 | 
							obj.View = p.view
 | 
				
			||||||
		if getObject {
 | 
							if getObject {
 | 
				
			||||||
			err = p.client.GetObject(obj, "", nil, &res)
 | 
								queryParams := ibclient.NewQueryParams(false, map[string]string{"name": obj.Name})
 | 
				
			||||||
 | 
								err = p.client.GetObject(obj, "", queryParams, &res)
 | 
				
			||||||
			if err != nil && !isNotFoundError(err) {
 | 
								if err != nil && !isNotFoundError(err) {
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
@ -587,7 +590,8 @@ func (p *ProviderConfig) recordSet(ep *endpoint.Endpoint, getObject bool, target
 | 
				
			|||||||
			},
 | 
								},
 | 
				
			||||||
		)
 | 
							)
 | 
				
			||||||
		if getObject {
 | 
							if getObject {
 | 
				
			||||||
			err = p.client.GetObject(obj, "", nil, &res)
 | 
								queryParams := ibclient.NewQueryParams(false, map[string]string{"name": obj.Name})
 | 
				
			||||||
 | 
								err = p.client.GetObject(obj, "", queryParams, &res)
 | 
				
			||||||
			if err != nil && !isNotFoundError(err) {
 | 
								if err != nil && !isNotFoundError(err) {
 | 
				
			||||||
				return
 | 
									return
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
				
			|||||||
@ -20,6 +20,7 @@ import (
 | 
				
			|||||||
	"context"
 | 
						"context"
 | 
				
			||||||
	"encoding/base64"
 | 
						"encoding/base64"
 | 
				
			||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
 | 
						"net/http"
 | 
				
			||||||
	"regexp"
 | 
						"regexp"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
@ -741,6 +742,38 @@ func TestExtendedRequestMaxResultsBuilder(t *testing.T) {
 | 
				
			|||||||
	assert.True(t, req.URL.Query().Get("_max_results") == "")
 | 
						assert.True(t, req.URL.Query().Get("_max_results") == "")
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestGetObject(t *testing.T) {
 | 
				
			||||||
 | 
						hostCfg := ibclient.HostConfig{}
 | 
				
			||||||
 | 
						authCfg := ibclient.AuthConfig{}
 | 
				
			||||||
 | 
						transportConfig := ibclient.TransportConfig{}
 | 
				
			||||||
 | 
						requestBuilder := NewExtendedRequestBuilder(1000, "mysite.com")
 | 
				
			||||||
 | 
						requestor := mockRequestor{}
 | 
				
			||||||
 | 
						client, _ := ibclient.NewConnector(hostCfg, authCfg, transportConfig, requestBuilder, &requestor)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						providerConfig := newInfobloxProvider(endpoint.NewDomainFilter([]string{"mysite.com"}), provider.NewZoneIDFilter([]string{""}), true, true, client)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						providerConfig.deleteRecords(infobloxChangeMap{
 | 
				
			||||||
 | 
							"myzone.com": []*endpoint.Endpoint{
 | 
				
			||||||
 | 
								endpoint.NewEndpoint("deletethisrecord.com", endpoint.RecordTypeA, "1.2.3.4"),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						requestQuery := requestor.request.URL.Query()
 | 
				
			||||||
 | 
						assert.True(t, requestQuery.Has("name"), "Expected the request to filter objects by name")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Mock requestor that doesn't send request
 | 
				
			||||||
 | 
					type mockRequestor struct {
 | 
				
			||||||
 | 
						request *http.Request
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (r *mockRequestor) Init(ibclient.AuthConfig, ibclient.TransportConfig) {}
 | 
				
			||||||
 | 
					func (r *mockRequestor) SendRequest(req *http.Request) (res []byte, err error) {
 | 
				
			||||||
 | 
						res = []byte("[{}]")
 | 
				
			||||||
 | 
						r.request = req
 | 
				
			||||||
 | 
						return
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func validateEndpoints(t *testing.T, endpoints []*endpoint.Endpoint, expected []*endpoint.Endpoint) {
 | 
					func validateEndpoints(t *testing.T, endpoints []*endpoint.Endpoint, expected []*endpoint.Endpoint) {
 | 
				
			||||||
	assert.True(t, testutils.SameEndpoints(endpoints, expected), "actual and expected endpoints don't match. %s:%s", endpoints, expected)
 | 
						assert.True(t, testutils.SameEndpoints(endpoints, expected), "actual and expected endpoints don't match. %s:%s", endpoints, expected)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -21,10 +21,10 @@ import (
 | 
				
			|||||||
	"fmt"
 | 
						"fmt"
 | 
				
			||||||
	"os"
 | 
						"os"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ansClient "github.com/ans-group/sdk-go/pkg/client"
 | 
				
			||||||
 | 
						ansConnection "github.com/ans-group/sdk-go/pkg/connection"
 | 
				
			||||||
 | 
						"github.com/ans-group/sdk-go/pkg/service/safedns"
 | 
				
			||||||
	log "github.com/sirupsen/logrus"
 | 
						log "github.com/sirupsen/logrus"
 | 
				
			||||||
	ukfClient "github.com/ukfast/sdk-go/pkg/client"
 | 
					 | 
				
			||||||
	ukfConnection "github.com/ukfast/sdk-go/pkg/connection"
 | 
					 | 
				
			||||||
	"github.com/ukfast/sdk-go/pkg/service/safedns"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"sigs.k8s.io/external-dns/endpoint"
 | 
						"sigs.k8s.io/external-dns/endpoint"
 | 
				
			||||||
	"sigs.k8s.io/external-dns/plan"
 | 
						"sigs.k8s.io/external-dns/plan"
 | 
				
			||||||
@ -38,8 +38,8 @@ type SafeDNS interface {
 | 
				
			|||||||
	DeleteZoneRecord(zoneName string, recordID int) error
 | 
						DeleteZoneRecord(zoneName string, recordID int) error
 | 
				
			||||||
	GetZone(zoneName string) (safedns.Zone, error)
 | 
						GetZone(zoneName string) (safedns.Zone, error)
 | 
				
			||||||
	GetZoneRecord(zoneName string, recordID int) (safedns.Record, error)
 | 
						GetZoneRecord(zoneName string, recordID int) (safedns.Record, error)
 | 
				
			||||||
	GetZoneRecords(zoneName string, parameters ukfConnection.APIRequestParameters) ([]safedns.Record, error)
 | 
						GetZoneRecords(zoneName string, parameters ansConnection.APIRequestParameters) ([]safedns.Record, error)
 | 
				
			||||||
	GetZones(parameters ukfConnection.APIRequestParameters) ([]safedns.Zone, error)
 | 
						GetZones(parameters ansConnection.APIRequestParameters) ([]safedns.Zone, error)
 | 
				
			||||||
	PatchZoneRecord(zoneName string, recordID int, patch safedns.PatchRecordRequest) (int, error)
 | 
						PatchZoneRecord(zoneName string, recordID int, patch safedns.PatchRecordRequest) (int, error)
 | 
				
			||||||
	UpdateZoneRecord(zoneName string, record safedns.Record) (int, error)
 | 
						UpdateZoneRecord(zoneName string, record safedns.Record) (int, error)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@ -51,7 +51,7 @@ type SafeDNSProvider struct {
 | 
				
			|||||||
	// Only consider hosted zones managing domains ending in this suffix
 | 
						// Only consider hosted zones managing domains ending in this suffix
 | 
				
			||||||
	domainFilter     endpoint.DomainFilter
 | 
						domainFilter     endpoint.DomainFilter
 | 
				
			||||||
	DryRun           bool
 | 
						DryRun           bool
 | 
				
			||||||
	APIRequestParams ukfConnection.APIRequestParameters
 | 
						APIRequestParams ansConnection.APIRequestParameters
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ZoneRecord is a datatype to simplify management of a record in a zone.
 | 
					// ZoneRecord is a datatype to simplify management of a record in a zone.
 | 
				
			||||||
@ -70,15 +70,15 @@ func NewSafeDNSProvider(domainFilter endpoint.DomainFilter, dryRun bool) (*SafeD
 | 
				
			|||||||
		return nil, fmt.Errorf("no SAFEDNS_TOKEN found in environment")
 | 
							return nil, fmt.Errorf("no SAFEDNS_TOKEN found in environment")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	ukfAPIConnection := ukfConnection.NewAPIKeyCredentialsAPIConnection(token)
 | 
						ukfAPIConnection := ansConnection.NewAPIKeyCredentialsAPIConnection(token)
 | 
				
			||||||
	ukfClient := ukfClient.NewClient(ukfAPIConnection)
 | 
						ansClient := ansClient.NewClient(ukfAPIConnection)
 | 
				
			||||||
	safeDNS := ukfClient.SafeDNSService()
 | 
						safeDNS := ansClient.SafeDNSService()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	provider := &SafeDNSProvider{
 | 
						provider := &SafeDNSProvider{
 | 
				
			||||||
		Client:           safeDNS,
 | 
							Client:           safeDNS,
 | 
				
			||||||
		domainFilter:     domainFilter,
 | 
							domainFilter:     domainFilter,
 | 
				
			||||||
		DryRun:           dryRun,
 | 
							DryRun:           dryRun,
 | 
				
			||||||
		APIRequestParams: *ukfConnection.NewAPIRequestParameters(),
 | 
							APIRequestParams: *ansConnection.NewAPIRequestParameters(),
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return provider, nil
 | 
						return provider, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -21,11 +21,11 @@ import (
 | 
				
			|||||||
	"os"
 | 
						"os"
 | 
				
			||||||
	"testing"
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ansConnection "github.com/ans-group/sdk-go/pkg/connection"
 | 
				
			||||||
 | 
						"github.com/ans-group/sdk-go/pkg/service/safedns"
 | 
				
			||||||
	"github.com/stretchr/testify/assert"
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
	"github.com/stretchr/testify/mock"
 | 
						"github.com/stretchr/testify/mock"
 | 
				
			||||||
	"github.com/stretchr/testify/require"
 | 
						"github.com/stretchr/testify/require"
 | 
				
			||||||
	ukfConnection "github.com/ukfast/sdk-go/pkg/connection"
 | 
					 | 
				
			||||||
	"github.com/ukfast/sdk-go/pkg/service/safedns"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"sigs.k8s.io/external-dns/endpoint"
 | 
						"sigs.k8s.io/external-dns/endpoint"
 | 
				
			||||||
	"sigs.k8s.io/external-dns/plan"
 | 
						"sigs.k8s.io/external-dns/plan"
 | 
				
			||||||
@ -56,12 +56,12 @@ func (m *MockSafeDNSService) GetZoneRecord(zoneName string, recordID int) (safed
 | 
				
			|||||||
	return args.Get(0).(safedns.Record), args.Error(1)
 | 
						return args.Get(0).(safedns.Record), args.Error(1)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *MockSafeDNSService) GetZoneRecords(zoneName string, parameters ukfConnection.APIRequestParameters) ([]safedns.Record, error) {
 | 
					func (m *MockSafeDNSService) GetZoneRecords(zoneName string, parameters ansConnection.APIRequestParameters) ([]safedns.Record, error) {
 | 
				
			||||||
	args := m.Called(zoneName, parameters)
 | 
						args := m.Called(zoneName, parameters)
 | 
				
			||||||
	return args.Get(0).([]safedns.Record), args.Error(1)
 | 
						return args.Get(0).([]safedns.Record), args.Error(1)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func (m *MockSafeDNSService) GetZones(parameters ukfConnection.APIRequestParameters) ([]safedns.Zone, error) {
 | 
					func (m *MockSafeDNSService) GetZones(parameters ansConnection.APIRequestParameters) ([]safedns.Zone, error) {
 | 
				
			||||||
	args := m.Called(parameters)
 | 
						args := m.Called(parameters)
 | 
				
			||||||
	return args.Get(0).([]safedns.Zone), args.Error(1)
 | 
						return args.Get(0).([]safedns.Zone), args.Error(1)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -67,6 +67,11 @@ func (sdr *AWSSDRegistry) Records(ctx context.Context) ([]*endpoint.Endpoint, er
 | 
				
			|||||||
	return records, nil
 | 
						return records, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MissingRecords returns nil because there is no missing records for AWSSD registry
 | 
				
			||||||
 | 
					func (sdr *AWSSDRegistry) MissingRecords() []*endpoint.Endpoint {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ApplyChanges filters out records not owned the External-DNS, additionally it adds the required label
 | 
					// ApplyChanges filters out records not owned the External-DNS, additionally it adds the required label
 | 
				
			||||||
// inserted in the AWS SD instance as a CreateID field
 | 
					// inserted in the AWS SD instance as a CreateID field
 | 
				
			||||||
func (sdr *AWSSDRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
 | 
					func (sdr *AWSSDRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
 | 
				
			||||||
 | 
				
			|||||||
@ -45,6 +45,11 @@ func (im *NoopRegistry) Records(ctx context.Context) ([]*endpoint.Endpoint, erro
 | 
				
			|||||||
	return im.provider.Records(ctx)
 | 
						return im.provider.Records(ctx)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MissingRecords returns nil because there is no missing records for Noop registry
 | 
				
			||||||
 | 
					func (im *NoopRegistry) MissingRecords() []*endpoint.Endpoint {
 | 
				
			||||||
 | 
						return nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// ApplyChanges propagates changes to the dns provider
 | 
					// ApplyChanges propagates changes to the dns provider
 | 
				
			||||||
func (im *NoopRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
 | 
					func (im *NoopRegistry) ApplyChanges(ctx context.Context, changes *plan.Changes) error {
 | 
				
			||||||
	return im.provider.ApplyChanges(ctx, changes)
 | 
						return im.provider.ApplyChanges(ctx, changes)
 | 
				
			||||||
 | 
				
			|||||||
@ -35,6 +35,7 @@ type Registry interface {
 | 
				
			|||||||
	PropertyValuesEqual(attribute string, previous string, current string) bool
 | 
						PropertyValuesEqual(attribute string, previous string, current string) bool
 | 
				
			||||||
	AdjustEndpoints(endpoints []*endpoint.Endpoint) []*endpoint.Endpoint
 | 
						AdjustEndpoints(endpoints []*endpoint.Endpoint) []*endpoint.Endpoint
 | 
				
			||||||
	GetDomainFilter() endpoint.DomainFilterInterface
 | 
						GetDomainFilter() endpoint.DomainFilterInterface
 | 
				
			||||||
 | 
						MissingRecords() []*endpoint.Endpoint
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//TODO(ideahitme): consider moving this to Plan
 | 
					//TODO(ideahitme): consider moving this to Plan
 | 
				
			||||||
 | 
				
			|||||||
@ -47,10 +47,15 @@ type TXTRegistry struct {
 | 
				
			|||||||
	// registry TXT records corresponding to wildcard records will be invalid (and rejected by most providers), due to
 | 
						// registry TXT records corresponding to wildcard records will be invalid (and rejected by most providers), due to
 | 
				
			||||||
	// having a '*' appear (not as the first character) - see https://tools.ietf.org/html/rfc1034#section-4.3.3
 | 
						// having a '*' appear (not as the first character) - see https://tools.ietf.org/html/rfc1034#section-4.3.3
 | 
				
			||||||
	wildcardReplacement string
 | 
						wildcardReplacement string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						managedRecordTypes []string
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// missingTXTRecords stores TXT records which are missing after the migration to the new format
 | 
				
			||||||
 | 
						missingTXTRecords []*endpoint.Endpoint
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// NewTXTRegistry returns new TXTRegistry object
 | 
					// NewTXTRegistry returns new TXTRegistry object
 | 
				
			||||||
func NewTXTRegistry(provider provider.Provider, txtPrefix, txtSuffix, ownerID string, cacheInterval time.Duration, txtWildcardReplacement string) (*TXTRegistry, error) {
 | 
					func NewTXTRegistry(provider provider.Provider, txtPrefix, txtSuffix, ownerID string, cacheInterval time.Duration, txtWildcardReplacement string, managedRecordTypes []string) (*TXTRegistry, error) {
 | 
				
			||||||
	if ownerID == "" {
 | 
						if ownerID == "" {
 | 
				
			||||||
		return nil, errors.New("owner id cannot be empty")
 | 
							return nil, errors.New("owner id cannot be empty")
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@ -67,6 +72,7 @@ func NewTXTRegistry(provider provider.Provider, txtPrefix, txtSuffix, ownerID st
 | 
				
			|||||||
		mapper:              mapper,
 | 
							mapper:              mapper,
 | 
				
			||||||
		cacheInterval:       cacheInterval,
 | 
							cacheInterval:       cacheInterval,
 | 
				
			||||||
		wildcardReplacement: txtWildcardReplacement,
 | 
							wildcardReplacement: txtWildcardReplacement,
 | 
				
			||||||
 | 
							managedRecordTypes:  managedRecordTypes,
 | 
				
			||||||
	}, nil
 | 
						}, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -95,8 +101,10 @@ func (im *TXTRegistry) Records(ctx context.Context) ([]*endpoint.Endpoint, error
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	endpoints := []*endpoint.Endpoint{}
 | 
						endpoints := []*endpoint.Endpoint{}
 | 
				
			||||||
 | 
						missingEndpoints := []*endpoint.Endpoint{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	labelMap := map[string]endpoint.Labels{}
 | 
						labelMap := map[string]endpoint.Labels{}
 | 
				
			||||||
 | 
						txtRecordsMap := map[string]struct{}{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, record := range records {
 | 
						for _, record := range records {
 | 
				
			||||||
		if record.RecordType != endpoint.RecordTypeTXT {
 | 
							if record.RecordType != endpoint.RecordTypeTXT {
 | 
				
			||||||
@ -117,6 +125,7 @@ func (im *TXTRegistry) Records(ctx context.Context) ([]*endpoint.Endpoint, error
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		key := fmt.Sprintf("%s::%s", im.mapper.toEndpointName(record.DNSName), record.SetIdentifier)
 | 
							key := fmt.Sprintf("%s::%s", im.mapper.toEndpointName(record.DNSName), record.SetIdentifier)
 | 
				
			||||||
		labelMap[key] = labels
 | 
							labelMap[key] = labels
 | 
				
			||||||
 | 
							txtRecordsMap[record.DNSName] = struct{}{}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for _, ep := range endpoints {
 | 
						for _, ep := range endpoints {
 | 
				
			||||||
@ -135,6 +144,26 @@ func (im *TXTRegistry) Records(ctx context.Context) ([]*endpoint.Endpoint, error
 | 
				
			|||||||
				ep.Labels[k] = v
 | 
									ep.Labels[k] = v
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							// Handle the migration of TXT records created before the new format (introduced in v0.12.0).
 | 
				
			||||||
 | 
							// The migration is done for the TXT records owned by this instance only.
 | 
				
			||||||
 | 
							if len(txtRecordsMap) > 0 && ep.Labels[endpoint.OwnerLabelKey] == im.ownerID {
 | 
				
			||||||
 | 
								if plan.IsManagedRecord(ep.RecordType, im.managedRecordTypes) {
 | 
				
			||||||
 | 
									// Get desired TXT records and detect the missing ones
 | 
				
			||||||
 | 
									desiredTXTs := im.generateTXTRecord(ep)
 | 
				
			||||||
 | 
									missingDesiredTXTs := []*endpoint.Endpoint{}
 | 
				
			||||||
 | 
									for _, desiredTXT := range desiredTXTs {
 | 
				
			||||||
 | 
										if _, exists := txtRecordsMap[desiredTXT.DNSName]; !exists {
 | 
				
			||||||
 | 
											missingDesiredTXTs = append(missingDesiredTXTs, desiredTXT)
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if len(desiredTXTs) > len(missingDesiredTXTs) {
 | 
				
			||||||
 | 
										// Add missing TXT records only if those are managed (by externaldns) ones.
 | 
				
			||||||
 | 
										// The unmanaged record has both of the desired TXT records missing.
 | 
				
			||||||
 | 
										missingEndpoints = append(missingEndpoints, missingDesiredTXTs...)
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Update the cache.
 | 
						// Update the cache.
 | 
				
			||||||
@ -143,12 +172,25 @@ func (im *TXTRegistry) Records(ctx context.Context) ([]*endpoint.Endpoint, error
 | 
				
			|||||||
		im.recordsCacheRefreshTime = time.Now()
 | 
							im.recordsCacheRefreshTime = time.Now()
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						im.missingTXTRecords = missingEndpoints
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return endpoints, nil
 | 
						return endpoints, nil
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// MissingRecords returns the TXT record to be created.
 | 
				
			||||||
 | 
					// The missing records are collected during the run of Records method.
 | 
				
			||||||
 | 
					func (im *TXTRegistry) MissingRecords() []*endpoint.Endpoint {
 | 
				
			||||||
 | 
						return im.missingTXTRecords
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// generateTXTRecord generates both "old" and "new" TXT records.
 | 
					// generateTXTRecord generates both "old" and "new" TXT records.
 | 
				
			||||||
// Once we decide to drop old format we need to drop toTXTName() and rename toNewTXTName
 | 
					// Once we decide to drop old format we need to drop toTXTName() and rename toNewTXTName
 | 
				
			||||||
func (im *TXTRegistry) generateTXTRecord(r *endpoint.Endpoint) []*endpoint.Endpoint {
 | 
					func (im *TXTRegistry) generateTXTRecord(r *endpoint.Endpoint) []*endpoint.Endpoint {
 | 
				
			||||||
 | 
						// Missing TXT records are added to the set of changes.
 | 
				
			||||||
 | 
						// Obviously, we don't need any other TXT record for them.
 | 
				
			||||||
 | 
						if r.RecordType == endpoint.RecordTypeTXT {
 | 
				
			||||||
 | 
							return nil
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
	// old TXT record format
 | 
						// old TXT record format
 | 
				
			||||||
	txt := endpoint.NewEndpoint(im.mapper.toTXTName(r.DNSName), endpoint.RecordTypeTXT, r.Labels.Serialize(true)).WithSetIdentifier(r.SetIdentifier)
 | 
						txt := endpoint.NewEndpoint(im.mapper.toTXTName(r.DNSName), endpoint.RecordTypeTXT, r.Labels.Serialize(true)).WithSetIdentifier(r.SetIdentifier)
 | 
				
			||||||
	txt.ProviderSpecific = r.ProviderSpecific
 | 
						txt.ProviderSpecific = r.ProviderSpecific
 | 
				
			||||||
 | 
				
			|||||||
@ -41,24 +41,25 @@ func TestTXTRegistry(t *testing.T) {
 | 
				
			|||||||
	t.Run("TestNewTXTRegistry", testTXTRegistryNew)
 | 
						t.Run("TestNewTXTRegistry", testTXTRegistryNew)
 | 
				
			||||||
	t.Run("TestRecords", testTXTRegistryRecords)
 | 
						t.Run("TestRecords", testTXTRegistryRecords)
 | 
				
			||||||
	t.Run("TestApplyChanges", testTXTRegistryApplyChanges)
 | 
						t.Run("TestApplyChanges", testTXTRegistryApplyChanges)
 | 
				
			||||||
 | 
						t.Run("TestMissingRecords", testTXTRegistryMissingRecords)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func testTXTRegistryNew(t *testing.T) {
 | 
					func testTXTRegistryNew(t *testing.T) {
 | 
				
			||||||
	p := inmemory.NewInMemoryProvider()
 | 
						p := inmemory.NewInMemoryProvider()
 | 
				
			||||||
	_, err := NewTXTRegistry(p, "txt", "", "", time.Hour, "")
 | 
						_, err := NewTXTRegistry(p, "txt", "", "", time.Hour, "", []string{})
 | 
				
			||||||
	require.Error(t, err)
 | 
						require.Error(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err = NewTXTRegistry(p, "", "txt", "", time.Hour, "")
 | 
						_, err = NewTXTRegistry(p, "", "txt", "", time.Hour, "", []string{})
 | 
				
			||||||
	require.Error(t, err)
 | 
						require.Error(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r, err := NewTXTRegistry(p, "txt", "", "owner", time.Hour, "")
 | 
						r, err := NewTXTRegistry(p, "txt", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
	assert.Equal(t, p, r.provider)
 | 
						assert.Equal(t, p, r.provider)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r, err = NewTXTRegistry(p, "", "txt", "owner", time.Hour, "")
 | 
						r, err = NewTXTRegistry(p, "", "txt", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, err = NewTXTRegistry(p, "txt", "txt", "owner", time.Hour, "")
 | 
						_, err = NewTXTRegistry(p, "txt", "txt", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	require.Error(t, err)
 | 
						require.Error(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, ok := r.mapper.(affixNameMapper)
 | 
						_, ok := r.mapper.(affixNameMapper)
 | 
				
			||||||
@ -66,7 +67,7 @@ func testTXTRegistryNew(t *testing.T) {
 | 
				
			|||||||
	assert.Equal(t, "owner", r.ownerID)
 | 
						assert.Equal(t, "owner", r.ownerID)
 | 
				
			||||||
	assert.Equal(t, p, r.provider)
 | 
						assert.Equal(t, p, r.provider)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r, err = NewTXTRegistry(p, "", "", "owner", time.Hour, "")
 | 
						r, err = NewTXTRegistry(p, "", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	_, ok = r.mapper.(affixNameMapper)
 | 
						_, ok = r.mapper.(affixNameMapper)
 | 
				
			||||||
@ -182,13 +183,13 @@ func testTXTRegistryRecordsPrefixed(t *testing.T) {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "txt.", "", "owner", time.Hour, "wc")
 | 
						r, _ := NewTXTRegistry(p, "txt.", "", "owner", time.Hour, "wc", []string{})
 | 
				
			||||||
	records, _ := r.Records(ctx)
 | 
						records, _ := r.Records(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
						assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Ensure prefix is case-insensitive
 | 
						// Ensure prefix is case-insensitive
 | 
				
			||||||
	r, _ = NewTXTRegistry(p, "TxT.", "", "owner", time.Hour, "")
 | 
						r, _ = NewTXTRegistry(p, "TxT.", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	records, _ = r.Records(ctx)
 | 
						records, _ = r.Records(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert.True(t, testutils.SameEndpointLabels(records, expectedRecords))
 | 
						assert.True(t, testutils.SameEndpointLabels(records, expectedRecords))
 | 
				
			||||||
@ -287,13 +288,13 @@ func testTXTRegistryRecordsSuffixed(t *testing.T) {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "-txt", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "", "-txt", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	records, _ := r.Records(ctx)
 | 
						records, _ := r.Records(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
						assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Ensure prefix is case-insensitive
 | 
						// Ensure prefix is case-insensitive
 | 
				
			||||||
	r, _ = NewTXTRegistry(p, "", "-TxT", "owner", time.Hour, "")
 | 
						r, _ = NewTXTRegistry(p, "", "-TxT", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	records, _ = r.Records(ctx)
 | 
						records, _ = r.Records(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert.True(t, testutils.SameEndpointLabels(records, expectedRecords))
 | 
						assert.True(t, testutils.SameEndpointLabels(records, expectedRecords))
 | 
				
			||||||
@ -368,7 +369,7 @@ func testTXTRegistryRecordsNoPrefix(t *testing.T) {
 | 
				
			|||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	records, _ := r.Records(ctx)
 | 
						records, _ := r.Records(ctx)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
						assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
				
			||||||
@ -411,7 +412,7 @@ func testTXTRegistryApplyChangesWithPrefix(t *testing.T) {
 | 
				
			|||||||
			newEndpointWithOwner("txt.cname-multiple.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, "").WithSetIdentifier("test-set-2"),
 | 
								newEndpointWithOwner("txt.cname-multiple.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, "").WithSetIdentifier("test-set-2"),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "txt.", "", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "txt.", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	changes := &plan.Changes{
 | 
						changes := &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
@ -500,7 +501,7 @@ func testTXTRegistryApplyChangesWithTemplatedPrefix(t *testing.T) {
 | 
				
			|||||||
	p.ApplyChanges(ctx, &plan.Changes{
 | 
						p.ApplyChanges(ctx, &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{},
 | 
							Create: []*endpoint.Endpoint{},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "prefix%{record_type}.", "", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "prefix%{record_type}.", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	changes := &plan.Changes{
 | 
						changes := &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
			newEndpointWithOwnerResource("new-record-1.test-zone.example.org", "new-loadbalancer-1.lb.com", endpoint.RecordTypeCNAME, "", "ingress/default/my-ingress"),
 | 
								newEndpointWithOwnerResource("new-record-1.test-zone.example.org", "new-loadbalancer-1.lb.com", endpoint.RecordTypeCNAME, "", "ingress/default/my-ingress"),
 | 
				
			||||||
@ -543,7 +544,7 @@ func testTXTRegistryApplyChangesWithTemplatedSuffix(t *testing.T) {
 | 
				
			|||||||
	p.OnApplyChanges = func(ctx context.Context, got *plan.Changes) {
 | 
						p.OnApplyChanges = func(ctx context.Context, got *plan.Changes) {
 | 
				
			||||||
		assert.Equal(t, ctxEndpoints, ctx.Value(provider.RecordsContextKey))
 | 
							assert.Equal(t, ctxEndpoints, ctx.Value(provider.RecordsContextKey))
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "-%{record_type}suffix", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "", "-%{record_type}suffix", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	changes := &plan.Changes{
 | 
						changes := &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
			newEndpointWithOwnerResource("new-record-1.test-zone.example.org", "new-loadbalancer-1.lb.com", endpoint.RecordTypeCNAME, "", "ingress/default/my-ingress"),
 | 
								newEndpointWithOwnerResource("new-record-1.test-zone.example.org", "new-loadbalancer-1.lb.com", endpoint.RecordTypeCNAME, "", "ingress/default/my-ingress"),
 | 
				
			||||||
@ -608,7 +609,7 @@ func testTXTRegistryApplyChangesWithSuffix(t *testing.T) {
 | 
				
			|||||||
			newEndpointWithOwner("cname-multiple-txt.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, "").WithSetIdentifier("test-set-2"),
 | 
								newEndpointWithOwner("cname-multiple-txt.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, "").WithSetIdentifier("test-set-2"),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "-txt", "owner", time.Hour, "wildcard")
 | 
						r, _ := NewTXTRegistry(p, "", "-txt", "owner", time.Hour, "wildcard", []string{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	changes := &plan.Changes{
 | 
						changes := &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
@ -712,7 +713,7 @@ func testTXTRegistryApplyChangesNoPrefix(t *testing.T) {
 | 
				
			|||||||
			newEndpointWithOwner("cname-foobar.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
								newEndpointWithOwner("cname-foobar.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	changes := &plan.Changes{
 | 
						changes := &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
@ -766,6 +767,208 @@ func testTXTRegistryApplyChangesNoPrefix(t *testing.T) {
 | 
				
			|||||||
	require.NoError(t, err)
 | 
						require.NoError(t, err)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func testTXTRegistryMissingRecords(t *testing.T) {
 | 
				
			||||||
 | 
						t.Run("No prefix", testTXTRegistryMissingRecordsNoPrefix)
 | 
				
			||||||
 | 
						t.Run("With Prefix", testTXTRegistryMissingRecordsWithPrefix)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func testTXTRegistryMissingRecordsNoPrefix(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := context.Background()
 | 
				
			||||||
 | 
						p := inmemory.NewInMemoryProvider()
 | 
				
			||||||
 | 
						p.CreateZone(testZone)
 | 
				
			||||||
 | 
						p.ApplyChanges(ctx, &plan.Changes{
 | 
				
			||||||
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat.test-zone.example.org", "foo.loadbalancer.com", endpoint.RecordTypeCNAME, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat2.test-zone.example.org", "bar.loadbalancer.com", endpoint.RecordTypeA, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat2.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("newformat.test-zone.example.org", "foobar.nameserver.com", endpoint.RecordTypeNS, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("ns-newformat.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("newformat.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("noheritage.test-zone.example.org", "random", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat-otherowner.test-zone.example.org", "bar.loadbalancer.com", endpoint.RecordTypeA, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat-otherowner.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=otherowner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								endpoint.NewEndpoint("unmanaged1.test-zone.example.org", endpoint.RecordTypeA, "unmanaged1.loadbalancer.com"),
 | 
				
			||||||
 | 
								endpoint.NewEndpoint("unmanaged2.test-zone.example.org", endpoint.RecordTypeCNAME, "unmanaged2.loadbalancer.com"),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						expectedRecords := []*endpoint.Endpoint{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "oldformat.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"foo.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeCNAME,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									// owner was added from the TXT record's target
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "owner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "oldformat2.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"bar.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "owner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "newformat.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"foobar.nameserver.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeNS,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "owner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							// Only TXT records with the wrong heritage are returned by Records()
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "noheritage.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"random"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									// No owner because it's not external-dns heritage
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "oldformat-otherowner.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"bar.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									// Records() retrieves all the records of the zone, no matter the owner
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "otherowner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "unmanaged1.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"unmanaged1.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "unmanaged2.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"unmanaged2.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeCNAME,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMissingRecords := []*endpoint.Endpoint{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName: "cname-oldformat.test-zone.example.org",
 | 
				
			||||||
 | 
								// owner is taken from the source record (A, CNAME, etc.)
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "a-oldformat2.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "wc", []string{endpoint.RecordTypeCNAME, endpoint.RecordTypeA, endpoint.RecordTypeNS})
 | 
				
			||||||
 | 
						records, _ := r.Records(ctx)
 | 
				
			||||||
 | 
						missingRecords := r.MissingRecords()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
				
			||||||
 | 
						assert.True(t, testutils.SameEndpoints(missingRecords, expectedMissingRecords))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func testTXTRegistryMissingRecordsWithPrefix(t *testing.T) {
 | 
				
			||||||
 | 
						ctx := context.Background()
 | 
				
			||||||
 | 
						p := inmemory.NewInMemoryProvider()
 | 
				
			||||||
 | 
						p.CreateZone(testZone)
 | 
				
			||||||
 | 
						p.ApplyChanges(ctx, &plan.Changes{
 | 
				
			||||||
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat.test-zone.example.org", "foo.loadbalancer.com", endpoint.RecordTypeCNAME, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("txt.oldformat.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat2.test-zone.example.org", "bar.loadbalancer.com", endpoint.RecordTypeA, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("txt.oldformat2.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("newformat.test-zone.example.org", "foobar.nameserver.com", endpoint.RecordTypeNS, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("txt.ns-newformat.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("txt.newformat.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("noheritage.test-zone.example.org", "random", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("oldformat-otherowner.test-zone.example.org", "bar.loadbalancer.com", endpoint.RecordTypeA, ""),
 | 
				
			||||||
 | 
								newEndpointWithOwner("txt.oldformat-otherowner.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=otherowner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
 | 
								endpoint.NewEndpoint("unmanaged1.test-zone.example.org", endpoint.RecordTypeA, "unmanaged1.loadbalancer.com"),
 | 
				
			||||||
 | 
								endpoint.NewEndpoint("unmanaged2.test-zone.example.org", endpoint.RecordTypeCNAME, "unmanaged2.loadbalancer.com"),
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						})
 | 
				
			||||||
 | 
						expectedRecords := []*endpoint.Endpoint{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "oldformat.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"foo.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeCNAME,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									// owner was added from the TXT record's target
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "owner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "oldformat2.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"bar.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "owner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "newformat.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"foobar.nameserver.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeNS,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "owner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "noheritage.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"random"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									// No owner because it's not external-dns heritage
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "oldformat-otherowner.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"bar.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
								Labels: map[string]string{
 | 
				
			||||||
 | 
									// All the records of the zone are retrieved, no matter the owner
 | 
				
			||||||
 | 
									endpoint.OwnerLabelKey: "otherowner",
 | 
				
			||||||
 | 
								},
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "unmanaged1.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"unmanaged1.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeA,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "unmanaged2.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"unmanaged2.loadbalancer.com"},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeCNAME,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						expectedMissingRecords := []*endpoint.Endpoint{
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName: "txt.cname-oldformat.test-zone.example.org",
 | 
				
			||||||
 | 
								// owner is taken from the source record (A, CNAME, etc.)
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
							{
 | 
				
			||||||
 | 
								DNSName:    "txt.a-oldformat2.test-zone.example.org",
 | 
				
			||||||
 | 
								Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
 | 
							},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r, _ := NewTXTRegistry(p, "txt.", "", "owner", time.Hour, "wc", []string{endpoint.RecordTypeCNAME, endpoint.RecordTypeA, endpoint.RecordTypeNS})
 | 
				
			||||||
 | 
						records, _ := r.Records(ctx)
 | 
				
			||||||
 | 
						missingRecords := r.MissingRecords()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						assert.True(t, testutils.SameEndpoints(records, expectedRecords))
 | 
				
			||||||
 | 
						assert.True(t, testutils.SameEndpoints(missingRecords, expectedMissingRecords))
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
func TestCacheMethods(t *testing.T) {
 | 
					func TestCacheMethods(t *testing.T) {
 | 
				
			||||||
	cache := []*endpoint.Endpoint{
 | 
						cache := []*endpoint.Endpoint{
 | 
				
			||||||
		newEndpointWithOwner("thing.com", "1.2.3.4", "A", "owner"),
 | 
							newEndpointWithOwner("thing.com", "1.2.3.4", "A", "owner"),
 | 
				
			||||||
@ -877,7 +1080,7 @@ func TestNewTXTScheme(t *testing.T) {
 | 
				
			|||||||
			newEndpointWithOwner("cname-foobar.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
								newEndpointWithOwner("cname-foobar.test-zone.example.org", "\"heritage=external-dns,external-dns/owner=owner\"", endpoint.RecordTypeTXT, ""),
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	})
 | 
						})
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	changes := &plan.Changes{
 | 
						changes := &plan.Changes{
 | 
				
			||||||
		Create: []*endpoint.Endpoint{
 | 
							Create: []*endpoint.Endpoint{
 | 
				
			||||||
@ -938,18 +1141,18 @@ func TestGenerateTXT(t *testing.T) {
 | 
				
			|||||||
			DNSName:    "foo.test-zone.example.org",
 | 
								DNSName:    "foo.test-zone.example.org",
 | 
				
			||||||
			Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
								Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
			RecordType: endpoint.RecordTypeTXT,
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
			Labels: map[string]string{},
 | 
								Labels:     map[string]string{},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
			DNSName:    "cname-foo.test-zone.example.org",
 | 
								DNSName:    "cname-foo.test-zone.example.org",
 | 
				
			||||||
			Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
								Targets:    endpoint.Targets{"\"heritage=external-dns,external-dns/owner=owner\""},
 | 
				
			||||||
			RecordType: endpoint.RecordTypeTXT,
 | 
								RecordType: endpoint.RecordTypeTXT,
 | 
				
			||||||
			Labels: map[string]string{},
 | 
								Labels:     map[string]string{},
 | 
				
			||||||
		},
 | 
							},
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	p := inmemory.NewInMemoryProvider()
 | 
						p := inmemory.NewInMemoryProvider()
 | 
				
			||||||
	p.CreateZone(testZone)
 | 
						p.CreateZone(testZone)
 | 
				
			||||||
	r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "")
 | 
						r, _ := NewTXTRegistry(p, "", "", "owner", time.Hour, "", []string{})
 | 
				
			||||||
	gotTXT := r.generateTXTRecord(record)
 | 
						gotTXT := r.generateTXTRecord(record)
 | 
				
			||||||
	assert.Equal(t, expectedTXT, gotTXT)
 | 
						assert.Equal(t, expectedTXT, gotTXT)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										65
									
								
								source/targetfiltersource.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										65
									
								
								source/targetfiltersource.go
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,65 @@
 | 
				
			|||||||
 | 
					/*
 | 
				
			||||||
 | 
					Copyright 2017 The Kubernetes Authors.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					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.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package source
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"context"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"sigs.k8s.io/external-dns/endpoint"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// targetFilterSource is a Source that removes endpoints matching the target filter from its wrapped source.
 | 
				
			||||||
 | 
					type targetFilterSource struct {
 | 
				
			||||||
 | 
						source       Source
 | 
				
			||||||
 | 
						targetFilter endpoint.TargetFilterInterface
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// NewTargetFilterSource creates a new targetFilterSource wrapping the provided Source.
 | 
				
			||||||
 | 
					func NewTargetFilterSource(source Source, targetFilter endpoint.TargetFilterInterface) Source {
 | 
				
			||||||
 | 
						return &targetFilterSource{source: source, targetFilter: targetFilter}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Endpoints collects endpoints from its wrapped source and returns
 | 
				
			||||||
 | 
					// them without targets matching the target filter.
 | 
				
			||||||
 | 
					func (ms *targetFilterSource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint, error) {
 | 
				
			||||||
 | 
						result := []*endpoint.Endpoint{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						endpoints, err := ms.source.Endpoints(ctx)
 | 
				
			||||||
 | 
						if err != nil {
 | 
				
			||||||
 | 
							return nil, err
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for _, ep := range endpoints {
 | 
				
			||||||
 | 
							filteredTargets := []string{}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							for _, t := range ep.Targets {
 | 
				
			||||||
 | 
								if ms.targetFilter.Match(t) {
 | 
				
			||||||
 | 
									filteredTargets = append(filteredTargets, t)
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							ep.Targets = filteredTargets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							result = append(result, ep)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return result, nil
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func (ms *targetFilterSource) AddEventHandler(ctx context.Context, handler func()) {
 | 
				
			||||||
 | 
						ms.source.AddEventHandler(ctx, handler)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user