FreeNAS/freenas 54fd327 — src/middlewared/middlewared/plugins/container crud.py, src/middlewared/middlewared/plugins/filesystem_ acl.py

Consolidate internal dataset checks

## Problem
Three separate checks decided whether a dataset was internal and they disagreed. `has_internal_path` matched the top-level child exactly, `is_internal_dataset_name` used a substring match and was the only one aware of `.truenas_containers`, and `internal_datasets_filters` used its own substring filters with a trailing slash that missed `ix-applications` itself. As a result user datasets like `tank/ix-apps-old` were hidden and refused, creates under `.truenas_containers` left orphans that could not be deleted, destroying such datasets skipped key cleanup and leaked encryption key rows, container datasets could be destroyed or rolled back through `zfs.resource`/`pool.snapshot`, legacy `ix-applications` could not be deleted, and filesystem permission calls and local replication targets accepted internal datasets.

## Solution
- **Single source of truth**: `has_internal_path` is now the only check. `.truenas_containers` is internal, legacy `ix-applications` is visible at the top level only so users can delete it, and the substring-based checks are removed. ZFS destroy events use the same check, which fixes the key row leak.
- **Containers**: container create, image pull, rename and migration pass `bypass` for their writes. `zfs.resource.rename` gains a private `bypass` field for this, and the image clone goes through the public `zfs.resource.snapshot.clone` so the rootfs still gets mounted.
- **Pool import**: the container dataset mountpoint repair queries the dataset by explicit path since it no longer shows up in the root listing.
- **Snapshot tasks**: existing tasks on now hidden datasets stay editable as long as the dataset is unchanged.
- **Guards**: `filesystem.setperm`, `chown`, `setacl` and `mkdir` refuse paths backed by internal datasets when called over the API, while internal callers such as app ix-volume ACLs keep working. Replication tasks refuse local targets inside internal datasets.
DeltaFile
+18-17src/middlewared/middlewared/plugins/pool_/import_pool.py
+22-1tests/api2/test_apps.py
+2-20src/middlewared/middlewared/plugins/pool_/dataset.py
+16-6src/middlewared/middlewared/plugins/filesystem_/acl.py
+18-0src/middlewared/middlewared/pytest/unit/plugins/zfs/test_has_internal_path.py
+8-8src/middlewared/middlewared/plugins/container/crud.py
+84-5218 files not shown
+167-9424 files

FreeNAS/freenas c11b262 — src/middlewared/middlewared/api/v28_0_0 acl.py, src/middlewared/middlewared/plugins/filesystem_ acl.py

Use an explicit bypass option for filesystem.setacl

## Problem
The internal dataset guard on `filesystem.setacl` was skipped for any internal caller by inferring it from `app is None` via `pass_app`, which made the exemption implicit.

## Solution
Added a private `bypass` field to `FilesystemSetAclOptions` and use it to skip the guard instead. `add_to_acl` passes it for app ix-volume ACLs, and `setacl` no longer needs `pass_app`.
DeltaFile
+6-4src/middlewared/middlewared/plugins/filesystem_/acl.py
+6-0src/middlewared/middlewared/api/v28_0_0/acl.py
+12-42 files

FreeNAS/freenas fc4effe — src/middlewared/middlewared/api/v28_0_0 acl.py, src/middlewared/middlewared/plugins/filesystem_ acl.py

Use an explicit bypass option for filesystem.setacl

## Problem
The internal dataset guard on `filesystem.setacl` was skipped for any internal caller by inferring it from `app is None` via `pass_app`, which made the exemption implicit.

## Solution
Added a private `bypass` field to `FilesystemSetAclOptions` and use it to skip the guard instead. `add_to_acl` passes it for app ix-volume ACLs, and `setacl` no longer needs `pass_app`.
DeltaFile
+6-4src/middlewared/middlewared/plugins/filesystem_/acl.py
+6-0src/middlewared/middlewared/api/v28_0_0/acl.py
+12-42 files

FreeNAS/freenas 045fddf — src/middlewared/middlewared/common/attachment __init__.py, src/middlewared/middlewared/plugins truesearch.py smb.py

