diff --git a/cardano-config/src/Cardano/Config/Topology.hs b/cardano-config/src/Cardano/Config/Topology.hs index a7d66adefae..30b76ba2b1d 100644 --- a/cardano-config/src/Cardano/Config/Topology.hs +++ b/cardano-config/src/Cardano/Config/Topology.hs @@ -12,6 +12,7 @@ module Cardano.Config.Topology , NodeAddress(..) , NodeHostAddress(..) , NodeSetup(..) + , RealNodeTopology(..) , RemoteAddress(..) , createNodeAddress , nodeAddressInfo @@ -134,6 +135,17 @@ data NodeSetup = NodeSetup , producers :: ![RemoteAddress] } deriving Show +data RealNodeTopology = RealNodeTopology + { rNodeAddress :: !NodeAddress + , rProducers :: ![RemoteAddress] + } + +instance FromJSON RealNodeTopology where + parseJSON = withObject "RealNodeTopology" $ \v -> + RealNodeTopology + <$> v .: "rNodeAddress" + <*> (v .: "rProducers") + instance FromJSON NodeId where parseJSON v = CoreId <$> parseJSON v diff --git a/cardano-node/src/Cardano/Node/Run.hs b/cardano-node/src/Cardano/Node/Run.hs index 9506452fa9d..f157a3cc03f 100644 --- a/cardano-node/src/Cardano/Node/Run.hs +++ b/cardano-node/src/Cardano/Node/Run.hs @@ -24,8 +24,12 @@ import Cardano.Prelude hiding (ByteString, atomically, take, trace) import Prelude (error, id, unlines) import qualified Control.Concurrent.Async as Async +import Control.Exception (IOException) +import qualified Control.Exception as Exception import Control.Tracer +import Data.Aeson (eitherDecode) import qualified Data.ByteString.Char8 as BSC +import qualified Data.ByteString.Lazy as LB import Data.Either (partitionEithers) import Data.Functor.Contravariant (contramap) import qualified Data.List as List @@ -194,13 +198,22 @@ handleSimpleNode p trace nodeTracers npm = do addrs <- nodeAddressInfo rNodeAddr mapM_ print addrs + print . unTopology $ topFile rMscFp + eitherTopology <- readRealNodeTopology . unTopology $ topFile rMscFp + topology <- case eitherTopology of + --TODO: Convert handleSimpleNode to return `ExceptT` + Left err -> panic $ "Cardano.Node.Run.readRealNodeTopology: " + <> err + Right top -> pure top + + let ipProducerAddrs :: [NodeAddress] --TODO:I believe I need to get producers via jq conversion of topology file dnsProducerAddrs :: [RemoteAddress] (ipProducerAddrs, dnsProducerAddrs) = partitionEithers [ maybe (Right ra) Left $ remoteAddressToNodeAddress ra - | ra <- [RemoteAddress "18.185.45.45" 3001 1] ] + | ra <- rProducers topology ] ipProducers :: [SockAddr] ipProducers = nodeAddressToSockAddr <$> ipProducerAddrs @@ -355,3 +368,16 @@ handleSimpleNode p trace nodeTracers npm = do Just (CoreId n) -> n Just (RelayId _) -> error "Non-core nodes currently not supported" Nothing -> 999 + +-- | Read the `RealNodeTopology` configuration from the specified file. +-- While running a real protocol, this gives your node its own address and +-- other remote peers it will attempt to connect to. +readRealNodeTopology :: FilePath -> IO (Either Text RealNodeTopology) +readRealNodeTopology fp = do + ebs <- Exception.try $ BSC.readFile fp :: IO (Either IOException BSC.ByteString) + case ebs of + Left e -> pure $ handler e + Right bs -> pure . first toS . eitherDecode $ LB.fromStrict bs + where + handler :: IOException -> Either Text RealNodeTopology + handler e = Left . pack $ show e diff --git a/configuration/topology-proxy-follower.json b/configuration/topology-proxy-follower.json index 5c81c41003c..4ad10a0392e 100644 --- a/configuration/topology-proxy-follower.json +++ b/configuration/topology-proxy-follower.json @@ -1,14 +1,13 @@ -[ - { "nodeId": 0 - , "nodeAddress": - { "addr": "127.0.0.1" - , "port": 7776 - } - , "producers": - [ { "addr": "18.185.45.45" - , "port": 3001 - , "valency": 1 - } - ] +{ + "rNodeAddress": { + "addr": "127.0.0.1", + "port": 7776 + }, + "rProducers": [ + { + "addr": "18.185.45.45", + "port": 3001, + "valency": 1 } -] + ] +} diff --git a/scripts/mainnet-proxy-follower.sh b/scripts/mainnet-proxy-follower.sh index 3d471216bf3..32ca69dbf9d 100755 --- a/scripts/mainnet-proxy-follower.sh +++ b/scripts/mainnet-proxy-follower.sh @@ -3,13 +3,12 @@ set -e RUNNER=${RUNNER:-cabal new-run --} -TOPOLOGY=${TOPOLOGY:-"configuration/topology-proxy-follower.json"} ARGS=( real-protocol --database-path "./db" --genesis-file "configuration/mainnet-genesis.json" - --topology "${TOPOLOGY}" - --socket-dir "./socket/singlenode" + --topology "configuration/topology-proxy-follower.json" + --socket-path "./socket/singlenode" --config "./configuration/mainnet-proxy-follower.yaml" --port 7776 )