Repository navigation
Conversation
KSail warns about floating IPs it labelled for a cluster but does not manage, because such an address is billed while it exists. The check only ran when an update re-rendered the floating-IP endpoint, which happens on creation, on endpoint drift and on a control-plane change, so an ordinary update of a Hetzner cluster with a floating IP endpoint never reported a stray address. Run the same read-only check when an update changes neither the endpoint nor the control plane, and print a line when it finds nothing, so a log without a warning reads as "checked, none found" rather than "never checked". A failed lookup is still reported and never fails the update, and a cluster without a floating IP endpoint makes no floating-IP call. Fixes #7695 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
devantler
left a comment
There was a problem hiding this comment.
🤖 Generated by the Agentic Engineer (interactive Claude Code session)
Self-review (fallback — CodeRabbit, Codex and Cursor Bugbot unavailable)
Reviewed commit: 8049d92cd203d55a58955b34e160d6b2fc6fe6c3
- CodeRabbit: the account's free OSS review limit is used up — command reply 6230288024 ("Review rate limited", 05:40:32Z) and summary 6230288768 ("You've used all free OSS reviews for now", 05:40:38Z) on ksail#7822; recovers when that limit resets. No CodeRabbit artifact exists on this PR.
- Codex: usage limit reached — reply 6230189816 on ksail#7823 (05:29:03Z); account-wide, recovers at its weekly reset.
- Cursor Bugbot: usage limit reached — reply 6230200017 on ksail#7823 (05:30:20Z); account-wide, recovers when the usage limit resets.
Scope read: the new no-change branch in the floating-IP update step, the new check helper, the added "none found" line, the adjusted test comment and the four new tests. Checked: the check runs only when the update changes neither the endpoint nor the control plane, so no path now runs it twice; it is skipped unless the floating IP endpoint is enabled, and a cluster without one makes no floating-IP call; it only lists addresses — no ensure, attach or release — and a missing Hetzner provider or a failed listing prints the existing warning and returns, so the update step still succeeds; the "none found" line prints only after a successful listing, so a failed lookup is never reported as clean. The tests drive the real update step against a fake Hetzner API and count the label listings through the client transport: a stray address is named, a clean account prints the "none found" line, a failed lookup prints the warning, the disabled case makes no call, and no case attaches the address. With the new call removed, the three enabled cases fail; with it, the whole provisioner package (1085 tests) passes and lint is clean.
Verdict: no P0/P1 findings
Readiness at
|
✅MegaLinter analysis: Success✅ Linters with no issuesactionlint, bash-exec, git_diff, hadolint, jscpd, jsonlint, lychee, markdown-table-formatter, markdownlint, prettier, prettier, shellcheck, shfmt, stylelint, syft, trivy-sbom, trufflehog, v8r, v8r, yamllint See detailed reports in MegaLinter artifacts
|
Code coverage overviewLanguages: Go Go / code-coverage/go
View coverage of the 10 most impacted files.
ℹ️ Calculations represent line coverage. Results may change as calculations are updated. |
Blocker: the next free autonomous real-cluster trial slot (at most one per day portfolio-wide). 2026-10-18 and 2026-10-19 are used (the combined EKS trial for ksail#7823/#7852), 2026-10-20 is taken by ksail#7854, so this is no earlier than 2026-10-21. ksail#7870 also waits for a Hetzner cluster that day; both changes can be tried on one Hetzner cluster (an update for this one, a stop for #7870) | outcome | last-verified 2026-10-19: head 8049d92 is tested and its checks are green, with no conflicts but 19 commits behind main (the branch is updated right before the trial, so the trial runs the merged head and gets a fresh review); the only open readiness item is the user evaluation on a real Hetzner cluster |

Why
KSail warns when a Hetzner cluster has a floating IP address it labelled but no longer uses, because that address is billed while it exists. The warning only appeared when an update also changed the cluster's endpoint or control plane, so routine updates never said whether such an address exists.
What
Every update of a Hetzner cluster with a floating IP now checks for these addresses and says so either way, naming any it finds or stating that none were found. The check only reads, never stops the update, and is skipped for clusters without a floating IP.
🤖 Generated with Claude Code
Fixes #7695