mirror of
https://github.com/netbirdio/netbird.git
synced 2026-10-20 04:19:08 +02:00
[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:
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user