async def test_new_resources_and_namespaces_spawn_new_tasks( settings, ensemble: Ensemble, insights: Insights, peering_resource): settings.peering.namespaced = peering_resource.namespaced r1 = Resource(group='group1', version='version1', plural='plural1', namespaced=True) r2 = Resource(group='group2', version='version2', plural='plural2', namespaced=True) insights.resources.add(r1) insights.resources.add(r2) insights.namespaces.add('ns1') insights.namespaces.add('ns2') r1ns1 = EnsembleKey(resource=r1, namespace='ns1') r1ns2 = EnsembleKey(resource=r1, namespace='ns2') r2ns1 = EnsembleKey(resource=r2, namespace='ns1') r2ns2 = EnsembleKey(resource=r2, namespace='ns2') peer1 = EnsembleKey(resource=peering_resource, namespace='ns1') peer2 = EnsembleKey(resource=peering_resource, namespace='ns2') await adjust_tasks( processor=processor, identity=Identity('...'), settings=settings, insights=insights, ensemble=ensemble, ) assert set(ensemble.watcher_tasks) == {r1ns1, r1ns2, r2ns1, r2ns2} assert set(ensemble.peering_tasks) == {peer1, peer2} assert set(ensemble.pinging_tasks) == {peer1, peer2} assert set(ensemble.freeze_toggles) == {peer1, peer2}
async def test_discovery_is_cached_per_session(resp_mocker, aresponses, hostname): res1info = {'name': 'someresources1', 'namespaced': True} res2info = {'name': 'someresources2', 'namespaced': True} result = {'resources': [res1info]} list_mock = resp_mocker(return_value=aiohttp.web.json_response(result)) aresponses.add(hostname, '/apis/some-group.org/someversion', 'get', list_mock) result = {'resources': [res2info]} list_mock = resp_mocker(return_value=aiohttp.web.json_response(result)) aresponses.add(hostname, '/apis/some-group.org/someversion', 'get', list_mock) resource = Resource('some-group.org', 'someversion', 'someresources1') info = await discover(resource=resource) assert info == res1info resource = Resource('some-group.org', 'someversion', 'someresources2') info = await discover(resource=resource) assert info is None # cached as absent on the 1st call. resource = Resource('some-group.org', 'someversion', 'someresources1') info = await discover(resource=resource) assert info == res1info
async def insights(settings, resource): val_resource = Resource('admissionregistration.k8s.io', 'v1', 'validatingwebhookconfigurations') mut_resource = Resource('admissionregistration.k8s.io', 'v1', 'mutatingwebhookconfigurations') insights = Insights() insights.resources.add(resource) await insights.backbone.fill(resources=[val_resource, mut_resource]) insights.ready_resources.set() return insights
async def test_gone_resources_and_namespaces_stop_running_tasks( settings, ensemble: Ensemble, insights: Insights, peering_resource): settings.peering.namespaced = peering_resource.namespaced r1 = Resource(group='group1', version='version1', plural='plural1', namespaced=True) r2 = Resource(group='group2', version='version2', plural='plural2', namespaced=True) insights.resources.add(r1) insights.resources.add(r2) insights.namespaces.add('ns1') insights.namespaces.add('ns2') r1ns1 = EnsembleKey(resource=r1, namespace='ns1') r1ns2 = EnsembleKey(resource=r1, namespace='ns2') r2ns1 = EnsembleKey(resource=r2, namespace='ns1') r2ns2 = EnsembleKey(resource=r2, namespace='ns2') peer1 = EnsembleKey(resource=peering_resource, namespace='ns1') await adjust_tasks( # initialisation processor=processor, identity=Identity('...'), settings=settings, insights=insights, ensemble=ensemble) r1ns2_task = ensemble.watcher_tasks[r1ns2] r2ns1_task = ensemble.watcher_tasks[r2ns1] r2ns2_task = ensemble.watcher_tasks[r2ns2] insights.resources.discard(r2) insights.namespaces.discard('ns2') await adjust_tasks( # action-under-test processor=processor, identity=Identity('...'), settings=settings, insights=insights, ensemble=ensemble, ) assert set(ensemble.watcher_tasks) == {r1ns1} assert set(ensemble.peering_tasks) == {peer1} assert set(ensemble.pinging_tasks) == {peer1} assert set(ensemble.freeze_toggles) == {peer1} assert r1ns2_task.cancelled() assert r2ns1_task.cancelled() assert r2ns2_task.cancelled()
async def test_cluster_tasks_continue_running_on_namespace_deletion( settings, ensemble: Ensemble, insights: Insights, peering_resource): settings.peering.namespaced = peering_resource.namespaced r1 = Resource(group='group1', version='version1', plural='plural1', namespaced=True) r2 = Resource(group='group2', version='version2', plural='plural2', namespaced=True) insights.resources.add(r1) insights.resources.add(r2) insights.namespaces.add(None) r1nsN = EnsembleKey(resource=r1, namespace=None) r2nsN = EnsembleKey(resource=r2, namespace=None) peerN = EnsembleKey(resource=peering_resource, namespace=None) await adjust_tasks( # initialisation processor=processor, identity=Identity('...'), settings=settings, insights=insights, ensemble=ensemble) r1nsN_task = ensemble.watcher_tasks[r1nsN] r2nsN_task = ensemble.watcher_tasks[r2nsN] insights.namespaces.discard(None) await adjust_tasks( # action-under-test processor=processor, identity=Identity('...'), settings=settings, insights=insights, ensemble=ensemble, ) assert set(ensemble.watcher_tasks) == {r1nsN, r2nsN} assert set(ensemble.peering_tasks) == {peerN} assert set(ensemble.pinging_tasks) == {peerN} assert set(ensemble.freeze_toggles) == {peerN} assert not r1nsN_task.cancelled() assert not r2nsN_task.cancelled() assert not r1nsN_task.done() assert not r2nsN_task.done()
def test_creation_with_all_kwargs(): resource = Resource( group='group', version='version', plural='plural', ) assert resource.group == 'group' assert resource.version == 'version' assert resource.plural == 'plural'
async def test_discovery_of_unexisting_group_or_version( resp_mocker, aresponses, hostname, status): list_mock = resp_mocker(return_value=aresponses.Response(status=status)) aresponses.add(hostname, '/apis/some-group.org/someversion', 'get', list_mock) resource = Resource('some-group.org', 'someversion', 'someresources') info = await discover(resource=resource) assert info is None
def resource(): return Resource( group='group1', version='version1', preferred=True, plural='plural1', singular='singular1', kind='kind1', shortcuts=['shortcut1', 'shortcut2'], categories=['category1', 'category2'], )