Skip to content

Commit 6454c90

Browse files
committed
NetworkState - ToJSON instances
1 parent a7011c3 commit 6454c90

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,11 +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)
813
import Data.Typeable (Typeable)
14+
import GHC.Generics
915

1016

1117
-- | Each connection is is either initiated locally (outbound) or by a remote
@@ -19,8 +25,10 @@ data Provenance =
1925
-- | An outbound connection: one that was initiated by us.
2026
--
2127
| Outbound
22-
deriving (Eq, Ord, Show)
28+
deriving (Eq, Ord, Show, Generic)
2329

30+
instance Aeson.ToJSON Provenance where
31+
toEncoding = Aeson.string . show
2432

2533
-- | Each connection negotiates if it is uni- or bi-directional. 'DataFlow'
2634
-- is a life time property of a connection, once negotiated it never changes.
@@ -33,13 +41,19 @@ data Provenance =
3341
data DataFlow
3442
= Unidirectional
3543
| Duplex
36-
deriving (Eq, Ord, Show)
44+
deriving (Eq, Ord, Show, Generic)
45+
46+
instance Aeson.ToJSON DataFlow where
47+
toEncoding = Aeson.string . show
3748

3849

3950
-- | Boolean like type which indicates if the timeout on 'OutboundStateDuplex'
4051
-- has expired.
4152
data TimeoutExpired = Expired | Ticking
42-
deriving (Eq, Ord, Show)
53+
deriving (Eq, Ord, Show, Generic)
54+
55+
instance Aeson.ToJSON TimeoutExpired where
56+
toEncoding = Aeson.string . show
4357

4458

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

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)