Skip to content

chore(deps): migrate to Helm 4 and drop the cozystack/talos fork - #231

Merged
Aleksei Sviridkin (lexfrei) merged 4 commits into
mainfrom
chore/helm-4-migration
Jul 23, 2026
Merged

chore(deps): migrate to Helm 4 and drop the cozystack/talos fork#231
Aleksei Sviridkin (lexfrei) merged 4 commits into
mainfrom
chore/helm-4-migration

Conversation

@lexfrei

@lexfrei Aleksei Sviridkin (lexfrei) commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

What

Migrates talm off the end-of-life Helm 3 library to Helm 4. The v4 dependency graph forces the rest: it drops the cozystack/talos fork for stock upstream Talos v1.13.7, then refreshes the dependency tree. Four self-contained commits: golden snapshots (on v3), the v3-to-v4 swap, fork drop plus local --skip-verify, remaining dependency bumps.

Why the fork drop rides along

Helm v4 requires k8s.io/api v0.36, which cascades across the whole build graph. The pinned cozystack/talos fork was a January-2026 pre-v1.13 snapshot that can't coexist with that bump. The fork only ever existed to carry --skip-verify (upstream declined it in siderolabs/talos#12652), so I reimplemented that flag in talm's own client wrappers and moved to upstream v1.13.7. You can't take Helm 4 without also unpinning talos.

Transparency

The golden snapshots prove the migration doesn't change what talm generates. They were committed on v3, the v4 commit doesn't touch them, and TestGoldenRender passes byte-for-byte across the full matrix (cozystack and generic, controlplane and worker, multidoc and legacy). Rendered machine-config is identical before and after.

Breaking change: --skip-verify on wrapped talosctl commands

Under the fork, --skip-verify was injected at the library level and worked for every command, including passthroughs (talm get, talm health, talm dashboard). Those run upstream code that never reaches talm's client wrappers, so without the fork there is no way to inject it. --skip-verify now works only for talm-native commands (apply, template, upgrade, rotate-ca). Passthroughs print an explicit warning and connect with full verification, instead of failing with an opaque TLS SAN error.

Testing

go build, go vet, the full suite, and golangci-lint are all clean. The --skip-verify reimplementation covers the TLS config, native routing, the no-nodes contract, config-context and endpoint threading, and the passthrough warning. Manual steps are in docs/manual-test-plan.md D4. Reviewed by Opus. Docs for the --skip-verify scope reduction will follow at cozystack/website.

Summary by CodeRabbit

  • New Features
    • Added reliable --skip-verify TLS behavior for talm-native commands (apply, template, upgrade, rotate-ca).
    • Skips server certificate verification while preserving client-certificate authentication and talosconfig-based connection targeting.
  • Bug Fixes
    • Using --skip-verify with wrapped talosctl passthrough commands now warns and falls back to full TLS verification.
  • Documentation
    • Expanded the manual test plan with positive/negative --skip-verify scenarios.
  • Tests
    • Added comprehensive --skip-verify routing/TLS coverage and new golden render snapshot validation.

The engine's contract tests are substring-based — they pin only the
specific fields each one names, so a change that alters whitespace,
key ordering, number formatting, document count, or any unasserted
field renders green. Add byte-for-byte golden snapshots of the full
rendered output across the schema matrix: cozystack and generic charts,
controlplane and worker, legacy single-doc and multi-doc schemas,
driven by a deterministic discovery fixture.

Regenerate with TALM_UPDATE_GOLDEN=1; without it the test compares and
fails on any drift, catching behavioral regressions the targeted
assertions miss.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
talm consumes the Helm library only as a template engine — a vendored
fork of pkg/engine plus the chart types, loader, and strvals — never
its release or install machinery. The v4 changes around server-side
apply, kstatus, and release storage therefore do not apply here.

The swap is not purely mechanical. The Helm v4 module requires
k8s.io/api v0.36, which drops autoscaling/v2beta2 that fluxcd/pkg/ssa
v0.70 still imports, so the whole k8s.io stack moves to v0.36.2 and
fluxcd/pkg/ssa to v0.77 (which is already on v0.36 and no longer needs
the removed package). Chart value and file types moved to
pkg/chart/common in v4; the engine fork and its tests reference them
there, with CoalesceValues now under pkg/chart/common/util.

The golden snapshots render byte-for-byte identical on v4, confirming
the generated Talos machine-config is unchanged for users.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

The change reimplements native --skip-verify handling, warns for unsupported wrapped commands, migrates the rendering engine from Helm v3 to Helm v4, refreshes dependencies, and adds deterministic golden render tests with generated fixtures.

