Skip to content

Commit a374873

Browse files
committed
PR review
Signed-off-by: Sasha Bogicevic <[email protected]>
1 parent bc495d4 commit a374873

File tree

9 files changed

+85
-76
lines changed

9 files changed

+85
-76
lines changed

hydra-chain-observer/src/Hydra/ChainObserver.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import Hydra.ChainObserver.NodeClient (ChainObservation, ChainObserverLog (..),
1111
import Hydra.ChainObserver.Options (Backend (..), Options (..), hydraChainObserverOptions)
1212
import Hydra.Contract qualified as Contract
1313
import Hydra.Logging (Verbosity (..), traceWith, withTracer)
14-
import Hydra.Options (hydraNodeVersion)
14+
import Hydra.NetworkVersions (hydraNodeVersion)
1515
import Hydra.Ouroborus.ChainObserver (ouroborusClient)
1616
import Network.HTTP.Simple (getResponseBody, httpNoBody, parseRequestThrow, setRequestBodyJSON)
1717
import Network.URI (URI)

hydra-chain-observer/src/Hydra/ChainObserver/Options.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import Hydra.Prelude
66

77
import Data.Version (showVersion)
88
import Hydra.Cardano.Api (ChainPoint, NetworkId, SocketPath)
9+
import Hydra.NetworkVersions (hydraNodeVersion)
910
import Hydra.Options (
10-
hydraNodeVersion,
1111
networkIdParser,
1212
nodeSocketParser,
1313
startChainFromParser,

hydra-node/hydra-node.cabal

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
cabal-version: 3.0
2-
name: hydra-node
3-
version: 0.22.0
4-
synopsis: The Hydra node
5-
author: IOG
6-
copyright: 2022 IOG
7-
license: Apache-2.0
1+
cabal-version: 3.0
2+
name: hydra-node
3+
version: 0.22.0
4+
synopsis: The Hydra node
5+
author: IOG
6+
copyright: 2022 IOG
7+
license: Apache-2.0
88
license-files:
99
LICENSE
1010
NOTICE
@@ -327,6 +327,7 @@ test-suite tests
327327
Hydra.ModelSpec
328328
Hydra.Network.AuthenticateSpec
329329
Hydra.NetworkSpec
330+
Hydra.NetworkVersionsSpec
330331
Hydra.Node.InputQueueSpec
331332
Hydra.Node.RunSpec
332333
Hydra.NodeSpec

hydra-node/src/Hydra/API/WSServer.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import Hydra.Chain.Direct.State ()
4343
import Hydra.HeadLogic (ClosedState (ClosedState, readyToFanoutSent), HeadState, StateChanged)
4444
import Hydra.HeadLogic.State qualified as HeadState
4545
import Hydra.Logging (Tracer, traceWith)
46-
import Hydra.Options qualified as Options
46+
import Hydra.NetworkVersions qualified as NetworkVersions
4747
import Hydra.Tx (Party)
4848
import Hydra.Tx.HeadId (HeadId (..))
4949
import Network.WebSockets (
@@ -104,7 +104,7 @@ wsApp party tracer history callback headStateP headIdP responseChannel ServerOut
104104
, headStatus = getHeadStatus headState
105105
, hydraHeadId
106106
, snapshotUtxo = getSnapshotUtxo headState
107-
, hydraNodeVersion = showVersion Options.hydraNodeVersion
107+
, hydraNodeVersion = showVersion NetworkVersions.hydraNodeVersion
108108
}
109109

110110
Projection{getLatest} = headStateP
Lines changed: 30 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,48 @@
1-
{-# LANGUAGE DerivingStrategies #-}
21
{-# LANGUAGE TemplateHaskell #-}
32

43
module Hydra.NetworkVersions where
54

65
import Hydra.Prelude hiding (encodeUtf8)
76

8-
import Control.Lens ((^@..))
9-
import Data.Aeson (Value (..))
10-
import Data.Aeson.Key qualified as Key
11-
import Data.Aeson.KeyMap qualified as KeyMap
12-
import Data.Aeson.Lens (members, _Object)
7+
import Control.Lens ((^.), (^?))
8+
import Data.Aeson (Value (..), encode)
9+
import Data.Aeson.Lens (key, nonNull, _Key)
1310
import Data.FileEmbed (embedFile, makeRelativeToProject)
14-
import Data.List qualified as List
15-
import Data.Text (pack, splitOn, toLower, unpack)
11+
import Data.Text (splitOn)
1612
import Data.Text.Encoding (encodeUtf8)
13+
import Data.Version (Version (..), showVersion)
1714
import Hydra.Cardano.Api (TxId, deserialiseFromRawBytesHex)
18-
import Hydra.Version (gitDescribe)
15+
import Hydra.Version (embeddedRevision, gitRevision, unknownVersion)
16+
import Paths_hydra_node (version)
17+
18+
hydraNodeVersion :: Version
19+
hydraNodeVersion =
20+
version & \(Version semver _) -> Version semver revision
21+
where
22+
revision =
23+
maybeToList $
24+
embeddedRevision
25+
<|> gitRevision
26+
<|> Just unknownVersion
1927

20-
{-# NOINLINE networkVersions #-}
2128
networkVersions :: ByteString
2229
networkVersions = $(makeRelativeToProject "./networks.json" >>= embedFile)
2330

24-
parseNetworkTxIds :: String -> Either String [TxId]
25-
parseNetworkTxIds networkString = do
26-
let networkTxt = toLower $ pack networkString
27-
let info = networkVersions ^@.. members . _Object
28-
case find (\(n, _) -> Key.toText n == networkTxt) info of
29-
Nothing -> Left $ "Unknown network:" <> unpack networkTxt
30-
Just (_, t) -> getLastTxId t
31+
parseNetworkTxIds :: MonadFail m => Version -> String -> m [TxId]
32+
parseNetworkTxIds hydraVersion network = do
33+
case networkVersions ^? key (network ^. _Key) of
34+
Nothing -> fail $ "Unknown network: " <> toString network
35+
Just t -> getLastTxId t
3136
where
3237
getLastTxId t = do
33-
lastTxIds <-
34-
case gitDescribe of
35-
Nothing -> Left "Missing hydra-node revision."
36-
Just fullRev -> do
37-
let rev = List.head $ splitOn "-" $ pack fullRev
38-
case List.find (String rev ==) (KeyMap.elems t) of
39-
Just (String s) -> Right s
40-
_ -> Left "Failed to find released hydra-node version in networks.json."
41-
mapM parseToTxId (splitOn "," lastTxIds)
38+
case splitOn "-" $ fromString $ showVersion hydraVersion of
39+
[] -> fail "Failed to parse hydra-node revision."
40+
(rev : _) -> do
41+
case encode t ^? key (rev ^. _Key) . nonNull of
42+
Just (String s) -> mapM parseToTxId $ splitOn "," s
43+
_ -> fail "Failed to find released hydra-node version in networks.json."
4244

4345
parseToTxId textTxId = do
4446
case deserialiseFromRawBytesHex $ encodeUtf8 textTxId of
45-
Left _ -> Left $ "Failed to parse string to TxId: " <> unpack textTxId
46-
Right txid -> Right txid
47+
Left _ -> fail $ "Failed to parse string to TxId: " <> toString textTxId
48+
Right txid -> pure txid

hydra-node/src/Hydra/Options.hs

Lines changed: 5 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import Data.ByteString.Char8 qualified as BSC
1919
import Data.IP (IP (IPv4), toIPv4, toIPv4w)
2020
import Data.Text (unpack)
2121
import Data.Text qualified as T
22-
import Data.Version (Version (..), showVersion)
22+
import Data.Version (showVersion)
2323
import Hydra.Cardano.Api (
2424
ChainPoint (..),
2525
File (..),
@@ -38,11 +38,10 @@ import Hydra.Contract qualified as Contract
3838
import Hydra.Ledger.Cardano ()
3939
import Hydra.Logging (Verbosity (..))
4040
import Hydra.Network (Host (..), NodeId (NodeId), PortNumber, WhichEtcd (..), readHost, readPort, showHost)
41-
import Hydra.NetworkVersions (parseNetworkTxIds)
41+
import Hydra.NetworkVersions (hydraNodeVersion, parseNetworkTxIds)
4242
import Hydra.Node.DepositPeriod (DepositPeriod (..))
4343
import Hydra.Tx.ContestationPeriod (ContestationPeriod, fromNominalDiffTime)
4444
import Hydra.Tx.HeadId (HeadSeed)
45-
import Hydra.Version (embeddedRevision, gitRevision, unknownVersion)
4645
import Options.Applicative (
4746
Parser,
4847
ParserInfo,
@@ -79,7 +78,6 @@ import Options.Applicative (
7978
)
8079
import Options.Applicative.Builder (str)
8180
import Options.Applicative.Help (vsep)
82-
import Paths_hydra_node (version)
8381
import Test.QuickCheck (elements, listOf, listOf1, oneof, vectorOf)
8482

8583
data Command
@@ -814,9 +812,9 @@ hydraScriptsDefaultParser =
814812
where
815813
validateNetwork arg =
816814
case arg of
817-
"preview" -> parseNetworkTxIds arg
818-
"preprod" -> parseNetworkTxIds arg
819-
"mainnet" -> parseNetworkTxIds arg
815+
"preview" -> parseNetworkTxIds hydraNodeVersion arg
816+
"preprod" -> parseNetworkTxIds hydraNodeVersion arg
817+
"mainnet" -> parseNetworkTxIds hydraNodeVersion arg
820818
_ -> Left $ "Unknown network: " <> arg
821819

822820
persistenceDirParser :: Parser FilePath
@@ -864,16 +862,6 @@ hydraNodeCommand =
864862
(decodeUtf8 $ encodePretty Contract.scriptInfo)
865863
(long "script-info" <> help "Dump script info as JSON")
866864

867-
hydraNodeVersion :: Version
868-
hydraNodeVersion =
869-
version & \(Version semver _) -> Version semver revision
870-
where
871-
revision =
872-
maybeToList $
873-
embeddedRevision
874-
<|> gitRevision
875-
<|> Just unknownVersion
876-
877865
defaultContestationPeriod :: ContestationPeriod
878866
defaultContestationPeriod = 600
879867

hydra-node/test/Hydra/API/ServerSpec.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import Hydra.HeadLogic.StateEvent (StateEvent (..), genStateEvent)
4343
import Hydra.Ledger.Simple (SimpleTx (..))
4444
import Hydra.Logging (Tracer, showLogsOnFailure)
4545
import Hydra.Network (PortNumber)
46-
import Hydra.Options qualified as Options
46+
import Hydra.NetworkVersions qualified as NetworkVersions
4747
import Hydra.Tx.Party (Party)
4848
import Hydra.Tx.Snapshot (Snapshot (Snapshot, utxo, utxoToCommit))
4949
import Network.Simple.WSS qualified as WSS
@@ -88,7 +88,7 @@ spec =
8888
version <- waitMatch 5 conn $ \v -> do
8989
guard $ matchGreetings v
9090
v ^? key "hydraNodeVersion"
91-
version `shouldBe` toJSON (showVersion Options.hydraNodeVersion)
91+
version `shouldBe` toJSON (showVersion NetworkVersions.hydraNodeVersion)
9292

9393
it "sends server outputs to all connected clients" $ do
9494
queue <- atomically newTQueue
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
module Hydra.NetworkVersionsSpec where
2+
3+
import Hydra.Prelude
4+
import Test.Hydra.Prelude
5+
6+
import Data.Version (Version, makeVersion)
7+
import Hydra.NetworkVersions (hydraNodeVersion, parseNetworkTxIds)
8+
import Test.QuickCheck (Property, counterexample, forAll, property)
9+
10+
spec :: Spec
11+
spec =
12+
describe "NetworkVersions" $ do
13+
it "parseNetworkTxIds produces list TxId" $ do
14+
let networks = ["mainnet", "preview", "preprod"]
15+
let versions = makeVersion . (\v -> [0, v, 0]) <$> [13 .. 21]
16+
forM_ networks $ \network ->
17+
forM_ versions $ \version -> do
18+
case parseNetworkTxIds version network of
19+
Left err -> failure $ "Failed to parse network tx ids: " <> err
20+
Right txIds -> txIds `shouldSatisfy` not . null
21+
22+
prop "parseNetworkTxIds works with expected versions and networks" $
23+
forAll arbitrary $ \version ->
24+
forAll arbitrary $ \network ->
25+
propParseNetworkTxIds version network
26+
27+
propParseNetworkTxIds :: Version -> String -> Property
28+
propParseNetworkTxIds version network = do
29+
let varlidNetworks = ["mainnet", "preview", "preprod"]
30+
let validVersions = (makeVersion . (\v -> [0, v, 0]) <$> [13 .. 21]) <> [hydraNodeVersion]
31+
case parseNetworkTxIds version network of
32+
Left err ->
33+
if network `elem` varlidNetworks && version `elem` validVersions
34+
then property False & counterexample ("error: " <> err)
35+
else property True
36+
Right txIds -> property $ not (null txIds)

hydra-node/test/Hydra/OptionsSpec.hs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import Hydra.Cardano.Api (
1616
)
1717
import Hydra.Chain (maximumNumberOfParties)
1818
import Hydra.Network (Host (Host))
19-
import Hydra.NetworkVersions (parseNetworkTxIds)
2019
import Hydra.Options (
2120
BlockfrostOptions (..),
2221
CardanoChainConfig (..),
@@ -325,23 +324,6 @@ spec = parallel $
325324
{ chainConfig = Cardano (defaultCardanoChainConfig & #chainBackendOptions .~ Blockfrost (BlockfrostOptions "blockfrost-project.txt"))
326325
}
327326

328-
it "parses --network into related tx ids" $ do
329-
-- NOTE: we should be able to parse both upper and lower case network names
330-
let networks = ["Mainnet", "preview", "Preprod"]
331-
forM_ networks $ \network -> do
332-
case parseNetworkTxIds network of
333-
Left err ->
334-
err `shouldSatisfy` \case
335-
"Failed to find released hydra-node version in networks.json." -> True
336-
"Missing hydra-node revision." -> True
337-
_ -> False
338-
Right txIds ->
339-
["--network", network]
340-
`shouldParse` Run
341-
defaultRunOptions
342-
{ chainConfig = Cardano defaultCardanoChainConfig{hydraScriptsTxId = txIds}
343-
}
344-
345327
it "switches to offline mode when using --offline-head-seed and --initial-utxo" $
346328
mconcat
347329
[ ["--offline-head-seed", "0100"]

0 commit comments

Comments
 (0)