Skip to content

Commit f6fdd96

Browse files
chore: return all peers from rest admin (#3395)
* Updated version of getting peers by /admin endpoints
1 parent 7a6c00b commit f6fdd96

File tree

3 files changed

+89
-85
lines changed

3 files changed

+89
-85
lines changed

tests/wakunode_rest/test_rest_admin.nim

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,9 @@ suite "Waku v2 Rest API - Admin":
120120
check:
121121
getRes.status == 200
122122
$getRes.contentType == $MIMETYPE_JSON
123-
getRes.data.len() == 0
123+
getRes.data.len() == 1
124+
getRes.data[0].multiaddr == nonExistentPeer
125+
getRes.data[0].connected == CannotConnect
124126

125127
asyncTest "Get filter data":
126128
await allFutures(
@@ -274,7 +276,7 @@ suite "Waku v2 Rest API - Admin":
274276
check:
275277
postRes.status == 200
276278

277-
let getRes = await client.getConnectedRelayPeers()
279+
let getRes = await client.getRelayPeers()
278280

279281
check:
280282
getRes.status == 200
@@ -286,13 +288,13 @@ suite "Waku v2 Rest API - Admin":
286288
# Check peer 3
287289

288290
# Todo: investigate why the test setup missing remote peer's shard info
289-
# let getRes2 = await client.getConnectedRelayPeersByShard(0)
291+
# let getRes2 = await client.getRelayPeersByShard(0)
290292
# check:
291293
# getRes2.status == 200
292294
# $getRes2.contentType == $MIMETYPE_JSON
293295
# getRes2.data.peers.len() == 2
294296

295-
let getRes3 = await client.getConnectedRelayPeersByShard(99)
297+
let getRes3 = await client.getRelayPeersByShard(99)
296298
check:
297299
getRes3.status == 200
298300
$getRes3.contentType == $MIMETYPE_JSON

waku/waku_api/rest/admin/client.nim

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ proc getPeerById*(
2828
rest, endpoint: "/admin/v1/peer/{peerId}", meth: HttpMethod.MethodGet
2929
.}
3030

31+
proc getServicePeers*(): RestResponse[seq[WakuPeer]] {.
32+
rest, endpoint: "/admin/v1/peers/service", meth: HttpMethod.MethodGet
33+
.}
34+
3135
proc getConnectedPeers*(): RestResponse[seq[WakuPeer]] {.
3236
rest, endpoint: "/admin/v1/peers/connected", meth: HttpMethod.MethodGet
3337
.}
@@ -38,16 +42,14 @@ proc getConnectedPeersByShard*(
3842
rest, endpoint: "/admin/v1/peers/connected/on/{shardId}", meth: HttpMethod.MethodGet
3943
.}
4044

41-
proc getConnectedRelayPeers*(): RestResponse[PeersOfShards] {.
42-
rest, endpoint: "/admin/v1/peers/connected/relay", meth: HttpMethod.MethodGet
45+
proc getRelayPeers*(): RestResponse[PeersOfShards] {.
46+
rest, endpoint: "/admin/v1/peers/relay", meth: HttpMethod.MethodGet
4347
.}
4448

45-
proc getConnectedRelayPeersByShard*(
49+
proc getRelayPeersByShard*(
4650
shardId: uint16
4751
): RestResponse[PeersOfShard] {.
48-
rest,
49-
endpoint: "/admin/v1/peers/connected/relay/on/{shardId}",
50-
meth: HttpMethod.MethodGet
52+
rest, endpoint: "/admin/v1/peers/relay/on/{shardId}", meth: HttpMethod.MethodGet
5153
.}
5254

5355
proc getMeshPeers*(): RestResponse[PeersOfShards] {.

waku/waku_api/rest/admin/handlers.nim

Lines changed: 75 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ logScope:
3434
const ROUTE_ADMIN_V1_PEERS* = "/admin/v1/peers" # returns all peers
3535
const ROUTE_ADMIN_V1_SINGLE_PEER* = "/admin/v1/peer/{peerId}"
3636

37+
const ROUTE_ADMIN_V1_SERVICE_PEERS* = "/admin/v1/peers/service" # returns all peers
38+
3739
const ROUTE_ADMIN_V1_CONNECTED_PEERS* = "/admin/v1/peers/connected"
3840
const ROUTE_ADMIN_V1_CONNECTED_PEERS_ON_SHARD* =
3941
"/admin/v1/peers/connected/on/{shardId}"
40-
const ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS* = "/admin/v1/peers/connected/relay"
41-
const ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS_ON_SHARD* =
42-
"/admin/v1/peers/connected/relay/on/{shardId}"
42+
const ROUTE_ADMIN_V1_RELAY_PEERS* = "/admin/v1/peers/relay"
43+
const ROUTE_ADMIN_V1_RELAY_PEERS_ON_SHARD* = "/admin/v1/peers/relay/on/{shardId}"
4344
const ROUTE_ADMIN_V1_MESH_PEERS* = "/admin/v1/peers/mesh"
4445
const ROUTE_ADMIN_V1_MESH_PEERS_ON_SHARD* = "/admin/v1/peers/mesh/on/{shardId}"
4546

@@ -62,46 +63,48 @@ proc tuplesToWakuPeers(peers: var WakuPeers, peersTup: seq[PeerProtocolTuple]) =
6263
peer.origin,
6364
)
6465

65-
proc populateAdminPeerInfo(peers: var WakuPeers, node: WakuNode, codec: string) =
66-
let peersForCodec = node.peerManager.switch.peerStore.peers(codec).mapIt(
67-
(
68-
multiaddr: constructMultiaddrStr(it),
69-
protocol: codec,
70-
shards: it.getShards(),
71-
connected: it.connectedness,
72-
agent: it.agent,
73-
origin: it.origin,
66+
proc populateAdminPeerInfo(
67+
peers: var WakuPeers, node: WakuNode, codec: Option[string] = none[string]()
68+
) =
69+
if codec.isNone():
70+
peers = node.peerManager.switch.peerStore.peers().mapIt(WakuPeer.init(it))
71+
else:
72+
let peersTuples = node.peerManager.switch.peerStore.peers(codec.get()).mapIt(
73+
(
74+
multiaddr: constructMultiaddrStr(it),
75+
protocol: codec.get(),
76+
shards: it.getShards(),
77+
connected: it.connectedness,
78+
agent: it.agent,
79+
origin: it.origin,
80+
)
7481
)
75-
)
76-
tuplesToWakuPeers(peers, peersForCodec)
82+
tuplesToWakuPeers(peers, peersTuples)
83+
84+
proc populateAdminPeerInfoForAll(node: WakuNode): WakuPeers =
85+
var peers: WakuPeers = @[]
86+
populateAdminPeerInfo(peers, node)
87+
return peers
7788

7889
proc populateAdminPeerInfoForCodecs(node: WakuNode, codecs: seq[string]): WakuPeers =
7990
var peers: WakuPeers = @[]
8091

8192
for codec in codecs:
82-
populateAdminPeerInfo(peers, node, codec)
93+
populateAdminPeerInfo(peers, node, some(codec))
8394

8495
return peers
8596

8697
proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
8798
router.api(MethodGet, ROUTE_ADMIN_V1_PEERS) do() -> RestApiResponse:
88-
let peers = populateAdminPeerInfoForCodecs(
89-
node,
90-
@[
91-
WakuRelayCodec, WakuFilterSubscribeCodec, WakuStoreCodec, WakuLegacyStoreCodec,
92-
WakuLegacyLightPushCodec, WakuLightPushCodec, WakuPeerExchangeCodec,
93-
WakuReconciliationCodec,
94-
],
95-
)
99+
let peers = populateAdminPeerInfoForAll(node)
96100

97-
let resp = RestApiResponse.jsonResponse(peers, status = Http200)
98-
if resp.isErr():
99-
error "An error occurred while building the json response: ", error = resp.error
101+
let resp = RestApiResponse.jsonResponse(peers, status = Http200).valueOr:
102+
error "An error occurred while building the json response: ", error = error
100103
return RestApiResponse.internalServerError(
101-
fmt("An error occurred while building the json response: {resp.error}")
104+
fmt("An error occurred while building the json response: {error}")
102105
)
103106

104-
return resp.get()
107+
return resp
105108

106109
router.api(MethodGet, ROUTE_ADMIN_V1_SINGLE_PEER) do(
107110
peerId: string
@@ -115,19 +118,18 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
115118
if node.peerManager.switch.peerStore.peerExists(peerIdVal):
116119
let peerInfo = node.peerManager.switch.peerStore.getPeer(peerIdVal)
117120
let peer = WakuPeer.init(peerInfo)
118-
let resp = RestApiResponse.jsonResponse(peer, status = Http200)
119-
if resp.isErr():
120-
error "An error occurred while building the json response: ", error = resp.error
121+
let resp = RestApiResponse.jsonResponse(peer, status = Http200).valueOr:
122+
error "An error occurred while building the json response: ", error = error
121123
return RestApiResponse.internalServerError(
122-
fmt("An error occurred while building the json response: {resp.error}")
124+
fmt("An error occurred while building the json response: {error}")
123125
)
124126

125-
return resp.get()
127+
return resp
126128
else:
127129
return RestApiResponse.notFound(fmt("Peer with ID {peerId} not found"))
128130

129-
router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_PEERS) do() -> RestApiResponse:
130-
let allPeers = populateAdminPeerInfoForCodecs(
131+
router.api(MethodGet, ROUTE_ADMIN_V1_SERVICE_PEERS) do() -> RestApiResponse:
132+
let peers = populateAdminPeerInfoForCodecs(
131133
node,
132134
@[
133135
WakuRelayCodec, WakuFilterSubscribeCodec, WakuStoreCodec, WakuLegacyStoreCodec,
@@ -136,46 +138,48 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
136138
],
137139
)
138140

141+
let resp = RestApiResponse.jsonResponse(peers, status = Http200).valueOr:
142+
error "An error occurred while building the json response: ", error = error
143+
return RestApiResponse.internalServerError(
144+
fmt("An error occurred while building the json response: {error}")
145+
)
146+
147+
return resp
148+
149+
router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_PEERS) do() -> RestApiResponse:
150+
let allPeers = populateAdminPeerInfoForAll(node)
151+
139152
let connectedPeers = allPeers.filterIt(it.connected == Connectedness.Connected)
140153

141-
let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200)
142-
if resp.isErr():
143-
error "An error occurred while building the json response: ", error = resp.error
154+
let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200).valueOr:
155+
error "An error occurred while building the json response: ", error = error
144156
return RestApiResponse.internalServerError(
145-
fmt("An error occurred while building the json response: {resp.error}")
157+
fmt("An error occurred while building the json response: {error}")
146158
)
147159

148-
return resp.get()
160+
return resp
149161

150162
router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_PEERS_ON_SHARD) do(
151163
shardId: uint16
152164
) -> RestApiResponse:
153165
let shard = shardId.valueOr:
154166
return RestApiResponse.badRequest(fmt("Invalid shardId: {error}"))
155167

156-
let allPeers = populateAdminPeerInfoForCodecs(
157-
node,
158-
@[
159-
WakuRelayCodec, WakuFilterSubscribeCodec, WakuStoreCodec, WakuLegacyStoreCodec,
160-
WakuLegacyLightPushCodec, WakuLightPushCodec, WakuPeerExchangeCodec,
161-
WakuReconciliationCodec,
162-
],
163-
)
168+
let allPeers = populateAdminPeerInfoForAll(node)
164169

165170
let connectedPeers = allPeers.filterIt(
166171
it.connected == Connectedness.Connected and it.shards.contains(shard)
167172
)
168173

169-
let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200)
170-
if resp.isErr():
171-
error "An error occurred while building the json response: ", error = resp.error
174+
let resp = RestApiResponse.jsonResponse(connectedPeers, status = Http200).valueOr:
175+
error "An error occurred while building the json response: ", error = error
172176
return RestApiResponse.internalServerError(
173-
fmt("An error occurred while building the json response: {resp.error}")
177+
fmt("An error occurred while building the json response: {error}")
174178
)
175179

176-
return resp.get()
180+
return resp
177181

178-
router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS) do() -> RestApiResponse:
182+
router.api(MethodGet, ROUTE_ADMIN_V1_RELAY_PEERS) do() -> RestApiResponse:
179183
if node.wakuRelay.isNil():
180184
return RestApiResponse.serviceUnavailable(
181185
"Error: Relay Protocol is not mounted to the node"
@@ -195,16 +199,15 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
195199
)
196200
)
197201

198-
let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200)
199-
if resp.isErr():
200-
error "An error occurred while building the json response: ", error = resp.error
202+
let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200).valueOr:
203+
error "An error occurred while building the json response: ", error = error
201204
return RestApiResponse.internalServerError(
202-
fmt("An error occurred while building the json response: {resp.error}")
205+
fmt("An error occurred while building the json response: {error}")
203206
)
204207

205-
return resp.get()
208+
return resp
206209

207-
router.api(MethodGet, ROUTE_ADMIN_V1_CONNECTED_RELAY_PEERS_ON_SHARD) do(
210+
router.api(MethodGet, ROUTE_ADMIN_V1_RELAY_PEERS_ON_SHARD) do(
208211
shardId: uint16
209212
) -> RestApiResponse:
210213
let shard = shardId.valueOr:
@@ -223,14 +226,13 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
223226
shard: shard, peers: toSeq(pubsubPeers).mapIt(WakuPeer.init(it, node.peerManager))
224227
)
225228

226-
let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200)
227-
if resp.isErr():
228-
error "An error occurred while building the json response: ", error = resp.error
229+
let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200).valueOr:
230+
error "An error occurred while building the json response: ", error = error
229231
return RestApiResponse.internalServerError(
230-
fmt("An error occurred while building the json response: {resp.error}")
232+
fmt("An error occurred while building the json response: {error}")
231233
)
232234

233-
return resp.get()
235+
return resp
234236

235237
router.api(MethodGet, ROUTE_ADMIN_V1_MESH_PEERS) do() -> RestApiResponse:
236238
if node.wakuRelay.isNil():
@@ -252,14 +254,13 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
252254
)
253255
)
254256

255-
let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200)
256-
if resp.isErr():
257-
error "An error occurred while building the json response: ", error = resp.error
257+
let resp = RestApiResponse.jsonResponse(relayPeers, status = Http200).valueOr:
258+
error "An error occurred while building the json response: ", error = error
258259
return RestApiResponse.internalServerError(
259-
fmt("An error occurred while building the json response: {resp.error}")
260+
fmt("An error occurred while building the json response: {error}")
260261
)
261262

262-
return resp.get()
263+
return resp
263264

264265
router.api(MethodGet, ROUTE_ADMIN_V1_MESH_PEERS_ON_SHARD) do(
265266
shardId: uint16
@@ -280,14 +281,13 @@ proc installAdminV1GetPeersHandler(router: var RestRouter, node: WakuNode) =
280281
shard: shard, peers: toSeq(peers).mapIt(WakuPeer.init(it, node.peerManager))
281282
)
282283

283-
let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200)
284-
if resp.isErr():
285-
error "An error occurred while building the json response: ", error = resp.error
284+
let resp = RestApiResponse.jsonResponse(relayPeer, status = Http200).valueOr:
285+
error "An error occurred while building the json response: ", error = error
286286
return RestApiResponse.internalServerError(
287-
fmt("An error occurred while building the json response: {resp.error}")
287+
fmt("An error occurred while building the json response: {error}")
288288
)
289289

290-
return resp.get()
290+
return resp
291291

292292
proc installAdminV1PostPeersHandler(router: var RestRouter, node: WakuNode) =
293293
router.api(MethodPost, ROUTE_ADMIN_V1_PEERS) do(

0 commit comments

Comments
 (0)