Skip to content

fix(interface): match labels against FQDN in LLDP validation#396

Open
nikatza wants to merge 1 commit into
mainfrom
fix-lldp-hostname
Open

fix(interface): match labels against FQDN in LLDP validation#396
nikatza wants to merge 1 commit into
mainfrom
fix-lldp-hostname

Conversation

@nikatza
Copy link
Copy Markdown
Contributor

@nikatza nikatza commented Jun 4, 2026

In this commit we change the validation of the label against the
information received via LLDP. If DNS is configured on the remote device
via a DNS Kubernetes resource, the interface controller fetches that
resource and uses the domain field together with the device hostname
to build an FQDN that is then compared to the LLDP systemName. This
change now captures devices that export the FQDN in LLDP.

Add DNS watch to interface controller for LLDP neighbor re-validation.
When a DNS resource is created, deleted, or has its domain changed,
interfaces with neighbor labels pointing to that device's interfaces are
re-enqueued so LLDP adjacency validation re-evaluates the expected FQDN.
Also fix SetLLDPNeighbor test helper to set ChassisIDType/PortIDType so
LLDP adjacencies are no longer silently skipped in integration tests.

Replace conditions-length heuristic in interfaceUpdatePredicate with
explicit finalizer and deletion-timestamp checks. Adding a finalizer is
a metadata-only change that no standard predicate (Generation, Label,
Annotation) catches, so it falls to interfaceUpdatePredicate. The old
len(conditions) < 4 guard happened to let these through because
conditions are empty during bootstrap, but expressed the wrong
invariant. The new checks explicitly pass the lifecycle transitions that
the controller's multi-step bootstrap (finalizer → init conditions →
reconcile) depends on.

@nikatza nikatza force-pushed the fix-lldp-hostname branch 5 times, most recently from d0fce87 to e3827bb Compare June 4, 2026 21:11
In this commit we change the validation of the label against the
information received via LLDP. If DNS is configured on the remote device
via a `DNS` Kubernetes resource, the interface controller fetches that
resource and uses the `domain` field together with the device `hostname`
to build an FQDN that is then compared to the LLDP systemName. This
change now captures devices that export the FQDN in LLDP.

Add DNS watch to interface controller for LLDP neighbor re-validation.
When a DNS resource is created, deleted, or has its domain changed,
interfaces with neighbor labels pointing to that device's interfaces are
re-enqueued so LLDP adjacency validation re-evaluates the expected FQDN.
Also fix SetLLDPNeighbor test helper to set ChassisIDType/PortIDType so
LLDP adjacencies are no longer silently skipped in integration tests.

Replace conditions-length heuristic in interfaceUpdatePredicate with
explicit finalizer and deletion-timestamp checks. Adding a finalizer is
a metadata-only change that no standard predicate (Generation, Label,
Annotation) catches, so it falls to interfaceUpdatePredicate. The old
len(conditions) < 4 guard happened to let these through because
conditions are empty during bootstrap, but expressed the wrong
invariant. The new checks explicitly pass the lifecycle transitions that
the controller's multi-step bootstrap (finalizer → init conditions →
reconcile) depends on.

Signed-off-by: Pujol <enric.pujol@sap.com>
@nikatza nikatza force-pushed the fix-lldp-hostname branch from e3827bb to 88ca683 Compare June 4, 2026 21:26
@github-actions
Copy link
Copy Markdown

github-actions Bot commented Jun 4, 2026

Merging this branch will increase overall coverage

Impacted Packages Coverage Δ 🤖
github.com/ironcore-dev/network-operator/internal/controller/core 63.84% (+1.18%) 👍

Coverage by file

Changed files (no unit tests)

Changed File Coverage Δ Total Covered Missed 🤖
github.com/ironcore-dev/network-operator/internal/controller/core/interface_controller.go 72.60% (+6.72%) 584 (+33) 424 (+61) 160 (-28) 👍

Please note that the "Total", "Covered", and "Missed" counts above refer to code statements instead of lines of code. The value in brackets refers to the test coverage of that file in the old version of the code.

Changed unit test files

  • github.com/ironcore-dev/network-operator/internal/controller/core/interface_controller_test.go
  • github.com/ironcore-dev/network-operator/internal/controller/core/suite_test.go

@nikatza nikatza marked this pull request as ready for review June 4, 2026 21:36
@nikatza nikatza requested a review from a team as a code owner June 4, 2026 21:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant