def testNodeKeysChanged(looper, txnPoolNodeSet, tdir,
                        tconf, sdk_node_theta_added,
                        sdk_pool_handle,
                        allPluginsPath=None):
    new_steward_wallet, new_node = sdk_node_theta_added

    new_node.stop()
    looper.removeProdable(name=new_node.name)
    nodeHa, nodeCHa = HA(*new_node.nodestack.ha), HA(*new_node.clientstack.ha)
    sigseed = randomString(32).encode()
    verkey = base58.b58encode(SimpleSigner(seed=sigseed).naclSigner.verraw).decode("utf-8")
    sdk_change_node_keys(looper, new_node, new_steward_wallet, sdk_pool_handle, verkey)

    config_helper = PNodeConfigHelper(new_node.name, tconf, chroot=tdir)
    initNodeKeysForBothStacks(new_node.name, config_helper.keys_dir, sigseed,
                              override=True)

    logger.debug("{} starting with HAs {} {}".format(new_node, nodeHa, nodeCHa))

    node = TestNode(new_node.name,
                    config_helper=config_helper,
                    config=tconf,
                    ha=nodeHa, cliha=nodeCHa, pluginPaths=allPluginsPath)
    looper.add(node)
    # The last element of `txnPoolNodeSet` is the node Theta that was just
    # stopped
    txnPoolNodeSet[-1] = node

    looper.run(checkNodesConnected(txnPoolNodeSet))
    waitNodeDataEquality(looper, node, *txnPoolNodeSet[:-1])
    sdk_ensure_pool_functional(looper, txnPoolNodeSet, new_steward_wallet, sdk_pool_handle)
def testNodeInitRemoteKeysErrorsNotSuppressed(looper, txnPoolNodeSet,
                                              sdk_node_theta_added,
                                              monkeypatch, sdk_pool_handle):
    TEST_EXCEPTION_MESSAGE = 'Failed to create some cert files'

    new_steward_wallet, new_node = sdk_node_theta_added

    new_node.stop()
    looper.removeProdable(name=new_node.name)
    nodeHa, nodeCHa = HA(*new_node.nodestack.ha), HA(*new_node.clientstack.ha)
    sigseed = randomString(32).encode()
    verkey = base58.b58encode(SimpleSigner(seed=sigseed).naclSigner.verraw)

    def initRemoteKeysMock(name, *args, **kwargs):
        if name in [node.name for node in txnPoolNodeSet]:
            raise OSError(TEST_EXCEPTION_MESSAGE)
        else:
            return initRemoteKeys(name, *args, **kwargs)

    def wrap(node):
        oldMethod = node.poolManager.stackKeysChanged

        def stackKeysChanged(self, *args, **kwargs):
            with pytest.raises(OSError,
                               message="exception was suppressed") as excinfo:
                oldMethod(*args, **kwargs)
            excinfo.match(r'{}'.format(TEST_EXCEPTION_MESSAGE))
            return 0

        node.poolManager.stackKeysChanged = types.MethodType(
            stackKeysChanged, node.poolManager)

    for node in txnPoolNodeSet:
        wrap(node)

    monkeypatch.setattr(stack_manager, 'initRemoteKeys', initRemoteKeysMock)

    sdk_change_node_keys(looper, new_node, new_steward_wallet, sdk_pool_handle,
                         verkey)

    monkeypatch.undo()
def testNodeInitRemoteKeysErrorsNotSuppressed(looper, txnPoolNodeSet,
                                              sdk_node_theta_added,
                                              monkeypatch,
                                              sdk_pool_handle):
    TEST_EXCEPTION_MESSAGE = 'Failed to create some cert files'

    new_steward_wallet, new_node = sdk_node_theta_added

    new_node.stop()
    looper.removeProdable(name=new_node.name)
    nodeHa, nodeCHa = HA(*new_node.nodestack.ha), HA(*new_node.clientstack.ha)
    sigseed = randomString(32).encode()
    verkey = base58.b58encode(SimpleSigner(seed=sigseed).naclSigner.verraw).decode("utf-8")

    def initRemoteKeysMock(name, *args, **kwargs):
        if name in [node.name for node in txnPoolNodeSet]:
            raise OSError(TEST_EXCEPTION_MESSAGE)
        else:
            return initRemoteKeys(name, *args, **kwargs)

    def wrap(node):
        oldMethod = node.poolManager.stackKeysChanged

        def stackKeysChanged(self, *args, **kwargs):
            with pytest.raises(OSError,
                               message="exception was suppressed") as excinfo:
                oldMethod(*args, **kwargs)
            excinfo.match(r'{}'.format(TEST_EXCEPTION_MESSAGE))
            return 0

        node.poolManager.stackKeysChanged = types.MethodType(stackKeysChanged,
                                                             node.poolManager)

    for node in txnPoolNodeSet:
        wrap(node)

    monkeypatch.setattr(stack_manager, 'initRemoteKeys', initRemoteKeysMock)

    sdk_change_node_keys(looper, new_node, new_steward_wallet, sdk_pool_handle, verkey)

    monkeypatch.undo()
def test_edit_node_with_invalid_verkey(looper, txnPoolNodeSet, sdk_pool_handle,
                                       sdk_wallet_steward):
    with pytest.raises(RequestNackedException) as e:
        sdk_change_node_keys(looper, txnPoolNodeSet[0], sdk_wallet_steward,
                             sdk_pool_handle, invalid_dest)
    e.match('Node\'s verkey is not correct Ed25519 key.')