Stop share deletes and attachment queries from extending every share row
DeltaFile
+96-0src/middlewared/middlewared/pytest/unit/plugins/test_crud_extend_context_select.py
+26-14src/middlewared/middlewared/plugins/smb.py
+16-8src/middlewared/middlewared/service/crud_service.py
+18-6src/middlewared/middlewared/common/attachment/__init__.py
+23-0src/middlewared/middlewared/utils/filter_list.py
+7-8src/middlewared/middlewared/plugins/truesearch.py
+186-365 files not shown
+212-4711 files

FreeNAS/freenas d1543ec — src/middlewared/middlewared/pytest/unit/plugins/failover test_push_license_if_newer.py, src/middlewared/middlewared/pytest/unit/plugins/kmip test_sync.py

Trim license delegate unit tests to the essentials

This commit makes some changes where the license rework tests are cut down to the few that guard severe regressions (missing delegates, stopped services or non-autostart VMs being started, TNC reverting a newer license, DS auth lockout) and drops the mock-heavy HA, propagation and per-feature edge case tests.
DeltaFile
+19-195src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_delegates.py
+23-127src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_upload.py
+0-109src/middlewared/middlewared/pytest/unit/plugins/kmip/test_sync.py
+0-62src/middlewared/middlewared/pytest/unit/plugins/failover/test_push_license_if_newer.py
+0-39src/middlewared/middlewared/pytest/unit/plugins/vm/test_stop_active.py
+0-33src/middlewared/middlewared/pytest/unit/plugins/pool/test_update_all_sed_attr.py
+42-5657 files not shown
+52-69113 files

FreeNAS/freenas eb8f742 — src/middlewared/middlewared/plugins account.py, src/middlewared/middlewared/plugins/account_ privilege.py group_obj.py

Convert `group` plugin to new style
DeltaFile
+59-708src/middlewared/middlewared/plugins/account.py
+399-0src/middlewared/middlewared/plugins/account_/group_crud.py
+245-0src/middlewared/middlewared/plugins/account_/group_validate.py
+148-0src/middlewared/middlewared/plugins/account_/group.py
+123-0src/middlewared/middlewared/plugins/account_/group_obj.py
+37-32src/middlewared/middlewared/plugins/account_/privilege.py
+1,011-74030 files not shown
+1,317-96936 files

FreeNAS/freenas f27cbd5 — src/middlewared/middlewared/plugins/kmip zfs_keys.py __init__.py, src/middlewared/middlewared/pytest/unit/plugins/kmip test_sync.py

Simplify KMIP key pull on license revoke

This commit makes some changes where pulling KMIP keys back clears kmip_uid as soon as the key is saved locally again, with destroying the server copy staying best-effort. The escrowed key count is dropped in favour of reporting a pending revoke whenever keys are still waiting to be pulled back, and sync_keys goes back to just starting the sync jobs.

The KMIP license delegate now starts the ZFS and SED sync jobs together and waits on both, so a failing ZFS sync no longer stops the SED keys from being pulled back and every failure is reported in a single error.
DeltaFile
+12-42src/middlewared/middlewared/pytest/unit/plugins/kmip/test_sync.py
+23-27tests/api2/test_kmip.py
+2-31src/middlewared/middlewared/plugins/kmip/sync.py
+10-11src/middlewared/middlewared/plugins/kmip/sed_keys.py
+9-9src/middlewared/middlewared/plugins/kmip/__init__.py
+4-8src/middlewared/middlewared/plugins/kmip/zfs_keys.py
+60-1283 files not shown
+62-1409 files

FreeNAS/freenas d368dec — src/middlewared/middlewared/plugins/kmip __init__.py zfs_keys.py, src/middlewared/middlewared/pytest/unit/plugins/kmip test_sync.py

Simplify KMIP key pull on license revoke