Changes

Talm-native TLS verification

Layer / File(s) Summary
Native client routing and TLS configuration
main.go, pkg/commands/root.go, pkg/commands/apply.go, pkg/commands/rotate_ca_handler.go
Native commands now use package-level skip-verify state, resolve talosconfig contexts, preserve client certificates, and pass endpoint, cluster, and dial options into the skip-verification client.
Command behavior and regression coverage
pkg/commands/talosctl_wrapper.go, pkg/commands/template.go, pkg/commands/skip_verify_test.go, docs/manual-test-plan.md
Wrapped talosctl commands warn that --skip-verify is unsupported; template routing retains node metadata; tests cover TLS errors, context resolution, metadata, options, and warnings.

Helm v4 rendering migration

Layer / File(s) Summary
Helm v4 engine contracts and dependencies
go.mod, pkg/engine/helm/*, pkg/engine/engine.go, pkg/engine/contract_errors_test.go
Helm chart, file, loader, and values types are migrated to Helm v4, with refreshed Talos, Kubernetes, and transitive dependencies.
Rendering test adaptation
pkg/engine/helm/engine_test.go, pkg/engine/render_test.go
Rendering tests use Helm v4 chart files, loaders, value containers, and coalescing helpers while retaining existing assertions.

Golden render coverage

Layer / File(s) Summary
Golden test and snapshots
pkg/engine/golden_test.go, pkg/engine/testdata/golden/*, .gitattributes
A deterministic golden test compares or regenerates rendered YAML across chart variants, with committed generic and Cozystack legacy and multidocument snapshots marked as generated data.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant CLI
  participant TalmCommand
  participant ClientBuilder
  participant TalosConfig
  participant TalosAPI
  CLI->>TalmCommand: invoke native command with --skip-verify
  TalmCommand->>ClientBuilder: request client and dial options
  ClientBuilder->>TalosConfig: resolve context, credentials, and endpoints
  ClientBuilder->>TalosAPI: connect with server verification disabled
  TalosAPI-->>TalmCommand: execute action with resolved context metadata
Loading

Suggested reviewers: ivanhunters

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 60.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately summarizes the main changes: Helm 4 migration and removal of the cozystack/talos fork.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch chore/helm-4-migration

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/manual-test-plan.md`:
- Around line 1001-1010: Update the expected passthrough warning in the manual
test plan to include rotate-ca in the talm-native command list, matching
warnSkipVerifyUnsupported in talosctl_wrapper.go; leave the remaining expected
stderr text unchanged.

In `@pkg/commands/root.go`:
- Around line 71-73: Update the TLS configuration logic around configContext.Crt
and configContext.Key to distinguish an entirely absent certificate/key pair
from a partial pair. Return the existing empty TLS configuration only when both
are unset; when exactly one is set, return a clear configuration error before
the invalid-base64 and key-pair validation paths.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: a4bc126f-e290-4c80-9afb-7fb5879fc17d

📥 Commits

Reviewing files that changed from the base of the PR and between e14fe35 and a8d04bc.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (26)
  • .gitattributes
  • docs/manual-test-plan.md
  • go.mod
  • main.go
  • pkg/commands/apply.go
  • pkg/commands/root.go
  • pkg/commands/rotate_ca_handler.go
  • pkg/commands/skip_verify_test.go
  • pkg/commands/talosctl_wrapper.go
  • pkg/commands/template.go
  • pkg/engine/contract_errors_test.go
  • pkg/engine/engine.go
  • pkg/engine/golden_test.go
  • pkg/engine/helm/doc.go
  • pkg/engine/helm/engine.go
  • pkg/engine/helm/engine_test.go
  • pkg/engine/helm/files.go
  • pkg/engine/render_test.go
  • pkg/engine/testdata/golden/cozystack-controlplane-legacy.golden.yaml
  • pkg/engine/testdata/golden/cozystack-controlplane-multidoc.golden.yaml
  • pkg/engine/testdata/golden/cozystack-worker-legacy.golden.yaml
  • pkg/engine/testdata/golden/cozystack-worker-multidoc.golden.yaml
  • pkg/engine/testdata/golden/generic-controlplane-legacy.golden.yaml
  • pkg/engine/testdata/golden/generic-controlplane-multidoc.golden.yaml
  • pkg/engine/testdata/golden/generic-worker-legacy.golden.yaml
  • pkg/engine/testdata/golden/generic-worker-multidoc.golden.yaml

Comment thread docs/manual-test-plan.md
Comment thread pkg/commands/root.go
Comment on lines +71 to +73
if configContext.Crt == "" || configContext.Key == "" {
return tlsConfig, nil
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Inconsistent handling of a partial cert/key pair.

If only one of Crt/Key is set, this silently returns a TLS config with no client certificate instead of erroring — unlike the invalid-base64 and mismatched-keypair cases just below, which fail loudly. A talosconfig context with a typo'd/half-populated cert pair would silently lose client-cert auth and surface as an opaque downstream authorization failure instead of a clear config error.

🛡️ Proposed fix: treat "exactly one present" as an error too
-	if configContext.Crt == "" || configContext.Key == "" {
+	if configContext.Crt == "" && configContext.Key == "" {
 		return tlsConfig, nil
 	}
+
+	if configContext.Crt == "" || configContext.Key == "" {
+		return nil, errors.New("talosconfig context has only one of client certificate/key set")
+	}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
if configContext.Crt == "" || configContext.Key == "" {
return tlsConfig, nil
}
if configContext.Crt == "" && configContext.Key == "" {
return tlsConfig, nil
}
if configContext.Crt == "" || configContext.Key == "" {
return nil, errors.New("talosconfig context has only one of client certificate/key set")
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/commands/root.go` around lines 71 - 73, Update the TLS configuration
logic around configContext.Crt and configContext.Key to distinguish an entirely
absent certificate/key pair from a partial pair. Return the existing empty TLS
configuration only when both are unset; when exactly one is set, return a clear
configuration error before the invalid-base64 and key-pair validation paths.

The fork existed solely to carry the --skip-verify flag, which upstream
declined (siderolabs/talos#12652) over the risk of leaking data to an
actor impersonating the Talos API. Reimplement the flag locally in
pkg/commands: a package-level SkipVerify bound to --skip-verify, and a
WithClientSkipVerify that opens the talosconfig, builds a TLS config
skipping server-certificate verification while preserving client-cert
authentication, and dials the node directly. With the flag no longer
depending on fork-only API, the replace directive is dropped and talm
tracks stock upstream Talos v1.13.7.

The rendered machine-config is unchanged — golden snapshots stay
byte-identical; only the client-connection path is affected.

Co-authored-by: Kirill Ilin <stitch14@yandex.ru>
Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>
Refresh the dependency tree with the latest compatible minor/patch
versions across direct and indirect modules. siderolabs/go-talos-support
is held at v0.2.1 (the version Talos v1.13.7 expects) because v0.3.0
removes bundle.WithTalosClient, which the Talos cluster package still
calls — bumping it breaks the build.

Assisted-By: Claude <noreply@anthropic.com>
Signed-off-by: Aleksei Sviridkin <f@lex.la>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
pkg/commands/root.go (1)

61-93: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Partial cert/key pair still silently ignored (unresolved from prior review).

If only one of Crt/Key is set, this returns an insecure-only TLS config with no client cert instead of erroring — inconsistent with the invalid-base64/mismatched-keypair cases below, which fail loudly. A half-populated talosconfig context silently drops client-cert auth instead of surfacing a clear error. This is the same gap flagged on a prior commit of this PR and hasn't been addressed; skip_verify_test.go also has no test covering the "exactly one set" case, so the gap is currently unverified.

🛡️ Proposed fix: treat "exactly one present" as an error
-	if configContext.Crt == "" || configContext.Key == "" {
+	if configContext.Crt == "" && configContext.Key == "" {
 		return tlsConfig, nil
 	}
+
+	if configContext.Crt == "" || configContext.Key == "" {
+		return nil, errors.New("talosconfig context has only one of client certificate/key set")
+	}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/commands/root.go` around lines 61 - 93, Update skipVerifyTLSConfig to
reject partially populated client credentials: if exactly one of
configContext.Crt or configContext.Key is set, return a clear error instead of
returning the insecure-only TLS config. Preserve the existing no-credentials
path when both are empty and certificate decoding/key-pair loading when both are
present, and add coverage in skip_verify_test.go for the one-sided cases.
🧹 Nitpick comments (1)
pkg/commands/talosctl_wrapper.go (1)

282-282: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use Cobra’s configured stderr for the warning.

Passing os.Stderr bypasses cmd.SetErr(...)/cmd.ErrOrStderr(), so embedded callers and command-level tests cannot capture or redirect this warning. Pass cmd.ErrOrStderr() instead.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pkg/commands/talosctl_wrapper.go` at line 282, Update the warning call in the
command execution flow to pass cmd.ErrOrStderr() instead of os.Stderr, ensuring
warnSkipVerifyUnsupported respects Cobra’s configured error output while
preserving the existing command name argument.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@pkg/commands/root.go`:
- Around line 61-93: Update skipVerifyTLSConfig to reject partially populated
client credentials: if exactly one of configContext.Crt or configContext.Key is
set, return a clear error instead of returning the insecure-only TLS config.
Preserve the existing no-credentials path when both are empty and certificate
decoding/key-pair loading when both are present, and add coverage in
skip_verify_test.go for the one-sided cases.

---

Nitpick comments:
In `@pkg/commands/talosctl_wrapper.go`:
- Line 282: Update the warning call in the command execution flow to pass
cmd.ErrOrStderr() instead of os.Stderr, ensuring warnSkipVerifyUnsupported
respects Cobra’s configured error output while preserving the existing command
name argument.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: bdba6a9f-a6e8-4e85-b0a6-aa89a7bc1419

📥 Commits

Reviewing files that changed from the base of the PR and between a8d04bc and 3612169.

⛔ Files ignored due to path filters (1)
  • go.sum is excluded by !**/*.sum
