async def test_other_peering_objects_are_ignored(mocker, k8s_mocked, settings,
                                                 replenished, peering_resource,
                                                 peering_namespace):

    status = mocker.Mock()
    status.items.side_effect = Exception("This should not be called.")
    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': 'their-name'
            },
            'status': status,
        })

    wait_for = mocker.patch('asyncio.wait_for')

    settings.peering.name = 'our-name'
    await process_peering_event(
        raw_event=event,
        freeze_toggle=primitives.Toggle(),
        replenished=replenished,
        autoclean=False,
        identity='id',
        settings=settings,
        namespace=peering_namespace,
        resource=peering_resource,
    )
    assert not status.items.called
    assert not k8s_mocked.patch_obj.called
    assert wait_for.call_count == 0
Exemple #2
0
async def test_ignored_for_higher_priority_peer_when_already_on(caplog, assert_logs):
    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {'name': 'name', 'namespace': 'namespace'},  # for matching
            'status': {
                'higher-prio': {
                    'priority': 101,
                    'lifetime': 10,
                    'lastseen': '2020-12-31T23:59:59'
                },
            },
        })

    replenished = asyncio.Event()
    freeze_mode = primitives.Toggle(True)
    ourselves = Peer(id='id', name='name', namespace='namespace', priority=100)

    caplog.set_level(0)
    assert freeze_mode.is_on()
    await process_peering_event(
        raw_event=event,
        freeze_mode=freeze_mode,
        ourselves=ourselves,
        replenished=replenished,
        autoclean=False,
    )
    assert freeze_mode.is_on()
    assert_logs([], prohibited=[
        "Possibly conflicting operators",
        "Freezing all operators, including self",
        "Freezing operations in favour of",
        "Resuming operations after the freeze",
    ])
Exemple #3
0
async def test_other_peering_objects_are_ignored(mocker, settings, our_name,
                                                 our_namespace, their_name,
                                                 their_namespace):

    status = mocker.Mock()
    status.items.side_effect = Exception("This should not be called.")
    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': their_name,
                'namespace': their_namespace
            },
            'status': status,
        })

    settings.peering.name = our_name
    await process_peering_event(
        raw_event=event,
        freeze_mode=primitives.Toggle(),
        replenished=asyncio.Event(),
        autoclean=False,
        identity='id',
        settings=settings,
        namespace=our_namespace,
    )
    assert not status.items.called
async def test_ignored_for_same_priority_peer_when_already_on(
        mocker, k8s_mocked, replenished, caplog, assert_logs, settings,
        peering_resource, peering_namespace):

    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': 'name',
                'namespace': peering_namespace
            },  # for matching
            'status': {
                'higher-prio': {
                    'priority': 100,
                    'lifetime': 10,
                    'lastseen': '2020-12-31T23:59:59'
                },
            },
        })
    settings.peering.name = 'name'
    settings.peering.priority = 100

    freeze_toggle = primitives.Toggle(True)
    wait_for = mocker.patch('asyncio.wait_for')

    caplog.set_level(0)
    assert freeze_toggle.is_on()
    await process_peering_event(
        raw_event=event,
        freeze_toggle=freeze_toggle,
        replenished=replenished,
        autoclean=False,
        namespace=peering_namespace,
        resource=peering_resource,
        identity='id',
        settings=settings,
    )
    assert freeze_toggle.is_on()
    assert wait_for.call_count == 1
    assert 9 < wait_for.call_args[1]['timeout'] < 10
    assert not k8s_mocked.patch_obj.called
    assert_logs([
        "Possibly conflicting operators",
    ],
                prohibited=[
                    "Freezing all operators, including self",
                    "Freezing operations in favour of",
                    "Resuming operations after the freeze",
                ])
Exemple #5
0
async def test_ignored_for_same_priority_peer_when_already_on(
        k8s_mocked, caplog, assert_logs, settings, peering_resource,
        peering_namespace):

    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': 'name',
                'namespace': peering_namespace
            },  # for matching
            'status': {
                'higher-prio': {
                    'priority': 100,
                    'lifetime': 10,
                    'lastseen': '2020-12-31T23:59:59'
                },
            },
        })
    settings.peering.name = 'name'
    settings.peering.priority = 100

    conflicts_found = primitives.Toggle(True)
    k8s_mocked.sleep_or_wait.return_value = 1  # as if interrupted by stream pressure

    caplog.set_level(0)
    assert conflicts_found.is_on()
    await process_peering_event(
        raw_event=event,
        conflicts_found=conflicts_found,
        autoclean=False,
        namespace=peering_namespace,
        resource=peering_resource,
        identity='id',
        settings=settings,
    )
    assert conflicts_found.is_on()
    assert k8s_mocked.sleep_or_wait.call_count == 1
    assert 9 < k8s_mocked.sleep_or_wait.call_args[0][0][0] < 10
    assert not k8s_mocked.patch_obj.called
    assert_logs([
        "Possibly conflicting operators",
    ],
                prohibited=[
                    "Pausing all operators, including self",
                    "Pausing operations in favour of",
                    "Resuming operations after the pause",
                ])
