1284 Commits

Author SHA1 Message Date
Oguz Kilcan
addf66249a
feat: add omnictl media command group with preset support
The UI exposes an Installation Media configurator that saves presets as InstallationMediaConfig resources, but the CLI only allowed downloading built-in images via inline flags. This adds `omnictl media preset {create,list,delete}` for managing presets and `omnictl media download <preset>` for downloading from them, with create-time validation against the server's CloudPlatformConfig (architecture and secure-boot support, min Talos version), SBCConfig (min Talos version), and TalosExtensions resources. Download flags are restricted to runtime overrides only - flags that redefine the preset (platform, overlay, arch, bootloader) are intentionally not accepted, and overrides that affect validation re-run the relevant checks.

The legacy `omnictl download` is preserved but deprecated, and its download logic is extracted into an internal/download package shared by both commands.

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-05-05 17:13:57 +02:00
Oguz Kilcan
110be565c0
feat: expose provision step errors on machine request status
Surface step errors via a new Error field on `ClusterMachineRequestStatus` so users can see why a request is stuck or has failed without scraping logs. Persist the error on both the failure and requeue paths in the provision controller (the previous in-memory mutations were never written), and constrain step mutations to Id and LabelMachineInfraID by passing a copy of `MachineRequestStatus` to step.Run instead of the controller's live object.

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-05-05 16:17:08 +02:00
Edward Sammut Alessi
699ebf70e3
fix(frontend): fix revoking/deleting join tokens
Fix an issue were the delete/revoke button for join tokens was permanently disabled in the modals. Refactor modals to ConfirmModal. Add stories & tests.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-05-05 15:23:54 +02:00
Utku Ozdemir
1f4f2afa55
feat: allow exposing a Kubernetes service on multiple host ports
The annotation now accepts a comma-separated list of entries. Each entry is either a bare host port or a "host-port:service-port" pair, where the service port can be a number or a name. Each entry produces its own ExposedService with its own URL.

Before:

    omni-kube-service-exposer.sidero.dev/port: "30080"

After:

    omni-kube-service-exposer.sidero.dev/port: "30080,30443:8080,30444:https"

The label, icon, and prefix annotations gain per-host-port suffixed variants like "label-30080" or "prefix-30443". The suffixed variant wins for that port, otherwise the unsuffixed one is used as a fallback. For multi-port services the unsuffixed prefix is claimed by the lowest port, and other ports auto-generate aliases instead of failing with a duplicate-alias error.

Existing single-port exposed services keep their URLs across the upgrade.

Also bump the kube-service-exposer image to the version that supports the new annotation format.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-05-05 14:39:49 +02:00
Artem Chernyshev
75e881fca9
feat: resolve patches/kubernetes manifests relative to the templates dir
Previous behavior: resolve all includes relative to where `omnictl`
runs.
Current behavior: resolve all includes relative to where targeted
template YAML file is stored.

The new behavior should be more straightforward.

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-05-05 13:03:20 +03:00
Edward Sammut Alessi
e9b71f0ba9
fix(frontend): only show machine patches for currently visible machine
Only show patches for the currently viewed machine on the Patches tab of a clustered or unclustered machine.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-05-05 08:52:56 +02:00
Edward Sammut Alessi
a524554c74
fix(frontend): fix editing labels on machine class
Fix bug which was preventing editing labels for machine classes.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-05-05 08:32:22 +02:00
Edward Sammut Alessi
c14ee1019e
refactor(frontend): refactor all but the last tlist use of watch.setup
Refactor the final use cases of watch.setup (excluding TList) to be useResourceWatch. TList must be tackled on its own in #1534

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-05-04 18:49:20 +02:00
Edward Sammut Alessi
56cce45e19
chore(frontend): bump node to 24.15.0
Bump node version for frontend to 24.15.0

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-05-04 12:07:10 +02:00
Utku Ozdemir
7989c3c03b
test: fix data race in machine service mock
The read of the field was not protected by the lock, unlike all other operations, which caused a data race in CA rotation tests.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-05-04 00:38:57 +02:00
Artem Chernyshev
c141613d46
fix: fix the storm of PendingUpdateStatus create/destroy
Use `shouldUpgrade` bool flag when computing the config/upgrade diffs.
Otherwise any if `shouldUpgrade` gets out of sync with the condition
inside the `ClusterMachineConfigStatus` controller causes it to loop
creating and deleting pending changes.

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-05-01 17:59:07 +03:00
Utku Ozdemir
a43407d095
feat: generate config section of helm chart values from config schema
Introduce a new small tool, `helmvaluesgen`, which runs on `make generate` to update the `config:` section in the Helm chart's `values.yaml` with the current Omni config schema.