📒 Files selected for processing (9)
  • docs/manual-test-plan.md
  • go.mod
  • main.go
  • pkg/commands/apply.go
  • pkg/commands/root.go
  • pkg/commands/rotate_ca_handler.go
  • pkg/commands/skip_verify_test.go
  • pkg/commands/talosctl_wrapper.go
  • pkg/commands/template.go
🚧 Files skipped from review as they are similar to previous changes (5)
  • pkg/commands/apply.go
  • main.go
  • pkg/commands/rotate_ca_handler.go
  • docs/manual-test-plan.md
  • pkg/commands/template.go

@IvanHunters

Copy link
Copy Markdown

Verdict

LGTM with non-blocking notes.

Helm v3→v4 migration and the cozystack/talos fork drop are mechanically sound and independently verified end-to-end (build, vet, full test suite, lint, go mod verify/tidy all clean in this environment); only stale-config cleanup items remain.

Findings

[MINOR] .github/renovate.json:8-16 — dead Renovate custom manager left behind after the migration it was tracking.

The custom manager's regex (helm\.sh/helm/v3 v(?<currentValue>\d+\.\d+\.\d+)) exists specifically to surface the v3→v4 major bump in go.mod. This PR completes that bump and removes every helm.sh/helm/v3 reference from go.mod (confirmed: grep -c "helm.sh/helm/v3" go.mod → 0). The custom manager can now never match anything again and should be deleted as part of this PR rather than left as orphaned config for the next person to puzzle over.

