Skip to content

Conversation

mrozentsvayg
Copy link
Contributor

@mrozentsvayg mrozentsvayg commented Feb 11, 2025

Description

Associates and manages Cloudflare custom hostnames with external-dns.alpha.kubernetes.io/cloudflare-custom-hostname annotations.

Checklist

  • Unit tests updated
  • End user documentation updated

@k8s-ci-robot k8s-ci-robot added cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Feb 11, 2025
@k8s-ci-robot
Copy link
Contributor

Hi @mrozentsvayg. Thanks for your PR.

I'm waiting for a kubernetes-sigs member to verify that this patch is reasonable to test. If it is, they should reply with /ok-to-test on its own line. Until that is done, I will not automatically test new commits in this PR, but the usual testing commands by org members will still work. Regular contributors should join the org to skip this step.

Once the patch is verified, the new status will be reflected by the ok-to-test label.

I understand the commands that are listed here.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@k8s-ci-robot k8s-ci-robot added the size/L Denotes a PR that changes 100-499 lines, ignoring generated files. label Feb 11, 2025
@mrozentsvayg
Copy link
Contributor Author

mrozentsvayg commented Feb 12, 2025

There are a couple of changes not directly related to the cloudflare custom hostnames support:

  • the regional hostnames cloudflare API currently requires superadmin or admin role; submitChanges() always errors out on any change.Action == cloudFlareUpdate if the api key is more restrictive, even if the regional hostnames are not being used; To address it, proposing to only call updateDataLocalizationRegionalHostnameParams() if regionalHostnameParam.RegionKey is set;
  • the commit e8bda89 is reverted, because UpdateDataLocalizationRegionalHostname doesn't have to be a part of more common TestCloudflareComplexUpdate test;
    the test case is not using RegionalKey for UpdateDataLocalizationRegionalHostname and should not expect a change.

@mloiseleur
Copy link
Collaborator

@AndrewCharlesHay Would you please review this PR ? Wdyt of this approach ?

@mloiseleur
Copy link
Collaborator

/ok-to-test

@k8s-ci-robot k8s-ci-robot added ok-to-test Indicates a non-member PR verified by an org member that is safe to test. and removed needs-ok-to-test Indicates a PR that requires an org member to verify it is safe to test. labels Feb 12, 2025
@AndrewCharlesHay
Copy link
Contributor

LGTM!

}

// customHostnamesWithPagination performs automatic pagination of results on requests to cloudflare.CustomHostnames
func (p *CloudFlareProvider) customHostnamesWithPagination(ctx context.Context, zoneID string) ([]cloudflare.CustomHostname, error) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you rename this to listCustomHostnamesWithAutoPagination to match the naming of listDNSRecordsWithAutoPagination

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AndrewCharlesHay done!