This commit makes some changes where pulling KMIP keys back clears kmip_uid as soon as the key is saved locally again, with destroying the server copy staying best-effort. The escrowed key count is dropped in favour of reporting a pending revoke whenever keys are still waiting to be pulled back, and sync_keys goes back to just starting the sync jobs.
DeltaFile
+22-25tests/api2/test_kmip.py
+0-42src/middlewared/middlewared/pytest/unit/plugins/kmip/test_sync.py
+2-31src/middlewared/middlewared/plugins/kmip/sync.py
+10-11src/middlewared/middlewared/plugins/kmip/sed_keys.py
+4-8src/middlewared/middlewared/plugins/kmip/zfs_keys.py
+3-6src/middlewared/middlewared/plugins/kmip/__init__.py
+41-1232 files not shown
+41-1348 files

FreeNAS/freenas 282b3bb — src/middlewared/middlewared/plugins/kmip sed_keys.py sync.py, src/middlewared/middlewared/plugins/truenas license.py

Stop working around license daemon errors

This commit makes some changes where license entitlement snapshots, the unlicensed features alert and the KMIP key sync no longer special-case a license daemon that cannot answer. A down daemon now reads as no license everywhere except the upload path, which still refuses because it cannot validate the license without the daemon; this means a KMIP sync during a daemon outage pulls keys back locally until the next sync after it recovers.
DeltaFile
+1-31src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_delegates.py
+9-19src/middlewared/middlewared/pytest/unit/plugins/kmip/test_sync.py
+3-14src/middlewared/middlewared/plugins/kmip/connection.py
+0-14src/middlewared/middlewared/plugins/truenas/license.py
+1-11src/middlewared/middlewared/plugins/kmip/sync.py
+1-8src/middlewared/middlewared/plugins/kmip/sed_keys.py
+15-972 files not shown
+17-1068 files

FreeNAS/freenas 8850e08 — src/middlewared/middlewared/common/license __init__.py, src/middlewared/middlewared/plugins/truenas license.py

Rework how license changes are applied

This PR adds changes to replace the license reconcile delegates and the post_license_update hook with a single apply path driven by the entitlement matrix. Every install path (upload, TNC heartbeat, HA peer propagation, legacy sync) snapshots entitlements before and after the change, diffs them and runs only the delegates of the features that actually flipped, so unaffected services are no longer reloaded/restarted on every license change.

Delegates are defined next to their plugins on top of a small base (converge, workload and custom kinds) which owns the service control flags, running/active node checks and failure reporting. Revoking a feature now revokes running functionality as well: VMs and containers are shut down (autostart ones come back on re-grant), docker is stopped while keeping its pool, webshare is stopped and masked, NFS snapshot exposure and DS auth are gated at render time (DS auth is left alone if no usable local admin exists), FC/RDMA targets are converged and KMIP keys are pulled back locally. STIG/FIPS, dedup, NVMe-oF SPDK and network FEC are alert-only. A single alert lists features which are not licensed but still in use, including revokes which did not complete.

On HA, uploads are refused on the standby, during failover and when they would drop HA on a configured pair, and the newer license is pushed to the peer when it reconnects. The pending changes are journalled in /run so a middlewared restart between install and apply does not lose them.
DeltaFile
+326-27src/middlewared/middlewared/plugins/truenas/license.py
+289-0src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_delegates.py
+0-200src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_reconcile.py
+169-0src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_upload.py
+148-0src/middlewared/middlewared/pytest/unit/plugins/kmip/test_sync.py
+137-0src/middlewared/middlewared/common/license/__init__.py
+1,069-22774 files not shown
+2,175-81780 files

FreeNAS/freenas 3acfc50 — src/middlewared/middlewared/common/license __init__.py, src/middlewared/middlewared/plugins failover.py

Address review findings in license apply rework

This commit fixes the issues found while reviewing the license apply rework: KMIP now resolves its push/pull direction through the entitlement check so a daemon blip never pulls keys and the integration tests exercise the real path, the KMIP tests expect escrow references to be kept when the server is unreachable, HA delegate steps are isolated from each other, the remote client cannot be started twice on a first HA license, and the apply/journal replay paths no longer race the upload lock.

