From 98c3979119383a77c4caee650f357407412b8096 Mon Sep 17 00:00:00 2001 From: NagyZoltanPeter <113987313+NagyZoltanPeter@users.noreply.github.com> Date: Fri, 25 Apr 2025 15:36:41 +0200 Subject: [PATCH] chore: return all peers from rest admin (#3395) * Updated version of getting peers by /admin endpoints --- tests/wakunode_rest/test_rest_admin.nim | 10 +- waku/waku_api/rest/admin/client.nim | 14 ++- waku/waku_api/rest/admin/handlers.nim | 154 ++++++++++++------------ 3 files changed, 91 insertions(+), 87 deletions(-) diff --git a/tests/wakunode_rest/test_rest_admin.nim b/tests/wakunode_rest/test_rest_admin.nim index bdab61a75..a3546f1f8 100644 --- a/tests/wakunode_rest/test_rest_admin.nim +++ b/tests/wakunode_rest/test_rest_admin.nim @@ -120,7 +120,9 @@ suite "Waku v2 Rest API - Admin": check: getRes.status == 200 $getRes.contentType == $MIMETYPE_JSON - getRes.data.len() == 0 + getRes.data.len() == 1 + getRes.data[0].multiaddr == nonExistentPeer + getRes.data[0].connected == CannotConnect asyncTest "Get filter data": await allFutures( @@ -274,7 +276,7 @@ suite "Waku v2 Rest API - Admin": check: postRes.status == 200 - let getRes = await client.getConnectedRelayPeers() + let getRes = await client.getRelayPeers() check: getRes.status == 200 @@ -286,13 +288,13 @@ suite "Waku v2 Rest API - Admin": # Check peer 3 # Todo: investigate why the test setup missing remote peer's shard info - # let getRes2 = await client.getConnectedRelayPeersByShard(0) + # let getRes2 = await client.getRelayPeersByShard(0) # check: # getRes2.status == 200 # $getRes2.contentType == $MIMETYPE_JSON # getRes2.data.peers.len() == 2 - let getRes3 = await client.getConnectedRelayPeersByShard(99) + let getRes3 = await client.getRelayPeersByShard(99) check: getRes3.status == 200 $getRes3.contentType == $MIMETYPE_JSON diff --git a/waku/waku_api/rest/admin/client.nim b/waku/waku_api/rest/admin/client.nim index 4b46ca136..7d45544e2 100644 --- a/waku/waku_api/rest/admin/client.nim +++ b/waku/waku_api/rest/admin/client.nim @@ -28,6 +28,10 @@ proc getPeerById*( rest, endpoint: "/admin/v1/peer/{peerId}", meth: HttpMethod.MethodGet .} +proc getServicePeers*(): RestResponse[seq[WakuPeer]] {. + rest, endpoint: "/admin/v1/peers/service", meth: HttpMethod.MethodGet +.} + proc getConnectedPeers*(): RestResponse[seq[WakuPeer]] {. rest, endpoint: "/admin/v1/peers/connected", meth: HttpMethod.MethodGet .} @@ -38,16 +42,14 @@ proc getConnectedPeersByShard*( rest, endpoint: "/admin/v1/peers/connected/on/{shardId}", meth: HttpMethod.MethodGet .} -proc getConnectedRelayPeers*(): RestResponse[PeersOfShards] {. - rest, endpoint: "/admin/v1/peers/connected/relay", meth: HttpMethod.MethodGet +proc getRelayPeers*(): RestResponse[PeersOfShards] {. + rest, endpoint: "/admin/v1/peers/relay", meth: HttpMethod.MethodGet .} -proc getConnectedRelayPeersByShard*( +proc getRelayPeersByShard*( shardId: uint16 ): RestResponse[PeersOfShard] {. - rest, - endpoint: "/admin/v1/peers/connected/relay/on/{shardId}", - meth: HttpMethod.MethodGet + rest, endpoint: "/admin/v1/peers/relay/on/{shardId}", meth: HttpMethod.MethodGet .} proc getMeshPeers*(): RestResponse[PeersOfShards] {. diff --git a/waku/waku_api/rest/admin/handlers.nim b/waku/waku_api/rest/admin/handlers.nim index ada60e870..9cf6ec131 100644 --- a/waku/waku_api/rest/admin/handlers.nim +++ b/waku/waku_api/rest/admin/handlers.nim @@ -34,12 +34,13 @@ logScope: const ROUTE_ADMIN_V1_PEERS* = "/admin/v1/peers" # returns all peers const ROUTE_ADMIN_V1_SINGLE_PEER* = "/admin/v1/peer/{peerId}" +const ROUTE_ADMIN_V1_SERVICE_PEERS* = "/admin/v1/peers/service" # returns all peers + const ROUTE_ADMIN_V1_CONNECTED_PEERS* = "/admin/v1/peers/connected" const ROUTE_ADMIN_V1_CONNECTED_PEERS_ON_SHARD* = "/admin/v1/peers/connected/on/{shardId}" -const ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS* = "/admin/v1/peers/connected/relay" -const ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS_ON_SHARD* = - "/admin/v1/peers/connected/relay/on/{shardId}" +const ROUTE_ADMIN_V1_RELAY_PEERS* = "/admin/v1/peers/relay" +const ROUTE_ADMIN_V1_RELAY_PEERS_ON_SHARD* = "/admin/v1/peers/relay/on/{shardId}" const ROUTE_ADMIN_V1_MESH_PEERS* = "/admin/v1/peers/mesh" const ROUTE_ADMIN_V1_MESH_PEERS_ON_SHARD* = "/admin/v1/peers/mesh/on/{shardId}" @@ -62,46 +63,48 @@ proc tuplesToWakuPeers(peers: var WakuPeers, peersTup: seq[PeerProtocolTuple]) = peer.origin, ) -proc populateAdminPeerInfo(peers: var WakuPeers, node: WakuNode, codec: string) = - let peersForCodec = node.peerManager.switch.peerStore.peers(codec).mapIt( - ( - multiaddr: constructMultiaddrStr(it), - protocol: codec, - shards: it.getShards(), - connected: it.connectedness, - agent: it.agent, - origin: it.origin, +proc populateAdminPeerInfo( + peers: var WakuPeers, node: WakuNode, codec: Option[string] = none[string]() +) = + if codec.isNone(): + peers = node.peerManager.switch.peerStore.peers().mapIt(WakuPeer.init(it)) + else: + let peersTuples = node.peerManager.switch.peerStore.peers(codec.get()).mapIt( + ( + multiaddr: constructMultiaddrStr(it), + protocol: codec.get(), + shards: it.getShards(), + connected: it.connectedness, + agent: it.agent, + origin: it.origin, + ) ) - ) - tuplesToWakuPeers(peers, peersForCodec) + tuplesToWakuPeers(peers, peersTuples) + +proc populateAdminPeerInfoForAll(node: WakuNode): WakuPeers = + var peers: WakuPeers = @[] + populateAdminPeerInfo(peers, node) + return peers proc populateAdminPeerInfoForCodecs(node: WakuNode, codecs: seq[string]): WakuPeers = var peers: WakuPeers = @[] for codec in codecs: - populateAdminPeerInfo(peers, node, codec) + populateAdminPeerInfo(peers, node, some(codec)) return peers proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = router.api(MethodGet, ROUTE_ADMIN_V1_PEERS) do() -> RestApiResponse: - let peers = populateAdminPeerInfoForCodecs( - node, - @[ - WakuRelayCodec, WakuFilterSubscribeCodec, WakuStoreCodec, WakuLegacyStoreCodec, - WakuLegacyLightPushCodec, WakuLightPushCodec, WakuPeerExchangeCodec, - WakuReconciliationCodec, - ], - ) + let peers = populateAdminPeerInfoForAll(node) - let resp = RestApiResponse.jsonResponse(peers, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(peers, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp router.api(MethodGet, ROUTE_ADMIN_V1_SINGLE_PEER) do( peerId: string @@ -115,19 +118,18 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = if node.peerManager.switch.peerStore.peerExists(peerIdVal): let peerInfo = node.peerManager.switch.peerStore.getPeer(peerIdVal) let peer = WakuPeer.init(peerInfo) - let resp = RestApiResponse.jsonResponse(peer, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(peer, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp else: return RestApiResponse.notFound(fmt("Peer with ID {peerId} not found")) - router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_PEERS) do() -> RestApiResponse: - let allPeers = populateAdminPeerInfoForCodecs( + router.api(MethodGet, ROUTE_ADMIN_V1_SERVICE_PEERS) do() -> RestApiResponse: + let peers = populateAdminPeerInfoForCodecs( node, @[ WakuRelayCodec, WakuFilterSubscribeCodec, WakuStoreCodec, WakuLegacyStoreCodec, @@ -136,16 +138,26 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = ], ) - let connectedPeers = allPeers.filterIt(it.connected == Connectedness.Connected) - - let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(peers, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp + + router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_PEERS) do() -> RestApiResponse: + let allPeers = populateAdminPeerInfoForAll(node) + + let connectedPeers = allPeers.filterIt(it.connected == Connectedness.Connected) + + let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error + return RestApiResponse.internalServerError( + fmt("An error occurred while building the json response: {error}") + ) + + return resp router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_PEERS_ON_SHARD) do( shardId: uint16 @@ -153,29 +165,21 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = let shard = shardId.valueOr: return RestApiResponse.badRequest(fmt("Invalid shardId: {error}")) - let allPeers = populateAdminPeerInfoForCodecs( - node, - @[ - WakuRelayCodec, WakuFilterSubscribeCodec, WakuStoreCodec, WakuLegacyStoreCodec, - WakuLegacyLightPushCodec, WakuLightPushCodec, WakuPeerExchangeCodec, - WakuReconciliationCodec, - ], - ) + let allPeers = populateAdminPeerInfoForAll(node) let connectedPeers = allPeers.filterIt( it.connected == Connectedness.Connected and it.shards.contains(shard) ) - let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp - router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS) do() -> RestApiResponse: + router.api(MethodGet, ROUTE_ADMIN_V1_RELAY_PEERS) do() -> RestApiResponse: if node.wakuRelay.isNil(): return RestApiResponse.serviceUnavailable( "Error: Relay Protocol is not mounted to the node" @@ -195,16 +199,15 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = ) ) - let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp - router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS_ON_SHARD) do( + router.api(MethodGet, ROUTE_ADMIN_V1_RELAY_PEERS_ON_SHARD) do( shardId: uint16 ) -> RestApiResponse: let shard = shardId.valueOr: @@ -223,14 +226,13 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = shard: shard, peers: toSeq(pubsubPeers).mapIt(WakuPeer.init(it, node.peerManager)) ) - let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp router.api(MethodGet, ROUTE_ADMIN_V1_MESH_PEERS) do() -> RestApiResponse: if node.wakuRelay.isNil(): @@ -252,14 +254,13 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = ) ) - let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp router.api(MethodGet, ROUTE_ADMIN_V1_MESH_PEERS_ON_SHARD) do( shardId: uint16 @@ -280,14 +281,13 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) = shard: shard, peers: toSeq(peers).mapIt(WakuPeer.init(it, node.peerManager)) ) - let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200) - if resp.isErr(): - error "An error occurred while building the json response: ", error = resp.error + let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200).valueOr: + error "An error occurred while building the json response: ", error = error return RestApiResponse.internalServerError( - fmt("An error occurred while building the json response: {resp.error}") + fmt("An error occurred while building the json response: {error}") ) - return resp.get() + return resp proc installAdminV1PostPeersHandler(router: var RestRouter, node: WakuNode) = router.api(MethodPost, ROUTE_ADMIN_V1_PEERS) do(