it stemmed from the API / cloudflare-go library method name CustomHostnames (https://github.com/cloudflare/cloudflare-go/blob/v0/custom_hostname.go#L222) and I agree that the internal helper function doesn't have to follow it.
The library naming inconsistency is only v0 specific, newer cloudflare SDK versions drastically addressed it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ohh that makes sense. Thanks for updating it!

_, chAddErr := p.Client.CreateCustomHostname(ctx, zoneID, change.CustomHostname)
if chAddErr != nil {
failedChange = true
log.WithFields(logFields).Errorf("failed to add custom hostname %v: %v", change.CustomHostname.Hostname, chAddErr)
Copy link
Contributor

@AndrewCharlesHay AndrewCharlesHay Feb 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do you want to make the error statement something like Failed to add replacement custom hostname so that it is different and more specific to the error message on line 405

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All possible scenarios:

  • adding record (DNS along with the custom hostname) - "failed to create"
  • deleting record - "failed to delete"
  • updating record:
    • custom hostname didn't not exist before - "failed to add"
    • custom hostname exists and needs to be removed - "failed to remove"
    • custom hostname needs to be changed (cloudflare doesn't allow to rename the existing hostname, recreate only):
      • "failed to remove"
      • "failed to add"

I couldn't come up with a clear message for the last 2, besides "failed to add/remove custom hostname on replace" or "failed to add custom hostname on update".
Do you think it would it be less confusing? I would be happy to rephrase it.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yeah, I think just adding the word replacement would differentiate it from line 405 and let them know that it was in the process of replacing the record and is probably in a bad state now since it deleted the record and couldn't recreate the record.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

updated, hope that helps, thanks!

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good thanks!

## Setting cloudflare-region-key to configure regional services

Using the `external-dns.alpha.kubernetes.io/cloudflare-region-key` annotation on your ingress, you can restrict which data centers can decrypt and serve HTTPS traffic. A list of available options can be seen [here](https://developers.cloudflare.com/data-localization/regional-services/get-started/).
Currently, requires SuperAdmin or Admin role.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Most likely same requirement for Setting cloudflare-custom-hostname, as I was not able to use non Admin role.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's documented in the new Setting cloudflare-custom-hostname section:

Requires Cloudflare for SaaS product and "SSL and Certificates" API permission.

source/source.go Outdated
Comment on lines 200 to 206
v, exists = annotations[CloudflareCustomHostnameKey]
if exists {
providerSpecificAnnotations = append(providerSpecificAnnotations, endpoint.ProviderSpecificProperty{
Name: CloudflareCustomHostnameKey,
Value: v,
})
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
v, exists = annotations[CloudflareCustomHostnameKey]
if exists {
providerSpecificAnnotations = append(providerSpecificAnnotations, endpoint.ProviderSpecificProperty{
Name: CloudflareCustomHostnameKey,
Value: v,
})
}
if v, exists := annotations[CloudflareCustomHostnameKey]; exists {
providerSpecificAnnotations = append(providerSpecificAnnotations, endpoint.ProviderSpecificProperty{
Name: CloudflareCustomHostnameKey,
Value: v,
})
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like unit test is missing as well for this code

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would you please elaborate on that?
All added functionality is based on the single external-dns.alpha.kubernetes.io/cloudflare-custom-hostname annotation, the new test function contains all possible test cases (add, replace, remove) with it:
https://github.com/kubernetes-sigs/external-dns/pull/5087/files#diff-537daf60acab77454c1d11e74a7076d095600e9b67cbf3541782c569aa162dbfR1501

Please let me know if i'm missing something, thanks!

records[0].Type,
endpoint.TTL(records[0].TTL),
targets...)
ep.WithProviderSpecific(source.CloudflareProxiedKey, strconv.FormatBool(*records[0].Proxied))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Need to ensure that records[0].Proxied is not nil before dereferencing it

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could be something like that

proxied := false
if records[0].Proxied != nil {
	proxied = *records[0].Proxied
}
ep.WithProviderSpecific(source.CloudflareProxiedKey, strconv.FormatBool(proxied))

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added
(applicable to the existing code as well)

Comment on lines 720 to 722
if _, ok := customOriginServers[records[0].Name]; ok {
ep.WithProviderSpecific(source.CloudflareCustomHostnameKey, customOriginServers[records[0].Name])
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
if _, ok := customOriginServers[records[0].Name]; ok {
ep.WithProviderSpecific(source.CloudflareCustomHostnameKey, customOriginServers[records[0].Name])
}
if customHostname, ok := customOriginServers[records[0].Name]; ok {
ep.WithProviderSpecific(source.CloudflareCustomHostnameKey, customHostname)
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

my bad, thanks
not even sure why i committed it like that

targets...).
WithProviderSpecific(source.CloudflareProxiedKey, strconv.FormatBool(*records[0].Proxied)),
)
ep := endpoint.NewEndpointWithTTL(
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it is possible for records[0] to cause an out-of-index exception if the records slice is empty.

we most likely do need

if len(records) == 0 {
    return endpoints
}

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added
(applicable to the existing code as well)

ep.WithProviderSpecific(source.CloudflareCustomHostnameKey, customOriginServers[records[0].Name])
}

endpoints = append(endpoints, ep)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ep could be null, we should have something like

if ep == nil {
  continue
}

somewhere

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

added
(applicable to the existing code as well)

return ""
}

func groupByNameAndType(records []cloudflare.DNSRecord) []*endpoint.Endpoint {
Copy link
Contributor

@ivankatliarchuk ivankatliarchuk Feb 18, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is this function only used in tests? If YES, could we move it to cloudflare_test.go?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in this case we just do not need the original version.
renaming groupByNameAndTypeWithCh to groupByNameAndTypeWithCustomHostnames and using it directly from the single cloudflare_test.go ref

Value: v,
})
}
if v, exists := annotations[CloudflareCustomHostnameKey]; exists {
Copy link
Contributor

@ivankatliarchuk ivankatliarchuk Feb 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

#5087 (comment)
This code is not coverade with testing. How I knew it? The source_test.go no changes

Screenshot 2025-02-19 at 00 14 45

And I just did a double check with code coverage. I thinks this is the last thing that needs resolving.

Screenshot 2025-02-19 at 00 13 28

Copy link
Contributor Author

@mrozentsvayg mrozentsvayg Feb 19, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Right.
Currently source_test.go is only covering A, AAAA, CNAME records validator function suitableType() (with the logic if not ipv4 address and not ipv6 address, then it's CNAME) and TTL validator getTTLFromAnnotations() (which makes sense, because the code implements ttl value parser).
Neither existing provider specific annotations (getProviderSpecificAnnotations()), nor anything else implemented in source.go, besides the TTL annotations (including the very hostnameAnnotationKey = "external-dns.alpha.kubernetes.io/hostname" in getHostnamesFromAnnotations()) are having unit tests. I believe with the reasoning that the string values are just being used as it is and there's basically no code to cover with tests.

However I used the occasion to cover with unit tests all the logic implemented in getProviderSpecificAnnotations().
If we need to add more unit tests for more source.go functions, I believe it should not be in this PR scope.

@k8s-ci-robot k8s-ci-robot added size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. and removed size/L Denotes a PR that changes 100-499 lines, ignoring generated files. labels Feb 19, 2025
Copy link
Contributor

@ivankatliarchuk ivankatliarchuk left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm

@k8s-ci-robot k8s-ci-robot added the lgtm "Looks good to me", indicates that a PR is ready to be merged. label Feb 19, 2025
@ivankatliarchuk
Copy link
Contributor

cc @mloiseleur for review

@mloiseleur
Copy link
Collaborator

@AndrewCharlesHay Do you want to do a final review before merge ?

@AndrewCharlesHay
Copy link
Contributor

/lgtm

@k8s-ci-robot
Copy link
Contributor

@AndrewCharlesHay: changing LGTM is restricted to collaborators

In response to this:

/lgtm

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository.

@mloiseleur
Copy link
Collaborator

/approve

@k8s-ci-robot
Copy link
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: ivankatliarchuk, mloiseleur

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@k8s-ci-robot k8s-ci-robot added the approved Indicates a PR has been approved by an approver from all required OWNERS files. label Feb 19, 2025
@mloiseleur
Copy link
Collaborator

mloiseleur commented Feb 19, 2025

Many thanks for this great PR 👍.
@AndrewCharlesHay @mrozentsvayg if you have time to help us on other PRs or issues, you are more than welcome !

@k8s-ci-robot k8s-ci-robot merged commit e665a73 into kubernetes-sigs:master Feb 19, 2025
14 checks passed
JesusMtnez pushed a commit to JesusMtnez/homelab that referenced this pull request May 29, 2025
…o v0.16.1 (#667)

This PR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [registry.k8s.io/external-dns/external-dns](https://github.com/kubernetes-sigs/external-dns) | minor | `v0.15.1` -> `v0.16.1` |

---

### Release Notes

<details>
<summary>kubernetes-sigs/external-dns (registry.k8s.io/external-dns/external-dns)</summary>

### [`v0.16.1`](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.16.1)

[Compare Source](kubernetes-sigs/external-dns@v0.16.0...v0.16.1)

This release fixes the breaking change introduced in v0.16.0 for Cloudflare.

:warning: New features on Cloudflare, custom and regional hostnames have some known issues, see [#&#8203;5175](kubernetes-sigs/external-dns#5175) and [#&#8203;5183](kubernetes-sigs/external-dns#5183)

:warning: OpenStack designate in-tree provider will be removed in the next version. There is now a [webhook provider](https://github.com/inovex/external-dns-openstack-webhook).

:information_source: With v0.16.0, a new option on TXT Registry is available to use only new format ([#&#8203;4946](kubernetes-sigs/external-dns#4946)). Previous format will be removed in the next release ([#&#8203;5172](kubernetes-sigs/external-dns#5172)).

#### 🐛 Bug fixes

-   fix(cloudflare): optional custom hostnames by [@&#8203;mrozentsvayg](https://github.com/mrozentsvayg) in kubernetes-sigs/external-dns#5146
-   fix(source): pass GatewayName to config by [@&#8203;buroa](https://github.com/buroa) in kubernetes-sigs/external-dns#5169
-   fix(cloudflare): infinite loop with more than 50 custom hostnames by [@&#8203;mrozentsvayg](https://github.com/mrozentsvayg) in kubernetes-sigs/external-dns#5181

#### 📦 Others

-   chore: update OWNERS with required config file by [@&#8203;mloiseleur](https://github.com/mloiseleur) in kubernetes-sigs/external-dns#5164

**Full Changelog**: kubernetes-sigs/external-dns@v0.16.0...v0.16.1

### [`v0.16.0`](https://github.com/kubernetes-sigs/external-dns/releases/tag/v0.16.0)

[Compare Source](kubernetes-sigs/external-dns@v0.15.1...v0.16.0)

#### 💥 Breaking Changes

There is a [breaking change on Cloudflare](kubernetes-sigs/external-dns#5166) with this release. It requires Cloudflare for Saas.

#### 🚀 Features

-   feat: add dreamhost webook provider to readme  ([#&#8203;5015](kubernetes-sigs/external-dns#5015)) [@&#8203;asymingt](https://github.com/asymingt)
-   feat: Add F5 TransportServer source  ([#&#8203;4944](kubernetes-sigs/external-dns#4944)) [@&#8203;visokoo](https://github.com/visokoo)
-   feat(chart): allow to run tpl on `ServiceAccount` annotations ([#&#8203;4958](kubernetes-sigs/external-dns#4958)) ([#&#8203;4958](kubernetes-sigs/external-dns#4958)) [@&#8203;fcrespofastly](https://github.com/fcrespofastly)
-   feat(cloudflare): custom hostname and fix apex  ([#&#8203;5087](kubernetes-sigs/external-dns#5087)) [@&#8203;mrozentsvayg](https://github.com/mrozentsvayg)
-   feat(deps): added renovate config for custom regexes  ([#&#8203;4978](kubernetes-sigs/external-dns#4978)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   feat: don't discard klog logs at the highest log levels (debug and trace)  ([#&#8203;4961](kubernetes-sigs/external-dns#4961)) [@&#8203;dmarkhas](https://github.com/dmarkhas)
-   feat(pdns): add validation for MX and SRV records  ([#&#8203;4871](kubernetes-sigs/external-dns#4871)) [@&#8203;julillae](https://github.com/julillae)
-   feat(rfc2136): support multiple hosts  ([#&#8203;4653](kubernetes-sigs/external-dns#4653)) [@&#8203;Jeremy-Boyle](https://github.com/Jeremy-Boyle)
-   feat(service): listen to endpoint changes  ([#&#8203;5085](kubernetes-sigs/external-dns#5085)) [@&#8203;dmarkhas](https://github.com/dmarkhas)
-   feat(source): allow to register all pods and their associated PTR record  ([#&#8203;4782](kubernetes-sigs/external-dns#4782)) [@&#8203;foyerunix](https://github.com/foyerunix)
-   feat(txt-registry): add option to use only new format ([#&#8203;4946](kubernetes-sigs/external-dns#4946)) [@&#8203;malpou](https://github.com/malpou)

#### 🐛 Bug fixes

-   fix(aes-encryption): support plain txt and url safe base64 strings  ([#&#8203;4980](kubernetes-sigs/external-dns#4980)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   fix(aws-provider): ListTagsForResource incorrect zone-id handling  ([#&#8203;5029](kubernetes-sigs/external-dns#5029)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   fix(chart): non-string types on svcaccount annotations ([#&#8203;5067](kubernetes-sigs/external-dns#5067)) [@&#8203;hjoshi123](https://github.com/hjoshi123)
-   fix(chart): regression with affinity.nodeAffinity getting ignored  ([#&#8203;5046](kubernetes-sigs/external-dns#5046)) [@&#8203;mkhpalm](https://github.com/mkhpalm)
-   fix(chart): update rbac for F5 transportserver source ([#&#8203;5066](kubernetes-sigs/external-dns#5066)) ([#&#8203;5066](kubernetes-sigs/external-dns#5066)) [@&#8203;visokoo](https://github.com/visokoo)
-   fix(cloudflare): add more descriptive log message  ([#&#8203;5047](kubernetes-sigs/external-dns#5047)) [@&#8203;AndrewCharlesHay](https://github.com/AndrewCharlesHay)
-   fix(cloudflare): use softerror on internal server error with api  ([#&#8203;4931](kubernetes-sigs/external-dns#4931)) [@&#8203;vishuvenu](https://github.com/vishuvenu)
-   fix(dedup): records with different type are not duplicates  ([#&#8203;4889](kubernetes-sigs/external-dns#4889)) [@&#8203;jtszalay](https://github.com/jtszalay)
-   fix(docs): aws tutorial broken internal markdown links  ([#&#8203;5036](kubernetes-sigs/external-dns#5036)) [@&#8203;strophy](https://github.com/strophy)
-   fix:  do not merge CNAME with multiple targets  ([#&#8203;4856](kubernetes-sigs/external-dns#4856)) [@&#8203;dtuck9](https://github.com/dtuck9)
-   fix(f5-virtualserver): skip endpoint creation when VirtualServer is not ready ([#&#8203;4996](kubernetes-sigs/external-dns#4996)) [@&#8203;mikejoh](https://github.com/mikejoh)
-   fix(godaddy): Handle missing Retry-After header gracefully  ([#&#8203;4866](kubernetes-sigs/external-dns#4866)) [@&#8203;alexstojda](https://github.com/alexstojda)
-   fix(oci): records with multiple IP addresses  ([#&#8203;4993](kubernetes-sigs/external-dns#4993)) [@&#8203;jrosinsk](https://github.com/jrosinsk)
-   fix(ovh): cache refresh and duplicates processing  ([#&#8203;4932](kubernetes-sigs/external-dns#4932)) [@&#8203;nmaupu](https://github.com/nmaupu)
-   fix(registry): handle empty targets in TXT records logging an error  ([#&#8203;5149](kubernetes-sigs/external-dns#5149)) [@&#8203;saikatharryc](https://github.com/saikatharryc)
-   fix(source): allow ipv4-mapped ipv6 addresses  ([#&#8203;4943](kubernetes-sigs/external-dns#4943)) [@&#8203;buroa](https://github.com/buroa)
-   fix(source): debug log on gateway target detection  ([#&#8203;5096](kubernetes-sigs/external-dns#5096)) [@&#8203;drcapulet](https://github.com/drcapulet)
-   Fix spelling in webhook OpenAPI spec  ([#&#8203;5038](kubernetes-sigs/external-dns#5038)) [@&#8203;claycooper](https://github.com/claycooper)
-   fix: use informer for istio gateways  ([#&#8203;4522](kubernetes-sigs/external-dns#4522)) [@&#8203;woehrl01](https://github.com/woehrl01)

#### 📝 Documentation

-   docs: add deprecation policy ([#&#8203;5053](kubernetes-sigs/external-dns#5053)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   docs: add staging images to release process ([#&#8203;5050](kubernetes-sigs/external-dns#5050)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   docs: fix typo on aws tutorial  ([#&#8203;5070](kubernetes-sigs/external-dns#5070)) [@&#8203;Ileriayo](https://github.com/Ileriayo)
-   docs: fix typos in tutorials  ([#&#8203;4969](kubernetes-sigs/external-dns#4969)) [@&#8203;mloiseleur](https://github.com/mloiseleur)
-   docs(Microsoft DNS): improve instructions  ([#&#8203;4893](kubernetes-sigs/external-dns#4893)) [@&#8203;TomyLobo](https://github.com/TomyLobo)
-   docs(proposal): standartise date format  ([#&#8203;5128](kubernetes-sigs/external-dns#5128)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   docs(proposal): update template with statuses  ([#&#8203;5098](kubernetes-sigs/external-dns#5098)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   docs(provider): add ClouDNS to README  ([#&#8203;5065](kubernetes-sigs/external-dns#5065)) [@&#8203;rwunderer](https://github.com/rwunderer)
-   docs(README): fix link to dev guide  ([#&#8203;5116](kubernetes-sigs/external-dns#5116)) [@&#8203;masterkain](https://github.com/masterkain)
-   docs(registry): fix managed-record-type argument  ([#&#8203;5102](kubernetes-sigs/external-dns#5102)) [@&#8203;splitice](https://github.com/splitice)
-   docs: update and refactor contribution part ([#&#8203;5073](kubernetes-sigs/external-dns#5073)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   ci(docs): add markdown linters and editorconfig ([#&#8203;5055](kubernetes-sigs/external-dns#5055)) [@&#8203;mloiseleur](https://github.com/mloiseleur)
-   Improve sources' docs to mention '--managed-record-types'  ([#&#8203;4882](kubernetes-sigs/external-dns#4882)) [@&#8203;juan-vg](https://github.com/juan-vg)

#### 📦 Others

-   add: auto label source and providers  ([#&#8203;5158](kubernetes-sigs/external-dns#5158)) [@&#8203;szuecs](https://github.com/szuecs)
-   Add OpenStack Designate webook provider to readme  ([#&#8203;5115](kubernetes-sigs/external-dns#5115)) [@&#8203;frittentheke](https://github.com/frittentheke)
-   chore(ci): fix and sort changelog  ([#&#8203;4979](kubernetes-sigs/external-dns#4979)) [@&#8203;mloiseleur](https://github.com/mloiseleur) dependabot
-   chore(ci): fix failing test, upgrade to go 1.23.5 and linter to v1.63  ([#&#8203;5013](kubernetes-sigs/external-dns#5013)) [@&#8203;mloiseleur](https://github.com/mloiseleur)
-   chore(ci): remove too slow test  ([#&#8203;5014](kubernetes-sigs/external-dns#5014)) [@&#8203;mloiseleur](https://github.com/mloiseleur)
-   chore(deps): bump actions/setup-python from 5.3.0 to 5.4.0 in the dev-dependencies group  ([#&#8203;5041](kubernetes-sigs/external-dns#5041)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump azure/setup-helm from 4.2.0 to 4.3.0 in the dev-dependencies group  ([#&#8203;5108](kubernetes-sigs/external-dns#5108)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump helm/kind-action from 1.10.0 to 1.11.0 in the dev-dependencies group  ([#&#8203;4956](kubernetes-sigs/external-dns#4956)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump helm/kind-action from 1.11.0 to 1.12.0 in the dev-dependencies group  ([#&#8203;4972](kubernetes-sigs/external-dns#4972)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump nosborn/github-action-markdown-cli from 3.3.0 to 3.4.0 in the dev-dependencies group  ([#&#8203;5083](kubernetes-sigs/external-dns#5083)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 14 updates  ([#&#8203;4976](kubernetes-sigs/external-dns#4976)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 18 updates  ([#&#8203;5040](kubernetes-sigs/external-dns#5040)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 20 updates  ([#&#8203;4999](kubernetes-sigs/external-dns#4999)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 21 updates  ([#&#8203;5089](kubernetes-sigs/external-dns#5089)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 22 updates  ([#&#8203;5062](kubernetes-sigs/external-dns#5062)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 23 updates  ([#&#8203;5145](kubernetes-sigs/external-dns#5145)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 25 updates  ([#&#8203;5023](kubernetes-sigs/external-dns#5023)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 5 updates  ([#&#8203;4987](kubernetes-sigs/external-dns#4987)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group across 1 directory with 7 updates  ([#&#8203;5125](kubernetes-sigs/external-dns#5125)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group with 20 updates  ([#&#8203;5109](kubernetes-sigs/external-dns#5109)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group with 2 updates  ([#&#8203;5022](kubernetes-sigs/external-dns#5022)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group with 3 updates  ([#&#8203;5112](kubernetes-sigs/external-dns#5112)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(deps): bump the dev-dependencies group with 4 updates  ([#&#8203;4988](kubernetes-sigs/external-dns#4988)) [@&#8203;dependabot](https://github.com/dependabot)
-   chore(docs): docs/flags.md generation  ([#&#8203;4983](kubernetes-sigs/external-dns#4983)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   chore(filter-tags): pre-process filter tags  ([#&#8203;5063](kubernetes-sigs/external-dns#5063)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   chore(makefile): add helper and document targets  ([#&#8203;5093](kubernetes-sigs/external-dns#5093)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   chore(makefile): simplify coverage script  ([#&#8203;5105](kubernetes-sigs/external-dns#5105)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   chore(provider-aws): improve canonicalHostedZone handling  ([#&#8203;5031](kubernetes-sigs/external-dns#5031)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   chore(release): publish chart v1.15.2  ([#&#8203;5094](kubernetes-sigs/external-dns#5094)) [@&#8203;stevehipwell](https://github.com/stevehipwell)
-   chore: update maintainers/reviewers  ([#&#8203;5020](kubernetes-sigs/external-dns#5020)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   chore: upgrade ExternalDNS to go 1.24  ([#&#8203;5106](kubernetes-sigs/external-dns#5106)) [@&#8203;mloiseleur](https://github.com/mloiseleur)
-   kustomize-v0.15.1  ([#&#8203;4966](kubernetes-sigs/external-dns#4966)) [@&#8203;Raffo](https://github.com/Raffo)
-   Release Helm chart for `v0.15.1`  ([#&#8203;5028](kubernetes-sigs/external-dns#5028)) [@&#8203;stevehipwell](https://github.com/stevehipwell)
-   replace all versions to v0.15.1  ([#&#8203;4973](kubernetes-sigs/external-dns#4973)) [@&#8203;Raffo](https://github.com/Raffo)
-   test(cloudflare): add scenarios on submitChanges  ([#&#8203;5054](kubernetes-sigs/external-dns#5054)) [@&#8203;AndrewCharlesHay](https://github.com/AndrewCharlesHay)
-   test(domain-filter): simple filters on domain exclusion ([#&#8203;5064](kubernetes-sigs/external-dns#5064)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)
-   test(provider): tags filter coverage and benchmark  ([#&#8203;5060](kubernetes-sigs/external-dns#5060)) [@&#8203;ivankatliarchuk](https://github.com/ivankatliarchuk)

#### New Contributors

-   [@&#8203;juan-vg](https://github.com/juan-vg) made their first contribution in kubernetes-sigs/external-dns#4882
-   [@&#8203;dmarkhas](https://github.com/dmarkhas) made their first contribution in kubernetes-sigs/external-dns#4961
-   [@&#8203;buroa](https://github.com/buroa) made their first contribution in kubernetes-sigs/external-dns#4943
-   [@&#8203;fcrespofastly](https://github.com/fcrespofastly) made their first contribution in kubernetes-sigs/external-dns#4958
-   [@&#8203;nmaupu](https://github.com/nmaupu) made their first contribution in kubernetes-sigs/external-dns#4932
-   [@&#8203;dtuck9](https://github.com/dtuck9) made their first contribution in kubernetes-sigs/external-dns#4856
-   [@&#8203;asymingt](https://github.com/asymingt) made their first contribution in kubernetes-sigs/external-dns#5015
-   [@&#8203;alexstojda](https://github.com/alexstojda) made their first contribution in kubernetes-sigs/external-dns#4866
-   [@&#8203;visokoo](https://github.com/visokoo) made their first contribution in kubernetes-sigs/external-dns#4944
-   [@&#8203;vishuvenu](https://github.com/vishuvenu) made their first contribution in kubernetes-sigs/external-dns#4931
-   [@&#8203;TomyLobo](https://github.com/TomyLobo) made their first contribution in kubernetes-sigs/external-dns#4893
-   [@&#8203;strophy](https://github.com/strophy) made their first contribution in kubernetes-sigs/external-dns#5036
-   [@&#8203;malpou](https://github.com/malpou) made their first contribution in kubernetes-sigs/external-dns#4946
-   [@&#8203;foyerunix](https://github.com/foyerunix) made their first contribution in kubernetes-sigs/external-dns#4782
-   [@&#8203;rwunderer](https://github.com/rwunderer) made their first contribution in kubernetes-sigs/external-dns#5065
-   [@&#8203;Ileriayo](https://github.com/Ileriayo) made their first contribution in kubernetes-sigs/external-dns#5070
-   [@&#8203;hjoshi123](https://github.com/hjoshi123) made their first contribution in kubernetes-sigs/external-dns#5067
-   [@&#8203;mkhpalm](https://github.com/mkhpalm) made their first contribution in kubernetes-sigs/external-dns#5046
-   [@&#8203;woehrl01](https://github.com/woehrl01) made their first contribution in kubernetes-sigs/external-dns#4522
-   [@&#8203;jtszalay](https://github.com/jtszalay) made their first contribution in kubernetes-sigs/external-dns#4889
-   [@&#8203;splitice](https://github.com/splitice) made their first contribution in kubernetes-sigs/external-dns#5102
-   [@&#8203;drcapulet](https://github.com/drcapulet) made their first contribution in kubernetes-sigs/external-dns#5096
-   [@&#8203;mrozentsvayg](https://github.com/mrozentsvayg) made their first contribution in kubernetes-sigs/external-dns#5087
-   [@&#8203;frittentheke](https://github.com/frittentheke) made their first contribution in kubernetes-sigs/external-dns#5115
-   [@&#8203;masterkain](https://github.com/masterkain) made their first contribution in kubernetes-sigs/external-dns#5116
-   [@&#8203;renanqts](https://github.com/renanqts) made their first contribution in kubernetes-sigs/external-dns#5132
-   [@&#8203;rlees85](https://github.com/rlees85) made their first contribution in kubernetes-sigs/external-dns#5111
-   [@&#8203;stefaneg](https://github.com/stefaneg) made their first contribution in kubernetes-sigs/external-dns#5135
-   [@&#8203;saikatharryc](https://github.com/saikatharryc) made their first contribution in kubernetes-sigs/external-dns#5149

**Full Changelog**: kubernetes-sigs/external-dns@v0.15.1...v0.16.0

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this PR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, check this box

---

This PR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC4wLjAtbmV4dC4xIiwidXBkYXRlZEluVmVyIjoiNDAuMC4wLW5leHQuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiZGVwL21pbm9yIl19-->

Reviewed-on: https://codeberg.org/JesusMtnez/homelab/pulls/667
Co-authored-by: JesusMtnez-bot <[email protected]>
Co-committed-by: JesusMtnez-bot <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
approved Indicates a PR has been approved by an approver from all required OWNERS files. cncf-cla: yes Indicates the PR's author has signed the CNCF CLA. lgtm "Looks good to me", indicates that a PR is ready to be merged. ok-to-test Indicates a non-member PR verified by an org member that is safe to test. size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants