Skip to content

Commit e55ffbe

Browse files
committed
NetworkState - ToJSON instances
1 parent de6d180 commit e55ffbe

File tree

4 files changed

+117
-11
lines changed

4 files changed

+117
-11
lines changed

ouroboros-network-api/src/Ouroboros/Network/ConnectionId.hs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
{-# LANGUAGE DeriveFunctor #-}
22
{-# LANGUAGE DeriveGeneric #-}
3-
{-# LANGUAGE DerivingStrategies #-}
43
{-# LANGUAGE DerivingVia #-}
4+
{-# LANGUAGE NamedFieldPuns #-}
55
{-# LANGUAGE RankNTypes #-}
66
{-# LANGUAGE ScopedTypeVariables #-}
7-
{-# LANGUAGE StandaloneDeriving #-}
87
{-# LANGUAGE StaticPointers #-}
98

109
module Ouroboros.Network.ConnectionId where
1110

1211
import NoThunks.Class (InspectHeap (..), NoThunks)
1312

13+
import Data.Aeson qualified as Aeson
1414
import Data.Hashable
15+
import Data.String (fromString)
1516
import GHC.Generics (Generic)
1617
import Ouroboros.Network.Util.ShowProxy (Proxy (..), ShowProxy (..))
1718

@@ -29,6 +30,14 @@ data ConnectionId addr = ConnectionId {
2930
deriving NoThunks via InspectHeap (ConnectionId addr)
3031
deriving Functor
3132

33+
instance Aeson.ToJSON addr => Aeson.ToJSONKey (ConnectionId addr) where
34+
instance Aeson.ToJSON addr => Aeson.ToJSON (ConnectionId addr) where
35+
toEncoding ConnectionId {remoteAddress, localAddress} =
36+
Aeson.pairs $
37+
fromString "remoteAddress" Aeson..= remoteAddress
38+
<> fromString "localAddress" Aeson..= localAddress
39+
40+
3241
-- | Order first by `remoteAddress` then by `localAddress`.
3342
--
3443
-- /Note:/ we relay on the fact that `remoteAddress` is an order

ouroboros-network-api/src/Ouroboros/Network/ConnectionManager/Public.hs

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1+
{-# LANGUAGE DeriveGeneric #-}
2+
13
module Ouroboros.Network.ConnectionManager.Public
24
( Provenance (..)
35
, DataFlow (..)
46
, TimeoutExpired (..)
57
, AbstractState (..)
68
) where
79

10+
import Data.Aeson qualified as Aeson
11+
import Data.Aeson.Encoding qualified as Aeson
12+
import Data.String (fromString)
13+
import GHC.Generics
14+
815

916
-- | Each connection is is either initiated locally (outbound) or by a remote
1017
-- peer (inbound).
@@ -17,8 +24,10 @@ data Provenance =
1724
-- | An outbound connection: one that was initiated by us.
1825
--
1926
| Outbound
20-
deriving (Eq, Ord, Show)
27+
deriving (Eq, Ord, Show, Generic)
2128

29+
instance Aeson.ToJSON Provenance where
30+
toEncoding = Aeson.string . show
2231

2332
-- | Each connection negotiates if it is uni- or bi-directional. 'DataFlow'
2433
-- is a life time property of a connection, once negotiated it never changes.
@@ -31,13 +40,19 @@ data Provenance =
3140
data DataFlow
3241
= Unidirectional
3342
| Duplex
34-
deriving (Eq, Ord, Show)
43+
deriving (Eq, Ord, Show, Generic)
44+
45+
instance Aeson.ToJSON DataFlow where
46+
toEncoding = Aeson.string . show
3547

3648

3749
-- | Boolean like type which indicates if the timeout on 'OutboundStateDuplex'
3850
-- has expired.
3951
data TimeoutExpired = Expired | Ticking
40-
deriving (Eq, Ord, Show)
52+
deriving (Eq, Ord, Show, Generic)
53+
54+
instance Aeson.ToJSON TimeoutExpired where
55+
toEncoding = Aeson.string . show
4156

4257

4358
-- | Useful for tracing and error messages.
@@ -57,4 +72,35 @@ data AbstractState =
5772
| WaitRemoteIdleSt
5873
| TerminatingSt
5974
| TerminatedSt
60-
deriving (Eq, Ord, Show)
75+
deriving (Eq, Ord, Show, Generic)
76+
77+
instance Aeson.ToJSON AbstractState where
78+
toEncoding UnknownConnectionSt =
79+
Aeson.pairs $ fromString "type" Aeson..= "UnknownConnectionState"
80+
toEncoding ReservedOutboundSt =
81+
Aeson.pairs $ fromString "type" Aeson..= "ReservedOutboundState"
82+
toEncoding (UnnegotiatedSt a) =
83+
Aeson.pairs $ fromString "type" Aeson..= "UnnegotiatedState"
84+
<> fromString "provenance" Aeson..= a
85+
toEncoding (InboundIdleSt a) =
86+
Aeson.pairs $ fromString "type" Aeson..= "InboundIdleState"
87+
<> fromString "dataFlow" Aeson..= a
88+
toEncoding (InboundSt a) =
89+
Aeson.pairs $ fromString "type" Aeson..= "InboundState"
90+
<> fromString "dataFlow" Aeson..= a
91+
toEncoding OutboundUniSt =
92+
Aeson.pairs $ fromString "type" Aeson..= "OutboundUnidirectionalState"
93+
toEncoding (OutboundDupSt a) =
94+
Aeson.pairs $ fromString "type" Aeson..= "OutboundDuplexState"
95+
<> fromString "timeout" Aeson..= a
96+
toEncoding (OutboundIdleSt a) =
97+
Aeson.pairs $ fromString "type" Aeson..= "OutboundIdleState"
98+
<> fromString "dataFlow" Aeson..= a
99+
toEncoding DuplexSt =
100+
Aeson.pairs $ fromString "type" Aeson..= "DuplexState"
101+
toEncoding WaitRemoteIdleSt =
102+
Aeson.pairs $ fromString "type" Aeson..= "WaitRemoteIdleState"
103+
toEncoding TerminatingSt =
104+
Aeson.pairs $ fromString "type" Aeson..= "TerminatingState"
105+
toEncoding TerminatedSt =
106+
Aeson.pairs $ fromString "type" Aeson..= "TerminatedState"

ouroboros-network-api/src/Ouroboros/Network/PeerSelection/PeerSharing/Codec.hs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE DeriveGeneric #-}
12
{-# LANGUAGE FlexibleInstances #-}
23
{-# LANGUAGE LambdaCase #-}
34

@@ -12,6 +13,8 @@ module Ouroboros.Network.PeerSelection.PeerSharing.Codec
1213
import Codec.CBOR.Decoding qualified as CBOR
1314
import Codec.CBOR.Encoding qualified as CBOR
1415
import Codec.Serialise (Serialise (..))
16+
import Data.Aeson qualified as Aeson
17+
import GHC.Generics
1518

1619
import Network.Socket (PortNumber, SockAddr (..))
1720

@@ -72,11 +75,15 @@ decodeRemoteAddress = do
7275
--
7376
newtype RemoteAddressEncoding addr =
7477
RemoteAddressEncoding { getRemoteAddressEncoding :: addr }
75-
deriving (Eq, Ord)
78+
deriving (Eq, Ord, Generic)
7679

7780
-- | This instance is used by `LocalStateQuery` mini-protocol codec in
7881
-- `ouroboros-consensus-diffusion`.
7982
--
8083
instance Serialise (RemoteAddressEncoding SockAddr) where
8184
encode = encodeRemoteAddress . getRemoteAddressEncoding
8285
decode = RemoteAddressEncoding <$> decodeRemoteAddress
86+
87+
instance Aeson.ToJSON (RemoteAddressEncoding SockAddr) where
88+
toJSON (RemoteAddressEncoding addr) = Aeson.toJSON (show addr)
89+
toEncoding (RemoteAddressEncoding addr) = Aeson.toEncoding (show addr)

ouroboros-network-api/src/Ouroboros/Network/PublicState.hs

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
{-# LANGUAGE DeriveGeneric #-}
12
{-# LANGUAGE FlexibleContexts #-}
23
{-# LANGUAGE NamedFieldPuns #-}
34

@@ -25,10 +26,13 @@ import Codec.CBOR.Encoding
2526
import Codec.Serialise (Serialise)
2627
import Codec.Serialise.Class (decode, encode)
2728
import Control.Monad (replicateM)
29+
import Data.Aeson qualified as Aeson
2830
import Data.Map.Strict (Map)
2931
import Data.Map.Strict qualified as Map
3032
import Data.Set (Set)
3133
import Data.Set qualified as Set
34+
import Data.String (fromString)
35+
import GHC.Generics
3236

3337
import Ouroboros.Network.ConnectionId
3438
import Ouroboros.Network.ConnectionManager.Public
@@ -44,7 +48,7 @@ data ConnectionManagerState peeraddr = ConnectionManagerState {
4448
registeredOutboundConnections :: Set peeraddr
4549
-- ^ set of outbound connections in `ReserverdOutboundSt` state.
4650
}
47-
deriving (Eq, Show)
51+
deriving (Eq, Show, Generic)
4852

4953
-- | Map 'ConnectionManagerState'
5054
--
@@ -64,14 +68,32 @@ mapConnectionManagerStateMonotonic
6468
registeredOutboundConnections = Set.mapMonotonic fn registeredOutboundConnections
6569
}
6670

71+
instance Aeson.ToJSON peeraddr => Aeson.ToJSON (ConnectionManagerState peeraddr) where
72+
toEncoding ConnectionManagerState { connectionMap, registeredOutboundConnections } =
73+
Aeson.pairs $
74+
fromString "connectionMap" Aeson..= connectionMap
75+
<> fromString "registeredOutboundConnections" Aeson..= registeredOutboundConnections
6776

6877
data InboundState peeraddr = InboundState {
6978
remoteHotSet :: !(Set (ConnectionId peeraddr)),
7079
remoteWarmSet :: !(Set (ConnectionId peeraddr)),
7180
remoteColdSet :: !(Set (ConnectionId peeraddr)),
7281
remoteIdleSet :: !(Set (ConnectionId peeraddr))
7382
}
74-
deriving (Eq, Show)
83+
deriving (Eq, Show, Generic)
84+
85+
instance Aeson.ToJSON peeraddr => Aeson.ToJSON (InboundState peeraddr) where
86+
toEncoding InboundState {
87+
remoteHotSet,
88+
remoteWarmSet,
89+
remoteColdSet,
90+
remoteIdleSet
91+
} =
92+
Aeson.pairs $
93+
fromString "remoteHotSet" Aeson..= remoteHotSet
94+
<> fromString "remoteWarmSet" Aeson..= remoteWarmSet
95+
<> fromString "remoteColdSet" Aeson..= remoteColdSet
96+
<> fromString "remoteIdleSet" Aeson..= remoteIdleSet
7597

7698
mapInboundStateMonotonic
7799
:: (peeraddr -> peeraddr')
@@ -106,7 +128,18 @@ data OutboundState peeraddr = OutboundState {
106128
warmPeers :: Set peeraddr,
107129
hotPeers :: Set peeraddr
108130
}
109-
deriving (Eq, Show)
131+
deriving (Eq, Show, Generic)
132+
133+
instance Aeson.ToJSON peeraddr => Aeson.ToJSON (OutboundState peeraddr) where
134+
toEncoding OutboundState {
135+
hotPeers,
136+
warmPeers,
137+
coldPeers
138+
} =
139+
Aeson.pairs $
140+
fromString "hotPeers" Aeson..= hotPeers
141+
<> fromString "warmPeers" Aeson..= warmPeers
142+
<> fromString "coldPeers" Aeson..= coldPeers
110143

111144
mapOutboundStateMonotonic
112145
:: (peeraddr -> peeraddr')
@@ -135,7 +168,18 @@ data NetworkState peeraddr = NetworkState {
135168
inboundGovernorState :: InboundState peeraddr,
136169
outboundGovernorState :: OutboundState peeraddr
137170
}
138-
deriving (Eq, Show)
171+
deriving (Eq, Show, Generic)
172+
173+
instance Aeson.ToJSON peeraddr => Aeson.ToJSON (NetworkState peeraddr) where
174+
toEncoding NetworkState {
175+
connectionManagerState,
176+
inboundGovernorState,
177+
outboundGovernorState
178+
} =
179+
Aeson.pairs $
180+
fromString "connectionManagerState" Aeson..= connectionManagerState
181+
<> fromString "inboundGovernorState" Aeson..= inboundGovernorState
182+
<> fromString "outboundGovernorState" Aeson..= outboundGovernorState
139183

140184
mapNetworkStateMonotonic
141185
:: (peeraddr -> peeraddr')

0 commit comments

Comments
 (0)