def testNonStewardCannotAddNode(looper, txnPoolNodeSet, client1, wallet1, client1Connected, tdirWithPoolTxns, tconf, allPluginsPath): newNodeName = "Epsilon" sendAddNewNode(tdirWithPoolTxns, newNodeName, client1, wallet1) for node in txnPoolNodeSet: waitRejectWithReason( looper, client1, 'is not a steward so cannot add a ' 'new node', node.clientstack.name)
def testStewardCannotAddMoreThanOneNode(looper, txnPoolNodeSet, steward1, stewardWallet, tdirWithPoolTxns, tconf, allPluginsPath): newNodeName = "Epsilon" sendAddNewNode(tdirWithPoolTxns, newNodeName, steward1, stewardWallet) for node in txnPoolNodeSet: waitRejectWithReason(looper, steward1, 'already has a node', node.clientstack.name)
def test_different_ledger_request_interleave(tconf, looper, txnPoolNodeSet, client1, wallet1, one_node_added, client1Connected, tdir, client_tdir, tdirWithPoolTxns, steward1, stewardWallet, allPluginsPath): """ Send pool and domain ledger requests such that they interleave, and do view change in between and verify the pool is functional """ new_node = one_node_added sendReqsToNodesAndVerifySuffReplies(looper, wallet1, client1, 2) ensure_all_nodes_have_same_data(looper, txnPoolNodeSet) # Send domain ledger requests but don't wait for replies requests = sendRandomRequests(wallet1, client1, 2) # Add another node by sending pool ledger request _, _, new_theta = nodeThetaAdded(looper, txnPoolNodeSet, tdir, client_tdir, tconf, steward1, stewardWallet, allPluginsPath, name='new_theta') # Send more domain ledger requests but don't wait for replies requests.extend(sendRandomRequests(wallet1, client1, 3)) # Do view change without waiting for replies ensure_view_change(looper, nodes=txnPoolNodeSet) checkProtocolInstanceSetup(looper, txnPoolNodeSet, retryWait=1) # Make sure all requests are completed waitForSufficientRepliesForRequests(looper, client1, requests=requests) ensure_pool_functional(looper, txnPoolNodeSet, wallet1, client1) new_steward, new_steward_wallet = addNewSteward(looper, client_tdir, steward1, stewardWallet, 'another_ste') # Send another pool ledger request (NODE) but don't wait for completion of # request next_node_name = 'next_node' r = sendAddNewNode(tdir, tconf, next_node_name, new_steward, new_steward_wallet) node_req = r[0] # Send more domain ledger requests but don't wait for replies requests = [ node_req, *sendRandomRequests(new_steward_wallet, new_steward, 5) ] # Make sure all requests are completed waitForSufficientRepliesForRequests(looper, new_steward, requests=requests) # Make sure pool is functional ensure_pool_functional(looper, txnPoolNodeSet, wallet1, client1)
def testStewardCannotAddNodeWithOutFullFieldsSet(looper, tdir, tconf, txnPoolNodeSet, newAdHocSteward): """ The case: Steward accidentally sends the NODE txn without full fields set. The expected result: Steward gets NAck response from the pool. """ newNodeName = "Epsilon" newSteward, newStewardWallet = newAdHocSteward # case from the ticket def _renameNodePortField(op): op[DATA].update({NODE_PORT + ' ': op[DATA][NODE_PORT]}) del op[DATA][NODE_PORT] sendAddNewNode(tdir, tconf, newNodeName, newSteward, newStewardWallet, transformOpFunc=_renameNodePortField) waitReqNackFromPoolWithReason(looper, txnPoolNodeSet, newSteward, "unknown field") for fn in (NODE_IP, CLIENT_IP, NODE_PORT, CLIENT_PORT): def _tnf(op): del op[DATA][fn] sendAddNewNode(tdir, tconf, newNodeName, newSteward, newStewardWallet, transformOpFunc=_tnf) # wait NAcks with exact message. it does not works for just 'is missed' # because the 'is missed' will check only first few cases waitReqNackFromPoolWithReason(looper, txnPoolNodeSet, newSteward, "unknown field")