diff --git a/.github/workflows/lint-test-chart.yaml b/.github/workflows/lint-test-chart.yaml index 79cdc4700..a91d954c7 100644 --- a/.github/workflows/lint-test-chart.yaml +++ b/.github/workflows/lint-test-chart.yaml @@ -18,6 +18,25 @@ jobs: with: fetch-depth: 0 + - name: Install Helm + uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # v4.2.0 + with: + token: ${{ github.token }} + version: latest + + - name: Run Helm Schema check + working-directory: charts/external-dns + run: | + set -euo pipefail + + helm plugin install https://github.com/losisin/helm-values-schema-json.git + helm schema + if [[ -n "$(git status --porcelain --untracked-files=no)" ]] + then + echo "Schema not up to date. Please run helm schema and commit changes!" >&2 + exit 1 + fi + - name: Install Helm Docs uses: action-stars/install-tool-from-github-release@ece2623611b240002e0dd73a0d685505733122f6 # v0.2.4 with: @@ -52,12 +71,6 @@ jobs: - name: Run Artifact Hub lint run: ah lint --kind helm || exit 1 - - name: Install Helm - uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # v4.2.0 - with: - token: ${{ github.token }} - version: latest - - name: Install Python uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5.4.0 with: diff --git a/Makefile b/Makefile index ae575d863..d9392e708 100644 --- a/Makefile +++ b/Makefile @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -# cover-html creates coverage report for whole project excluding vendor and opens result in the default browser +#? cover: Creates coverage report for whole project excluding vendor and opens result in the default browser .PHONY: cover cover-html .DEFAULT_GOAL := build @@ -24,11 +24,11 @@ cover: gocovmerge `ls *.coverprofile` > cover.out rm *.coverprofile +#? cover-html: Run tests with coverage and open coverage report in the browser cover-html: cover go tool cover -html cover.out -# find or download controller-gen -# download controller-gen if necessary +#? controller-gen: download controller-gen if necessary controller-gen: ifeq (, $(shell which controller-gen)) @{ \ @@ -40,15 +40,16 @@ else CONTROLLER_GEN=$(shell which controller-gen) endif +#? golangci-lint: Install golangci-lint tool golangci-lint: @command -v golangci-lint > /dev/null || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.63.4 -# Run the golangci-lint tool +#? go-lint: Run the golangci-lint tool .PHONY: go-lint go-lint: golangci-lint golangci-lint run --timeout=30m ./... -# Run the licensecheck script to check for license headers +#? licensecheck: Run the to check for license headers .PHONY: licensecheck licensecheck: @echo ">> checking license header" @@ -60,25 +61,25 @@ licensecheck: exit 1; \ fi -# Requires to install spectral. See https://github.com/stoplightio/spectral +#? oas-lint: Requires to install spectral. See github.com/stoplightio/spectral oas-lint: spectral lint api/*.yaml -# Run all the linters +#? lint: Run all the linters .PHONY: lint lint: licensecheck go-lint oas-lint -# generates CRD using controller-gen +#? crd: Generates CRD using controller-gen .PHONY: crd crd: controller-gen ${CONTROLLER_GEN} crd:crdVersions=v1 paths="./endpoint/..." output:crd:stdout > docs/contributing/crd-source/crd-manifest.yaml -# The verify target runs tasks similar to the CI tasks, but without code coverage +#? test: The verify target runs tasks similar to the CI tasks, but without code coverage .PHONY: test test: go test -race -coverprofile=profile.cov ./... -# The build targets allow to build the binary and container image +#? build: The build targets allow to build the binary and container image .PHONY: build BINARY ?= external-dns @@ -148,9 +149,9 @@ clean: @rm -rf build @go clean -cache - # Builds and push container images to the staging bucket. -.PHONY: release.staging +.PHONY: release.staging +#? release.staging: Builds and push container images to the staging bucket. release.staging: test IMAGE=$(IMAGE_STAGING) $(MAKE) build.push/multiarch @@ -161,17 +162,25 @@ release.prod: test ko: scripts/install-ko.sh -# generate-flags-documentation: Generate documentation (docs/flags.md) .PHONY: generate-flags-documentation +#? generate-flags-documentation: Generate documentation (docs/flags.md) generate-flags-documentation: go run internal/gen/docs/flags/main.go -pre-commit-install: ## Install pre-commit hooks +#? pre-commit-install: Install pre-commit hooks +pre-commit-install: @pre-commit install @pre-commit gc -pre-commit-uninstall: ## Uninstall hooks +#? pre-commit-uninstall: Uninstall pre-commit hooks +pre-commit-uninstall: @pre-commit uninstall -pre-commit-validate: ## Validate files with pre-commit hooks +#? pre-commit-validate: Validate files with pre-commit hooks +pre-commit-validate: @pre-commit run --all-files + +.PHONY: help +#? help: Get more info on available commands +help: Makefile + @sed -n 's/^#?//p' $< | column -t -s ':' | sort | sed -e 's/^/ /' diff --git a/charts/external-dns/.helmignore b/charts/external-dns/.helmignore index 0e8a0eb36..596d9bae6 100644 --- a/charts/external-dns/.helmignore +++ b/charts/external-dns/.helmignore @@ -21,3 +21,6 @@ .idea/ *.tmproj .vscode/ +ci/ +schema/ +.schema.yaml diff --git a/charts/external-dns/.schema.yaml b/charts/external-dns/.schema.yaml new file mode 100644 index 000000000..3268703c4 --- /dev/null +++ b/charts/external-dns/.schema.yaml @@ -0,0 +1,11 @@ +# ref: https://github.com/losisin/helm-values-schema-json.git +input: + - schema/values.yaml + - values.yaml + +draft: 7 +indent: 2 +output: values.schema.json + +schemaRoot: + additionalProperties: true diff --git a/charts/external-dns/CHANGELOG.md b/charts/external-dns/CHANGELOG.md index 7e90a7070..d1e974f19 100644 --- a/charts/external-dns/CHANGELOG.md +++ b/charts/external-dns/CHANGELOG.md @@ -18,6 +18,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [UNRELEASED] +### Added + +- Added ability to generate schema with `helm plugin schema`. ([#5075](https://github.com/kubernetes-sigs/external-dns/pull/5075)) _@ivankatliarchuk_ +- Added `docs/contributing/dev-guide.md#helm-values` guide. ([#5075](https://github.com/kubernetes-sigs/external-dns/pull/5075)) _@ivankatliarchuk_ + +### Changed + +- Regenerate JSON schema with `helm-values-schema-json' plugin. ([#5075](https://github.com/kubernetes-sigs/external-dns/pull/5075)) _@ivankatliarchuk_ + +## [v1.15.2] - 2025-02-14 + ### Changed - Added `transportservers` resource to ClusterRole when specifying `f5-transportserver` or `f5-virtualserver` as a source. ([#5066](https://github.com/kubernetes-sigs/external-dns/pull/5066)) _@visokoo_ @@ -25,8 +36,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Fixed - Fixed handling of non-string types in `serviceAccount.metadata.annotations` field. ([#5067](https://github.com/kubernetes-sigs/external-dns/pull/5067)) _@hjoshi123_ +- Fixed regression where `affinity.nodeAffinity` was being ignored. ([#5046](https://github.com/kubernetes-sigs/external-dns/pull/5046)) _@mkhpalm_ -## [v1.15.1] - 2023-09-10 +## [v1.15.1] - 2025-01-27 ### Added @@ -225,6 +237,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 RELEASE LINKS --> [UNRELEASED]: https://github.com/kubernetes-sigs/external-dns/tree/master/charts/external-dns +[v1.15.2]: https://github.com/kubernetes-sigs/external-dns/releases/tag/external-dns-helm-chart-1.15.2 [v1.15.1]: https://github.com/kubernetes-sigs/external-dns/releases/tag/external-dns-helm-chart-1.15.1 [v1.15.0]: https://github.com/kubernetes-sigs/external-dns/releases/tag/external-dns-helm-chart-1.15.0 [v1.14.5]: https://github.com/kubernetes-sigs/external-dns/releases/tag/external-dns-helm-chart-1.14.5 diff --git a/charts/external-dns/Chart.yaml b/charts/external-dns/Chart.yaml index 91df716c9..7bec0a800 100644 --- a/charts/external-dns/Chart.yaml +++ b/charts/external-dns/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: external-dns description: ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers. type: application -version: 1.15.1 +version: 1.15.2 appVersion: 0.15.1 keywords: - kubernetes @@ -21,14 +21,8 @@ maintainers: annotations: artifacthub.io/changes: | - kind: added - description: "Added ability to configure `imagePullSecrets` via helm `global` value." - - kind: added - description: "Added options to configure `labelFilter` and `managedRecordTypes` via dedicated helm values." - - kind: changed - description: "Allow templating `serviceaccount.annotations` keys and values, by rendering them using the `tpl` built-in function." - - kind: changed - description: "Updated _ExternalDNS_ OCI image version to [v0.15.1](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.15.1)." + description: "Added `transportservers` resource to ClusterRole when specifying `f5-transportserver` or `f5-virtualserver` as a source." - kind: fixed - description: "Fixed automatic addition of pod selector labels to `affinity` and `topologySpreadConstraints` if not defined." + description: "Fixed handling of non-string types in `serviceAccount.metadata.annotations` field." - kind: fixed - description: "Fixed missing Ingress permissions when using Istio sources." + description: "Fixed regression where `affinity.nodeAffinity` was being ignored." diff --git a/charts/external-dns/README.md b/charts/external-dns/README.md index 157413ba2..94344ff70 100644 --- a/charts/external-dns/README.md +++ b/charts/external-dns/README.md @@ -1,6 +1,6 @@ # external-dns -![Version: 1.15.1](https://img.shields.io/badge/Version-1.15.1-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.15.1](https://img.shields.io/badge/AppVersion-0.15.1-informational?style=flat-square) +![Version: 1.15.2](https://img.shields.io/badge/Version-1.15.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: 0.15.1](https://img.shields.io/badge/AppVersion-0.15.1-informational?style=flat-square) ExternalDNS synchronizes exposed Kubernetes Services and Ingresses with DNS providers. @@ -27,7 +27,7 @@ helm repo add external-dns https://kubernetes-sigs.github.io/external-dns/ After you've installed the repo you can install the chart. ```shell -helm upgrade --install external-dns external-dns/external-dns --version 1.15.1 +helm upgrade --install external-dns external-dns/external-dns --version 1.15.2 ``` ## Providers @@ -151,7 +151,7 @@ If `namespaced` is set to `true`, please ensure that `sources` my only contains | secretConfiguration.subPath | string | `nil` | Sub-path for mounting the `Secret`, this can be templated. | | securityContext | object | See _values.yaml_ | [Security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container) for the `external-dns` container. | | service.annotations | object | `{}` | Service annotations. | -| service.ipFamilies | list | `[]` | Service IP families. | +| service.ipFamilies | list | `[]` | Service IP families (e.g. IPv4 and/or IPv6). | | service.ipFamilyPolicy | string | `nil` | Service IP family policy. | | service.port | int | `7979` | Service HTTP port. | | serviceAccount.annotations | object | `{}` | Annotations to add to the service account. Templates are allowed in both the key and the value. Example: `example.com/annotation/{{ .Values.nameOverride }}: {{ .Values.nameOverride }}` | diff --git a/charts/external-dns/schema/values.yaml b/charts/external-dns/schema/values.yaml new file mode 100644 index 000000000..3b2f8598f --- /dev/null +++ b/charts/external-dns/schema/values.yaml @@ -0,0 +1,19 @@ +# Custom values for schema creation. +# This is a YAML-formatted file. +# Declare variables to be passed into your schema. +resources: + requests: + cpu: 200m + memory: 128Mi + limits: + cpu: 200m + memory: 128Mi + +provider: + webhook: + requests: + cpu: 200m + memory: 128Mi + limits: + cpu: 300m + memory: 200Mi diff --git a/charts/external-dns/templates/deployment.yaml b/charts/external-dns/templates/deployment.yaml index 46a41de4f..ae60cffcf 100644 --- a/charts/external-dns/templates/deployment.yaml +++ b/charts/external-dns/templates/deployment.yaml @@ -204,6 +204,10 @@ spec: {{- end }} {{- with .Values.affinity }} affinity: + {{- with .nodeAffinity }} + nodeAffinity: + {{- toYaml . | nindent 10 }} + {{- end }} {{- with .podAffinity }} podAffinity: {{- with .preferredDuringSchedulingIgnoredDuringExecution }} diff --git a/charts/external-dns/values.schema.json b/charts/external-dns/values.schema.json index 80378c724..47db1df6b 100644 --- a/charts/external-dns/values.schema.json +++ b/charts/external-dns/values.schema.json @@ -1,94 +1,691 @@ { - "$schema": "http://json-schema.org/draft-07/schema", - "type": "object", + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": true, "properties": { - "global": { + "affinity": { + "properties": {}, "type": "object" }, - "provider": { - "anyOf": [ - { - "type": "string" - }, - { - "type": "object", - "properties": { - "name": { - "type": "string" - } - } + "automountServiceAccountToken": { + "type": "null" + }, + "commonLabels": { + "properties": {}, + "type": "object" + }, + "deploymentAnnotations": { + "properties": {}, + "type": "object" + }, + "deploymentStrategy": { + "additionalProperties": true, + "properties": { + "type": { + "enum": [ + "Recreate", + "RollingUpdate" + ], + "type": [ + "string" + ] } - ] + }, + "type": "object" + }, + "dnsConfig": { + "type": "null" + }, + "dnsPolicy": { + "type": "null" + }, + "domainFilters": { + "type": "array" + }, + "env": { + "type": "array" + }, + "excludeDomains": { + "type": "array" }, "extraArgs": { - "type": "array", "items": { "type": "string" - } + }, + "type": [ + "array", + "null" + ], + "uniqueItems": true + }, + "extraContainers": { + "properties": {}, + "type": "object" + }, + "extraVolumeMounts": { + "type": "array" + }, + "extraVolumes": { + "type": "array" + }, + "fullnameOverride": { + "type": "null" + }, + "global": { + "properties": { + "imagePullSecrets": { + "items": { + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + "image": { + "additionalProperties": false, + "properties": { + "pullPolicy": { + "enum": [ + "IfNotPresent", + "Always" + ], + "type": "string" + }, + "repository": { + "type": "string" + }, + "tag": { + "type": [ + "string", + "null" + ] + } + }, + "type": "object" + }, + "imagePullSecrets": { + "items": { + "type": "object" + }, + "type": "array" + }, + "initContainers": { + "type": "array" + }, + "interval": { + "type": "string" + }, + "labelFilter": { + "pattern": "^[a-zA-Z0-9._-]+=[a-zA-Z0-9._-]+$", + "type": [ + "string", + "null" + ] + }, + "livenessProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "httpGet": { + "properties": { + "path": { + "type": "string" + }, + "port": { + "type": "string" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "logFormat": { + "default": "text", + "enum": [ + "text", + "json" + ], + "type": [ + "string" + ] + }, + "logLevel": { + "default": "info", + "enum": [ + "panic", + "debug", + "info", + "warning", + "error", + "fatal" + ], + "type": [ + "string" + ] + }, + "managedRecordTypes": { + "items": { + "type": "string" + }, + "type": [ + "array", + "null" + ], + "uniqueItems": true + }, + "nameOverride": { + "type": "null" + }, + "namespaced": { + "type": "boolean" + }, + "nodeSelector": { + "properties": {}, + "type": "object" + }, + "podAnnotations": { + "properties": {}, + "type": "object" + }, + "podLabels": { + "properties": {}, + "type": "object" + }, + "podSecurityContext": { + "properties": { + "fsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "seccompProfile": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "policy": { + "default": "upsert-only", + "enum": [ + "sync", + "upsert-only" + ], + "type": [ + "string" + ] + }, + "priorityClassName": { + "type": "null" + }, + "provider": { + "properties": { + "name": { + "type": "string" + }, + "webhook": { + "properties": { + "args": { + "type": "array" + }, + "env": { + "type": "array" + }, + "extraVolumeMounts": { + "type": "array" + }, + "image": { + "properties": { + "pullPolicy": { + "type": "string" + }, + "repository": { + "type": "null" + }, + "tag": { + "type": "null" + } + }, + "type": "object" + }, + "limits": { + "properties": { + "cpu": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "livenessProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "httpGet": { + "properties": { + "path": { + "type": "string" + }, + "port": { + "type": "string" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "readinessProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "httpGet": { + "properties": { + "path": { + "type": "string" + }, + "port": { + "type": "string" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "requests": { + "properties": { + "cpu": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "resources": { + "properties": {}, + "type": "object" + }, + "securityContext": { + "properties": {}, + "type": "object" + }, + "service": { + "properties": { + "port": { + "type": "integer" + } + }, + "type": "object" + }, + "serviceMonitor": { + "properties": { + "bearerTokenFile": { + "type": "null" + }, + "interval": { + "type": "null" + }, + "metricRelabelings": { + "type": "array" + }, + "relabelings": { + "type": "array" + }, + "scheme": { + "type": "null" + }, + "scrapeTimeout": { + "type": "null" + }, + "tlsConfig": { + "properties": {}, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "rbac": { + "additionalProperties": true, + "properties": { + "additionalPermissions": { + "type": "array" + }, + "create": { + "type": "boolean" + } + }, + "type": "object" + }, + "readinessProbe": { + "properties": { + "failureThreshold": { + "type": "integer" + }, + "httpGet": { + "properties": { + "path": { + "type": "string" + }, + "port": { + "type": "string" + } + }, + "type": "object" + }, + "initialDelaySeconds": { + "type": "integer" + }, + "periodSeconds": { + "type": "integer" + }, + "successThreshold": { + "type": "integer" + }, + "timeoutSeconds": { + "type": "integer" + } + }, + "type": "object" + }, + "registry": { + "default": "txt", + "enum": [ + "txt", + "aws-sd", + "dynamodb", + "noop" + ], + "type": "string" + }, + "resources": { + "properties": { + "limits": { + "properties": { + "cpu": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + }, + "requests": { + "properties": { + "cpu": { + "type": "string" + }, + "memory": { + "type": "string" + } + }, + "type": "object" + } + }, + "type": "object" + }, + "revisionHistoryLimit": { + "minimum": 0, + "type": [ + "integer", + "null" + ] }, "secretConfiguration": { - "$comment": "This value is DEPRECATED as secrets should be configured external to the chart and exposed to the container via extraVolumes & extraVolumeMounts.", - "type": "object", "properties": { + "data": { + "properties": {}, + "type": "object" + }, "enabled": { "type": "boolean" }, "mountPath": { - "type": [ - "string", - "null" - ] + "type": "null" }, "subPath": { - "type": [ - "string", - "null" - ] - }, - "data": { - "type": "object", - "patternProperties": { - ".+": { - "type": "string" - } - } + "type": "null" } - } + }, + "type": "object" + }, + "securityContext": { + "properties": { + "allowPrivilegeEscalation": { + "type": "boolean" + }, + "capabilities": { + "properties": { + "drop": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object" + }, + "privileged": { + "type": "boolean" + }, + "readOnlyRootFilesystem": { + "type": "boolean" + }, + "runAsGroup": { + "type": "integer" + }, + "runAsNonRoot": { + "type": "boolean" + }, + "runAsUser": { + "type": "integer" + } + }, + "type": "object" }, "service": { - "type": "object", "properties": { "annotations": { + "properties": {}, "type": "object" }, "ipFamilies": { - "type": "array", "items": { - "type": "string", "enum": [ - "IPv6", - "IPv4" - ] - } + "IPv4", + "IPv6" + ], + "type": "string" + }, + "maxItems": 2, + "minItems": 0, + "type": [ + "array", + "null" + ], + "uniqueItems": true }, "ipFamilyPolicy": { + "enum": [ + "SingleStack", + "PreferDualStack", + "RequireDualStack", + null + ], "type": [ "string", "null" - ], - "items": { - "type": "string", - "enum": [ - "SingleStack", - "PreferDualStack", - "RequireDualStack" - ] - } + ] }, "port": { + "default": 7979, + "minimum": 0, "type": "integer" } - } + }, + "type": "object" + }, + "serviceAccount": { + "properties": { + "annotations": { + "properties": {}, + "type": "object" + }, + "automountServiceAccountToken": { + "type": "null" + }, + "create": { + "type": "boolean" + }, + "labels": { + "properties": {}, + "type": "object" + }, + "name": { + "type": "null" + } + }, + "type": "object" + }, + "serviceMonitor": { + "properties": { + "additionalLabels": { + "properties": {}, + "type": "object" + }, + "annotations": { + "properties": {}, + "type": "object" + }, + "bearerTokenFile": { + "type": "null" + }, + "enabled": { + "type": "boolean" + }, + "interval": { + "type": "null" + }, + "metricRelabelings": { + "type": "array" + }, + "namespace": { + "type": "null" + }, + "relabelings": { + "type": "array" + }, + "scheme": { + "type": "null" + }, + "scrapeTimeout": { + "type": "null" + }, + "targetLabels": { + "type": "array" + }, + "tlsConfig": { + "properties": {}, + "type": "object" + } + }, + "type": "object" + }, + "shareProcessNamespace": { + "type": "boolean" + }, + "sources": { + "items": { + "type": "string" + }, + "type": "array" + }, + "terminationGracePeriodSeconds": { + "type": "null" + }, + "tolerations": { + "type": "array" + }, + "topologySpreadConstraints": { + "type": "array" + }, + "triggerLoopOnEvent": { + "type": "boolean" + }, + "txtOwnerId": { + "type": [ + "string", + "null" + ] + }, + "txtPrefix": { + "type": [ + "string", + "null" + ] + }, + "txtSuffix": { + "type": [ + "string", + "null" + ] } - } + }, + "type": "object" } diff --git a/charts/external-dns/values.yaml b/charts/external-dns/values.yaml index 0a6ee4849..0bb99a759 100644 --- a/charts/external-dns/values.yaml +++ b/charts/external-dns/values.yaml @@ -4,18 +4,18 @@ global: # -- Global image pull secrets. - imagePullSecrets: [] + imagePullSecrets: [] # @schema item: object -image: +image: # @schema additionalProperties: false # -- Image repository for the `external-dns` container. repository: registry.k8s.io/external-dns/external-dns - # -- (string) Image tag for the `external-dns` container, this will default to `.Chart.AppVersion` if not set. - tag: + # -- Image tag for the `external-dns` container, this will default to `.Chart.AppVersion` if not set. + tag: # @schema type:[string, null] # -- Image pull policy for the `external-dns` container. - pullPolicy: IfNotPresent + pullPolicy: IfNotPresent # @schema enum:[IfNotPresent, Always]; # -- Image pull secrets. -imagePullSecrets: [] +imagePullSecrets: [] # @schema item: object # -- (string) Override the name of the chart. nameOverride: @@ -42,13 +42,15 @@ service: # -- Service annotations. annotations: {} # -- Service HTTP port. - port: 7979 - # -- Service IP families. - ipFamilies: [] - # -- (string) Service IP family policy. - ipFamilyPolicy: + port: 7979 # @schema minimum:0; default:7979 + # -- Service IP families (e.g. IPv4 and/or IPv6). + ipFamilies: [] # @schema type: [array, null]; item: string; itemEnum: ["IPv4", "IPv6"]; minItems:0; maxItems:2; uniqueItems: true; + # - IPv4 + # - IPv6 + # -- Service IP family policy. + ipFamilyPolicy: # @schema type: [string, null]; enum:[SingleStack, PreferDualStack, RequireDualStack, null]; -rbac: +rbac: # @schema additionalProperties: true # -- If `true`, create a `ClusterRole` & `ClusterRoleBinding` with access to the Kubernetes API. create: true # -- Additional rules to add to the `ClusterRole`. @@ -61,11 +63,11 @@ deploymentAnnotations: {} extraContainers: {} # -- [Deployment Strategy](https://kubernetes.io/docs/concepts/workloads/controllers/deployment/#strategy). -deploymentStrategy: - type: Recreate +deploymentStrategy: # @schema additionalProperties: true + type: Recreate # @schema enum:[Recreate, RollingUpdate]; type:string; default: Recreate # -- (int) Specify the number of old `ReplicaSets` to retain to allow rollback of the `Deployment``. -revisionHistoryLimit: +revisionHistoryLimit: # @schema type:[integer, null];minimum:0 # -- Labels to add to the `Pod`. podLabels: {} @@ -189,10 +191,10 @@ serviceMonitor: targetLabels: [] # -- Log level. -logLevel: info +logLevel: info # @schema enum:[panic, debug, info, warning, error, fatal]; type:string; default: "info" # -- Log format. -logFormat: text +logFormat: text # @schema enum:["text", "json"]; type:string; default: "text" # -- Interval for DNS updates. interval: 1m @@ -209,19 +211,19 @@ sources: - ingress # -- How DNS records are synchronized between sources and providers; available values are `sync` & `upsert-only`. -policy: upsert-only +policy: upsert-only # @schema enum:[sync, upsert-only]; type:string; default: "upsert-only" # -- Specify the registry for storing ownership and labels. # Valid values are `txt`, `aws-sd`, `dynamodb` & `noop`. -registry: txt +registry: txt # @schema enum:[txt, aws-sd, dynamodb, noop]; default: "txt" # -- (string) Specify an identifier for this instance of _ExternalDNS_ wWhen using a registry other than `noop`. -txtOwnerId: +txtOwnerId: # @schema type:[string, null]; default: null # -- (string) Specify a prefix for the domain names of TXT records created for the `txt` registry. # Mutually exclusive with `txtSuffix`. -txtPrefix: +txtPrefix: # @schema type:[string, null]; default: null # -- (string) Specify a suffix for the domain names of TXT records created for the `txt` registry. # Mutually exclusive with `txtPrefix`. -txtSuffix: +txtSuffix: # @schema type:[string, null]; default: null # -- Limit possible target zones by domain suffixes. domainFilters: [] @@ -229,11 +231,11 @@ domainFilters: [] # -- Intentionally exclude domains from being managed. excludeDomains: [] -# -- (string) Filter resources queried for endpoints by label selector -labelFilter: +# -- Filter resources queried for endpoints by label selector +labelFilter: # @schema pattern:^[a-zA-Z0-9._-]+=[a-zA-Z0-9._-]+$; type: [string,null]; # -- Record types to manage (default: A, AAAA, CNAME) -managedRecordTypes: [] +managedRecordTypes: [] # @schema type: [array, null]; item: string; uniqueItems: true; provider: # -- _ExternalDNS_ provider name; for the available providers and how to configure them see [README](https://github.com/kubernetes-sigs/external-dns/blob/master/charts/external-dns/README.md#providers). @@ -294,7 +296,7 @@ provider: relabelings: [] # -- Extra arguments to provide to _ExternalDNS_. -extraArgs: [] +extraArgs: [] # @schema type: [array, null]; item: string; uniqueItems: true; secretConfiguration: # -- If `true`, create a `Secret` to store sensitive provider configuration (**DEPRECATED**). diff --git a/docs/contributing/dev-guide.md b/docs/contributing/dev-guide.md index 00c4e4a8f..855a8f4e5 100644 --- a/docs/contributing/dev-guide.md +++ b/docs/contributing/dev-guide.md @@ -210,6 +210,42 @@ Modify chart or values and validate the diff ❯❯ kubectl diff -f _scratch/external-dns --recursive=true --show-managed-fields=false ``` +### Helm Values + +This helm chart comes with a JSON schema generated from values with [helm schema](https://github.com/losisin/helm-values-schema-json.git) plugin. + +1. Install required plugin(s) + +```sh +❯❯ scripts/helm-tools.sh --install +``` + +2. Ensure that the schema is always up-to-date + +```sh +❯❯ scripts/helm-tools.sh --diff +``` + +3. When not up-to-date, update JSON schema + +```sh +❯❯ scripts/helm-tools.sh --schema +``` + +4. Runs a series of tests to verify that the chart is well-formed, linted and JSON schema is valid + +```sh +❯❯ scripts/helm-tools.sh --lint +``` + +5. Auto-generate documentation for helm charts into markdown files. + +```sh +❯❯ scripts/helm-tools.sh --docs +``` + +6. Add an entry to the chart [CHANGELOG.md](../../charts/external-dns/CHANGELOG.md) under `## UNRELEASED` section and `open` pull request + ## Deploy with kubernetes manifests > Note; kubernetes manifest are not up to date. Consider to create an `examples` folder diff --git a/docs/tutorials/aws.md b/docs/tutorials/aws.md index af4456e15..ed697e11c 100644 --- a/docs/tutorials/aws.md +++ b/docs/tutorials/aws.md @@ -1101,8 +1101,10 @@ args: ``` Can't specify multiple or separate values with commas: `key1=val1,key2=val2` at the moment. +Filter only by value `--aws-zone-tags==tag-value` is not supported. ```sh args: - --aws-zone-tags=team=k8s,vertical=platform + --aws-zone-tags=team=k8s,vertical=platform # this is not supported + --aws-zone-tags==tag-value # this is not supported ``` diff --git a/go.mod b/go.mod index 108e80489..1c5848a02 100644 --- a/go.mod +++ b/go.mod @@ -5,25 +5,25 @@ go 1.23.5 require ( cloud.google.com/go/compute/metadata v0.6.0 github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/privatedns/armprivatedns v1.3.0 github.com/F5Networks/k8s-bigip-ctlr/v2 v2.19.0 - github.com/IBM-Cloud/ibm-cloud-cli-sdk v1.6.1 + github.com/IBM-Cloud/ibm-cloud-cli-sdk v1.6.2 github.com/IBM/go-sdk-core/v5 v5.18.5 github.com/IBM/networking-go-sdk v0.51.1 github.com/Yamashou/gqlgenc v0.30.3 github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 github.com/alecthomas/kingpin/v2 v2.4.0 - github.com/aliyun/alibaba-cloud-sdk-go v1.63.84 - github.com/aws/aws-sdk-go-v2 v1.36.0 - github.com/aws/aws-sdk-go-v2/config v1.29.5 - github.com/aws/aws-sdk-go-v2/credentials v1.17.58 - github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.18.1 - github.com/aws/aws-sdk-go-v2/service/dynamodb v1.39.9 - github.com/aws/aws-sdk-go-v2/service/route53 v1.48.6 - github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.34.10 - github.com/aws/aws-sdk-go-v2/service/sts v1.33.13 + github.com/aliyun/alibaba-cloud-sdk-go v1.63.88 + github.com/aws/aws-sdk-go-v2 v1.36.1 + github.com/aws/aws-sdk-go-v2/config v1.29.6 + github.com/aws/aws-sdk-go-v2/credentials v1.17.59 + github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.18.4 + github.com/aws/aws-sdk-go-v2/service/dynamodb v1.40.1 + github.com/aws/aws-sdk-go-v2/service/route53 v1.48.7 + github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.34.11 + github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 github.com/bodgit/tsig v1.2.2 github.com/cenkalti/backoff/v4 v4.3.0 github.com/civo/civogo v0.3.93 @@ -31,7 +31,7 @@ require ( github.com/cloudfoundry-community/go-cfclient v0.0.0-20190201205600-f136f9222381 github.com/datawire/ambassador v1.12.4 github.com/denverdino/aliyungo v0.0.0-20230411124812-ab98a9173ace - github.com/digitalocean/godo v1.136.0 + github.com/digitalocean/godo v1.137.0 github.com/dnsimple/dnsimple-go v1.7.0 github.com/exoscale/egoscale v0.102.3 github.com/ffledgling/pdns-go v0.0.0-20180219074714-524e7daccd99 @@ -47,8 +47,8 @@ require ( github.com/onsi/ginkgo v1.16.5 github.com/openshift/api v0.0.0-20230607130528-611114dca681 github.com/openshift/client-go v0.0.0-20230607134213-3cd0021bbee3 - github.com/oracle/oci-go-sdk/v65 v65.83.0 - github.com/ovh/go-ovh v1.6.0 + github.com/oracle/oci-go-sdk/v65 v65.83.1 + github.com/ovh/go-ovh v1.7.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/errors v0.9.1 github.com/pluralsh/gqlclient v1.12.2 @@ -57,22 +57,22 @@ require ( github.com/scaleway/scaleway-sdk-go v1.0.0-beta.32 github.com/sirupsen/logrus v1.9.3 github.com/stretchr/testify v1.10.0 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1091 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1091 - github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1091 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1097 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1097 + github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1097 github.com/transip/gotransip/v6 v6.26.0 github.com/ultradns/ultradns-sdk-go v1.3.7 go.etcd.io/etcd/client/v3 v3.5.18 go.uber.org/ratelimit v0.3.1 - golang.org/x/net v0.34.0 + golang.org/x/net v0.35.0 golang.org/x/oauth2 v0.26.0 golang.org/x/sync v0.11.0 golang.org/x/time v0.10.0 - google.golang.org/api v0.219.0 + google.golang.org/api v0.221.0 gopkg.in/ns1/ns1-go.v2 v2.13.0 gopkg.in/yaml.v2 v2.4.0 - istio.io/api v1.24.2 - istio.io/client-go v1.24.2 + istio.io/api v1.24.3 + istio.io/client-go v1.24.3 k8s.io/api v0.32.1 k8s.io/apimachinery v0.32.1 k8s.io/client-go v0.32.1 @@ -81,26 +81,26 @@ require ( ) require ( - cloud.google.com/go/auth v0.14.0 // indirect + cloud.google.com/go/auth v0.14.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect code.cloudfoundry.org/gofileutils v0.0.0-20170111115228-4d0c80011a0f // indirect github.com/99designs/gqlgen v0.17.61 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 // indirect github.com/Masterminds/semver v1.4.2 // indirect github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 // indirect github.com/alexbrainman/sspi v0.0.0-20180613141037-e580b900e9f5 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect - github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.19 // indirect + github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.12 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.14 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.13 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 // indirect github.com/aws/smithy-go v1.22.2 // indirect github.com/benbjohnson/clock v1.3.0 // indirect github.com/beorn7/perks v1.0.1 // indirect @@ -188,23 +188,24 @@ require ( go.etcd.io/etcd/api/v3 v3.5.18 // indirect go.etcd.io/etcd/client/pkg/v3 v3.5.18 // indirect go.mongodb.org/mongo-driver v1.17.2 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect - go.opentelemetry.io/otel v1.32.0 // indirect - go.opentelemetry.io/otel/metric v1.32.0 // indirect - go.opentelemetry.io/otel/trace v1.32.0 // indirect + go.opentelemetry.io/auto/sdk v1.1.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.uber.org/atomic v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.26.0 // indirect - golang.org/x/crypto v0.32.0 // indirect + golang.org/x/crypto v0.33.0 // indirect golang.org/x/mod v0.22.0 // indirect - golang.org/x/sys v0.29.0 // indirect - golang.org/x/term v0.28.0 // indirect - golang.org/x/text v0.21.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/term v0.29.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/tools v0.28.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 // indirect google.golang.org/grpc v1.70.0 // indirect - google.golang.org/protobuf v1.36.4 // indirect + google.golang.org/protobuf v1.36.5 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index ae09725f9..739159f6b 100644 --- a/go.sum +++ b/go.sum @@ -2,8 +2,8 @@ bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxo cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go/auth v0.14.0 h1:A5C4dKV/Spdvxcl0ggWwWEzzP7AZMJSEIgrkngwhGYM= -cloud.google.com/go/auth v0.14.0/go.mod h1:CYsoRL1PdiDuqeQpZE0bP2pnPrGqFcOkI0nldEQis+A= +cloud.google.com/go/auth v0.14.1 h1:AwoJbzUdxA/whv1qj3TLKwh3XX5sikny2fc40wUl+h0= +cloud.google.com/go/auth v0.14.1/go.mod h1:4JHUxlGXisL0AW8kXPtUF6ztuOksyfUQNFjfsOCXkPM= cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= @@ -18,10 +18,10 @@ github.com/Azure/azure-sdk-for-go v16.2.1+incompatible h1:KnPIugL51v3N3WwvaSmZbx github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 h1:1mvYtZfWQAnwNah/C+Z+Jb9rQH95LPE2vlmMuWAHJk8= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1/go.mod h1:75I/mXtme1JyWFtz8GocPHVFyH421IBoZErnO16dd0k= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1 h1:Bk5uOhSAenHyR5P61D/NzeQCv+4fEVV8mOkJ82NqpWw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1/go.mod h1:QZ4pw3or1WPmRBxf0cHd1tknzrT54WPBOQoGutCPvSU= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2 h1:F0gBpfdPLGsw+nsgk6aqqkZS1jiixa5WwFe3fk/T3Ys= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/dns/armdns v1.2.0 h1:lpOxwrQ919lCZoNCd69rVt8u1eLZuMORrGXqy8sNf3c= @@ -43,16 +43,16 @@ github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6L github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3 h1:H5xDQaE3XowWfhZRUpnfC+rGZMEVoSiji+b+/HFAPU4= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/DATA-DOG/go-sqlmock v1.4.1/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/F5Networks/k8s-bigip-ctlr/v2 v2.19.0 h1:IZEN1/wXkfHfHKE89fWpOZ797NbR7CCrYjwBnXiRZxI= github.com/F5Networks/k8s-bigip-ctlr/v2 v2.19.0/go.mod h1:JwdtGjHFTmUM1zjzvvCotCCyP55S146IuVPOJZ7D/Jw= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= -github.com/IBM-Cloud/ibm-cloud-cli-sdk v1.6.1 h1:XAz4wwcUlPnqLtDkeRKRRzcNXY7m/92pAaYpsHL32Ro= -github.com/IBM-Cloud/ibm-cloud-cli-sdk v1.6.1/go.mod h1:1oYb5+X7zh9MDtKr9f/KjMLSz+3tZpXBqfwRdu9wiws= +github.com/IBM-Cloud/ibm-cloud-cli-sdk v1.6.2 h1:MADnrzQB08k54k2sz6IyXjcaXOKxvMoayU05NG0CEuE= +github.com/IBM-Cloud/ibm-cloud-cli-sdk v1.6.2/go.mod h1:1oYb5+X7zh9MDtKr9f/KjMLSz+3tZpXBqfwRdu9wiws= github.com/IBM/go-sdk-core/v5 v5.18.5 h1:g0JRl3sYXJczB/yuDlrN6x22LJ6jIxhp0Sa4ARNW60c= github.com/IBM/go-sdk-core/v5 v5.18.5/go.mod h1:KonTFRR+8ZSgw5cxBSYo6E4WZoY1+7n1kfHM82VcjFU= github.com/IBM/networking-go-sdk v0.51.1 h1:xRlDFxSMejMmJ7JPFZ9cflL86uJpbqUzuL/1D/pP7/g= @@ -98,8 +98,8 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAu github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= 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/aliyun/alibaba-cloud-sdk-go v1.63.84 h1:8IpC2i1mtsuUt13cbZtVCtQRSjzuMvLiDrbOJcaS+Z4= -github.com/aliyun/alibaba-cloud-sdk-go v1.63.84/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.88 h1:87jNTxliGqU2yB3H09xCd4U3cZCmR4AkOMqWgaluo5Q= +github.com/aliyun/alibaba-cloud-sdk-go v1.63.88/go.mod h1:SOSDHfe1kX91v3W5QiBsWSLqeLxImobbMX1mxrFHsVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= 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= @@ -121,42 +121,42 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.36.0 h1:b1wM5CcE65Ujwn565qcwgtOTT1aT4ADOHHgglKjG7fk= -github.com/aws/aws-sdk-go-v2 v1.36.0/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= -github.com/aws/aws-sdk-go-v2/config v1.29.5 h1:4lS2IB+wwkj5J43Tq/AwvnscBerBJtQQ6YS7puzCI1k= -github.com/aws/aws-sdk-go-v2/config v1.29.5/go.mod h1:SNzldMlDVbN6nWxM7XsUiNXPSa1LWlqiXtvh/1PrJGg= -github.com/aws/aws-sdk-go-v2/credentials v1.17.58 h1:/d7FUpAPU8Lf2KUdjniQvfNdlMID0Sd9pS23FJ3SS9Y= -github.com/aws/aws-sdk-go-v2/credentials v1.17.58/go.mod h1:aVYW33Ow10CyMQGFgC0ptMRIqJWvJ4nxZb0sUiuQT/A= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.18.1 h1:ZUkvHnTYJj4URe24GFGjm2u5FpjKnUUV1ZiI7r4/y3g= -github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.18.1/go.mod h1:dSkBQQO1LcOD5wSHuM6FqrkgfirJs+tAKm/laeSa0Oc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 h1:7lOW8NUwE9UZekS1DYoiPdVAqZ6A+LheHWb+mHbNOq8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27/go.mod h1:w1BASFIPOPUae7AgaH4SbjNbfdkxuggLyGfNFTn8ITY= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31 h1:lWm9ucLSRFiI4dQQafLrEOmEDGry3Swrz0BIRdiHJqQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31/go.mod h1:Huu6GG0YTfbPphQkDSo4dEGmQRTKb9k9G7RdtyQWxuI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31 h1:ACxDklUKKXb48+eg5ROZXi1vDgfMyfIA/WyvqHcHI0o= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31/go.mod h1:yadnfsDwqXeVaohbGc/RaD287PuyRw2wugkh5ZL2J6k= +github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E= +github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= +github.com/aws/aws-sdk-go-v2/config v1.29.6 h1:fqgqEKK5HaZVWLQoLiC9Q+xDlSp+1LYidp6ybGE2OGg= +github.com/aws/aws-sdk-go-v2/config v1.29.6/go.mod h1:Ft+WLODzDQmCTHDvqAH1JfC2xxbZ0MxpZAcJqmE1LTQ= +github.com/aws/aws-sdk-go-v2/credentials v1.17.59 h1:9btwmrt//Q6JcSdgJOLI98sdr5p7tssS9yAsGe8aKP4= +github.com/aws/aws-sdk-go-v2/credentials v1.17.59/go.mod h1:NM8fM6ovI3zak23UISdWidyZuI1ghNe2xjzUZAyT+08= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.18.4 h1:phn1rkXqpC2IMSrYF9lC99BnvctRo4ArDG5S8XcoJMA= +github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.18.4/go.mod h1:8Nk8uFZ5rACaV8aiP31yQZPh9kasjSFMDj/GOrFT91E= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28 h1:KwsodFKVQTlI5EyhRSugALzsV6mG/SGrdjlMXSZSdso= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.28/go.mod h1:EY3APf9MzygVhKuPXAc5H+MkGb8k/DOSQjWS0LgkKqI= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32 h1:BjUcr3X3K0wZPGFg2bxOWW3VPN8rkE3/61zhP+IHviA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.32/go.mod h1:80+OGC/bgzzFFTUmcuwD0lb4YutwQeKLFpmt6hoWapU= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32 h1:m1GeXHVMJsRsUAqG6HjZWx9dj7F5TR+cF1bjyfYyBd4= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.32/go.mod h1:IitoQxGfaKdVLNg0hD8/DXmAqNy0H4K2H2Sf91ti8sI= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.39.9 h1:gC1SKYPagK6aiL6BrQOl0U5D3vSLQUw6mMaFe9DzoC8= -github.com/aws/aws-sdk-go-v2/service/dynamodb v1.39.9/go.mod h1:+pfCvXbSNLZ7lG+tydnY5IN4WUoz+WsGDrl2rg2DEew= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.19 h1:3n3jgZnhHXSHGHudTOtN3WHkgouE4Jw5rXkBNnPpPo8= -github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.19/go.mod h1:K7wcnwLh1oGGwASzdY6mryhtkPgst/CxmEw78LmlyOU= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.40.1 h1:JUvURAe0mNRzYd+1uTHEiojeyWtNPIQ5EXnDKfgKGUU= +github.com/aws/aws-sdk-go-v2/service/dynamodb v1.40.1/go.mod h1:FcMiR2AALpkrpik6JzbYu+iEfktzrs3XOq5Shk9nvik= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.20 h1:uUTR6EInXq1uf/Bz/0V9bc4jT3sKQ3UuFOjxeUVjeCM= +github.com/aws/aws-sdk-go-v2/service/dynamodbstreams v1.24.20/go.mod h1:jpQRvf4Atm1US92/h+6U3NLeoygPdFid9OYw8awLEa8= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.12 h1:V1h3Cxmn0tN5EhL31uvqSLKsMlPlqiYxRwAEdwNeIJ8= -github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.12/go.mod h1:KzXJPn2wqsZJlNSx70gmDkRDVTmyF/RRXxTP2yMxUwc= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 h1:O+8vD2rGjfihBewr5bT+QUfYUHIxCVgG61LHoT59shM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12/go.mod h1:usVdWJaosa66NMvmCrr08NcWDBRv4E6+YFG2pUdw1Lk= -github.com/aws/aws-sdk-go-v2/service/route53 v1.48.6 h1:O7L9iEodiF07vJoXShMrw2XyeAqZhLUIXqWEitCq6EE= -github.com/aws/aws-sdk-go-v2/service/route53 v1.48.6/go.mod h1:E93uWfli9RToQzVA7+bYnynKOFcYOhNWqhY1hWSMZRc= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.34.10 h1:G3u05YD9rurafUNF4CTVQZ+Fhb5qIPl4CrXJTU+gN0U= -github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.34.10/go.mod h1:8W5a2c+QnClUwxJp+jHnoyWxT2GywMsP7ia3fcQ0oHE= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.14 h1:c5WJ3iHz7rLIgArznb3JCSQT3uUMiz9DLZhIX+1G8ok= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.14/go.mod h1:+JJQTxB6N4niArC14YNtxcQtwEqzS3o9Z32n7q33Rfs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 h1:f1L/JtUkVODD+k1+IiSJUUv8A++2qVr+Xvb3xWXETMU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13/go.mod h1:tvqlFoja8/s0o+UruA1Nrezo/df0PzdunMDDurUfg6U= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.13 h1:3LXNnmtH3TURctC23hnC0p/39Q5gre3FI7BNOiDcVWc= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.13/go.mod h1:7Yn+p66q/jt38qMoVfNvjbm3D89mGBnkwDcijgtih8w= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.13 h1:eWoHfLIzYeUtJEuoUmD5PwTE+fLaIPN9NZ7UXd9CW0s= +github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.10.13/go.mod h1:x5t8Ve0J7JK9VHKSPSRAdBrWAgr/5hH3UeCFMLoyUGQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13 h1:SYVGSFQHlchIcy6e7x12bsrxClCXSP5et8cqVhL8cuw= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.13/go.mod h1:kizuDaLX37bG5WZaoxGPQR/LNFXpxp0vsUnqfkWXfNE= +github.com/aws/aws-sdk-go-v2/service/route53 v1.48.7 h1:oPqYaMfI6XYKXD5jlJ4JHipkKcA2Ska3JLLz11ukf0E= +github.com/aws/aws-sdk-go-v2/service/route53 v1.48.7/go.mod h1:DFFR1FKSHaBJZF2eMW+6PsSg97pldSoHQnRx4tH2Mek= +github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.34.11 h1:0P8AxY1gL1XAMtbh5oJ4dKa19vH+hWrOunHAKgzoI6k= +github.com/aws/aws-sdk-go-v2/service/servicediscovery v1.34.11/go.mod h1:vqJsXcYIagfc/7a+68TvAM2GogOSY6aK0bbROwq7uoM= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.15 h1:/eE3DogBjYlvlbhd2ssWyeuovWunHLxfgw3s/OJa4GQ= +github.com/aws/aws-sdk-go-v2/service/sso v1.24.15/go.mod h1:2PCJYpi7EKeA5SkStAmZlF6fi0uUABuhtF8ILHjGc3Y= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14 h1:M/zwXiL2iXUrHputuXgmO94TVNmcenPHxgLXLutodKE= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.14/go.mod h1:RVwIw3y/IqxC2YEXSIkAzRDdEU1iRabDPaYjpGCbCGQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.14 h1:TzeR06UCMUq+KA3bDkujxK1GVGy+G8qQN/QVYzGLkQE= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.14/go.mod h1:dspXf/oYWGWo6DEvj98wpaTeqt5+DMidZD0A9BYTizc= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/benbjohnson/clock v1.3.0 h1:ip6w0uFQkncKQ979AypyG0ER7mqUSBdKLOgAle/AT8A= @@ -257,8 +257,8 @@ github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZm github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/digitalocean/godo v1.136.0 h1:DTxugljFJSMBPfEGq4KeXpnKeAHicggNqogcrw/YdZw= -github.com/digitalocean/godo v1.136.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= +github.com/digitalocean/godo v1.137.0 h1:bkPG5ram9bHErbCWCKT6j/fMs8jisckhczd3IvueJHg= +github.com/digitalocean/godo v1.137.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= github.com/dnsimple/dnsimple-go v1.7.0 h1:JKu9xJtZ3SqOC+BuYgAWeab7+EEx0sz422vu8j611ZY= github.com/dnsimple/dnsimple-go v1.7.0/go.mod h1:EKpuihlWizqYafSnQHGCd/gyvy3HkEQJ7ODB4KdV8T8= @@ -848,10 +848,10 @@ github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxS github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/oracle/oci-go-sdk/v65 v65.83.0 h1:KFI0oyyCTPmgevHF+QlN02Zdf23Jx1p1X+4KPyH14H8= -github.com/oracle/oci-go-sdk/v65 v65.83.0/go.mod h1:IBEV9l1qBzUpo7zgGaRUhbB05BVfcDGYRFBCPlTcPp0= -github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= -github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/oracle/oci-go-sdk/v65 v65.83.1 h1:Cgojq322B7NwOPOa/arfgVz+5+vRbb2lJtiADVQfgHE= +github.com/oracle/oci-go-sdk/v65 v65.83.1/go.mod h1:IBEV9l1qBzUpo7zgGaRUhbB05BVfcDGYRFBCPlTcPp0= +github.com/ovh/go-ovh v1.7.0 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw= +github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2 h1:CXwSGu/LYmbjEab5aMCs5usQRVBGThelUKBNnoSOuso= github.com/oxtoacart/bpool v0.0.0-20150712133111-4e1c5567d7c2/go.mod h1:L3UMQOThbttwfYRNFOWLLVXMhk5Lkio4GGOtw5UrxS0= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= @@ -936,8 +936,8 @@ 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.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= -github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= -github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= 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/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -1018,12 +1018,12 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1091 h1:RxogX8ZCPBmZ6PY7DjnWnwGRkAkYEEinT5WNNxbLVeo= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1091/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1091 h1:36WwNgrtoGKszQovUj3+0CjNsM1gMQ3a5lvZx2bkjng= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1091/go.mod h1:cWRGvOUnMQMky4oliMX1dXT6Z4CbsSGOIxaUcrD5Zvw= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1091 h1:nNPu5tK4RYMzy1igVv2KDFZBdptI/hEBJYRBsEnSiZA= -github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1091/go.mod h1:PFelV0G8C5lfhFSz/VO4ee4sfg4sEIq/g8HzlytjmQk= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1097 h1:3wV4Lq32bzwtFJutzjdZGM+QYUff/E8fp0nLLugWDtI= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1097/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1097 h1:bXAszuWU0a+MmQ5YDWNZYB7lhWtPgTioCFDLzuyma+A= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1097/go.mod h1:YDURTkRoR7iySup30Wvxt/SChJOZ0dV+P7NBoekQFdg= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1097 h1:qg6EGXlghoTIHOLmegnxBkbkmpds2ZUVG9ti8htUU44= +github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/privatedns v1.0.1097/go.mod h1:zsaqJnLZrmwF8m5zJDuXIW9IUJ3lokrxwgBtcCupFIM= github.com/terra-farm/udnssdk v1.3.5 h1:MNR3adfuuEK/l04+jzo8WW/0fnorY+nW515qb3vEr6I= github.com/terra-farm/udnssdk v1.3.5/go.mod h1:8RnM56yZTR7mYyUIvrDgXzdRaEyFIzqdEi7+um26Sv8= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= @@ -1091,18 +1091,20 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= -go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= -go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= -go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= -go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= -go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= +go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= +go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0 h1:yd02MEjBdJkG3uabWP9apV+OuWRIXGDuJEUJbOHmCFU= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM= -go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= @@ -1147,8 +1149,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20220131195533-30dcbda58838/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220829220503-c86fa9a7ed90/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.32.0 h1:euUpcYgM8WcP71gNpTqQCn6rC2t6ULUPiOzfWaXVVfc= -golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= +golang.org/x/crypto v0.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus= +golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1210,8 +1212,8 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210913180222-943fd674d43e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220725212005-46097bf591d3/go.mod h1:AaygXjzTFtRAg2ttMY5RMuhpJ3cNnI0XpyFJD1iQRSM= -golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= -golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8= +golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= 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-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1281,13 +1283,13 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= -golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg= -golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1295,8 +1297,8 @@ golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo= -golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1351,8 +1353,8 @@ gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZ google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.219.0 h1:nnKIvxKs/06jWawp2liznTBnMRQBEPpGo7I+oEypTX0= -google.golang.org/api v0.219.0/go.mod h1:K6OmjGm+NtLrIkHxv1U3a0qIf/0JOvAHd5O/6AoyKYE= +google.golang.org/api v0.221.0 h1:qzaJfLhDsbMeFee8zBRdt/Nc+xmOuafD/dbdgGfutOU= +google.golang.org/api v0.221.0/go.mod h1:7sOU2+TL4TxUTdbi0gWgAIg7tH5qBXxoyhtL+9x3biQ= 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.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1368,8 +1370,8 @@ google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98 google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576 h1:CkkIfIt50+lT6NHAVoRYEyAvQGFM7xEwXUUywFvEb3Q= google.golang.org/genproto/googleapis/api v0.0.0-20241209162323-e6fa225c2576/go.mod h1:1R3kvZ1dtP3+4p4d3G8uJ8rFk/fWlScl38vanWACI08= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47 h1:91mG8dNTpkC0uChJUQ9zCiRqx3GEEFOWaRZ0mI6Oj2I= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250124145028-65684f501c47/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6 h1:2duwAxN2+k0xLNpjnHTXoMUgnv6VPSp5fiqTuwSxjmI= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250207221924-e9438ea467c6/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= @@ -1394,8 +1396,8 @@ google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2 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.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM= -google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= 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/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1451,10 +1453,10 @@ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -istio.io/api v1.24.2 h1:jYjcN6Iq0RPtQj/3KMFsybxmfqmjGN/dxhL7FGJEdIM= -istio.io/api v1.24.2/go.mod h1:MQnRok7RZ20/PE56v0LxmoWH0xVxnCQPNuf9O7PAN1I= -istio.io/client-go v1.24.2 h1:JTTfBV6dv+AAW+AfccyrdX4T1f9CpsXd1Yzo1s/IYAI= -istio.io/client-go v1.24.2/go.mod h1:dgZ9EmJzh1EECzf6nQhwNL4R6RvlyeH/RXeNeNp/MRg= +istio.io/api v1.24.3 h1:iwWWPM0uEQ+oxRHvIWoB8MQ4bjF3dRQj+M5IDVczg0M= +istio.io/api v1.24.3/go.mod h1:MQnRok7RZ20/PE56v0LxmoWH0xVxnCQPNuf9O7PAN1I= +istio.io/client-go v1.24.3 h1:TB8IcM3yyMCDzKRJo0YfFOUGNQmkhwH/JE/Yr3lzVAk= +istio.io/client-go v1.24.3/go.mod h1:zSyw/c4luKQKosFIHQaWAQOA0c3bODu4SahQCAMlKA4= k8s.io/api v0.18.0/go.mod h1:q2HRQkfDzHMBZL9l/y9rH63PkQl4vae0xRT+8prbrK8= k8s.io/api v0.18.2/go.mod h1:SJCWI7OLzhZSvbY7U8zwNl9UA4o1fizoug34OV/2r78= k8s.io/api v0.18.4/go.mod h1:lOIQAKYgai1+vz9J7YcDZwC26Z0zQewYOGWdyIPUUQ4= diff --git a/internal/testutils/log.go b/internal/testutils/log.go new file mode 100644 index 000000000..232ac78f5 --- /dev/null +++ b/internal/testutils/log.go @@ -0,0 +1,49 @@ +/* +Copyright 2025 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 testutils + +import ( + "bytes" + "flag" + "testing" + + log "github.com/sirupsen/logrus" + "k8s.io/klog/v2" +) + +// LogsToBuffer redirects log(s) output to a buffer for testing purposes +// +// Usage: LogsToBuffer(t) +// Example: +// +// buf := LogsToBuffer(log.DebugLevel, t) +// ... do something that logs ... +// assert.Contains(t, buf.String(), "expected debug log message") +func LogsToBuffer(level log.Level, t *testing.T) *bytes.Buffer { + t.Helper() + buf := new(bytes.Buffer) + log.SetOutput(buf) + log.SetLevel(level) + klog.SetOutput(buf) + flags := &flag.FlagSet{} + klog.InitFlags(flags) + // make sure klog doesn't write to stderr by default in tests + _ = flags.Set("logtostderr", "false") + _ = flags.Set("alsologtostderr", "false") + _ = flags.Set("stderrthreshold", "4") + return buf +} diff --git a/provider/aws/aws_fixtures_test.go b/provider/aws/aws_fixtures_test.go new file mode 100644 index 000000000..5317bb64d --- /dev/null +++ b/provider/aws/aws_fixtures_test.go @@ -0,0 +1,76 @@ +/* +Copyright 2025 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 aws + +import ( + "context" + "testing" + + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "sigs.k8s.io/external-dns/internal/testutils" +) + +func TestAWSRecordsV1(t *testing.T) { + var zones HostedZones + unmarshalTestHelper("/fixtures/160-plus-zones.yaml", &zones, t) + + stub := NewRoute53APIFixtureStub(&zones) + provider := providerFilters(stub, + WithZoneIDFilters( + "Z10242883PKPS38KA4S6C", "Z10295763LSQ170JCTR78", + "Z102957NOTEXISTS", "Z09418121E8V6WT4FASZE", + ), + WithDomainFilters("w2.w1.ex.com", "ex.com"), + ) + + ctx := context.Background() + z, err := provider.Zones(ctx) + assert.NoError(t, err) + assert.EqualValues(t, 3, len(z)) +} + +func TestAWSZonesFilterWithTags(t *testing.T) { + var zones HostedZones + unmarshalTestHelper("/fixtures/160-plus-zones.yaml", &zones, t) + + stub := NewRoute53APIFixtureStub(&zones) + provider := providerFilters(stub, + WithZoneTagFilters([]string{"level=5", "owner=ext-dns"}), + ) + + ctx := context.Background() + z, err := provider.Zones(ctx) + assert.NoError(t, err) + assert.EqualValues(t, 24, len(z)) + assert.Equal(t, 169, stub.calls["listtagsforresource"]) +} + +func TestAWSZonesSecondRequestHitsTheCache(t *testing.T) { + var zones HostedZones + unmarshalTestHelper("/fixtures/160-plus-zones.yaml", &zones, t) + + stub := NewRoute53APIFixtureStub(&zones) + provider := providerFilters(stub) + + ctx := context.Background() + _, err := provider.Zones(ctx) + assert.NoError(t, err) + b := testutils.LogsToBuffer(log.DebugLevel, t) + _, _ = provider.Zones(ctx) + assert.Contains(t, b.String(), "level=debug msg=\"Using cached zones list\"") +} diff --git a/provider/aws/aws_utils_test.go b/provider/aws/aws_utils_test.go new file mode 100644 index 000000000..704bd8392 --- /dev/null +++ b/provider/aws/aws_utils_test.go @@ -0,0 +1,148 @@ +/* +Copyright 2025 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 aws + +import ( + "context" + "os" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/service/route53" + route53types "github.com/aws/aws-sdk-go-v2/service/route53/types" + "github.com/stretchr/testify/assert" + "gopkg.in/yaml.v3" + "sigs.k8s.io/external-dns/endpoint" + "sigs.k8s.io/external-dns/provider" +) + +type HostedZones struct { + Zones []*HostedZone `yaml:"zones"` +} + +type HostedZone struct { + Name string + ID string + Tags []route53types.Tag `yaml:"tags"` +} + +var _ Route53API = &Route53APIFixtureStub{} + +type Route53APIFixtureStub struct { + zones map[string]*route53types.HostedZone + zoneTags map[string][]route53types.Tag + calls map[string]int +} + +func providerFilters(client *Route53APIFixtureStub, options ...func(awsProvider *AWSProvider)) *AWSProvider { + p := &AWSProvider{ + clients: map[string]Route53API{defaultAWSProfile: client}, + evaluateTargetHealth: false, + dryRun: false, + domainFilter: endpoint.NewDomainFilter([]string{}), + zoneIDFilter: provider.NewZoneIDFilter([]string{}), + zoneTypeFilter: provider.NewZoneTypeFilter(""), + zoneTagFilter: provider.NewZoneTagFilter([]string{}), + zonesCache: &zonesListCache{duration: 1 * time.Second}, + } + for _, o := range options { + o(p) + } + return p +} + +func WithDomainFilters(filters ...string) func(awsProvider *AWSProvider) { + return func(awsProvider *AWSProvider) { + awsProvider.domainFilter = endpoint.NewDomainFilter(filters) + } +} + +func WithZoneIDFilters(filters ...string) func(awsProvider *AWSProvider) { + return func(awsProvider *AWSProvider) { + awsProvider.zoneIDFilter = provider.NewZoneIDFilter(filters) + } +} + +func WithZoneTagFilters(filters []string) func(awsProvider *AWSProvider) { + return func(awsProvider *AWSProvider) { + awsProvider.zoneTagFilter = provider.NewZoneTagFilter(filters) + } +} + +func NewRoute53APIFixtureStub(zones *HostedZones) *Route53APIFixtureStub { + route53Zones := make(map[string]*route53types.HostedZone) + zoneTags := make(map[string][]route53types.Tag) + for _, zone := range zones.Zones { + route53Zones[zone.ID] = &route53types.HostedZone{ + Id: &zone.ID, + Name: &zone.Name, + } + zoneTags[cleanZoneID(zone.ID)] = zone.Tags + } + return &Route53APIFixtureStub{ + zones: route53Zones, + zoneTags: zoneTags, + calls: make(map[string]int), + } +} + +func (r Route53APIFixtureStub) ListResourceRecordSets(ctx context.Context, input *route53.ListResourceRecordSetsInput, optFns ...func(options *route53.Options)) (*route53.ListResourceRecordSetsOutput, error) { + // TODO implement me + panic("implement me") +} + +func (r Route53APIFixtureStub) ChangeResourceRecordSets(ctx context.Context, input *route53.ChangeResourceRecordSetsInput, optFns ...func(options *route53.Options)) (*route53.ChangeResourceRecordSetsOutput, error) { + // TODO implement me + panic("implement me") +} + +func (r Route53APIFixtureStub) CreateHostedZone(ctx context.Context, input *route53.CreateHostedZoneInput, optFns ...func(*route53.Options)) (*route53.CreateHostedZoneOutput, error) { + // TODO implement me + panic("implement me") +} + +func (r Route53APIFixtureStub) ListHostedZones(ctx context.Context, input *route53.ListHostedZonesInput, optFns ...func(options *route53.Options)) (*route53.ListHostedZonesOutput, error) { + r.calls["listhostedzones"]++ + output := &route53.ListHostedZonesOutput{} + for _, zone := range r.zones { + output.HostedZones = append(output.HostedZones, *zone) + } + return output, nil +} + +func (r Route53APIFixtureStub) ListTagsForResource(ctx context.Context, input *route53.ListTagsForResourceInput, optFns ...func(options *route53.Options)) (*route53.ListTagsForResourceOutput, error) { + r.calls["listtagsforresource"]++ + tags := r.zoneTags[*input.ResourceId] + return &route53.ListTagsForResourceOutput{ + ResourceTagSet: &route53types.ResourceTagSet{ + ResourceId: input.ResourceId, + ResourceType: input.ResourceType, + Tags: tags, + }, + }, nil +} + +func unmarshalTestHelper(input string, obj any, t *testing.T) { + t.Helper() + path, _ := os.Getwd() + file, err := os.Open(path + input) + assert.NoError(t, err) + defer file.Close() + dec := yaml.NewDecoder(file) + err = dec.Decode(obj) + assert.NoError(t, err) +} diff --git a/provider/aws/fixtures/160-plus-zones.yaml b/provider/aws/fixtures/160-plus-zones.yaml new file mode 100644 index 000000000..809089b14 --- /dev/null +++ b/provider/aws/fixtures/160-plus-zones.yaml @@ -0,0 +1,3215 @@ +# AWS zones fixtures with tags +# number of zones 160+ (root domain + subdomains) +# root domain ex.com +# subdomains examples in the form of +# - x1.ex.com +# - ........ +# - x7.x6.x5.x4.x3.x2.x1.ex.com +zones: +- name: ex.com. + id: /hostedzone/Z10242883PKPS38KA4S6C + tags: + - key: owner + value: ext-dns + - key: level + value: root + - key: managed + value: terraform + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x7.x6.x5.x4.x3.x2.x1.ex.com. + id: /hostedzone/Z1032002B96QH7HFX83T + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: x6.x5.x4.x3.x2.x1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: x7.x6.x5.x4.x3.x2.x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u7.u6.u5.u4.u3.u2.u1.ex.com. + id: /hostedzone/Z10320232590ZA96YS1UU + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: u6.u5.u4.u3.u2.u1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: u7.u6.u5.u4.u3.u2.u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a7.a6.a5.a4.a3.a2.a1.ex.com. + id: /hostedzone/Z10315369KW0URNJU6RK + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: a6.a5.a4.a3.a2.a1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: a7.a6.a5.a4.a3.a2.a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j7.j6.j5.j4.j3.j2.j1.ex.com. + id: /hostedzone/Z10295763LSQ170JCTR78 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: j6.j5.j4.j3.j2.j1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: j7.j6.j5.j4.j3.j2.j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c7.c6.c5.c4.c3.c2.c1.ex.com. + id: /hostedzone/Z10288493DKATL8232JNZ + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: c6.c5.c4.c3.c2.c1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: c7.c6.c5.c4.c3.c2.c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f7.f6.f5.f4.f3.f2.f1.ex.com. + id: /hostedzone/Z102884820EE3LQYU9WOM + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: f6.f5.f4.f3.f2.f1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: f7.f6.f5.f4.f3.f2.f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w7.w6.w5.w4.w3.w2.w1.ex.com. + id: /hostedzone/Z10283413MVB9WV61S7OA + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: w6.w5.w4.w3.w2.w1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: w7.w6.w5.w4.w3.w2.w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r1.ex.com. + id: /hostedzone/Z1016808BHW7INWWYYIF + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h1.ex.com. + id: /hostedzone/Z1016090E4ZMPH0OUE8Z + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t1.ex.com. + id: /hostedzone/Z10161971RT6SUM2O9Q5E + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o1.ex.com. + id: /hostedzone/Z10159761394AY0UJXGVW + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g1.ex.com. + id: /hostedzone/Z10160182ROTV7D06VGRH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l2.l1.ex.com. + id: /hostedzone/Z10238911BEICMQG6K7N4 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: l1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: l2.l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d1.ex.com. + id: /hostedzone/Z10238042ATQ2R880EA30 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g2.g1.ex.com. + id: /hostedzone/Z102355127WZ6HZSCS1UQ + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: g1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: g2.g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k1.ex.com. + id: /hostedzone/Z10228862S8D8AWIBRPX5 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z2.z1.ex.com. + id: /hostedzone/Z1022753YQV9L66OQKKG + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: z1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: z2.z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n1.ex.com. + id: /hostedzone/Z10222872GS2T2IW5YE39 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p3.p2.p1.ex.com. + id: /hostedzone/Z10392163D8GY90CD0H8 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: p2.p1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: p3.p2.p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z3.z2.z1.ex.com. + id: /hostedzone/Z10385543080IK4J0F0TN + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: z2.z1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: z3.z2.z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m3.m2.m1.ex.com. + id: /hostedzone/Z10382283MVOVGXANQEYL + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: m2.m1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: m3.m2.m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r4.r3.r2.r1.ex.com. + id: /hostedzone/Z1038243J4I23XS7OSKF + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: r3.r2.r1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: r4.r3.r2.r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k3.k2.k1.ex.com. + id: /hostedzone/Z103808619D40WT1DR49J + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: k2.k1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: k3.k2.k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p4.p3.p2.p1.ex.com. + id: /hostedzone/Z1038033327YHLUQQI3X2 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: p3.p2.p1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: p4.p3.p2.p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m5.m4.m3.m2.m1.ex.com. + id: /hostedzone/Z0533089I4KYU2CI4QI1 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: m4.m3.m2.m1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: m5.m4.m3.m2.m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c5.c4.c3.c2.c1.ex.com. + id: /hostedzone/Z05330532TU88KT3RR8DV + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: c4.c3.c2.c1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: c5.c4.c3.c2.c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r5.r4.r3.r2.r1.ex.com. + id: /hostedzone/Z05330482Y4BD73GXQL9R + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: r4.r3.r2.r1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: r5.r4.r3.r2.r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g5.g4.g3.g2.g1.ex.com. + id: /hostedzone/Z0532558273KTRBR8UW6J + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: g4.g3.g2.g1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: g5.g4.g3.g2.g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r6.r5.r4.r3.r2.r1.ex.com. + id: /hostedzone/Z054065934ZVPHZZKEPH4 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: r5.r4.r3.r2.r1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: r6.r5.r4.r3.r2.r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f5.f4.f3.f2.f1.ex.com. + id: /hostedzone/Z053991036YAFX9ZO6WWP + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: f4.f3.f2.f1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: f5.f4.f3.f2.f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a5.a4.a3.a2.a1.ex.com. + id: /hostedzone/Z05399152X3HLIXV18OFH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: a4.a3.a2.a1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: a5.a4.a3.a2.a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g6.g5.g4.g3.g2.g1.ex.com. + id: /hostedzone/Z0539521253N0CZENGVYT + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: g5.g4.g3.g2.g1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: g6.g5.g4.g3.g2.g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h5.h4.h3.h2.h1.ex.com. + id: /hostedzone/Z0539437KPBCRSU5OQS2 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: h4.h3.h2.h1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: h5.h4.h3.h2.h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z6.z5.z4.z3.z2.z1.ex.com. + id: /hostedzone/Z05393465GOC3P191Z3M + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: z5.z4.z3.z2.z1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: z6.z5.z4.z3.z2.z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x6.x5.x4.x3.x2.x1.ex.com. + id: /hostedzone/Z05392373JKKXLCN3FNI4 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: x5.x4.x3.x2.x1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: x6.x5.x4.x3.x2.x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j5.j4.j3.j2.j1.ex.com. + id: /hostedzone/Z0539046IFXW5PM8YN1H + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: j4.j3.j2.j1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: j5.j4.j3.j2.j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d6.d5.d4.d3.d2.d1.ex.com. + id: /hostedzone/Z053882914TO782DFG8CG + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: d5.d4.d3.d2.d1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: d6.d5.d4.d3.d2.d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z5.z4.z3.z2.z1.ex.com. + id: /hostedzone/Z0538661Y3HB6MCJOE82 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: z4.z3.z2.z1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: z5.z4.z3.z2.z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k5.k4.k3.k2.k1.ex.com. + id: /hostedzone/Z05385574XIO6WFJ8LQ1 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: k4.k3.k2.k1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: k5.k4.k3.k2.k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i5.i4.i3.i2.i1.ex.com. + id: /hostedzone/Z053855215ZX8GW2J5KBG + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: i4.i3.i2.i1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: i5.i4.i3.i2.i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o5.o4.o3.o2.o1.ex.com. + id: /hostedzone/Z0538559IWTO974D6T3D + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: o4.o3.o2.o1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: o5.o4.o3.o2.o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o6.o5.o4.o3.o2.o1.ex.com. + id: /hostedzone/Z05384951BX94HIDSNC29 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: o5.o4.o3.o2.o1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: o6.o5.o4.o3.o2.o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w6.w5.w4.w3.w2.w1.ex.com. + id: /hostedzone/Z053846613UOJETPXKV9G + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: w5.w4.w3.w2.w1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: w6.w5.w4.w3.w2.w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b6.b5.b4.b3.b2.b1.ex.com. + id: /hostedzone/Z05380942D45I29YOVUJ1 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: b5.b4.b3.b2.b1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: b6.b5.b4.b3.b2.b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p6.p5.p4.p3.p2.p1.ex.com. + id: /hostedzone/Z05376071AXQ7LGK8Y7FO + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: p5.p4.p3.p2.p1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: p6.p5.p4.p3.p2.p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i6.i5.i4.i3.i2.i1.ex.com. + id: /hostedzone/Z05375472NGNYPN630LTO + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: i5.i4.i3.i2.i1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: i6.i5.i4.i3.i2.i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k6.k5.k4.k3.k2.k1.ex.com. + id: /hostedzone/Z05374771LUBA1Z2GUIT6 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: k5.k4.k3.k2.k1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: k6.k5.k4.k3.k2.k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h6.h5.h4.h3.h2.h1.ex.com. + id: /hostedzone/Z0537068TAWOCOL8HJ61 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: h5.h4.h3.h2.h1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: h6.h5.h4.h3.h2.h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s7.s6.s5.s4.s3.s2.s1.ex.com. + id: /hostedzone/Z072010925XG7D9WXB3H + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: s6.s5.s4.s3.s2.s1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: s7.s6.s5.s4.s3.s2.s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y7.y6.y5.y4.y3.y2.y1.ex.com. + id: /hostedzone/Z071952623W901PGCEAA1 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: y6.y5.y4.y3.y2.y1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: y7.y6.y5.y4.y3.y2.y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k7.k6.k5.k4.k3.k2.k1.ex.com. + id: /hostedzone/Z0719164E82YWUXVQD4F + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: k6.k5.k4.k3.k2.k1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: k7.k6.k5.k4.k3.k2.k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c1.ex.com. + id: /hostedzone/Z07076132LTJ3XGH5CJWY + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z1.ex.com. + id: /hostedzone/Z070741827T4NNW17A6N9 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i2.i1.ex.com. + id: /hostedzone/Z0706863ZTD2HUTU10N0 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: i1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: i2.i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x2.x1.ex.com. + id: /hostedzone/Z0705382P6ROONRM2CKR + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: x1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: x2.x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p1.ex.com. + id: /hostedzone/Z0705253DHCTMDZ48Q4V + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s1.ex.com. + id: /hostedzone/Z070526324O7V32HB2GP4 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n3.n2.n1.ex.com. + id: /hostedzone/Z072628929FO3LXWQVOY7 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: n2.n1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: n3.n2.n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r3.r2.r1.ex.com. + id: /hostedzone/Z07259612MWHI9NFRS53E + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: r2.r1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: r3.r2.r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j3.j2.j1.ex.com. + id: /hostedzone/Z072595530FWB47CDV2WC + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: j2.j1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: j3.j2.j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d3.d2.d1.ex.com. + id: /hostedzone/Z0725572346MYVZ3KGNUH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: d2.d1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: d3.d2.d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o3.o2.o1.ex.com. + id: /hostedzone/Z072558318OW0Y4DNPN66 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: o2.o1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: o3.o2.o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x3.x2.x1.ex.com. + id: /hostedzone/Z0725404124TWY26MTQXT + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: x2.x1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: x3.x2.x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l3.l2.l1.ex.com. + id: /hostedzone/Z07255931Q3MVC1T9FIX1 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: l2.l1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: l3.l2.l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t4.t3.t2.t1.ex.com. + id: /hostedzone/Z0725300TUYR9MM1NP9T + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: t3.t2.t1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: t4.t3.t2.t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i4.i3.i2.i1.ex.com. + id: /hostedzone/Z07252442H3FRQ6T9REYR + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: i3.i2.i1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: i4.i3.i2.i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g3.g2.g1.ex.com. + id: /hostedzone/Z072522110PO1T9F6EOIH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: g2.g1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: g3.g2.g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y3.y2.y1.ex.com. + id: /hostedzone/Z074908589R64YFZTTRF + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: y2.y1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: y3.y2.y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w4.w3.w2.w1.ex.com. + id: /hostedzone/Z07491213MWEKC6MH5BEX + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: w3.w2.w1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: w4.w3.w2.w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e4.e3.e2.e1.ex.com. + id: /hostedzone/Z0748318XZ5SAQVUUDHE + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: e3.e2.e1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: e4.e3.e2.e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a4.a3.a2.a1.ex.com. + id: /hostedzone/Z07482493MHOG25MXMYQW + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: a3.a2.a1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: a4.a3.a2.a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g4.g3.g2.g1.ex.com. + id: /hostedzone/Z07473562MT9TYWVVE38G + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: g3.g2.g1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: g4.g3.g2.g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d4.d3.d2.d1.ex.com. + id: /hostedzone/Z0747355363XLS6BWS4JP + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: d3.d2.d1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: d4.d3.d2.d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u4.u3.u2.u1.ex.com. + id: /hostedzone/Z07473491EXNK832Z1KY2 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: u3.u2.u1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: u4.u3.u2.u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e5.e4.e3.e2.e1.ex.com. + id: /hostedzone/Z07516762P24S9BSAPW20 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: e4.e3.e2.e1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: e5.e4.e3.e2.e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y5.y4.y3.y2.y1.ex.com. + id: /hostedzone/Z07510071JNCBZN4PU9PU + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: y4.y3.y2.y1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: y5.y4.y3.y2.y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x5.x4.x3.x2.x1.ex.com. + id: /hostedzone/Z0750455O2P676BQCQ36 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: x4.x3.x2.x1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: x5.x4.x3.x2.x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s5.s4.s3.s2.s1.ex.com. + id: /hostedzone/Z07503442IXQWYXD3NA2P + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: s4.s3.s2.s1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: s5.s4.s3.s2.s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y6.y5.y4.y3.y2.y1.ex.com. + id: /hostedzone/Z07499781IH1IWL681HZA + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: y5.y4.y3.y2.y1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: y6.y5.y4.y3.y2.y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s6.s5.s4.s3.s2.s1.ex.com. + id: /hostedzone/Z074127711E3PB3VWCVR8 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: s5.s4.s3.s2.s1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: s6.s5.s4.s3.s2.s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l6.l5.l4.l3.l2.l1.ex.com. + id: /hostedzone/Z07407861HUM7TWLBEVHW + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: l5.l4.l3.l2.l1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: l6.l5.l4.l3.l2.l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j6.j5.j4.j3.j2.j1.ex.com. + id: /hostedzone/Z07407492KRCV3E1Q3TTH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: j5.j4.j3.j2.j1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: j6.j5.j4.j3.j2.j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z7.z6.z5.z4.z3.z2.z1.ex.com. + id: /hostedzone/Z05977813GQTSJK0XA6CR + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: z6.z5.z4.z3.z2.z1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: z7.z6.z5.z4.z3.z2.z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p7.p6.p5.p4.p3.p2.p1.ex.com. + id: /hostedzone/Z05976812XQ4FYDX0EA1M + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: p6.p5.p4.p3.p2.p1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: p7.p6.p5.p4.p3.p2.p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r7.r6.r5.r4.r3.r2.r1.ex.com. + id: /hostedzone/Z059725536VFD0SUK6COX + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: r6.r5.r4.r3.r2.r1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: r7.r6.r5.r4.r3.r2.r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n7.n6.n5.n4.n3.n2.n1.ex.com. + id: /hostedzone/Z05968613E7Z7DOMT8XQY + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: n6.n5.n4.n3.n2.n1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: n7.n6.n5.n4.n3.n2.n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j1.ex.com. + id: /hostedzone/Z061728615D0VKL6DXRPH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y1.ex.com. + id: /hostedzone/Z06172299A0X24MKXTOD + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p2.p1.ex.com. + id: /hostedzone/Z06167006NZ1D5IRNRYA + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: p1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: p2.p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f1.ex.com. + id: /hostedzone/Z06160862E2ELNT29RQL3 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l1.ex.com. + id: /hostedzone/Z06158931J4KH25JG225F + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a1.ex.com. + id: /hostedzone/Z06155043AVN8RVC88TYY + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u1.ex.com. + id: /hostedzone/Z061540412CK4L8XI4BB6 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c2.c1.ex.com. + id: /hostedzone/Z06150423UYFKAE29W1SW + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: c1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: c2.c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m2.m1.ex.com. + id: /hostedzone/Z06152622MZNX328M11VY + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: m1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: m2.m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o2.o1.ex.com. + id: /hostedzone/Z06151611YG2J9D7Y9URS + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: o1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: o2.o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w1.ex.com. + id: /hostedzone/Z06144631U9WHJGPNE0F6 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b2.b1.ex.com. + id: /hostedzone/Z0621921Q39DAS25KW2F + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: b1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: b2.b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k2.k1.ex.com. + id: /hostedzone/Z06214591V9ROEHRT4AJR + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: k1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: k2.k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: r2.r1.ex.com. + id: /hostedzone/Z062145823F9HOXQ8AQTT + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: r1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: r2.r1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a2.a1.ex.com. + id: /hostedzone/Z062114713UUBAQBGL50S + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: a1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: a2.a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u2.u1.ex.com. + id: /hostedzone/Z062114626Y9F53JWLIF3 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: u1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: u2.u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j2.j1.ex.com. + id: /hostedzone/Z06208221KB9XPMJOH1YY + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: j1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: j2.j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f2.f1.ex.com. + id: /hostedzone/Z0620221RICGJ8UMXA3J + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: f1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: f2.f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s3.s2.s1.ex.com. + id: /hostedzone/Z0633015M1WISEQYPT1O + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: s2.s1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: s3.s2.s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a3.a2.a1.ex.com. + id: /hostedzone/Z06329532JLRXZTWQP7A3 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: a2.a1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: a3.a2.a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m4.m3.m2.m1.ex.com. + id: /hostedzone/Z0632386384GR41PHHKYP + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: m3.m2.m1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: m4.m3.m2.m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y4.y3.y2.y1.ex.com. + id: /hostedzone/Z06317473A6DQOQB2TRU5 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: y3.y2.y1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: y4.y3.y2.y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: k4.k3.k2.k1.ex.com. + id: /hostedzone/Z0631662C8V9KGIE114K + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: k3.k2.k1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: k4.k3.k2.k1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l4.l3.l2.l1.ex.com. + id: /hostedzone/Z0631619300T0491JETF6 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: l3.l2.l1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: l4.l3.l2.l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c4.c3.c2.c1.ex.com. + id: /hostedzone/Z06312335K3AAQ106WOS + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: c3.c2.c1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: c4.c3.c2.c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d5.d4.d3.d2.d1.ex.com. + id: /hostedzone/Z06264302YRR5RW36ZQTN + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: d4.d3.d2.d1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: d5.d4.d3.d2.d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n5.n4.n3.n2.n1.ex.com. + id: /hostedzone/Z06255473B4E9CCCYXD0C + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: n4.n3.n2.n1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: n5.n4.n3.n2.n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t6.t5.t4.t3.t2.t1.ex.com. + id: /hostedzone/Z06247991Z9UOIVBEHBIZ + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: t5.t4.t3.t2.t1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: t6.t5.t4.t3.t2.t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m6.m5.m4.m3.m2.m1.ex.com. + id: /hostedzone/Z06248401WRYVSUJIMXGM + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: m5.m4.m3.m2.m1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: m6.m5.m4.m3.m2.m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u5.u4.u3.u2.u1.ex.com. + id: /hostedzone/Z06248072H6SA6EBROQVA + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: u4.u3.u2.u1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: u5.u4.u3.u2.u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t5.t4.t3.t2.t1.ex.com. + id: /hostedzone/Z062430113Y30HAIE6V8 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: t4.t3.t2.t1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: t5.t4.t3.t2.t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n6.n5.n4.n3.n2.n1.ex.com. + id: /hostedzone/Z06239002LL6XI9BMP5LP + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: n5.n4.n3.n2.n1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: n6.n5.n4.n3.n2.n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u6.u5.u4.u3.u2.u1.ex.com. + id: /hostedzone/Z062358930OBBSG0DNV0Y + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: u5.u4.u3.u2.u1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: u6.u5.u4.u3.u2.u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l5.l4.l3.l2.l1.ex.com. + id: /hostedzone/Z06227713K2LX8JW32GM0 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: l4.l3.l2.l1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: l5.l4.l3.l2.l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w5.w4.w3.w2.w1.ex.com. + id: /hostedzone/Z06227293A8RSW44CUSQI + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: w4.w3.w2.w1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: w5.w4.w3.w2.w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e6.e5.e4.e3.e2.e1.ex.com. + id: /hostedzone/Z06304583NEE5VFLGKEQU + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: e5.e4.e3.e2.e1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: e6.e5.e4.e3.e2.e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b7.b6.b5.b4.b3.b2.b1.ex.com. + id: /hostedzone/Z0942661HXLGP9L2YZH3 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: b6.b5.b4.b3.b2.b1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: b7.b6.b5.b4.b3.b2.b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t7.t6.t5.t4.t3.t2.t1.ex.com. + id: /hostedzone/Z0949431OHPKQPZEXGDX + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: t6.t5.t4.t3.t2.t1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: t7.t6.t5.t4.t3.t2.t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d7.d6.d5.d4.d3.d2.d1.ex.com. + id: /hostedzone/Z09491241UC9DWHHT0SEN + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: d6.d5.d4.d3.d2.d1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: d7.d6.d5.d4.d3.d2.d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h7.h6.h5.h4.h3.h2.h1.ex.com. + id: /hostedzone/Z09480891AX3V95RKI43I + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: h6.h5.h4.h3.h2.h1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: h7.h6.h5.h4.h3.h2.h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: g7.g6.g5.g4.g3.g2.g1.ex.com. + id: /hostedzone/Z094802628HB653GKGL2W + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: g6.g5.g4.g3.g2.g1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: g7.g6.g5.g4.g3.g2.g1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m7.m6.m5.m4.m3.m2.m1.ex.com. + id: /hostedzone/Z09480162FW8C3KROXT7G + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: m6.m5.m4.m3.m2.m1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: m7.m6.m5.m4.m3.m2.m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: l7.l6.l5.l4.l3.l2.l1.ex.com. + id: /hostedzone/Z09480273OHY83D5NHYVH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: l6.l5.l4.l3.l2.l1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: l7.l6.l5.l4.l3.l2.l1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o7.o6.o5.o4.o3.o2.o1.ex.com. + id: /hostedzone/Z09480223A3R9GDRXB62G + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: o6.o5.o4.o3.o2.o1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: o7.o6.o5.o4.o3.o2.o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i7.i6.i5.i4.i3.i2.i1.ex.com. + id: /hostedzone/Z09475203CZDWQ5UOPB5H + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: i6.i5.i4.i3.i2.i1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: i7.i6.i5.i4.i3.i2.i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e7.e6.e5.e4.e3.e2.e1.ex.com. + id: /hostedzone/Z09465491NJY6YM6BV9CR + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: e6.e5.e4.e3.e2.e1.ex.com + - key: level + value: "7" + - key: managed + value: terraform + - key: domain + value: e7.e6.e5.e4.e3.e2.e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w2.w1.ex.com. + id: /hostedzone/Z09418121E8V6WT4FASZE + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: w1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: w2.w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t2.t1.ex.com. + id: /hostedzone/Z0941411140EAM8LI6XSX + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: t1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: t2.t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: m1.ex.com. + id: /hostedzone/Z0941151MH351YJEC250 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: m1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e2.e1.ex.com. + id: /hostedzone/Z09408592RKGIVCOGBFJW + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: e1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: e2.e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n2.n1.ex.com. + id: /hostedzone/Z09408791OZQTXJTECCDX + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: n1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: n2.n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i1.ex.com. + id: /hostedzone/Z0940748ZXY7SLGNELA0 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e1.ex.com. + id: /hostedzone/Z094076011ZHUH8WUULP + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b1.ex.com. + id: /hostedzone/Z09407613O62TF4KJ7UHH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x1.ex.com. + id: /hostedzone/Z09407532B9TMSQHCL5QA + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: ex.com + - key: level + value: "1" + - key: managed + value: terraform + - key: domain + value: x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: y2.y1.ex.com. + id: /hostedzone/Z0940306YB0C0775W4GP + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: y1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: y2.y1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h2.h1.ex.com. + id: /hostedzone/Z09405092OGSZIJY9BEYN + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: h1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: h2.h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: d2.d1.ex.com. + id: /hostedzone/Z09396301VGLGYVE5RGK5 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: d1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: d2.d1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s2.s1.ex.com. + id: /hostedzone/Z09394103L1W2N920D71K + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: s1.ex.com + - key: level + value: "2" + - key: managed + value: terraform + - key: domain + value: s2.s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f3.f2.f1.ex.com. + id: /hostedzone/Z09514023G8ZGR4DJKR3A + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: f2.f1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: f3.f2.f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b3.b2.b1.ex.com. + id: /hostedzone/Z09583652IMG5STP7731F + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: b2.b1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: b3.b2.b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: w3.w2.w1.ex.com. + id: /hostedzone/Z09580483LFSMB2OBV4FM + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: w2.w1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: w3.w2.w1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: x4.x3.x2.x1.ex.com. + id: /hostedzone/Z095764620VD6TFV6Q8FH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: x3.x2.x1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: x4.x3.x2.x1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f4.f3.f2.f1.ex.com. + id: /hostedzone/Z09564251P7OWGV8YAVPD + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: f3.f2.f1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: f4.f3.f2.f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: z4.z3.z2.z1.ex.com. + id: /hostedzone/Z095609014Z6XE70HI4T4 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: z3.z2.z1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: z4.z3.z2.z1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h3.h2.h1.ex.com. + id: /hostedzone/Z09557511F8219IOYA0PO + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: h2.h1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: h3.h2.h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b4.b3.b2.b1.ex.com. + id: /hostedzone/Z095570265KY2U6HO9TO + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: b3.b2.b1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: b4.b3.b2.b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: s4.s3.s2.s1.ex.com. + id: /hostedzone/Z0955182J8RQ0EOVX7X5 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: s3.s2.s1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: s4.s3.s2.s1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: j4.j3.j2.j1.ex.com. + id: /hostedzone/Z09551293SYT29TZGCK1Q + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: j3.j2.j1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: j4.j3.j2.j1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: i3.i2.i1.ex.com. + id: /hostedzone/Z09549753KGGEAJYSIKQU + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: i2.i1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: i3.i2.i1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: h4.h3.h2.h1.ex.com. + id: /hostedzone/Z095473017P9TIG47W418 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: h3.h2.h1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: h4.h3.h2.h1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c3.c2.c1.ex.com. + id: /hostedzone/Z09788602NGY8C9CCTV10 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: c2.c1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: c3.c2.c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: t3.t2.t1.ex.com. + id: /hostedzone/Z09788491STHS3LT21IWW + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: t2.t1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: t3.t2.t1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: e3.e2.e1.ex.com. + id: /hostedzone/Z09788593ERXU8DSD4LCO + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: e2.e1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: e3.e2.e1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: u3.u2.u1.ex.com. + id: /hostedzone/Z09783123AIJ322RP9AVS + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: u2.u1.ex.com + - key: level + value: "3" + - key: managed + value: terraform + - key: domain + value: u3.u2.u1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: n4.n3.n2.n1.ex.com. + id: /hostedzone/Z0978397265BSNRBCT08T + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: n3.n2.n1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: n4.n3.n2.n1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: o4.o3.o2.o1.ex.com. + id: /hostedzone/Z09753782VB47JVMP3QQH + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: o3.o2.o1.ex.com + - key: level + value: "4" + - key: managed + value: terraform + - key: domain + value: o4.o3.o2.o1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: b5.b4.b3.b2.b1.ex.com. + id: /hostedzone/Z09808623VONT9B5AGIBQ + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: b4.b3.b2.b1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: b5.b4.b3.b2.b1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: c6.c5.c4.c3.c2.c1.ex.com. + id: /hostedzone/Z09705082YEX3UKM47BT3 + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: c5.c4.c3.c2.c1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: c6.c5.c4.c3.c2.c1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: p5.p4.p3.p2.p1.ex.com. + id: /hostedzone/Z09704821Y3VVAC37HSED + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: p4.p3.p2.p1.ex.com + - key: level + value: "5" + - key: managed + value: terraform + - key: domain + value: p5.p4.p3.p2.p1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: a6.a5.a4.a3.a2.a1.ex.com. + id: /hostedzone/Z0969737LNGOLZ7RPT2E + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: a5.a4.a3.a2.a1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: a6.a5.a4.a3.a2.a1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com +- name: f6.f5.f4.f3.f2.f1.ex.com. + id: /hostedzone/Z09695981XV9GI7P7WRMX + tags: + - key: owner + value: ext-dns + - key: parentdomain + value: f5.f4.f3.f2.f1.ex.com + - key: level + value: "6" + - key: managed + value: terraform + - key: domain + value: f6.f5.f4.f3.f2.f1.ex.com + - key: vpcid + value: vpc-123456 + - key: env + value: sandbox + - key: rootdomain + value: ex.com diff --git a/provider/zone_tag_filter.go b/provider/zone_tag_filter.go index c40ab06e9..f659420d5 100644 --- a/provider/zone_tag_filter.go +++ b/provider/zone_tag_filter.go @@ -22,7 +22,7 @@ import ( // ZoneTagFilter holds a list of zone tags to filter by type ZoneTagFilter struct { - zoneTags []string + tagsMap map[string]string } // NewZoneTagFilter returns a new ZoneTagFilter given a list of zone tags @@ -30,22 +30,29 @@ func NewZoneTagFilter(tags []string) ZoneTagFilter { if len(tags) == 1 && len(tags[0]) == 0 { tags = []string{} } - return ZoneTagFilter{zoneTags: tags} + tagsMap := make(map[string]string) + // tags pre-processing, to make sure the pre-processing is not happening at the time of filtering + for _, tag := range tags { + parts := strings.SplitN(tag, "=", 2) + key := strings.TrimSpace(parts[0]) + if key == "" { + continue + } + if len(parts) == 2 { + value := strings.TrimSpace(parts[1]) + tagsMap[key] = value + } else { + tagsMap[key] = "" + } + } + return ZoneTagFilter{tagsMap: tagsMap} } // Match checks whether a zone's set of tags matches the provided tag values func (f ZoneTagFilter) Match(tagsMap map[string]string) bool { - for _, tagFilter := range f.zoneTags { - filterParts := strings.SplitN(tagFilter, "=", 2) - switch len(filterParts) { - case 1: - if _, hasTag := tagsMap[filterParts[0]]; !hasTag { - return false - } - case 2: - if value, hasTag := tagsMap[filterParts[0]]; !hasTag || value != filterParts[1] { - return false - } + for key, v := range f.tagsMap { + if value, hasTag := tagsMap[key]; !hasTag || (v != "" && value != v) { + return false } } return true @@ -53,5 +60,5 @@ func (f ZoneTagFilter) Match(tagsMap map[string]string) bool { // IsEmpty returns true if there are no tags for the filter func (f ZoneTagFilter) IsEmpty() bool { - return len(f.zoneTags) == 0 + return len(f.tagsMap) == 0 } diff --git a/provider/zone_tag_filter_test.go b/provider/zone_tag_filter_test.go index 05d435cea..a2a0b688b 100644 --- a/provider/zone_tag_filter_test.go +++ b/provider/zone_tag_filter_test.go @@ -57,7 +57,7 @@ var basicZoneTags = []struct { "empty tag filter matches all", []string{""}, map[string]string{"tag0": "value0"}, true, }, { - "tag filter without key and equal sign", []string{"tag1=value1", "=haha"}, map[string]string{"tag1": "value1"}, false, + "tag filter without key and equal sign", []string{"tag1=value1", "=haha"}, map[string]string{"tag1": "value1"}, true, }, } @@ -74,16 +74,17 @@ func TestZoneTagFilterNotSupportedFormat(t *testing.T) { tests := []struct { desc string tags []string - want []string + want map[string]string }{ - {desc: "multiple or separate values with commas", tags: []string{"key1=val1,key2=val2"}, want: []string{"key1=val1,key2=val2"}}, - {desc: "exclude tag", tags: []string{"!key1"}, want: []string{"!key1"}}, - {desc: "exclude tags", tags: []string{"!key1=val"}, want: []string{"!key1=val"}}, + {desc: "multiple or separate values with commas", tags: []string{"key1=val1,key2=val2"}, want: map[string]string{"key1": "val1,key2=val2"}}, + {desc: "exclude tag", tags: []string{"!key1"}, want: map[string]string{"!key1": ""}}, + {desc: "exclude tags", tags: []string{"!key1=val"}, want: map[string]string{"!key1": "val"}}, + {desc: "key is empty", tags: []string{"=val"}, want: map[string]string{}}, } for _, tc := range tests { t.Run(fmt.Sprintf("%s", tc.desc), func(t *testing.T) { got := NewZoneTagFilter(tc.tags) - assert.Equal(t, tc.want, got.zoneTags) + assert.Equal(t, tc.want, got.tagsMap) }) } } diff --git a/scripts/helm-tools.sh b/scripts/helm-tools.sh new file mode 100755 index 000000000..f723eb741 --- /dev/null +++ b/scripts/helm-tools.sh @@ -0,0 +1,122 @@ +#!/bin/bash + +set -e + +# JSON Schema https://json-schema.org/ +# JSON Schema spec https://json-schema.org/draft/2020-12/json-schema-validation +# Helm Schema https://helm.sh/docs/topics/charts/#schema-files + +# Execute +# scripts/helm-tools.sh +# scripts/helm-tools.sh -h +# scripts/helm-tools.sh --install +# scripts/helm-tools.sh --diff +# scripts/helm-tools.sh --schema +# scripts/helm-tools.sh --lint +# scripts/helm-tools.sh --docs + +show_help() { +cat << EOF +'external-dns' helm linter helper commands + +Usage: $(basename "$0") + -d, --diff Schema diff validation + --docs Re-generate helm documentation + -h, --help Display help + -i, --install Install required tooling + -l, --lint Lint chart + -s, --schema Generate schema + --show-docs Show available documentation +EOF +} + +install() { + if [[ -x $(which helm) ]]; then + echo "installing https://github.com/losisin/helm-values-schema-json.git plugin" + helm plugin install https://github.com/losisin/helm-values-schema-json.git | true + helm plugin list | grep "schema" + + echo "installing helm-docs" + go install github.com/norwoodj/helm-docs/cmd/helm-docs@latest | true + + if [[ -x $(which brew) ]]; then + echo "installing chart-testing https://github.com/helm/chart-testing" + brew install chart-testing + fi + else + echo "helm is not installed" + echo "install helm https://helm.sh/docs/intro/install/ and try again" + exit 1 + fi +} + +update_schema() { + cd charts/external-dns + # uses .schema.yamle + helm schema +} + +diff_schema() { + cd charts/external-dns + helm schema \ + -output diff-schema.schema.json + trap 'rm -rf -- "diff-schema.schema.json"' EXIT + CURRENT_SCHEMA=$(cat values.schema.json) + GENERATED_SCHEMA=$(cat diff-schema.schema.json) + if [ "$CURRENT_SCHEMA" != "$GENERATED_SCHEMA" ]; then + echo "Schema must be re-generated! Run 'scripts/helm-tools.sh --schema'" 1>&2 + diff -Nau diff-schema.schema.json values.schema.json + exit 1 + fi +} + +lint_chart() { + cd charts/external-dns + helm lint . --debug --strict \ + --values values.yaml \ + --values ci/ci-values.yaml + # lint with chart testing tool + ct lint --target-branch=master --check-version-increment=false +} + +helm_docs() { + cd charts/external-dns + helm-docs +} + +show_docs() { + open "https://github.com/losisin/helm-values-schema-json?tab=readme-ov-file" +} + +function main() { + case $1 in + --show-docs) + show_docs + ;; + -d|--diff) + diff_schema + ;; + --docs) + helm_docs + ;; + -i|--install) + install + ;; + -l|--lint) + lint_chart + ;; + -s|--schema) + update_schema + ;; + -h|--help) + show_help + ;; + *) + echo "unknown sub-command" >&2 + show_help + exit 1 + ;; + esac +} + +main "$@" diff --git a/source/dedupsource.go b/source/dedupsource.go index 758da43cb..3ac90d5db 100644 --- a/source/dedupsource.go +++ b/source/dedupsource.go @@ -18,6 +18,7 @@ package source import ( "context" + "strings" log "github.com/sirupsen/logrus" @@ -45,7 +46,11 @@ func (ms *dedupSource) Endpoints(ctx context.Context) ([]*endpoint.Endpoint, err } for _, ep := range endpoints { - identifier := ep.DNSName + " / " + ep.SetIdentifier + " / " + ep.Targets.String() + if ep == nil { + continue + } + + identifier := strings.Join([]string{ep.RecordType, ep.DNSName, ep.SetIdentifier, ep.Targets.String()}, "/") if _, ok := collected[identifier]; ok { log.Debugf("Removing duplicate endpoint %s", ep) diff --git a/source/dedupsource_test.go b/source/dedupsource_test.go index bbd3a21c7..d387f8819 100644 --- a/source/dedupsource_test.go +++ b/source/dedupsource_test.go @@ -90,6 +90,38 @@ func testDedupEndpoints(t *testing.T) { {DNSName: "foo.example.org", Targets: endpoint.Targets{"1.2.3.4"}}, }, }, + { + "two endpoints with same dnsname, same type, and same target return one endpoint", + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + }, + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + }, + }, + { + "two endpoints with same dnsname, different record type, and same target return two endpoints", + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + {DNSName: "foo.example.org", RecordType: "AAAA", Targets: endpoint.Targets{"1.2.3.4"}}, + }, + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + {DNSName: "foo.example.org", RecordType: "AAAA", Targets: endpoint.Targets{"1.2.3.4"}}, + }, + }, + { + "two endpoints with same dnsname, one with record type, one without, and same target return two endpoints", + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + {DNSName: "foo.example.org", Targets: endpoint.Targets{"1.2.3.4"}}, + }, + []*endpoint.Endpoint{ + {DNSName: "foo.example.org", RecordType: "A", Targets: endpoint.Targets{"1.2.3.4"}}, + {DNSName: "foo.example.org", Targets: endpoint.Targets{"1.2.3.4"}}, + }, + }, } { t.Run(tc.title, func(t *testing.T) { mockSource := new(testutils.MockSource) diff --git a/source/istio_virtualservice.go b/source/istio_virtualservice.go index 992e1ef1d..039aa6f3c 100644 --- a/source/istio_virtualservice.go +++ b/source/istio_virtualservice.go @@ -55,6 +55,7 @@ type virtualServiceSource struct { ignoreHostnameAnnotation bool serviceInformer coreinformers.ServiceInformer virtualserviceInformer networkingv1alpha3informer.VirtualServiceInformer + gatewayInformer networkingv1alpha3informer.GatewayInformer } // NewIstioVirtualServiceSource creates a new virtualServiceSource with the given config. @@ -79,6 +80,7 @@ func NewIstioVirtualServiceSource( serviceInformer := informerFactory.Core().V1().Services() istioInformerFactory := istioinformers.NewSharedInformerFactoryWithOptions(istioClient, 0, istioinformers.WithNamespace(namespace)) virtualServiceInformer := istioInformerFactory.Networking().V1alpha3().VirtualServices() + gatewayInformer := istioInformerFactory.Networking().V1alpha3().Gateways() // Add default resource event handlers to properly initialize informer. serviceInformer.Informer().AddEventHandler( @@ -97,6 +99,14 @@ func NewIstioVirtualServiceSource( }, ) + gatewayInformer.Informer().AddEventHandler( + cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + log.Debug("gateway added") + }, + }, + ) + informerFactory.Start(ctx.Done()) istioInformerFactory.Start(ctx.Done()) @@ -118,6 +128,7 @@ func NewIstioVirtualServiceSource( ignoreHostnameAnnotation: ignoreHostnameAnnotation, serviceInformer: serviceInformer, virtualserviceInformer: virtualServiceInformer, + gatewayInformer: gatewayInformer, }, nil } @@ -186,7 +197,7 @@ func (sc *virtualServiceSource) AddEventHandler(ctx context.Context, handler fun sc.virtualserviceInformer.Informer().AddEventHandler(eventHandlerFunc(handler)) } -func (sc *virtualServiceSource) getGateway(ctx context.Context, gatewayStr string, virtualService *networkingv1alpha3.VirtualService) (*networkingv1alpha3.Gateway, error) { +func (sc *virtualServiceSource) getGateway(_ context.Context, gatewayStr string, virtualService *networkingv1alpha3.VirtualService) (*networkingv1alpha3.Gateway, error) { if gatewayStr == "" || gatewayStr == IstioMeshGateway { // This refers to "all sidecars in the mesh"; ignore. return nil, nil @@ -201,7 +212,7 @@ func (sc *virtualServiceSource) getGateway(ctx context.Context, gatewayStr strin namespace = virtualService.Namespace } - gateway, err := sc.istioClient.NetworkingV1alpha3().Gateways(namespace).Get(ctx, name, metav1.GetOptions{}) + gateway, err := sc.gatewayInformer.Lister().Gateways(namespace).Get(name) if errors.IsNotFound(err) { log.Warnf("VirtualService (%s/%s) references non-existent gateway: %s ", virtualService.Namespace, virtualService.Name, gatewayStr) return nil, nil diff --git a/source/istio_virtualservice_test.go b/source/istio_virtualservice_test.go index b5bfe3c98..c56dce704 100644 --- a/source/istio_virtualservice_test.go +++ b/source/istio_virtualservice_test.go @@ -29,13 +29,10 @@ import ( istionetworking "istio.io/api/networking/v1alpha3" networkingv1alpha3 "istio.io/client-go/pkg/apis/networking/v1alpha3" istiofake "istio.io/client-go/pkg/clientset/versioned/fake" - fakenetworking3 "istio.io/client-go/pkg/clientset/versioned/typed/networking/v1alpha3/fake" v1 "k8s.io/api/core/v1" networkv1 "k8s.io/api/networking/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - "k8s.io/apimachinery/pkg/runtime" "k8s.io/client-go/kubernetes/fake" - k8sclienttesting "k8s.io/client-go/testing" "sigs.k8s.io/external-dns/endpoint" ) @@ -700,6 +697,20 @@ func testEndpointsFromVirtualServiceConfig(t *testing.T) { t.Run(ti.title, func(t *testing.T) { t.Parallel() + for i := range ti.ingresses { + if ti.ingresses[i].namespace == "" { + ti.ingresses[i].namespace = "test" + } + } + + if ti.gwconfig.namespace == "" { + ti.gwconfig.namespace = "test" + } + + if ti.vsconfig.namespace == "" { + ti.vsconfig.namespace = "test" + } + if source, err := newTestVirtualServiceSource(ti.lbServices, ti.ingresses, []fakeGatewayConfig{ti.gwconfig}); err != nil { require.NoError(t, err) } else if endpoints, err := source.endpointsFromVirtualService(context.Background(), ti.vsconfig.Config()); err != nil { @@ -2182,34 +2193,6 @@ func TestVirtualServiceSourceGetGateway(t *testing.T) { Spec: istionetworking.Gateway{}, Status: v1alpha1.IstioStatus{}, }, expectedErrStr: ""}, - {name: "ErrorGettingGateway", fields: fields{ - virtualServiceSource: func() *virtualServiceSource { - istioFake := istiofake.NewSimpleClientset() - istioFake.NetworkingV1alpha3().(*fakenetworking3.FakeNetworkingV1alpha3).PrependReactor("get", "gateways", func(action k8sclienttesting.Action) (handled bool, ret runtime.Object, err error) { - return true, &networkingv1alpha3.Gateway{}, fmt.Errorf("error getting gateway") - }) - vs, _ := NewIstioVirtualServiceSource( - context.TODO(), - fake.NewSimpleClientset(), - istioFake, - "", - "", - "{{.Name}}", - false, - false, - ) - return vs.(*virtualServiceSource) - }(), - }, args: args{ - ctx: context.TODO(), - gatewayStr: "foo/bar", - virtualService: &networkingv1alpha3.VirtualService{ - TypeMeta: metav1.TypeMeta{}, - ObjectMeta: metav1.ObjectMeta{Name: "gateway", Namespace: "error"}, - Spec: istionetworking.VirtualService{}, - Status: v1alpha1.IstioStatus{}, - }, - }, want: nil, expectedErrStr: "error getting gateway"}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) {