550 Commits

Author SHA1 Message Date
Ivan Ka
8533f19606
docs(metrics): add Labels column to metrics documentation table (#6306)
* docs(metrics): add Labels column to metrics documentation table

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* docs(metrics): add Labels column to metrics documentation table

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* docs(metrics): add Labels column to metrics documentation table

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-03-24 05:04:17 +05:30
Ivan Ka
19263ee9f0
fix(webhook): connection pool leaks, stuck goroutines on server hang, and retry correctness (#6279)
* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(webhook): connection leaks, goroutine leaks, and retry correctness

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-03-20 16:04:14 +05:30
Ivan Ka
eeb72d62e5
refactor(docs): documentation generators (#6221)
* refactore(gen): shared functions

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(gen): shared functions. simplify metrics

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(gen): shared functions. comments

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(gen): shared functions. comments

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(gen): shared functions. file writes

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(gen): shared functions. file writes

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(docs): documentation generators

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(docs): documentation generators

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(docs): documentation generators

* refactor(docs): documentation generators

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(docs): documentation generators

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(docs): documentation generators

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(docs): documentation generators

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-03-20 14:26:13 +05:30
Aleksei Sviridkin
a38a78cdc6
fix(events): re-enqueue failed events in controller work queue (#6285)
Without AddRateLimited the failed item was marked Done but never
put back into the queue, so transient API errors silently dropped
the event instead of retrying up to maxTriesPerEvent.

Assisted-By: Claude <noreply@anthropic.com>

Signed-off-by: Aleksei Sviridkin <f@lex.la>
2026-03-17 14:25:37 +05:30
Oleksandr Simonov
18c451cf87
chore(digitalocean)!: remove in-tree provider (#6283) 2026-03-17 14:11:39 +05:30
Ivan Ka
8906c3b9a3
refactor(registry): introduce factory with uniform New constructors (#6277)
* refactor(registry): introduce factory with uniform New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(registry): introduce factory with uniform New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(registry): introduce factory with uniform New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(registry): introduce factory with uniform New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(registry): introduce factory with uniform New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-03-17 02:25:38 +05:30
Ivan Ka
564d5353b8
refactor(provider): introduce factory with uniform New consturctor (#6276)
* refactor(controller): move provider construction to provider/factory package

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(controller): move provider construction to provider/factory package

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(provider): introduce factory package with per-provider New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(provider): introduce factory package with per-provider New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(provider): introduce factory package with per-provider New constructors

* refactor(provider): introduce factory package with per-provider New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(provider): introduce factory package with per-provider New constructors

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-03-16 13:29:37 +05:30
Ivan Ka
e1f848446d
feat(event): emit events for ingress,svc,pod,node,crd (#6099)
* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(source): move SuitableType to endpiont package

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): add support for svc,ingress,pod,node,crd

Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>

* feat(event): add support for svc,ingress,pod,node,crd

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>
2026-03-16 04:03:36 +05:30
Ivan Ka
4aa6419fd0
linter(goimports): Mixed import groups (internal before external) (#6238)
* linter(goimports): Mixed import groups (internal before external)

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* inter(goimports): Mixed import groups (internal before external)

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-03-15 04:25:35 +05:30
Charles Anderson
ca58d993af
feat(cloudflare): support batch API for DNS record changes (#6208)
* feat(cloudflare): add --batch-change-size and --batch-change-interval flags

Adds two new global CLI flags for controlling batch DNS change behaviour:
- --batch-change-size (default 200): maximum number of DNS operations per batch
- --batch-change-interval (default 1s): pause between consecutive batch chunks

Wires the flags through Config into the Cloudflare provider's DNSRecordsConfig.

* feat(cloudflare): implement batch DNS records API with automatic fallback

Uses Cloudflare's Batch DNS Records API to submit all creates, updates, and
deletes for a zone in a single transactional API call per chunk, significantly
reducing the total number of requests made against the Cloudflare API.

- Batch size and interval are controlled via --batch-change-size / --batch-change-interval
- Record types unsupported by the batch PUT endpoint (e.g. SRV, CAA) are
  submitted individually via the standard API
- If a batch chunk is rejected by Cloudflare, ExternalDNS automatically retries
  each record change in that chunk individually so no changes are silently lost
- Adds cloudflare_batch.go with the core batching logic and full test coverage

* feat(cloudflare): soft retry for 'unexpected EOF' (issue 3798)

* feat(cloudflare): soft retry for 'unexpected EOF' (issue 3798)

* feat(cloudflare): debug logs for intentional invididual-updates

* feat(cloudflare): improved code coverage

* feat(cloudflare): handle json.Encoder error in test helper
2026-03-12 22:21:36 +05:30
Ivan Ka
c35ed0b82a
feat(source): add unstructured source (#6172)
* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>

* feat(source): add unstructured source

Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* Update docs/sources/unstructured.md

Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add unstructured source

* feat(source): add unstructured source

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>
2026-03-12 05:23:33 +05:30
Kai Udo
9c91c6ff71
refactor(testutils): extract log test helpers into subpackage to fix (#6236)
circular import

Signed-off-by: u-kai <76635578+u-kai@users.noreply.github.com>
2026-03-01 14:56:11 +05:30
Vyacheslav Klimov
f4c758665b
feat(pdns): add --[no-]prefer-alias flag and alias annotation support (#6129)
* feat: add support for expand alias in pdns provider

* feat: codereview

* feat: rewrite docs

* feat: gofmt

* feat: rewrite using postprocessor

* feat: gofmt

* feat: update docs

* fix: prefer-alias respects existing annotations

* feat: update formatting verbs

* fix: fix return values and call sites after convertRRSetToEndpoints signature change

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

* fix: remove unused error return from convertRRSetToEndpoints

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-26 17:38:27 +05:30
Ivan Ka
d5b942d24e
fix(tlsutils): fix nil error wrapping and wrong env var in TLS config (#6198)
Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-02-20 13:31:46 +05:30
Ivan Ka
b304dfe37d
chore(linter): unused params and functions linter (#6142)
* chore(linter): enable unused

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(linter): enable unusedparam

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>
2026-01-31 23:20:24 +05:30
Ivan Ka
8e89808f2c
refactor(kubeclient): consolidate duplicate code (#6076)
* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(kubeclient): consolidate duplicate code to ensure consistent client creation

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: vflaux <38909103+vflaux@users.noreply.github.com>
2026-01-29 02:15:48 +05:30
Ivan Ka
5799aefc73
perf(controller): optimize metrics counting (#6124)
* perf(controller): optimize metrics counting

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* perf(controller): optimize metrics counting

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* perf(controller): optimize metrics counting

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* perf(controller): optimize metrics counting

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-01-20 22:51:25 +05:30
Ivan Ka
12ad9f94d8
feat(event): standardize event messages and add resource kind lookup for events (#6101)
* feat(event): standardize event messages and add Kind lookup

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): standardize event messages and add Kind lookup

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): standardize event messages and add Kind lookup

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): standardize event messages and add Kind lookup

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(event): standardize event messages and add Kind lookup

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-01-16 05:11:11 +05:30
Ritik shukla
bb67452f38
test: cover pkg/events/fake package (#6096)
* test: add tests for pkg/events/fake package

Add comprehensive test coverage for the fake EventEmitter implementation.
Tests cover:
- NewFakeEventEmitter() initialization
- Add() method with single and multiple events
- Different event types (Create, Update, Delete, Failed)
- Mock verification with specific events and any event type
- Edge case: empty events (panics as documented)

Improves code coverage from 0% to 100% for pkg/events/fake package.

Related to issue #5150

* fix: update copyright year to 2026
2026-01-11 14:35:56 +05:30
Ivan Ka
d2fb11a3fc
chore(source)!: remove cloudfoundry support (#6074)
* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(source): remove cloudfoundry support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2026-01-07 13:19:41 +05:30
Ivan Ka
3dd5dd6882
refactor(domainfilter): introduce functional options pattern (#6055)
* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(domainfilter): introduce functional options pattern

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactore(domainfilter): introduce functional options pattern

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-12-30 19:12:35 +05:30
Ivan Ka
72425c85cc
fix(domain-exclusion): domain exclusion filter fix (#6050)
* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(domain-exclusion): domain exclusion filter fix

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-12-27 22:18:39 +05:30
Ivan Ka
a23f2d5a9a
chore(lint): configure modernize linter (#6035)
* chore(lint): configure modernize linter

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(lint): configure modernize linter

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(lint): modernize linter

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(lint): configure modernize linter

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-12-27 22:04:33 +05:30
Ivan Ka
1ed1b22916
feat(cli): remove cobra cli support (#6034)
* feat(cli): rollbak to kingpin

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(cli): rollbak to kingpin

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(cli): rollbak to kingpin

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(lint): configure modernize linter

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(cli): rollbak to kingpin

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-12-26 17:50:33 +05:30
vflaux
2e65603f6a
fix(flags): restore min-ttl flag (#6014) 2025-12-12 02:12:11 -08:00
dongjiang
fa1de21122
fix typo (#6011)
Signed-off-by: jiangdong <jiangdong@iflytek.com>
2025-12-10 09:03:34 -08:00
Jan Jansen
8085ce246d
feat(coredns): use txt-owner-id to strictly separated external-dns instances (#5921)
* feat(coredns): use managed-by to separate records

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>

* feat(coredns): use txt-owner-id to strictly separated external-dns instances

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>

* fix tests

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>

* fix reviewer comments

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>

* answer review comments

* fix deletion behavior and remove extra function

* fix markdown

* fix tests again

---------

Signed-off-by: Jan Jansen <jan.jansen@gdata.de>
2025-12-02 00:48:25 -08:00
Aleksei Sviridkin
5a55b09f48
feat(annotations): add custom annotation prefix support for split horizon DNS (#5889)
* feat(annotations): add custom annotation prefix support for split horizon DNS

Add --annotation-prefix flag to allow customizing the annotation prefix
used by external-dns. This enables split horizon DNS scenarios where
multiple instances process different sets of annotations from the same
Kubernetes resources.

Changes:
- Add AnnotationPrefix field to Config with validation
- Convert annotation constants to variables that can be reconfigured
- Add SetAnnotationPrefix() function to rebuild annotation keys
- Integrate annotation prefix setting in controller startup
- Update Helm chart with annotationPrefix value
- Add comprehensive split horizon DNS documentation
- Update FAQ with annotation prefix examples

This maintains full backward compatibility - the default prefix remains
"external-dns.alpha.kubernetes.io/".

Co-Authored-By: Claude <noreply@anthropic.com>

* docs(advanced): fix markdown formatting in split-horizon guide

Add blank lines before code blocks to improve markdown rendering
and comply with markdownlint rules.

Co-Authored-By: Claude <noreply@anthropic.com>

* docs(advanced): fix markdown formatting in split-horizon guide

Co-Authored-By: Claude <noreply@anthropic.com>

* docs(charts): regenerate Helm chart documentation

Co-Authored-By: Claude <noreply@anthropic.com>

* test: add AnnotationPrefix field to test configs

Add missing AnnotationPrefix field to minimalConfig and overriddenConfig
test configurations to match the new default value set in NewConfig().

Co-Authored-By: Claude <noreply@anthropic.com>

* test(charts): update error pattern in json-schema test

Update expected error message pattern to match current Helm validation
output format.

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(annotations): remove init() for explicit initialization

- Remove init() function from annotations package
- Add explicit SetAnnotationPrefix() call in controller/execute.go
- Remove annotation key aliases from source/source.go
- Replace all alias usages with annotations.* references (348 changes in 28 files)
- Add TestMain to existing test files (service_test.go, cloudflare_test.go)

This change makes annotation initialization explicit and predictable,
avoiding hidden global state initialization at import time.

Co-Authored-By: Claude <noreply@anthropic.com>

* docs: update changelog and mkdocs to include annotationPrefix and split horizon DNS

Signed-off-by: Aleksei Sviridkin <f@lex.la>

* docs(split-horizon): fix linting

Signed-off-by: Aleksei Sviridkin <f@lex.la>

* refactor(annotations): replace hardcoded annotation prefix with constant

Replace all hardcoded "external-dns.alpha.kubernetes.io/" strings
with annotations.DefaultAnnotationPrefix constant to establish
a single source of truth.

Changes:
- Add DefaultAnnotationPrefix constant in source/annotations/annotations.go
- Replace hardcoded string in controller/execute.go with constant reference
- Replace hardcoded strings in pkg/apis/externaldns/types.go (2 occurrences)
- Add helm unit tests for annotationPrefix value

This eliminates string duplication and makes future changes easier.

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Signed-off-by: Aleksei Sviridkin <f@lex.la>
Co-authored-by: Claude <noreply@anthropic.com>
2025-11-08 03:56:52 -08:00
Ivan Ka
64c58aca56
refactor(source/wrappers): move wrappers logic away from execute file (#5888)
* refactor(source/wrappers): move wrappers away from

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(source/wrappers): move wrappers away from

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(source/wrappers): move wrappers away from

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* refactor(source/wrappers): move wrappers away from

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-10-08 23:47:02 -07:00
Andrew Hay
caa4fc75a3
test: update goversion label to 1.25 in metrics test (#5886)
* test(metrics): update goversion label to 1.25 for Go 1.25 upgrade compatibility

* feat(models_test): use runtime.version
2025-10-03 08:44:59 -07:00
Pascal Bourdier
699e994a9c
ci(linter): add go-critic (#5875)
* ci: add go-critic linter

follow go-critic advices when possible

* docs: add a short description about go-critic
2025-10-01 09:06:19 -07:00
troll-os
41b1154cdd
feat: add new flags to allow migration of OwnerID (#4823)
* Reintroduce base config for txt owner migration

# Conflicts:
#	controller/execute.go
#	registry/txt.go

# Conflicts:
#	pkg/apis/externaldns/types.go

* Added label update logic and fixed existing tests

* Fixed existing declaration in tests, re introduced tests for new flag, regened flags.md from make

* Fixed tests logic and target expression evaluation, fixed update of label in the TXT registry process

* Set Old owner id var down the plan to calculate changes correctly

* Lint fixes

* (wip) Code cleaning and test coverage

* Simplified label overwriting on migration and implem tests for coverage

* Fix tests

* Update txt registry doc

* Fix rebase issues in txt test

* Update docs/registry/txt.md

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* Update docs/registry/txt.md

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* Update docs/registry/txt.md

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* Fix label overriding in TXT record generation when migration is enabled

* Make linter happy

* Regen flags, fix types tests after types updates

* Removed boolean flag that enabled migration, evaluate only against old owner flag instead

---------

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>
2025-09-29 01:20:19 -07:00
Tobias Harnickell
c2276d8b84
feat(cli): migrate kingpin to cobra - dual parity (#5836)
* feat(cli): add Cobra binder and backend switch

* add FlagBinder with Kingpin and Cobra implementations
* support --cli-backend and EXTERNAL_DNS_CLI (default: kingpin)
* add tests for binders and CLI switch

Refs: #5379

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>

* feat(cli): centralize flag registration and add Cobra parity

Started moving CLI flag registration into a common binder function,
avoiding duplication between Kingpin and Cobra.

Refs: #5820

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>

* feat(cli): enforce Cobra parity with Kingpin

* Add `regexpValue` and `RegexpVar` to Cobra binder with
  `setRegexpDefault`
* Enforce `--provider` presence and validate against `providerNames
* require at least one `--source` and validate against new
  `allowedSources`
* Expand tests for Kingpin and Cobra

Refs: #5379

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>

* feat(cli): Commit go-lint edits

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>

* feat(cli): add kingpin vs cobra binder parity

* Test parity assertion across binders
* Test Cobra-specific incapabilities (`--no-<flag>` and env vars)
* Deduplicate regexp flag handling

Refs: #5379

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>

* feat(cli): Rebuild flags documentation

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>

---------

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>
2025-09-17 03:22:14 -07:00
Ivan Ka
7792e78eba
feat(source): add min-ttl support (#5641)
* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* feat(source): add min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source): add min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(source/min-ttl): added min-ttl support

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* feat(source): add min-ttl support

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>
2025-09-10 02:28:00 -07:00
Tobias Harnickell
f80f7e0666
feat(cli): add Cobra binder and backend switch (#5820)
* add FlagBinder with Kingpin and Cobra implementations
* support --cli-backend and EXTERNAL_DNS_CLI (default: kingpin)
* add tests for binders and CLI switch

Refs: #5379

Signed-off-by: Tobias Harnickell <tobias.harnickell@bedag.ch>
2025-09-09 02:57:39 -07:00
Ivan Ka
ccebff99e8
fix(http): concurrent map read/write (#5753)
* fix(http): concurrent map read/write

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(http): concurrent map read/write

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(http): concurrent map read/write

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(http): concurrent map read/write

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* fix(http): concurrent map read/write

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-08-21 04:53:06 -07:00
Ivan Ka
e9983a5726
feat(events): raise k8s events with fake provider (#5659)
* feat(events): publish k8s events

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): publish k8s events

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): publish k8s events

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): publish k8s events

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): publish k8s events

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provider

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provide

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(events): raise k8s events with fake provider

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>
2025-08-20 00:37:07 -07:00
Ivan Ka
b31afb430d
fix(source/wrappers/events): events not triggered (#5687)
Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-08-16 02:49:07 -07:00
Matt Mix
8ef5580733
fix(metrics): Make prometheus metrics labels more type safe. (#5717) 2025-08-06 01:07:26 -07:00
Matt Mix
9fc01b272b
test: improve coverage on http and metrics (#5712)
* chore(tests): Adding in missing tests for CustomRoundTrip struct.

* chore(tests): Adding in missing unit test.

* chore(tests): Refactored and addressed missing coverage in models.go
2025-08-05 05:09:38 -07:00
Matt Mix
0e7c3af221
chore(metrics): Updating so that request duration uses the common metrics registry. (#5677) 2025-08-03 00:21:38 -07:00
Ivan Ka
d8f31eb27e
fix(provider/aws-sd): fix namespace type filtering (#5682)
Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-07-25 03:18:28 -07:00
Ivan Ka
48760e653b
fix(instrumented_http): migrate to own http instrumenter (#5650)
Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-07-18 10:16:25 -07:00
Ivan Ka
b93d1e9abb
feat(metrics): publish build_info metric (#5643)
* feat(metrics): publish build_info metric

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(metrics): publish build_info metric

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* feat(metrics): publish build_info metric

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* feat(metrics): publish build_info metric

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>
2025-07-14 12:42:27 -07:00
tom
3e7c5cd2c1
fix(cloudflare): set comments properly (#5582)
* fix(cloudflare): Set comments properly

* Use cloudflare.StringPtr to enable comment removal
2025-07-14 02:48:24 -07:00
Michel Loiseleur
8cc73bd1e4
feat(traefik)!: disable legacy listeners on traefik.containo.us API Group (#5565)
* feat(traefik)!: disable legacy listeners on traefik.containo.us API Group

* update docs accordingly

* update test accordingly

* type argument is infered

* fix rebase
2025-07-03 09:15:27 -07:00
Michel Loiseleur
fc4a2cb6ac
chore(ci): update labels automation (#5580) 2025-07-03 08:45:26 -07:00
Ivan Ka
6e2fc4aa31
chore(codebase): enable linter nonamedreturns (#5594)
* chore(codebase): enable linter nonamedreturns

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* chore(codebase): enable linter nonamedreturns

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
2025-07-01 22:13:25 -07:00
Michel Loiseleur
2d898cd88d
feat(nodes)!: expose external ipv6 by default (#5575)
* feat(nodes)!: expose external ipv6 by default

* update proposal
2025-06-27 03:44:28 -07:00
Ivan Ka
5a321b6fb6
docs(traefik): public and private routing (#5559)
* docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

docs: added treafik public and private routing

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

docs(traefik): public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* docs(traefik): public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* docs(traefik): public and private routing

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

* docs(traefik): public and private routing

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>

* docs(traefik): public and private routing

Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>

---------

Signed-off-by: ivan katliarchuk <ivan.katliarchuk@gmail.com>
Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com>
2025-06-25 00:40:29 -07:00