Exemple #1
0
async def test_errors_are_raised_aggregated(activity):
    def sample_fn1(**_):
        raise PermanentError("boo!123")

    def sample_fn2(**_):
        raise PermanentError("boo!456")

    registry = OperatorRegistry()
    registry.register_activity_handler(fn=sample_fn1,
                                       id='id1',
                                       activity=activity)
    registry.register_activity_handler(fn=sample_fn2,
                                       id='id2',
                                       activity=activity)

    with pytest.raises(ActivityError) as e:
        await run_activity(
            registry=registry,
            activity=activity,
            lifecycle=all_at_once,
        )

    assert set(e.value.outcomes.keys()) == {'id1', 'id2'}
    assert e.value.outcomes['id1'].final
    assert e.value.outcomes['id1'].delay is None
    assert e.value.outcomes['id1'].result is None
    assert e.value.outcomes['id1'].exception is not None
    assert e.value.outcomes['id2'].final
    assert e.value.outcomes['id2'].delay is None
    assert e.value.outcomes['id2'].result is None
    assert e.value.outcomes['id2'].exception is not None
    assert str(e.value.outcomes['id1'].exception) == "boo!123"
    assert str(e.value.outcomes['id2'].exception) == "boo!456"
Exemple #2
0
async def test_delays_are_simulated(activity, mocker):
    def sample_fn(**_):
        raise TemporaryError('to be retried', delay=123)

    registry = OperatorRegistry()
    registry.register_activity_handler(fn=sample_fn,
                                       id='id',
                                       activity=activity,
                                       retries=3)

    with freezegun.freeze_time() as frozen:

        async def sleep_or_wait_substitute(*_, **__):
            frozen.tick(123)

        sleep_or_wait = mocker.patch('kopf.engines.sleeping.sleep_or_wait',
                                     wraps=sleep_or_wait_substitute)

        with pytest.raises(ActivityError) as e:
            await run_activity(
                registry=registry,
                activity=activity,
                lifecycle=all_at_once,
            )

    assert sleep_or_wait.call_count == 3  # 3 retries, 1 sleep each
Exemple #3
0
async def test_single_credentials_provided_to_vault():
    info = ConnectionInfo(server='https://expected/')
    vault = Vault()
    registry = OperatorRegistry()

    def login_fn(**_):
        return info

    registry.register_activity_handler(
        fn=login_fn,
        id=
        'login_fn',  # auto-detection does not work, as it is local to the test function.
        activity=Activity.AUTHENTICATION,
    )

    await authenticate(
        registry=registry,
        vault=vault,
    )

    assert vault

    items = []
    async for key, info in vault:
        items.append((key, info))

    assert len(items) == 1
    assert items[0][0] == 'login_fn'
    assert items[0][1] is info
Exemple #4
0
async def test_noreturn_handler_produces_no_credentials():
    vault = Vault()
    registry = OperatorRegistry()

    def login_fn(**_):
        pass

    registry.register_activity_handler(
        fn=login_fn,
        id=
        'login_fn',  # auto-detection does not work, as it is local to the test function.
        activity=Activity.AUTHENTICATION,
    )

    await authenticate(
        registry=registry,
        vault=vault,
    )

    assert vault.readiness.is_set()
    assert not vault.emptiness.is_set()

    assert not vault
    with pytest.raises(LoginError):
        async for _, _ in vault:
            pass
Exemple #5
0
async def test_errors_are_cascaded_from_one_of_the_originals(activity):
    def sample_fn(**_):
        raise PermanentError("boo!")

    registry = OperatorRegistry()
    registry.register_activity_handler(fn=sample_fn,
                                       id='id',
                                       activity=activity)

    with pytest.raises(ActivityError) as e:
        await run_activity(
            registry=registry,
            activity=activity,
            lifecycle=all_at_once,
        )

    assert e.value.__cause__
    assert type(e.value.__cause__) is PermanentError
    assert str(e.value.__cause__) == "boo!"
Exemple #6
0
async def test_retries_are_simulated(activity, mocker):
    mock = mocker.MagicMock()

    def sample_fn(**_):
        mock()
        raise TemporaryError('to be retried', delay=0)

    registry = OperatorRegistry()
    registry.register_activity_handler(fn=sample_fn,
                                       id='id',
                                       activity=activity,
                                       retries=3)

    with pytest.raises(ActivityError) as e:
        await run_activity(
            registry=registry,
            activity=activity,
            lifecycle=all_at_once,
        )

    assert isinstance(e.value.outcomes['id'].exception, PermanentError)
    assert mock.call_count == 3
Exemple #7
0
async def test_results_are_returned_on_success(activity):
    def sample_fn1(**_):
        return 123

    def sample_fn2(**_):
        return 456

    registry = OperatorRegistry()
    registry.register_activity_handler(fn=sample_fn1,
                                       id='id1',
                                       activity=activity)
    registry.register_activity_handler(fn=sample_fn2,
                                       id='id2',
                                       activity=activity)

    results = await run_activity(
        registry=registry,
        activity=activity,
        lifecycle=all_at_once,
    )

    assert set(results.keys()) == {'id1', 'id2'}
    assert results['id1'] == 123
    assert results['id2'] == 456