It takes two inputs:
1. Omni config schema JSON
2. An "overrides" YAML file for the customization for the Helm chart, such as different default values ("chart defaults, different from Omni's defaults"), omission rules, and different descriptions to be included in the chart README.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-05-01 16:32:11 +02:00
Artem Chernyshev
0cdb5a58c8
feat: support raw bytes in the inline fields for manifests/patches
Now inline supports all three variants:
- a single inline map (backward compatibility for config patches).
- a list of inline maps
- raw bytes, that can also contain multiple documents.

`omnictl cluster template export` command was updated to export config
patches/manifests as raw bytes to ensure that multiple values are
properly supported.

Fixes: https://github.com/siderolabs/omni/issues/2683

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-30 19:07:46 +03:00
Edward Sammut Alessi
14b83e1299
feat: set infra provider factory endpoint to the one configured in omni
Set infra provider factory endpoint to the one configured in Omni features state, which itself is from args/config. Expose the configured factory URL on the provider.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-30 15:32:40 +02:00
Edward Sammut Alessi
efbd089ffb
feat(frontend): add qol machine updates to omni frontend
Add some QoL updates for machine management to Omni frontend.

1. Add a copy machine UUID button to the cluster machine page
2. Add a toggle between hostnames and UUIDs to the machines list page (copy will copy what it sees, preference is saved)
3. Add kernel args tabs to machine and cluster machine pages, to allow editing kernel args. The "Update kernel args" button from machines list dropdown menu will now redirect to here instead of opening a modal.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-30 14:06:57 +02:00
Utku Ozdemir
2fe716d2c9
chore: enable go linting for build tags, fix linting errors
Add the build tags we were using, `integration` and `tools`, to be included in the linting/formatting of  golangci-lint.

Rename the build tag `tools` to `sidero.tools` to avoid colliding with the same named build tag in `github.com/johannesboyne/gofakes3` package - otherwise the dependency was failing to compile due to having multiple package names in the same package.

Fix all the linting errors surfaced by this enablement.

Also, temporarily re-enabled `nolintlint` to find the nolint directives which were no longer necessary and removed them.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-04-29 21:18:45 +02:00
Edward Sammut Alessi
718d61a6b4
chore(frontend): bump dependencies
Bump frontend dependencies

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-29 18:02:02 +02:00
Edward Sammut Alessi
d3592671ec
feat: download talosctl directly from factory
Download talosctl binaries from factory instead of Github

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-29 17:06:25 +02:00
Edward Sammut Alessi
b2671d08d0
refactor(frontend): create downloadfile helper
Create a downloadFile helper to stop repeating the anchor link creation logic

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-29 16:52:15 +02:00
Edward Sammut Alessi
dc9baca82f
refactor(frontend): refactor downloadtalosctl modal to new modal system
Refactor the DownloadTalosctl modal to the new Modal system.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-29 16:52:14 +02:00
Oguz Kilcan
06d8140d78
feat: add join token/talos version placeholders in installation media
InstallationMediaConfig can now use empty strings for talosVersion and joinToken, which resolve to the current stable version and default token at download time.

The create wizard adds "Automatic" options to the version and token dropdowns, and the download modal shows version/token/arch pickers for all presets.

Co-authored-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-29 14:34:30 +02:00
Artem Chernyshev
5f4b97616c
fix: bring back election campaign resign code in the etcd state
And also try to avoid the race in the election campaign.

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-28 19:57:01 +03:00
Utku Ozdemir
03c4e1d9ba
fix: stop logging Kubernetes read checks
Dry-run requests and permission checks no longer add noisy Kubernetes access entries to the audit log. Kubernetes writes continue to be recorded.