An admin's explicit upload on the active node is now authoritative. It is propagated through a private endpoint which skips the stale/test license refusals on the standby and a marker keeps the reconnect push from reverting it until the peer has accepted it. TNC and reconnect deliveries keep those refusals.
DeltaFile
+118-85src/middlewared/middlewared/plugins/truenas/license.py
+32-32src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_upload.py
+25-22tests/api2/test_kmip.py
+16-28src/middlewared/middlewared/plugins/failover.py
+22-19src/middlewared/middlewared/common/license/__init__.py
+11-12src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_delegates.py
+224-19820 files not shown
+286-22726 files

FreeNAS/freenas da3e38d — src/middlewared/middlewared/alert/source license_usage.py, src/middlewared/middlewared/plugins/container lifecycle.py

Simplify license delegate active check and usage alert

This commit makes some changes where license delegates decided whether the node is the active controller by reading failover.status.get_local and the VIP rows themselves; they now use the existing failover.is_single_master_node check, same as the TNC heartbeat.

It also turns the unlicensed features in use alert from a 10 minute polling source into a one-shot alert that is evaluated at the end of truenas.license.apply, once at system.ready on the active node and when a node becomes master, since gates already block new use of unlicensed features so the list can only shrink between license changes. A license daemon error still leaves the existing alert untouched.

VM and container updates are gated by the license again without carving out autostart-only edits, since an autostart instance coming back on a re-grant is what autostart means and the admin can change it once licensed.

Stopping active VMs and containers is simplified as well. The libvirt reachability probe, the resume-before-stop of suspended instances and the extra private endpoints are gone; a suspended VM is powered off and a suspended container killed, shutdown and failover call stop_active directly, and the pool import license guard for containers is dropped since container.start already refuses when unlicensed.
DeltaFile
+40-25src/middlewared/middlewared/pytest/unit/plugins/truenas/test_license_delegates.py
+10-39src/middlewared/middlewared/pytest/unit/plugins/vm/test_stop_active.py
+5-39src/middlewared/middlewared/plugins/container/lifecycle.py
+39-2src/middlewared/middlewared/plugins/truenas/license.py
+6-33src/middlewared/middlewared/plugins/vm/lifecycle.py
+4-34src/middlewared/middlewared/alert/source/license_usage.py
+104-17211 files not shown
+127-23317 files

FreeNAS/freenas 09947a4 — src/middlewared/middlewared/plugins/iscsi_ alua.py extents.py, src/middlewared/middlewared/utils/lio config.py

Add middleware support for LIO ALUA HA

Wire up the middleware side of LIO ALUA high-availability: load
lio_ha.ko with per-node addresses on service start, manage ALUA
state across failover events, clean up STANDBY configfs on pool
export, and add pre-flight validation that targets have static
initiator ACLs before ALUA can be enabled.

For each target, create a portal-less phantom TPG carrying the peer
node's controller group so that a single RTPG response from any
connected port lists both ALUA groups.  Write tpgt_N/rtpi explicitly
before enable so that relative target port IDs in RTPG match the
tag formula (portal.tag on Node A, portal.tag + 32000 on Node B)
rather than being auto-assigned sequentially by the kernel.

ALUA group states are driven by role and ha_state:

  MASTER  + synced        local=OPTIMIZED     remote=NONOPTIMIZED
  MASTER  + connected     local=OPTIMIZED     remote=TRANSITIONING

    [4 lines not shown]
DeltaFile
+541-135src/middlewared/middlewared/utils/lio/config.py
+214-2src/middlewared/middlewared/plugins/iscsi_/lio.py
+87-71src/middlewared/middlewared/plugins/iscsi_/fs_attachment_delegate.py
+89-58src/middlewared/middlewared/plugins/iscsi_/target_to_extent.py
+59-47src/middlewared/middlewared/plugins/iscsi_/extents.py
+62-9src/middlewared/middlewared/plugins/iscsi_/alua.py
+1,052-3228 files not shown
+1,236-37114 files

FreeNAS/freenas ac2c3ce — tests/protocols __init__.py iscsi_proto.py

