nim-raft/tests/raft_test_node_standalone.nim
Raycho Mukelov fe5c069ac7 Fixes
2023-09-11 19:55:30 +03:00

71 lines
1.7 KiB
Nim

import basic_state_machine
import basic_cluster
import std/json
import msgpack4nim
import strutils
import std/strformat
import httpclient
type
RaftPeerConf* = object
id*: UUID
host*: string
port*: int
RaftPeersConfContainer* = seq[RaftPeerConf]
var
conf: RaftPeersConfContainer
proc loadConfig() =
let jsonFile = "raft_node_config.json"
# read and parse file
let jsConf = parseFile(jsonFile)
for n in jsConf["raftPeers"]:
conf.add(RaftPeerConf(id: parseUUID(n["id"].astToStr), host: n["host"].astToStr, port: parseInt(n["port"].astToStr)))
debug "Conf", conf=conf
info "Conf", config=repr(conf)
proc TestRaftMessageSendCallbackCreate(): RaftMessageSendCallback =
proc (msg: RaftMessageBase): Future[RaftMessageResponseBase] {.async, gcsafe.} =
var
host: string
port: int
for c in conf:
if c.id == msg.receiverId:
host = c.host
port = c.port
var
client = newAsyncHttpClient()
s = MsgStream.init() # besides MsgStream, you can also use Nim StringStream or FileStream
s.pack(msg) #here the magic happened
var
resp = await client.post(fmt"http://host:port", s.data)
echo resp.status
var
ss = MsgStream.init(resp.body)
xx: RaftMessageResponseBase
ss.unpack(xx) #and here too
result = xx
if isMainModule:
loadConfig()
var
nodesIds: seq[UUID]
node: BasicRaftNode
for c in conf:
debug "single conf", single_conf=c
nodesIds.add(c.id)
var
nodeId = parseUUID("f9695ea4-4f37-11ee-8e75-8ff5a48faa42")
peersIds = nodesIds
peersIds.del(peersIds.find(nodeId))
node = BasicRaftNode.new(nodeId, peersIds, TestRaftMessageSendCallbackCreate())