Exemple #6
0
async def test_toggled_on_for_same_priority_peer_when_initially_off(
        caplog, assert_logs, settings):

    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': 'name',
                'namespace': 'namespace'
            },  # for matching
            'status': {
                'higher-prio': {
                    'priority': 100,
                    'lifetime': 10,
                    'lastseen': '2020-12-31T23:59:59'
                },
            },
        })
    settings.peering.name = 'name'
    settings.peering.priority = 100

    replenished = asyncio.Event()
    freeze_mode = primitives.Toggle(False)

    caplog.set_level(0)
    assert freeze_mode.is_off()
    await process_peering_event(
        raw_event=event,
        freeze_mode=freeze_mode,
        replenished=replenished,
        autoclean=False,
        namespace='namespace',
        identity='id',
        settings=settings,
    )
    assert freeze_mode.is_on()
    assert_logs([
        "Possibly conflicting operators",
        "Freezing all operators, including self",
    ],
                prohibited=[
                    "Freezing operations in favour of",
                    "Resuming operations after the freeze",
                ])
async def test_resumes_immediately_on_expiration_of_blocking_peers(
        mocker, k8s_mocked, replenished, caplog, assert_logs, settings,
        priority, peering_resource, peering_namespace):

    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': 'name',
                'namespace': peering_namespace
            },  # for matching
            'status': {
                'higher-prio': {
                    'priority': priority,
                    'lifetime': 10,
                    'lastseen': '2020-12-31T23:59:59'
                },
            },
        })
    settings.peering.name = 'name'
    settings.peering.priority = 100

    freeze_toggle = primitives.Toggle(True)
    wait_for = mocker.patch('asyncio.wait_for',
                            side_effect=asyncio.TimeoutError)

    caplog.set_level(0)
    assert freeze_toggle.is_on()
    await process_peering_event(
        raw_event=event,
        freeze_toggle=freeze_toggle,
        replenished=replenished,
        autoclean=False,
        namespace=peering_namespace,
        resource=peering_resource,
        identity='id',
        settings=settings,
    )
    assert freeze_toggle.is_on()
    assert wait_for.call_count == 1
    assert 9 < wait_for.call_args[1]['timeout'] < 10
    assert k8s_mocked.patch_obj.called
Exemple #8
0
def revise_namespaces(
        *,
        insights: references.Insights,
        namespaces: Collection[references.NamespacePattern],
        raw_events: Collection[bodies.RawEvent] = (),
        raw_bodies: Collection[bodies.RawBody] = (),
) -> None:
    all_events = list(raw_events) + [
        bodies.RawEvent(type=None, object=obj) for obj in raw_bodies
    ]
    for raw_event in all_events:
        namespace = references.NamespaceName(
            raw_event['object']['metadata']['name'])
        matched = any(
            references.match_namespace(namespace, pattern)
            for pattern in namespaces)
        deleted = is_deleted(raw_event)
        if deleted:
            insights.namespaces.discard(namespace)
        elif matched:
            insights.namespaces.add(namespace)
Exemple #9
0
async def test_resumes_immediately_on_expiration_of_blocking_peers(
        k8s_mocked, caplog, assert_logs, settings, priority, peering_resource,
        peering_namespace):

    event = bodies.RawEvent(
        type='ADDED',  # irrelevant
        object={
            'metadata': {
                'name': 'name',
                'namespace': peering_namespace
            },  # for matching
            'status': {
                'higher-prio': {
                    'priority': priority,
                    'lifetime': 10,
                    'lastseen': '2020-12-31T23:59:59'
                },
            },
        })
    settings.peering.name = 'name'
    settings.peering.priority = 100

    conflicts_found = primitives.Toggle(True)
    k8s_mocked.sleep_or_wait.return_value = None  # as if finished sleeping uninterrupted

    caplog.set_level(0)
    assert conflicts_found.is_on()
    await process_peering_event(
        raw_event=event,
        conflicts_found=conflicts_found,
        autoclean=False,
        namespace=peering_namespace,
        resource=peering_resource,
        identity='id',
        settings=settings,
    )
    assert conflicts_found.is_on()
    assert k8s_mocked.sleep_or_wait.call_count == 1
    assert 9 < k8s_mocked.sleep_or_wait.call_args[0][0][0] < 10
    assert k8s_mocked.patch_obj.called