Add context_params to iscsi_scsi_connect()

Pass an optional context_params dict through to python-scsi's
init_device(), so a test can set pre-login iscsi.Context options such
as an explicit ISID.  context_params_supported() lets callers skip when
the installed python-scsi predates it.

Also ruff.
DeltaFile
+41-6tests/protocols/iscsi_proto.py
+8-1tests/protocols/__init__.py
+49-72 files

FreeNAS/freenas d783861 — src/middlewared/middlewared/api/v28_0_0 iscsi_global.py

Allow iSCSI mode=2
DeltaFile
+1-1src/middlewared/middlewared/api/v28_0_0/iscsi_global.py
+1-11 files

FreeNAS/freenas 05d5e61 — src/middlewared/middlewared/plugins/iscsi_ lio.py

Update how we tell LIO that an extent has resized.
DeltaFile
+2-2src/middlewared/middlewared/plugins/iscsi_/lio.py
+2-21 files

FreeNAS/freenas 005a496 — tests/api2 test_zpool_scrub.py

NAS-144543 / 28.0.0-BETA.1 / Fix flaky scrub alert (by themylogin) (#20027)

Sometimes scrub finished before even have the time to see the alert. We
need to listen for `alert.query` events to see when it appears.

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

Co-authored-by: themylogin <themylogin at gmail.com>
DeltaFile
+25-38tests/api2/test_zpool_scrub.py
+25-381 files

FreeNAS/freenas ee3c1e3 — src/middlewared/middlewared/plugins nfs.py, src/middlewared/middlewared/plugins/nfs_ share.py share_hosts.py

NAS-144497 / 28.0.0-BETA.1 / Convert `sharing.nfs` to new style (#20015)
DeltaFile
+0-601src/middlewared/middlewared/plugins/nfs.py
+239-0src/middlewared/middlewared/plugins/nfs_/share_validate.py
+201-0src/middlewared/middlewared/plugins/nfs_/share_hosts.py
+149-32tests/api2/test_300_nfs.py
+111-0src/middlewared/middlewared/plugins/nfs_/share.py
+44-61src/middlewared/middlewared/pytest/unit/plugins/test_nfs.py
+744-69420 files not shown
+1,129-75926 files

FreeNAS/freenas e4c429a — tests/api2 test_zpool_scrub.py

NAS-144543 / 27.0.0 / Fix flaky scrub alert (#20026)

Sometimes scrub finished before even have the time to see the alert. We
need to listen for `alert.query` events to see when it appears.
DeltaFile
+25-38tests/api2/test_zpool_scrub.py
+25-381 files

FreeNAS/freenas fa2451a — tests/api2 test_legacy_api.py

NAS-144542 / 27.0.0 / Skip 25.04 filterable method tests (#20025)

They never worked. The only reason this doesn't fail in 28 is because
we've removed 25.04 from 28.

Co-authored-by: Claude Opus 5 (1M context) <noreply at anthropic.com>
DeltaFile
+15-1tests/api2/test_legacy_api.py
+15-11 files

FreeNAS/freenas 59642d0 — src/middlewared/middlewared/plugins/container crud.py, src/middlewared/middlewared/plugins/filesystem_ acl.py

Consolidate internal dataset checks

## Problem
Three separate checks decided whether a dataset was internal and they disagreed. `has_internal_path` matched the top-level child exactly, `is_internal_dataset_name` used a substring match and was the only one aware of `.truenas_containers`, and `internal_datasets_filters` used its own substring filters with a trailing slash that missed `ix-applications` itself. As a result user datasets like `tank/ix-apps-old` were hidden and refused, creates under `.truenas_containers` left orphans that could not be deleted, destroying such datasets skipped key cleanup and leaked encryption key rows, container datasets could be destroyed or rolled back through `zfs.resource`/`pool.snapshot`, legacy `ix-applications` could not be deleted, and filesystem permission calls and local replication targets accepted internal datasets.

## Solution
- **Single source of truth**: `has_internal_path` is now the only check. `.truenas_containers` is internal, legacy `ix-applications` is visible at the top level only so users can delete it, and the substring-based checks are removed. ZFS destroy events use the same check, which fixes the key row leak.
- **Containers**: container create, image pull, rename and migration pass `bypass` for their writes. `zfs.resource.rename` gains a private `bypass` field for this, and the image clone goes through the public `zfs.resource.snapshot.clone` so the rootfs still gets mounted.
- **Pool import**: the container dataset mountpoint repair queries the dataset by explicit path since it no longer shows up in the root listing.
- **Snapshot tasks**: existing tasks on now hidden datasets stay editable as long as the dataset is unchanged.
- **Guards**: `filesystem.setperm`, `chown`, `setacl` and `mkdir` refuse paths backed by internal datasets when called over the API, while internal callers such as app ix-volume ACLs keep working. Replication tasks refuse local targets inside internal datasets.
DeltaFile
+18-17src/middlewared/middlewared/plugins/pool_/import_pool.py
+22-1tests/api2/test_apps.py
+2-20src/middlewared/middlewared/plugins/pool_/dataset.py
+16-6src/middlewared/middlewared/plugins/filesystem_/acl.py
+18-0src/middlewared/middlewared/pytest/unit/plugins/zfs/test_has_internal_path.py
+8-8src/middlewared/middlewared/plugins/container/crud.py
+84-5218 files not shown
+167-9424 files

FreeNAS/freenas 18ab86c — src/middlewared/middlewared/plugins/kmip zfs_keys.py, tests/api2 test_kmip.py

NAS-144559 / 28.0.0-BETA.1 / Fix KMIP ZFS key sync with nested encryption roots (#20028)

## Problem
`get_encrypted_datasets` queried `zfs.resource` with
`get_children=True`, which rejects overlapping paths. Nested
key-encrypted roots (e.g. a key-encrypted pool root plus a child created
with its own key) are a normal layout, so every full push and pull of
ZFS keys failed with a validation error, leaving keys stuck on the KMIP
server and breaking server changes. Separately, push and pull pruned the
in-memory key cache down to the filtered database rows instead of the
datasets that exist, so the scoped push that runs whenever a
key-encrypted dataset is created or has its key changed evicted every
other KMIP-managed key from memory.

## Solution
Check existence by querying the exact paths without `get_children`, and
prune the cache only of keys whose dataset no longer exists in ZFS.
Pruning pops entries in place so concurrent sync jobs don't drop each
other's keys. The KMIP push/pull integration test now covers a nested
encryption root and checks the cache survives a scoped push.
DeltaFile
+20-19src/middlewared/middlewared/plugins/kmip/zfs_keys.py
+20-6tests/api2/test_kmip.py
+40-252 files

FreeNAS/freenas 2129457 — src/middlewared/middlewared/plugins/kmip zfs_keys.py, tests/api2 test_kmip.py

Fix KMIP ZFS key sync with nested encryption roots

## Problem
`get_encrypted_datasets` queried `zfs.resource` with `get_children=True`, which rejects overlapping paths. Nested key-encrypted roots (e.g. a key-encrypted pool root plus a child created with its own key) are a normal layout, so every full push and pull of ZFS keys failed with a validation error, leaving keys stuck on the KMIP server and breaking server changes. Separately, push and pull pruned the in-memory key cache down to the filtered database rows instead of the datasets that exist, so the scoped push that runs whenever a key-encrypted dataset is created or has its key changed evicted every other KMIP-managed key from memory.

## Solution
Check existence by querying the exact paths without `get_children`, and prune the cache only of keys whose dataset no longer exists in ZFS. Pruning pops entries in place so concurrent sync jobs don't drop each other's keys. The KMIP push/pull integration test now covers a nested encryption root and checks the cache survives a scoped push.
DeltaFile
+20-19src/middlewared/middlewared/plugins/kmip/zfs_keys.py
+20-6tests/api2/test_kmip.py
+40-252 files

FreeNAS/freenas c39ba72 — src/middlewared/middlewared/api/v28_0_0 zfs_resource_snapshot.py, src/middlewared/middlewared/plugins/pool_ snapshot.py

NAS-144430 / 28.0.0-BETA.1 / Standardize zfs.resource.snapshot on the zfs.resource design (#20017)

## Problem
`zfs.resource.snapshot` only partly followed the design `zfs.resource`
settled on. It still exposed `query` instead of `list`, raised on
missing paths, emitted no events, took clone properties as an untyped
dict passed straight to libzfs (so user properties failed and
internal-only properties like `mountpoint` were reachable through
clone), had no `force` acknowledgement on rename, keyed most validation
errors on the bare method name, and had several wrong descriptions.
Separately, the ZFS history hook ran the whole dataset-delete path for
every snapshot destroy, sending bogus `pool.dataset.query` REMOVED
events and, on HA, syncing encryption keys to the standby once per
destroyed snapshot. `pool.snapshot.update` silently did nothing.

## Solution
- **list**: added `zfs.resource.snapshot.list`; `query` stays as a
hidden alias for pre-v28 clients and `query_impl` is now `list_impl`.
list, query and count skip a named path that does not exist; a path

    [31 lines not shown]
DeltaFile
+0-423tests/api2/test_zfs_resource_snapshot_query.py
+413-0tests/api2/test_zfs_resource_snapshot_list.py
+207-86src/middlewared/middlewared/plugins/zfs/snapshot_ops.py
+163-86src/middlewared/middlewared/plugins/zfs/snapshot.py
+159-41src/middlewared/middlewared/api/v28_0_0/zfs_resource_snapshot.py
+93-53src/middlewared/middlewared/plugins/pool_/snapshot.py
+1,035-68941 files not shown
+1,357-88647 files

FreeNAS/freenas 1470f6c — tests/api2/zfs_tier test_shares.py

Merge branch 'sharing-nfs-mypy' of github.com:truenas/middleware into sharing-nfs-mypy
DeltaFile
+0-11tests/api2/zfs_tier/test_shares.py
+0-111 files

FreeNAS/freenas adc34f7 — src/middlewared/middlewared/alert/source nfs_host.py, src/middlewared/middlewared/migration 0021_nfs_share_alerts.py

Fix NFS share alerts
DeltaFile
+70-0tests/api2/test_300_nfs.py
+37-0src/middlewared/middlewared/plugins/nfs_/share_alerts.py
+27-7src/middlewared/middlewared/alert/source/nfs_host.py
+4-26src/middlewared/middlewared/plugins/nfs_/share_validate.py
+16-0src/middlewared/middlewared/migration/0021_nfs_share_alerts.py
+4-8src/middlewared/middlewared/plugins/nfs_/share_crud.py
+158-411 files not shown
+164-417 files

FreeNAS/freenas 65123dd — src/middlewared/middlewared/test/integration/assets iscsi.py, tests/api2 test_usage_reporting.py

Usage share reporting tests
DeltaFile
+84-1tests/api2/test_usage_reporting.py
+10-0src/middlewared/middlewared/test/integration/assets/iscsi.py
+94-12 files

FreeNAS/freenas 8bbd230 — src/middlewared/middlewared/etc_files exports.mako, src/middlewared/middlewared/plugins/usage gather.py

Address review
DeltaFile
+27-8src/middlewared/middlewared/service/sharing_task_service_part.py
+8-13src/middlewared/middlewared/service/sharing_service.py
+1-1src/middlewared/middlewared/plugins/usage/gather.py
+1-1src/middlewared/middlewared/etc_files/exports.mako
+37-234 files

FreeNAS/freenas 042dc2e — tests/api2 test_zpool_scrub.py

Fix flaky scrub alert

(cherry picked from commit bad493d177fed69a6ef9e60ae77f7f9321321cd4)
DeltaFile
+25-38tests/api2/test_zpool_scrub.py
+25-381 files

FreeNAS/freenas bad493d — tests/api2 test_zpool_scrub.py

Fix flaky scrub alert
DeltaFile
+25-38tests/api2/test_zpool_scrub.py
+25-381 files