[MINOR] .golangci.yml:38-49gomoddirectives.replace-allow-list entries for the dropped fork are now stale.

The block allow-lists github.com/siderolabs/talos and github.com/siderolabs/talos/pkg/machinery with a comment justifying it by "the cozystack fork of Talos carries a downstream-only patch ... the replace directive is the only way to consume the fork." This PR removes the replace (...) block from go.mod entirely — verified grep -n "^replace\|=> " go.mod returns nothing, i.e. there are zero replace directives left in the module at all. The allow-list and its justifying comment are dead configuration that should be removed alongside the replace block it was written for.

[MINOR] pkg/commands/root.go:71 — a partial client cert/key pair in the talosconfig context is silently ignored.

skipVerifyTLSConfig guards with if configContext.Crt == "" || configContext.Key == "" and returns a TLS config with no client certificate whenever either half is missing. If a context supplies only one of the two (e.g. Crt set, Key empty — a malformed/half-populated talosconfig), client-certificate authentication is silently dropped with no warning, and the user later hits an opaque authentication failure at connect time rather than a legible error pointing at the bad context. Prefer failing fast (or at least warning) on an XOR-populated pair instead of treating "one half present" the same as "neither present".

[MINOR] Commit messages — the disclosed --skip-verify scope-reduction is not marked as a breaking change per Conventional Commits.

The PR body has an explicit "Breaking change: --skip-verify on wrapped talosctl commands" section (skip-verify now works only for talm-native commands; wrapped passthroughs like talm get/talm health/talm dashboard silently lost coverage they had under the fork and now warn-and-fall-back instead). None of the three commits use a ! after type(scope) or carry a BREAKING CHANGE: footer, despite all being chore(deps): — a type conventionally read as safe-to-auto-merge by changelog/semver tooling. Since this repo has no CONTRIBUTING.md/AGENTS.md mandating the marker, this is a convention nit rather than a hard rule violation, but it is exactly the kind of case the marker exists for: a user-visible CLI behavior loss riding inside a "chore" commit.

