def testPrimaryElectionCase2(case2Setup, looper, keySharedNodes): """ Case 2 - A node making nominations for a multiple other nodes. Consider 4 nodes A, B, C, and D. Lets say node B is malicious and nominates node C to all nodes. Again node B nominates node D to all nodes. """ nodeSet = keySharedNodes A, B, C, D = nodeSet.nodes.values() looper.run(checkNodesConnected(nodeSet)) # Node B sends multiple NOMINATE msgs but only after A has nominated itself looper.run(eventually(checkNomination, A, A.name, retryWait=.25, timeout=1)) instId = getSelfNominationByNode(A) BRep = Replica.generateName(B.name, instId) CRep = Replica.generateName(C.name, instId) DRep = Replica.generateName(D.name, instId) # Node B first sends NOMINATE msgs for Node C to all nodes B.send(Nomination(CRep, instId, B.viewNo)) # Node B sends NOMINATE msgs for Node D to all nodes B.send(Nomination(DRep, instId, B.viewNo)) # Ensure elections are done ensureElectionsDone(looper=looper, nodes=nodeSet, retryWait=1, timeout=45) # All nodes from node A, node C, node D(node B is malicious anyway so # not considering it) should have nomination for node C from node B since # node B first nominated node C for node in [A, C, D]: assert node.elector.nominations[instId][BRep] == CRep
def testPrimaryElectionCase1(case1Setup, looper, keySharedNodes): """ Case 1 - A node making multiple nominations for a particular node. Consider 4 nodes A, B, C and D. Lets say node B is malicious and is repeatedly nominating Node D """ nodes = keySharedNodes nodeA, nodeB, nodeC, nodeD = [nodes.getNode(nm) for nm in nodes.nodeNames] # Doesn't matter if nodes reach the ready state or not. Just start them looper.run(checkNodesConnected(nodes)) # Node B sends multiple NOMINATE messages for Node D but only after A has # nominated itself timeout = waits.expectedPoolNominationTimeout( nodeCount=len(keySharedNodes)) looper.run( eventually(checkNomination, nodeA, nodeA.name, retryWait=.25, timeout=timeout)) instId = getSelfNominationByNode(nodeA) for i in range(5): # nodeB.send(Nomination(nodeD.name, instId, nodeB.viewNo)) nodeB.send(nominationByNode(nodeD.name, nodeB, instId)) nodeB.nodestack.flushOutBoxes() # No node from node A, node C, node D(node B is malicious anyway so not # considering it) should have more than one nomination for node D since # node D is slow. The one nomination for D, that nodes A, C # and D might have would be because of node B for node in [nodeA, nodeC, nodeD]: assert [n[0] for n in node.elector.nominations[instId].values()].count( Replica.generateName(nodeD.name, instId)) \ <= 1 timeout = waits.expectedPoolElectionTimeout(nodeCount) + delayOfNomination primaryReplicas = ensureElectionsDone(looper=looper, nodes=nodes, customTimeout=timeout) for node in nodes: logger.debug("{}'s nominations {}".format(node, node.elector.nominations)) # Node D should not have any primary assert not nodeD.hasPrimary # A node other than Node D should not have any replica among the # primary replicas assert nodeD.name not in [pr.name for pr in primaryReplicas]
def testPrimaryElectionCase1(case1Setup, looper, txnPoolNodeSet): """ Case 1 - A node making multiple nominations for a particular node. Consider 4 nodes A, B, C and D. Lets say node B is malicious and is repeatedly nominating Node D """ nodeA, nodeB, nodeC, nodeD = txnPoolNodeSet # Doesn't matter if nodes reach the ready state or not. Just start them looper.run(checkNodesConnected(txnPoolNodeSet)) # Node B sends multiple NOMINATE messages for Node D but only after A has # nominated itself timeout = waits.expectedPoolNominationTimeout( nodeCount=len(txnPoolNodeSet)) looper.run(eventually(checkNomination, nodeA, nodeA.name, retryWait=.25, timeout=timeout)) instId = getSelfNominationByNode(nodeA) for i in range(5): # nodeB.send(Nomination(nodeD.name, instId, nodeB.viewNo)) nodeB.send(nominationByNode(nodeD.name, nodeB, instId)) nodeB.nodestack.flushOutBoxes() # No node from node A, node C, node D(node B is malicious anyway so not # considering it) should have more than one nomination for node D since # node D is slow. The one nomination for D, that nodes A, C # and D might have would be because of node B for node in [nodeA, nodeC, nodeD]: assert [n[0] for n in node.elector.nominations[instId].values()].count( Replica.generateName(nodeD.name, instId)) \ <= 1 timeout = waits.expectedPoolElectionTimeout(nodeCount) + delayOfNomination primaryReplicas = ensureElectionsDone(looper=looper, nodes=txnPoolNodeSet, customTimeout=timeout) for node in txnPoolNodeSet: logger.debug( "{}'s nominations {}".format(node, node.elector.nominations)) # Node D should not have any primary assert not nodeD.hasPrimary # A node other than Node D should not have any replica among the # primary replicas assert nodeD.name not in [pr.name for pr in primaryReplicas]
def testPrimaryElectionCase1(case1Setup, looper, keySharedNodes): """ Case 1 - A node making multiple nominations for a particular node. Consider 4 nodes A, B, C and D. Lets say node B is malicious and is repeatedly nominating Node D """ nodes = keySharedNodes nodeA, nodeB, nodeC, nodeD = [nodes.getNode(nm) for nm in nodes.nodeNames] # Doesn't matter if nodes reach the ready state or not. Just start them looper.run(checkNodesConnected(nodes)) # Node B sends multiple NOMINATE msgs for Node D but only after A has # nominated itself looper.run(eventually(checkNomination, nodeA, nodeA.name, retryWait=.25, timeout=1)) instId = getSelfNominationByNode(nodeA) for i in range(5): nodeB.send(Nomination(nodeD.name, instId, nodeB.viewNo)) nodeB.flushOutBoxes() # No node from node A, node C, node D(node B is malicious anyway so not # considering it) should have more than one nomination for node D since # node D is slow. The one nomination for D, that nodes A, C # and D might have would be because of node B for node in [nodeA, nodeC, nodeD]: assert list(node.elector.nominations[instId].values()).count( Replica.generateName(nodeD.name, instId)) \ <= 1 primaryReplicas = ensureElectionsDone(looper=looper, nodes=nodes, retryWait=1, timeout=30) for node in nodes: logging.debug( "{}'s nominations {}".format(node, node.elector.nominations)) # Node D should not have any primary assert not nodeD.hasPrimary # A node other than Node D should not have any replica among the # primary replicas assert nodeD.name not in [pr.name for pr in primaryReplicas]