Fixes: siderolabs/omni#2745
Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-04-27 23:31:30 +02:00
Artem Chernyshev
dc3b974d0d
fix: remove workload proxy deployment when disabled on the account
Fixes: #2656

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-27 14:33:32 +03:00
Artem Chernyshev
65af568b34
fix: skip allocating nodes for deleted/tearing down MachineRequests
Without the fix `MachineRequestStatus` cleanup controller deletes the
`MachineSetNode` and the `MachineSetNode` controller might allocate it
back immediately.

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-24 20:35:12 +03:00
Utku Ozdemir
f9dd849153
feat: introduce powered off machine state and power on support
Machines that were shutting down and then disconnect are now shown as "Powered Off" in the UI instead of being stuck in "Shutting Down" with a greyed-out unreachable state.

For machines managed by a static infra provider, shutting down a machine now prevents the provider from automatically powering it back on due to cluster allocation. The provider honors the shutdown request until the machine goes through a deallocation cycle, at which point the request is considered stale.

Intentionally powered-off machines are also excluded from the "disconnected machines" list on the frontend when destroying a cluster, to avoid them being force-destroyed.

The shutdown modal in the frontend now calls a new management API endpoint instead of the Talos API directly. The CLI gains \`omnictl machine shutdown\` and \`omnictl machine power-on\` commands.

Closes siderolabs/omni#1634.
Part of siderolabs/omni-infra-provider-bare-metal#103.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-04-24 13:57:12 +02:00
Edward Sammut Alessi
921389a59c
fix(frontend): fix eula handling to prevent being stuck on /eula
If initial EULA request fails, we will show AppUnavailable instead of sending to /eula. If you navigate directly /eula and its already accepted, navigate away to the Home page.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-24 09:38:00 +02:00
Artem Chernyshev
725f41d4ee
fix: properly display service account expiration time in the UI
The old code was incorrectly picking the public key.

Fixes: https://github.com/siderolabs/omni/issues/2717

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-23 21:19:54 +03:00
Edward Sammut Alessi
c5a4310570
feat(frontend): add support modal to omni
Add a support modal to Omni, providing links to github issues, support, docs, community links, and office hours.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-23 15:46:42 +02:00
Edward Sammut Alessi
66383890b8
feat(frontend): show disks and devices in machines/machine page
Show disks and devices for machines in the machines/machine page, even for maintenance mode machines.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-23 15:21:01 +02:00
Edward Sammut Alessi
1e31079e4e
fix(frontend): fix indeterminate state for update extensions modal
Fix the indeterminate state for UpdateExtensions modal. It was never setting up the watch, so the information was not available. As part of this, refactored it to useResourceWatch and the new modal system and created stories for it. Also started moving refactored modals from views/modals into components/modals, as they are more of a component than a view anyway.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-23 14:56:36 +02:00
Edward Sammut Alessi
6d7e4f454e
feat(frontend): allow quickly switching between cluster machines
Allow quickly switching between cluster machines on the cluster machine page via a select dropdown. Reactivity was not working on most of the pages due to getContext only being checked once in setup, so had to fix a lot of things there.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-23 13:26:04 +02:00
Edward Sammut Alessi
c98b1187ea
fix(frontend): clear page state when keys are cleared
After clearing keys, use location.replace instead of router.replace to do a full page reload to clear any invalid key related state. This addresses an issue where user might see a blank screen if something breaks with their keys whilst still having a valid auth session. Usually an invalid auth session triggers a redirect to the auth provider, causing the same state reset. This also fixes a flakey test in e2e-talemu suite which was suffering from this.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-22 12:59:18 +02:00
Edward Sammut Alessi
f89955b43d
refactor(frontend): remove last use of <watch> component
Remove the last usage of the <Watch> component.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-22 12:40:58 +02:00
Edward Sammut Alessi
be67f710f8
feat: allow reader access to join token
Explicitly allow readers to read join tokens

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-21 16:28:32 +02:00
Oguz Kilcan
f221168823
chore: bump deps
Bump dependencies

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-04-21 10:20:29 +02:00
Oguz Kilcan
475e3660d7
feat: add Talos version end-of-support notifications and metrics
* Track machines running Talos versions approaching or past end of support relative to MinTalosVersion.
* Replace the config-driven non-ImageFactory deprecation notification with hardcoded constants and add two new notifications (approaching end of support, end of support reached) with corresponding Prometheus metrics.
* Add startup validation hooks (currently disabled) that will refuse to start when unsupported machines are detected.
* Fix frontend notification namespace from Default to Ephemeral.

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-04-20 17:11:49 +02:00
Justin Garrison
302e9175a3
feat: comment serviceaccount create output
The plain text output makes it less friendly to automation and saving to
.env files because it's interpreted by the shell.

Signed-off-by: Justin Garrison <justin.garrison@siderolabs.com>
2026-04-20 16:35:27 +02:00
Noel Georgi
967c229e1d
chore: rekres to update to new kres schema
This also allows enforcecontexts per branch.

Signed-off-by: Noel Georgi <git@frezbo.dev>
2026-04-20 18:08:29 +05:30
Edward Sammut Alessi
edbb621aa2
chore: bump stripe-go to v85
Bump stripe-go to v85 and use their modern syntax.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-20 12:31:58 +02:00
Edward Sammut Alessi
cc0adefcad
fix(frontend): select default join token in installation media wizard
Select the default join token in the installation media wizard. Also bump tsconfig to ES2023 (which is baseline widely available) to get access to .toSorted().

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-20 09:41:14 +02:00
Oguz Kilcan
0987fa9e8f
chore: prepare omni with talos v1.13.0-rc
Prepare omni for upcoming talos version 1.13

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-04-17 16:58:24 +02:00
Oguz Kilcan
73a06f8921
chore: bump talos machinery
Bump talos machinery to v1.13.0-rc.0

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-04-17 14:42:55 +02:00
Artem Chernyshev
78544a8557
feat: restrict directories for included files in the cluster templates
By default only allow to include files from the same directory where the
template file lives.
This is to prevent malicious cluster templates that include something
like `/etc/passwd`.
Fixes: https://github.com/siderolabs/omni/issues/2590

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-16 19:28:33 +03:00
Edward Sammut Alessi
a3fd0b1c4c
feat(frontend): allow re-saving omni support bundle
After download completes on the Omni support bundle, the user may click save again to save the bundle again without having to initiate the download again. This helps incase you accidentally click out of the first save, or deleted it, or anything like that. If you want a fresh bundle, you can still get that when you close & re-open the modal.

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-16 15:19:52 +02:00
Utku Ozdemir
5c4a6b5766
feat: remove image factory proxying
Omni now rejects legacy installation media download requests with a message asking users to upgrade omnictl instead of proxying them to the Talos image factory.

Current omnictl versions continue to download installation media directly from the Talos image factory.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2026-04-16 14:26:42 +02:00
Edward Sammut Alessi
dc5e289c1f
feat(frontend): show notifications in the frontend
Show Omni notifications in UI as a dismissable banner

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-15 18:42:20 +02:00
Edward Sammut Alessi
9fd6e9e14b
fix(frontend): open external eula link in a new tab
Open external EULA link in a new tab with _blank

Signed-off-by: Edward Sammut Alessi <edward.sammutalessi@siderolabs.com>
2026-04-15 16:57:05 +02:00
Oguz Kilcan
8c23f72e07
chore: bump deps
Bump dependency go-talos-support

Signed-off-by: Oguz Kilcan <oguz.kilcan@siderolabs.com>
2026-04-15 15:33:10 +02:00
Artem Chernyshev
2e9d00a661
chore: make Omni use join tokens mode legacyAllowed by default
Fixes: https://github.com/siderolabs/omni/issues/1591

Signed-off-by: Artem Chernyshev <artem.chernyshev@talos-systems.com>
2026-04-15 15:08:28 +03:00