Esempio n. 1
0
def test_availability_tracker_integration(blockchain_ursulas, monkeypatch):

    # Start up self-services
    ursula = blockchain_ursulas.pop()
    start_pytest_ursula_services(ursula=ursula)

    ursula._availability_tracker = AvailabilityTracker(ursula=ursula)

    def maintain():
        tracker = ursula._availability_tracker

        def mock_node_information_endpoint(middleware, port, *args, **kwargs):
            ursula_were_looking_for = ursula.rest_interface.port == port
            if ursula_were_looking_for:
                raise RestMiddleware.NotFound(
                    "Fake Reason")  # Make this node unreachable
            else:
                response = Response(response=bytes(ursula),
                                    mimetype='application/octet-stream')
                return response

        # apply the monkeypatch for requests.get to mock_get
        monkeypatch.setattr(NucypherMiddlewareClient,
                            NucypherMiddlewareClient.node_information.__name__,
                            mock_node_information_endpoint)

        ursula._availability_tracker.start()
        tracker.measure_sample()  # This makes a REST Call

        start, timeout = maya.now(), 1  # seconds
        while True:
            try:
                assert len(tracker.excuses)
            except AssertionError:
                now = maya.now()
                if (now - start).total_seconds() > timeout:
                    pytest.fail()
                time.sleep(0.1)
                continue
            else:
                break

    # Run the Callbacks
    try:
        d = threads.deferToThread(maintain)
        yield d
    finally:
        if ursula._availability_tracker:
            ursula._availability_tracker.stop()
            ursula._availability_tracker = None
Esempio n. 2
0
    def run_ursula():
        i = start_pytest_ursula_services(ursula=teacher)
        args = ('ursula', 'run',
                '--debug',  # Display log output; Do not attach console
                '--federated-only',  # Operating Mode
                '--rest-port', deploy_port,  # Network Port
                '--teacher', teacher_uri,
                '--dev',  # Run in development mode (ephemeral node)
                '--dry-run'  # Disable twisted reactor
                )

        return threads.deferToThread(click_runner.invoke,
                                     nucypher_cli, args,
                                     catch_exceptions=False,
                                     input=INSECURE_DEVELOPMENT_PASSWORD + '\n')
Esempio n. 3
0
def test_persistent_node_storage_integration(click_runner, custom_filepath,
                                             testerchain, blockchain_ursulas,
                                             agency_local_registry):

    alice, ursula, another_ursula, felix, staker, *all_yall = testerchain.unassigned_accounts
    filename = UrsulaConfiguration.generate_filename()
    another_ursula_configuration_file_location = os.path.join(
        custom_filepath, filename)

    init_args = (
        'ursula',
        'init',
        '--provider',
        TEST_PROVIDER_URI,
        '--worker-address',
        another_ursula,
        '--network',
        TEMPORARY_DOMAIN,
        '--rest-host',
        MOCK_IP_ADDRESS,
        '--config-root',
        custom_filepath,
        '--registry-filepath',
        agency_local_registry.filepath,
    )

    envvars = {NUCYPHER_ENVVAR_KEYRING_PASSWORD: INSECURE_DEVELOPMENT_PASSWORD}
    result = click_runner.invoke(nucypher_cli,
                                 init_args,
                                 catch_exceptions=False,
                                 env=envvars)
    assert result.exit_code == 0

    teacher = blockchain_ursulas.pop()
    teacher_uri = teacher.rest_information()[0].uri

    start_pytest_ursula_services(ursula=teacher)

    user_input = f'{INSECURE_DEVELOPMENT_PASSWORD}\n'

    run_args = ('ursula', 'run', '--dry-run', '--debug', '--interactive',
                '--config-file', another_ursula_configuration_file_location,
                '--teacher', teacher_uri)

    Worker.READY_TIMEOUT = 1
    with pytest.raises(Teacher.UnbondedWorker):
        # Worker init success, but not bonded.
        result = yield threads.deferToThread(click_runner.invoke,
                                             nucypher_cli,
                                             run_args,
                                             catch_exceptions=False,
                                             input=user_input,
                                             env=envvars)
    assert result.exit_code == 0

    # Run an Ursula amidst the other configuration files
    run_args = ('ursula', 'run', '--dry-run', '--debug', '--interactive',
                '--config-file', another_ursula_configuration_file_location)

    with pytest.raises(Teacher.UnbondedWorker):
        # Worker init success, but not bonded.
        result = yield threads.deferToThread(click_runner.invoke,
                                             nucypher_cli,
                                             run_args,
                                             catch_exceptions=False,
                                             input=user_input,
                                             env=envvars)
    assert result.exit_code == 0
Esempio n. 4
0
def test_availability_tracker_success(blockchain_ursulas):

    # Start up self-services
    ursula = blockchain_ursulas.pop()
    start_pytest_ursula_services(ursula=ursula)

    ursula._availability_tracker = AvailabilityTracker(ursula=ursula)

    def measure():
        ursula._availability_tracker.start()
        assert ursula._availability_tracker.score == 10
        ursula._availability_tracker.record(False)
        assert ursula._availability_tracker.score == 9.0
        for i in range(7):
            ursula._availability_tracker.record(True)
        assert ursula._availability_tracker.score > 9.5

    def maintain():
        tracker = ursula._availability_tracker
        tracker.maintain()

        # The node goes offline for some time...
        for _ in range(10):
            ursula._availability_tracker.record(
                False, reason={'error': 'fake failure reason'})

        assert tracker.score < 4
        assert tracker.status() == (
            tracker.score > (tracker.SENSITIVITY * tracker.MAXIMUM_SCORE))
        assert not tracker.status()

        original_issuer = AvailabilityTracker.issue_warnings
        warnings = dict()

        def issue_warnings(tracker, *args, **kwargs):
            result = original_issuer(tracker, *args, **kwargs)
            warnings[tracker.score] = result

        AvailabilityTracker.issue_warnings = issue_warnings
        tracker.maintain()
        assert warnings
        AvailabilityTracker.issue_warnings = original_issuer

        # to keep this test fast, were just checking for a single entry
        # (technically there will be 10, but resolution is one second.)
        assert len(tracker.excuses) > 0

    def raise_to_maximum():
        tracker = ursula._availability_tracker
        for i in range(150):
            tracker.record(True)
        assert tracker.score > 9.98
        assert tracker.status() == bool(
            tracker.score > (tracker.SENSITIVITY * tracker.MAXIMUM_SCORE))
        assert tracker.status()

    # Run the Callbacks
    try:
        d = threads.deferToThread(measure)
        yield d
        d = threads.deferToThread(maintain)
        yield d
        d = threads.deferToThread(raise_to_maximum)
        yield d
    finally:
        if ursula._availability_tracker:
            ursula._availability_tracker.stop()
            ursula._availability_tracker = None
Esempio n. 5
0
 def start():
     # Start running the worker
     start_pytest_ursula_services(ursula=ursula)
     ursula.work_tracker.start(act_now=True)
Esempio n. 6
0
 def start():
     print("Starting Worker for auto-commitment simulation")
     start_pytest_ursula_services(ursula=ursula)
Esempio n. 7
0
 def start():
     log("Starting Operator for auto confirm address simulation")
     start_pytest_ursula_services(ursula=ursula)
Esempio n. 8
0
 def start():
     # Start running the worker
     start_pytest_ursula_services(ursula=ursula)
Esempio n. 9
0
 def run_teacher():
     start_pytest_ursula_services(ursula=teacher)
     return teacher_uri
Esempio n. 10
0
 def _run_teacher(_encrypt_result):
     start_pytest_ursula_services(ursula=teacher)
     return teacher_uri