[management] Add support for pagination in GetAllPeers call (#8190)

* use libopenapi OpenAPI generator

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* added a handler for v1alpha1/peers

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* wire up request validator

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* wired up spec-based validation

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* use sync validation; set base url to v1alpha1

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* moved stuff around, extracted runtime libopenapu deps into runtime_tooling

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* testing /peers path params

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* fixed tests

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* added user schemas and paths

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* use api validation in tests

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* post-merge fixes

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* deleted tmp command used to test validator integration

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* require request body in post/put requests in order to force validation

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* making linter happy

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* switch to api/v1alpha1

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* go mod tidy

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* keep the original order of middleware: metrics, cors, then auth

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* return 422 on validation errors

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* cleanups

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* more cleanups

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* v1alpha1 spec cleanups

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* no need for a double-pointer

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* more linter fixes

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* removed more double pointers

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* use di to inject api_v0 and api_v1 http routers

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* do not re-add middleware on repeated call to ApiHandler

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* support for pagination and filtering in /peers call

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* calling ApiRouter() now also calls ApiV1Router()

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* adding peer filters

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* introduced paginated GetAllPeers call

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* wire up pagination

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* convert pagination state to query scope

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* peer filter wip

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* implemented peer filter

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* test for filtering by os

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* support for sorting of peers

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* support for ordering + tests

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* more tests

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* wire up total number of records in paginated GetAllPeers call

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* cleaned up GetAllPeers response

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* pacify linter

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* cleanups and fixes

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* moar cleanups

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* pacify linter

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* remove duplicated test

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* make linter happy

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* moving GetAllPeersPaginated to peer manager, p. 1

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* moving GetAllPeersPaginated to peer manager, p. 2

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* added peer manager tests for GetPeersPaginated

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* order peers in GetAccountPeersPaginated by their ids by default

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* always order by peer_id, filter out proxies

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* fixed broken tests

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* support for filtering of peers by peer_id in GetAllPeers()

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* filtering by peer_ids

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* use lowercase in 'like' queries, drop ordering by ip

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* drop sort_by ip key

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* drop forced_approve filter

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* replace mac with darwin in peer os filter

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* fix peers query parameter: use peer_ids

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* fixed broken peer_test

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

* responded to feedback

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>

---------

Signed-off-by: Dmitri Dolguikh <dmitri.external@netbird.io>
This commit is contained in:
dmitri-netbird
2026-10-19 22:19:39 +02:00
committed by GitHub
parent 36fe467aba
commit 8fef487e42
24 changed files with 1571 additions and 230 deletions
+94 -22
View File
@@ -150,22 +150,30 @@ components:
description: A human-readable error message.
example: "couldn't parse JSON request"
PeerBatch:
allOf:
- $ref: '#/components/schemas/Peer'
- type: object
properties:
created_at:
description: Peer creation date (UTC)
type: string
format: date-time
example: "2023-05-05T09:00:35.477782Z"
accessible_peers_count:
description: Number of accessible peers
type: integer
example: 5
required:
- created_at
- accessible_peers_count
type: object
properties:
peer_count:
description: Total number of peers
type: integer
example: 5
page:
description: Current page number
type: integer
example: 5
page_size:
description: Page size
type: integer
example: 5
peers:
description: List of peers
type: array
items:
$ref: '#/components/schemas/Peer'
required:
- peer_count
- page
- page_size
- peers
PeerMinimum:
type: object
properties:
@@ -701,6 +709,30 @@ components:
minimum: 1
maximum: 250
default: 100
- name: user_id
in: query
description: filter peers by their user_id
required: false
schema:
type: string
- name: group_ids
in: query
description: filter peers by group_ids
required: false
schema:
type: array
items:
type: string
- name: peer_ids
in: query
description: filter peers by their ids
required: false
schema:
type: array
minItems: 1
maxItems: 50
items:
type: string
- name: connected
in: query
description: Filter by peer connected status
@@ -724,16 +756,58 @@ components:
enum:
- linux
- windows
- mac
- darwin
- android
- ios
- js
- name: search
- name: ip
in: query
description: filter peers by name, dns_label, ip, os, version, serial_number, owner name, owner email, group names, mac
description: filter peers by ip
required: false
schema:
type: string
- name: mac
in: query
description: filter peers by mac address
required: false
schema:
type: string
- name: name
in: query
description: filter peers by hostname
required: false
schema:
type: string
- name: hostname
in: query
description: filter peers by hostname
required: false
schema:
type: string
- name: kind
in: query
description: filter peers by host kind
required: false
schema:
type: string
enum:
- server
- user_device
- name: sort_by
in: query
description: sorting of peers
required: false
example: sort_by=name,asc&sort_by=last_seen,desc&sort_by=version
schema:
type: array
items:
type: string
enum:
- name
- last_seen
- version
- asc
- desc
security:
- BearerAuth: []
- TokenAuth: []
@@ -743,9 +817,7 @@ components:
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/PeerBatch'
$ref: '#/components/schemas/PeerBatch'
'400':
"$ref": "#/components/responses/bad_request"
'401':
@@ -239,19 +239,27 @@ components:
type: boolean
example: false
PeerBatch:
allOf:
- $ref: '#/components/schemas/Peer'
- type: object
properties:
created_at:
description: Peer creation date (UTC)
type: string
format: date-time
example: "2023-05-05T09:00:35.477782Z"
accessible_peers_count:
description: Number of accessible peers
type: integer
example: 5
required:
- created_at
- accessible_peers_count
type: object
properties:
peer_count:
description: Total number of peers
type: integer
example: 5
page:
description: Current page number
type: integer
example: 5
page_size:
description: Page size
type: integer
example: 5
peers:
description: List of peers
type: array
items:
$ref: '#/components/schemas/Peer'
required:
- peer_count
- page
- page_size
- peers
@@ -20,6 +20,30 @@ get:
minimum: 1
maximum: 250
default: 100
- name: user_id
in: query
description: filter peers by their user_id
required: false
schema:
type: string
- name: group_ids
in: query
description: filter peers by group_ids
required: false
schema:
type: array
items:
type: string
- name: peer_ids
in: query
description: filter peers by their ids
required: false
schema:
type: array
minItems: 1
maxItems: 50
items:
type: string
- name: connected
in: query
description: Filter by peer connected status
@@ -43,16 +67,58 @@ get:
enum:
- linux
- windows
- mac
- darwin
- android
- ios
- js
- name: search
- name: ip
in: query
description: filter peers by name, dns_label, ip, os, version, serial_number, owner name, owner email, group names, mac
description: filter peers by ip
required: false
schema:
type: string
- name: mac
in: query
description: filter peers by mac address
required: false
schema:
type: string
- name: name
in: query
description: filter peers by hostname
required: false
schema:
type: string
- name: hostname
in: query
description: filter peers by hostname
required: false
schema:
type: string
- name: kind
in: query
description: filter peers by host kind
required: false
schema:
type: string
enum:
- server
- user_device
- name: sort_by
in: query
description: sorting of peers
required: false
example: sort_by=name,asc&sort_by=last_seen,desc&sort_by=version
schema:
type: array
items:
type: string
enum:
- name
- last_seen
- version
- asc
- desc
security:
- BearerAuth: [ ]
- TokenAuth: [ ]
@@ -62,9 +128,7 @@ get:
content:
application/json:
schema:
type: array
items:
$ref: './components.yaml#/components/schemas/PeerBatch'
$ref: './components.yaml#/components/schemas/PeerBatch'
'400':
"$ref": "../openapi.yaml#/components/responses/bad_request"
'401':
@@ -41,13 +41,17 @@ type ErrorResponse struct {
}
type PeerBatch struct {
Peer
// CreatedAt Peer creation date (UTC).
// CreatedAt example value is defined in the OpenAPI schema.
CreatedAt time.Time `json:"created_at"`
// AccessiblePeersCount Number of accessible peers.
// AccessiblePeersCount example value is defined in the OpenAPI schema.
AccessiblePeersCount int `json:"accessible_peers_count"`
// PeerCount Total number of peers.
// PeerCount example value is defined in the OpenAPI schema.
PeerCount int `json:"peer_count"`
// Page Current page number.
// Page example value is defined in the OpenAPI schema.
Page int `json:"page"`
// PageSize Page size.
// PageSize example value is defined in the OpenAPI schema.
PageSize int `json:"page_size"`
// Peers List of peers.
Peers []Peer `json:"peers"`
}
type PeerMinimum struct {