FreeNAS/freenas 71d7b30src/freenas/usr/local/bin truenas-initrd.py

Address review
DeltaFile
+16-7src/freenas/usr/local/bin/truenas-initrd.py
+16-71 files

FreeNAS/freenas 7546b7dsrc/middlewared/middlewared/pytest/unit/plugins test_libvirt_device_uniqueness.py, src/middlewared/middlewared/utils/libvirt utils.py nic.py

NAS-140626 / 26.0.0-BETA.2 / Prevent duplicate device attachment on VMs and containers (by Qubad786) (#18767)

## Problem

Currently, users can add the same USB or PCI device multiple times to
the same VM or container. This results in duplicate device assignments,
causing libvirt to fail with an error during startup.

## Solution

Added validation to ensure device uniqueness for both libvirt devices.
A validation error is now raised if the same device is added more than
once to a VM or container, preventing invalid configurations.

Original PR: https://github.com/truenas/middleware/pull/18763

Co-authored-by: M. Rehan <mrehanlm93 at gmail.com>
DeltaFile
+533-0src/middlewared/middlewared/pytest/unit/plugins/test_libvirt_device_uniqueness.py
+59-15src/middlewared/middlewared/utils/libvirt/utils.py
+9-0src/middlewared/middlewared/utils/libvirt/nic.py
+8-0src/middlewared/middlewared/utils/libvirt/usb.py
+7-1src/middlewared/middlewared/utils/libvirt/pci.py
+7-0src/middlewared/middlewared/utils/libvirt/gpu.py
+623-163 files not shown
+635-229 files

FreeNAS/freenas 4f3dde5src/middlewared/middlewared/plugins/vm utils.py crud.py, src/middlewared/middlewared/pytest/unit/plugins/vm test_state_utils.py

Move VM NVRAM and TPM atomically with VM rename
DeltaFile
+175-0src/middlewared/middlewared/pytest/unit/plugins/vm/test_state_utils.py
+119-0src/middlewared/middlewared/plugins/vm/utils.py
+44-19src/middlewared/middlewared/plugins/vm/crud.py
+338-193 files

FreeNAS/freenas d65d661src/middlewared/middlewared/plugins/vm utils.py crud.py, src/middlewared/middlewared/pytest/unit/plugins/vm test_state_utils.py

Move VM NVRAM and TPM atomically with VM rename
DeltaFile
+175-0src/middlewared/middlewared/pytest/unit/plugins/vm/test_state_utils.py
+111-0src/middlewared/middlewared/plugins/vm/utils.py
+44-19src/middlewared/middlewared/plugins/vm/crud.py
+330-193 files

FreeNAS/freenas 0d3d4acsrc/middlewared/middlewared/test/integration/utils system.py

NAS-140711 / 26.0.0-BETA.2 / Robustize helper to reset-failed (by anodos325) (#18769)

This commit handles edge-case where maybe our CI is trying to reset a
unit that is unloaded. This allows us to surface what may be a more
useful error condition later on in tests.

Original PR: https://github.com/truenas/middleware/pull/18762

Co-authored-by: Andrew Walker <andrew.walker at truenas.com>
DeltaFile
+13-1src/middlewared/middlewared/test/integration/utils/system.py
+13-11 files

FreeNAS/freenas ec66b66src/middlewared/middlewared/test/integration/utils system.py

Robustize helper to reset-failed

This commit handles edge-case where maybe our CI is trying to
reset a unit that is unloaded. This allows us to surface what
may be a more useful error condition later on in tests.

(cherry picked from commit 6ab6b07017c0fea31a0f254444934316f337a1d3)
DeltaFile
+13-1src/middlewared/middlewared/test/integration/utils/system.py
+13-11 files

FreeNAS/freenas 2651cd6src/middlewared/middlewared/test/integration/utils system.py

NAS-140711 / 27.0.0-BETA.1 / Robustize helper to reset-failed (#18762)

This commit handles edge-case where maybe our CI is trying to reset a
unit that is unloaded. This allows us to surface what may be a more
useful error condition later on in tests.
DeltaFile
+13-1src/middlewared/middlewared/test/integration/utils/system.py
+13-11 files

FreeNAS/freenas e5ea350src/freenas/usr/lib/modules-load.d truenas.conf

NAS-138933 / 25.10.3.1 / Load auth_rpcgss at boot to fix Kerberos NFS after manual start (by ixhamza) (by bugclerk) (#18768)

gssproxy writes 1 to `/proc/net/rpc/use-gss-proxy` once at startup. If
the proc file doesn't exist yet (`auth_rpcgss` not loaded), it silently
gives up. v0.9.2 [adds a 10-second retry timer for this
case](https://github.com/gssapi/gssproxy/pull/85), but TrueNAS ships
v0.9.1.

When NFS is started manually with auto-start disabled, `gssproxy` has
already started and given up. The kernel's `use_gss_proxy` flag stays -1
and the first Kerberos client locks it to 0 (one-shot latch), breaking
`RPCSEC_GSS` until reboot. Loading `auth_rpcgss` early ensures the proc
file exists before gssproxy starts.

### Testing
Tested with NFS auto-start disabled and rebooting. Before fix,
`use-gss-proxy` stayed -1 after manual NFS start and a raw
`RPCSEC_GSS_INIT` request locked it to 0. After fix, `use-gss-proxy` is
1.

    [13 lines not shown]
DeltaFile
+1-0src/freenas/usr/lib/modules-load.d/truenas.conf
+1-01 files

FreeNAS/freenas 4f73572src/freenas/usr/lib/modules-load.d truenas.conf

Load auth_rpcgss at boot to fix Kerberos NFS after manual start

gssproxy writes 1 to `/proc/net/rpc/use-gss-proxy` once at startup. If
the proc file doesn't exist yet (`auth_rpcgss` not loaded), it silently
gives up. v0.9.2 adds a 10-second retry timer for this case,
but TrueNAS ships v0.9.1.

When NFS is started manually with auto-start disabled, `gssproxy` has
already started and given up. The kernel's `use_gss_proxy` flag stays -1
and the first Kerberos client locks it to 0 (one-shot latch), breaking
`RPCSEC_GSS` until reboot. Loading `auth_rpcgss` early ensures the proc
file exists before gssproxy starts.

Tested with NFS auto-start disabled and rebooting. Before fix,
`use-gss-proxy` stayed -1 after manual NFS start and a raw
`RPCSEC_GSS_INIT` request locked it to 0. After fix, `use-gss-proxy`
is 1.

(cherry picked from commit f592af1014970a81a98b7a03052c2b7fdc557380)
(cherry picked from commit eb0cd965ec7795ede47665fd93dc8f5e7bf793a1)
DeltaFile
+1-0src/freenas/usr/lib/modules-load.d/truenas.conf
+1-01 files

FreeNAS/freenas bd913aesrc/middlewared/middlewared/pytest/unit/plugins test_libvirt_device_uniqueness.py, src/middlewared/middlewared/utils/libvirt utils.py nic.py

Prevent duplicate device attachment on VMs and containers

(cherry picked from commit c3f05a848d00f1b7c6519e2f68e830cf7532911e)
DeltaFile
+533-0src/middlewared/middlewared/pytest/unit/plugins/test_libvirt_device_uniqueness.py
+59-15src/middlewared/middlewared/utils/libvirt/utils.py
+9-0src/middlewared/middlewared/utils/libvirt/nic.py
+8-0src/middlewared/middlewared/utils/libvirt/usb.py
+7-1src/middlewared/middlewared/utils/libvirt/pci.py
+7-0src/middlewared/middlewared/utils/libvirt/gpu.py
+623-163 files not shown
+635-229 files

FreeNAS/freenas ef4535dsrc/middlewared/middlewared/pytest/unit/plugins test_libvirt_device_uniqueness.py, src/middlewared/middlewared/utils/libvirt utils.py nic.py

NAS-140626 / 27.0.0-BETA.1 / Prevent duplicate device attachment on VMs and containers (#18763)

## Problem

Currently, users can add the same USB or PCI device multiple times to
the same VM or container. This results in duplicate device assignments,
causing libvirt to fail with an error during startup.

## Solution

Added validation to ensure device uniqueness for both libvirt devices.
A validation error is now raised if the same device is added more than
once to a VM or container, preventing invalid configurations.
DeltaFile
+533-0src/middlewared/middlewared/pytest/unit/plugins/test_libvirt_device_uniqueness.py
+59-15src/middlewared/middlewared/utils/libvirt/utils.py
+9-0src/middlewared/middlewared/utils/libvirt/nic.py
+8-0src/middlewared/middlewared/utils/libvirt/usb.py
+7-1src/middlewared/middlewared/utils/libvirt/pci.py
+7-0src/middlewared/middlewared/utils/libvirt/gpu.py
+623-163 files not shown
+635-229 files

FreeNAS/freenas 05d162csrc/middlewared/middlewared/api/v27_0_0 app.py, src/middlewared/middlewared/plugins/apps/ix_apps portals.py query.py

Surface x-action-required compose extension on app.query
DeltaFile
+6-2src/middlewared/middlewared/plugins/apps/ix_apps/portals.py
+2-0src/middlewared/middlewared/plugins/apps/ix_apps/query.py
+2-0src/middlewared/middlewared/api/v27_0_0/app.py
+10-23 files

FreeNAS/freenas a1e54fdsrc/middlewared/middlewared/plugins/apps/ix_apps query.py

Fix get_instance issue
DeltaFile
+10-5src/middlewared/middlewared/plugins/apps/ix_apps/query.py
+10-51 files

FreeNAS/freenas 1d33c4csrc/middlewared/middlewared/plugins/vm utils.py crud.py, src/middlewared/middlewared/pytest/unit/plugins/vm test_state_utils.py

Move VM NVRAM and TPM atomically with VM rename
DeltaFile
+175-0src/middlewared/middlewared/pytest/unit/plugins/vm/test_state_utils.py
+110-0src/middlewared/middlewared/plugins/vm/utils.py
+38-19src/middlewared/middlewared/plugins/vm/crud.py
+323-193 files

FreeNAS/freenas 76bcd68src/middlewared/middlewared/api/v27_0_0 app.py

Fix integration tests
DeltaFile
+7-7src/middlewared/middlewared/api/v27_0_0/app.py
+7-71 files

FreeNAS/freenas 513ad5fsrc/middlewared/middlewared/plugins/update_ install_linux.py

prevent unlicensed LTS installation
DeltaFile
+58-0src/middlewared/middlewared/plugins/update_/install_linux.py
+58-01 files

FreeNAS/freenas edbb16csrc/middlewared/middlewared/api/v27_0_0 truenas.py, src/middlewared/middlewared/plugins failover.py

Fix tests
DeltaFile
+5-2tests/runtest.py
+2-4src/middlewared/middlewared/plugins/truenas/license_utils.py
+3-1src/middlewared/middlewared/api/v27_0_0/truenas.py
+2-1src/middlewared/middlewared/plugins/truenas/license_legacy_utils.py
+1-1src/middlewared/middlewared/plugins/failover.py
+2-0src/middlewared/middlewared/plugins/truenas/license.py
+15-95 files not shown
+20-1411 files

FreeNAS/freenas c3f05a8src/middlewared/middlewared/pytest/unit/plugins test_libvirt_device_uniqueness.py, src/middlewared/middlewared/utils/libvirt utils.py nic.py

Prevent duplicate device attachment on VMs and containers
DeltaFile
+533-0src/middlewared/middlewared/pytest/unit/plugins/test_libvirt_device_uniqueness.py
+59-15src/middlewared/middlewared/utils/libvirt/utils.py
+9-0src/middlewared/middlewared/utils/libvirt/nic.py
+7-1src/middlewared/middlewared/utils/libvirt/pci.py
+8-0src/middlewared/middlewared/utils/libvirt/usb.py
+7-0src/middlewared/middlewared/utils/libvirt/gpu.py
+623-163 files not shown
+635-229 files

FreeNAS/freenas 5d59982src/middlewared/middlewared/apps webshell_app.py

More fixes
DeltaFile
+4-3src/middlewared/middlewared/apps/webshell_app.py
+4-31 files

FreeNAS/freenas da3c3b6src/middlewared/middlewared/plugins/apps available_apps_info.py

Fix app.latest/app.available models mismatch
DeltaFile
+15-10src/middlewared/middlewared/plugins/apps/available_apps_info.py
+15-101 files

FreeNAS/freenas 0c7ed8fsrc/middlewared/middlewared/plugins/apps upgrade.py app_scale.py

Some more fixes
DeltaFile
+12-5src/middlewared/middlewared/plugins/apps/upgrade.py
+6-2src/middlewared/middlewared/plugins/apps/app_scale.py
+2-2src/middlewared/middlewared/plugins/apps/crud.py
+1-1src/middlewared/middlewared/plugins/apps/rollback.py
+1-1src/middlewared/middlewared/plugins/apps/custom_app_ops.py
+1-1src/middlewared/middlewared/plugins/apps/events.py
+23-121 files not shown
+24-137 files

FreeNAS/freenas ec8596fsrc/middlewared/middlewared/plugins/apps crud.py __init__.py

Minor fixes
DeltaFile
+4-2src/middlewared/middlewared/plugins/apps/crud.py
+5-1src/middlewared/middlewared/plugins/apps/__init__.py
+1-1src/middlewared/middlewared/plugins/apps/custom_app_ops.py
+1-0src/middlewared/middlewared/plugins/apps/ix_volumes.py
+11-44 files

FreeNAS/freenas 07d4222src/middlewared/middlewared event.py, src/middlewared/middlewared/plugins/apps logs.py

Annotate eventsource methods
DeltaFile
+8-8src/middlewared/middlewared/event.py
+1-1src/middlewared/middlewared/plugins/apps/logs.py
+9-92 files

FreeNAS/freenas 6f06629src/middlewared/middlewared/plugins/apps crud.py __init__.py, src/middlewared/middlewared/service base.py crud_service.py

Fix serialization of app.query
DeltaFile
+3-2src/middlewared/middlewared/plugins/apps/crud.py
+2-2src/middlewared/middlewared/plugins/apps/__init__.py
+2-0src/middlewared/middlewared/service/base.py
+1-1src/middlewared/middlewared/service/crud_service.py
+8-54 files

FreeNAS/freenas 4182a12src/middlewared/middlewared/plugins/apps fs_attachments.py port_attachments.py, src/middlewared/middlewared/plugins/catalog apps_details.py

Initial pass at covering app.* internal usages
DeltaFile
+10-11src/middlewared/middlewared/plugins/apps/fs_attachments.py
+6-6src/middlewared/middlewared/plugins/apps/port_attachments.py
+6-6src/middlewared/middlewared/plugins/pool_/dataset_details.py
+4-4src/middlewared/middlewared/plugins/apps/cert_attachments.py
+4-4src/middlewared/middlewared/plugins/docker/config.py
+3-3src/middlewared/middlewared/plugins/catalog/apps_details.py
+33-348 files not shown
+46-4814 files

FreeNAS/freenas e7611e1src/middlewared/middlewared/plugins/apps __init__.py, src/middlewared/middlewared/pytest/unit/api/base test_decorator.py

Allow filterable api method to pass check annotations
DeltaFile
+14-0src/middlewared/middlewared/pytest/unit/api/base/test_decorator.py
+7-3src/middlewared/middlewared/plugins/apps/__init__.py
+9-0src/middlewared/middlewared/pytest/unit/api/handler/accept/test_accept_1.py
+2-0src/middlewared/middlewared/service/decorators.py
+32-34 files

FreeNAS/freenas 053341dsrc/middlewared/middlewared/plugins/apps schema_action_context.py schema_normalization.py

Convert app.schema.actions to be typesafe
DeltaFile
+35-39src/middlewared/middlewared/plugins/apps/schema_action_context.py
+5-1src/middlewared/middlewared/plugins/apps/schema_normalization.py
+40-402 files

FreeNAS/freenas dd7152dsrc/middlewared/middlewared/plugins/apps events.py __init__.py

Convert events to be typesafe
DeltaFile
+11-38src/middlewared/middlewared/plugins/apps/events.py
+29-1src/middlewared/middlewared/plugins/apps/__init__.py
+40-392 files

FreeNAS/freenas b9b4f77src/middlewared/middlewared/api/v27_0_0 app.py, src/middlewared/middlewared/plugins/apps upgrade_old.py upgrade.py

Convert upgrade_summary to typesafe
DeltaFile
+0-64src/middlewared/middlewared/plugins/apps/upgrade_old.py
+36-1src/middlewared/middlewared/plugins/apps/upgrade.py
+10-9src/middlewared/middlewared/plugins/apps/utils.py
+7-3src/middlewared/middlewared/api/v27_0_0/app.py
+9-1src/middlewared/middlewared/plugins/apps/__init__.py
+62-785 files

FreeNAS/freenas 743362esrc/middlewared/middlewared/api/v27_0_0 app.py, src/middlewared/middlewared/plugins/apps pull_images.py __init__.py

Move pull_images methods to be typesafe
DeltaFile
+39-47src/middlewared/middlewared/plugins/apps/pull_images.py
+20-0src/middlewared/middlewared/plugins/apps/__init__.py
+3-1src/middlewared/middlewared/plugins/apps/upgrade.py
+2-1src/middlewared/middlewared/api/v27_0_0/app.py
+64-494 files