Caveats

  • Cozystack chart upgrade/fresh-install/config-matrix checks are not applicable: this PR touches zero packages and zero charts. The only YAML touched is Helm-engine golden-snapshot test fixtures under pkg/engine/testdata/golden/, which are test data, not shipped charts.
  • Fork-drop behavioral-parity check was executed, not just reasoned: fetched the actual dropped fork commit (cozystack/talos@d18a185e3680) and diffed it against upstream Talos v1.12.1/v1.13.7 source. Finding: the fork's own added client.WithSkipVerify() option / Options.skipVerify field / getConn() branch were dead code — never wired into global.Args.WithClientSkipVerify, which only ever called client.WithTLSConfig(tlsConfig). That option already short-circuits getConn() in stock upstream (verified in v1.12.1 and v1.13.7 source) before the SideroV1/basic-auth/interceptor logic. So the fork's actual observable behavior was already governed by the same code path this PR's reimplementation uses directly — no functional loss found in the connection/TLS layer from dropping the fork.
  • Node-context parity for --skip-verify (no-nodes vs with-nodes contract across WithClientNoNodes/WithClient/withApplyClientBare/runTemplate) was traced call-by-call and cross-checked against the shipped tests (TestWithClientNoNodes_SkipVerifyOmitsNodeMetadata, TestWithClient_SkipVerifySetsResolvedNodes, TestWithClient_SkipVerifyPreservesConfigContext) — all pass and assert the exact contract described in code comments. No stray GlobalArgs.With* call sites left bypassing the new SkipVerify routing.
  • Golden-render byte-identity claim ("rendered machine-config is unchanged") verified independently: git log --oneline -- pkg/engine/testdata/golden/ shows only the pre-migration commit ever touched those fixtures — none of the three migration commits do — and go test ./pkg/engine/... passes TestGoldenRender across the full 8-case matrix (cozystack/generic × controlplane/worker × multidoc/legacy).
  • go build ./..., go vet ./..., go test ./... (full suite), golangci-lint run ./... (0 issues), go mod verify (all modules verified), and go mod tidy (zero diff against the committed go.mod/go.sum) were all executed in this run, not assumed from the PR body. One test (TestCommittedTextFilesIgnoresUntrackedArtefacts, unrelated to this PR) failed only under an outdated default git (2.23.0, missing git init -b); re-run with a newer git (2.50.1) on PATH and the full suite is green. Environment artifact, not a PR defect.
  • Deeper behavioral verification of the wider transitive dependency bump (k8s.io 0.35→0.36, fluxcd/pkg/ssa, etcd, cosi-project, etc., forced by Helm v4's k8s.io/api v0.36 requirement) is bounded by what the existing test suite exercises (golden render + skip-verify + engine tests); no separate fuzzing of the newly-bumped transitive graph was performed beyond that.

Recommended follow-ups

  • Delete the dead helm.sh/helm/v3 → v4 custom manager from .github/renovate.json and the stale github.com/siderolabs/talos* entries from .golangci.yml's gomoddirectives.replace-allow-list (both now orphaned by this PR's own changes).

@IvanHunters

Copy link
Copy Markdown

On the scope question: the reduced set (apply, template, upgrade, rotate-ca) is sufficient, and here's the reasoning, not just a yes.

--skip-verify exists for exactly one situation: reaching a node by an IP that is absent from the server cert SANs, while still presenting the client cert (it is not talosctl's --insecure, which is maintenance-mode with no client auth at all). That situation is only functionally required during the config-management lifecycle: you connect to a not-yet-in-SAN node to push/upgrade the very config that adds the IP to certSANs. The four retained commands are precisely those, so the flag keeps working everywhere it is load-bearing.

The passthroughs that lose it (get, health, dashboard, …) run upstream RunE code directly, and upstream declined the flag (siderolabs/talos#12652), so there is no injection point without the fork — and the fork is what blocks Helm 4. Losing it there is a convenience gap in the transient bootstrap window, not a dead end:

  • once apply --skip-verify lands the config with the IP in certSANs, every command (passthroughs included) works with full verification;
  • --endpoints is preserved, so a node reachable by a SAN-listed name/endpoint is introspectable without skip-verify;
  • the new behavior is an explicit warning + fallback to full verification, which is strictly better than the opaque x509: certificate is valid for … not <ip> failure you'd otherwise hit.

The only way the scope would be insufficient is a supported workflow where you must introspect (get/health) a node that is permanently reachable only by an out-of-SAN IP and cannot be fixed via apply. That shouldn't exist in normal usage — certSANs should carry the management IPs, and if they don't, apply (which keeps the flag) is the fix. So: scope is enough.

@lexfrei
Aleksei Sviridkin (lexfrei) merged commit c2d0f05 into main Jul 23, 2026
8 checks passed
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.

2 participants