[PR #6928] [MERGED] [client] Unify route selection in the route manager #30033

Closed
opened 2026-08-05 08:09:48 -04:00 by saavagebueno · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/netbirdio/netbird/pull/6928
Author: @pappz
Created: 7/27/2026
Status: Merged
Merged: 7/28/2026
Merged by: @pappz

Base: mainHead: fix/unify-route-selection


📝 Commits (4)

  • cc0ab32 [client] Unify route selection in the route manager
  • 7e1b350 [client] Keep exit-node exclusivity on select-all and partial errors
  • 2428757 [client] Cover both invalid-ID orderings in the partial-error test
  • b61ebc9 Merge branch 'main' into fix/unify-route-selection

📊 Changes

9 files changed (+324 additions, -206 deletions)

View changed files

📝 client/android/client.go (+4 -8)
client/android/route_command.go (+0 -70)
📝 client/internal/routemanager/manager.go (+5 -8)
📝 client/internal/routemanager/mock.go (+26 -0)
client/internal/routemanager/selection.go (+138 -0)
client/internal/routemanager/selection_test.go (+129 -0)
📝 client/ios/NetBirdSDK/client.go (+16 -26)
📝 client/server/network.go (+6 -68)
client/server/network_exitnode_test.go (+0 -26)

📄 Description

Describe your changes

Move route select/deselect handling from the daemon server into exported routemanager methods (SelectRoutes, DeselectRoutes, SelectAllRoutes, DeselectAllRoutes) so every consumer shares one implementation: v4/v6 exit-pair expansion, exit-node mutual exclusion, and selection triggering.

Previously the exit-node exclusivity lived only in the daemon's SelectNetworks RPC, so the Android and iOS bindings could leave two exit nodes selected until the next network map reconciliation. Both bindings now call the shared manager methods and enforce exclusivity at toggle time, matching the desktop behavior.

Stack

Checklist

  • Is it a bug fix
  • Is a typo/documentation fix
  • Is a feature enhancement
  • It is a refactor
  • Created tests that fail without the change (if possible)
  • This change does not modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — OR I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See CONTRIBUTING.md.

By submitting this pull request, you confirm that you have read and agree to the terms of the Contributor License Agreement.

Documentation

Select exactly one:

  • I added/updated documentation for this change
  • Documentation is not needed for this change (explain why)

Docs PR URL (required if "docs added" is checked)

Paste the PR link from https://github.com/netbirdio/docs here:

https://github.com/netbirdio/docs/pull/__


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

Summary by CodeRabbit

  • New Features
    • Route selection/deselection is now handled through shared route-manager APIs for both individual routes and “all routes”.
    • Exit-node selections automatically enforce mutual exclusivity while keeping non-exit routes unaffected.
  • Bug Fixes
    • Unknown or unavailable route IDs now return errors, and exclusivity is preserved even when some route IDs fail.
  • Tests
    • Added route-selection tests covering exclusivity (including IPv4/IPv6), select-all behavior, partial errors, and invalid IDs.
  • Refactor / Chores
    • Simplified Android, iOS, and server routing flows to delegate to the shared manager; updated mocks and removed redundant routing command logic/dependencies.

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/netbirdio/netbird/pull/6928 **Author:** [@pappz](https://github.com/pappz) **Created:** 7/27/2026 **Status:** ✅ Merged **Merged:** 7/28/2026 **Merged by:** [@pappz](https://github.com/pappz) **Base:** `main` ← **Head:** `fix/unify-route-selection` --- ### 📝 Commits (4) - [`cc0ab32`](https://github.com/netbirdio/netbird/commit/cc0ab3247def18f2b03218d5f2c21d782fffc7bf) [client] Unify route selection in the route manager - [`7e1b350`](https://github.com/netbirdio/netbird/commit/7e1b35037a7a1f588d365ac4f0ab95a42f3bd480) [client] Keep exit-node exclusivity on select-all and partial errors - [`2428757`](https://github.com/netbirdio/netbird/commit/24287577c8d2204a9792ce474b261e38603e1818) [client] Cover both invalid-ID orderings in the partial-error test - [`b61ebc9`](https://github.com/netbirdio/netbird/commit/b61ebc94a4ff1c574735068cdcd07bab89b75952) Merge branch 'main' into fix/unify-route-selection ### 📊 Changes **9 files changed** (+324 additions, -206 deletions) <details> <summary>View changed files</summary> 📝 `client/android/client.go` (+4 -8) ➖ `client/android/route_command.go` (+0 -70) 📝 `client/internal/routemanager/manager.go` (+5 -8) 📝 `client/internal/routemanager/mock.go` (+26 -0) ➕ `client/internal/routemanager/selection.go` (+138 -0) ➕ `client/internal/routemanager/selection_test.go` (+129 -0) 📝 `client/ios/NetBirdSDK/client.go` (+16 -26) 📝 `client/server/network.go` (+6 -68) ➖ `client/server/network_exitnode_test.go` (+0 -26) </details> ### 📄 Description ## Describe your changes Move route select/deselect handling from the daemon server into exported routemanager methods (SelectRoutes, DeselectRoutes, SelectAllRoutes, DeselectAllRoutes) so every consumer shares one implementation: v4/v6 exit-pair expansion, exit-node mutual exclusion, and selection triggering. Previously the exit-node exclusivity lived only in the daemon's SelectNetworks RPC, so the Android and iOS bindings could leave two exit nodes selected until the next network map reconciliation. Both bindings now call the shared manager methods and enforce exclusivity at toggle time, matching the desktop behavior. ## Issue ticket number and link ## Stack <!-- branch-stack --> ### Checklist - [x] Is it a bug fix - [ ] Is a typo/documentation fix - [ ] Is a feature enhancement - [ ] It is a refactor - [ ] Created tests that fail without the change (if possible) - [ ] This change does **not** modify the public API, gRPC protocols, functionality behavior, CLI / service flags, or introduce a new feature — **OR** I have discussed it with the NetBird team beforehand (link the issue / Slack thread in the description). See [CONTRIBUTING.md](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTING.md#discuss-changes-with-the-netbird-team-first). > By submitting this pull request, you confirm that you have read and agree to the terms of the [Contributor License Agreement](https://github.com/netbirdio/netbird/blob/main/CONTRIBUTOR_LICENSE_AGREEMENT.md). ## Documentation Select exactly one: - [ ] I added/updated documentation for this change - [x] Documentation is **not needed** for this change (explain why) ### Docs PR URL (required if "docs added" is checked) Paste the PR link from https://github.com/netbirdio/docs here: https://github.com/netbirdio/docs/pull/__ <!-- codesmith:footer --> --- <a href="https://app.blacksmith.sh/netbirdio/codesmith/netbird/pr/6928"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-light-v2.svg"><img alt="View with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v2.svg"></picture></a> <a href="https://backend.blacksmith.sh/track/enable-autofix?expires=1787772098&installation_model_id=427504&pr_number=6928&repository=netbirdio%2Fnetbird&return_to=https%3A%2F%2Fgithub.com%2Fnetbirdio%2Fnetbird%2Fpull%2F6928&signature=31ad59e1483e1582cd447a8db2fe21e5309230e631cbd0cad0f977cd15fb7b9b"><picture><source media="(prefers-color-scheme: dark)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"><source media="(prefers-color-scheme: light)" srcset="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-light.svg"><img alt="Autofix with [code]smith" src="https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark.svg"></picture></a> <sup>Need help on this PR? Tag <code>@codesmith-bot</code> with what you need. Autofix is disabled.</sup> <!-- codesmith:autofix:disabled --> <!-- /codesmith:footer --> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **New Features** * Route selection/deselection is now handled through shared route-manager APIs for both individual routes and “all routes”. * Exit-node selections automatically enforce mutual exclusivity while keeping non-exit routes unaffected. * **Bug Fixes** * Unknown or unavailable route IDs now return errors, and exclusivity is preserved even when some route IDs fail. * **Tests** * Added route-selection tests covering exclusivity (including IPv4/IPv6), select-all behavior, partial errors, and invalid IDs. * **Refactor / Chores** * Simplified Android, iOS, and server routing flows to delegate to the shared manager; updated mocks and removed redundant routing command logic/dependencies. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
saavagebueno added the pull-request label 2026-08-05 08:09:48 -04:00
Sign in to join this conversation.
No Label pull-request
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: DYNR/netbird#30033