Skip to content
Snippets Groups Projects
Verified Commit 84e2f0af authored by Eliot Berriot's avatar Eliot Berriot
Browse files

See #689: added a task to refresh nodeinfo data on known domain periodically

parent b45cada6
No related branches found
No related tags found
No related merge requests found
......@@ -486,8 +486,15 @@ CELERY_BEAT_SCHEDULE = {
"schedule": crontab(minute="0", hour="0"),
"options": {"expires": 60 * 60 * 24},
},
"federation.refresh_nodeinfo_known_nodes": {
"task": "federation.refresh_nodeinfo_known_nodes",
"schedule": crontab(minute="0", hour="*"),
"options": {"expires": 60 * 60},
},
}
NODEINFO_REFRESH_DELAY = env.int("NODEINFO_REFRESH_DELAY", default=3600 * 24)
JWT_AUTH = {
"JWT_ALLOW_REFRESH": True,
"JWT_EXPIRATION_DELTA": datetime.timedelta(days=7),
......
......@@ -212,6 +212,22 @@ def update_domain_nodeinfo(domain):
domain.save(update_fields=["nodeinfo", "nodeinfo_fetch_date", "service_actor"])
@celery.app.task(name="federation.refresh_nodeinfo_known_nodes")
def refresh_nodeinfo_known_nodes():
"""
Trigger a node info refresh on all nodes that weren't refreshed since
settings.NODEINFO_REFRESH_DELAY
"""
limit = timezone.now() - datetime.timedelta(seconds=settings.NODEINFO_REFRESH_DELAY)
candidates = models.Domain.objects.external().exclude(
nodeinfo_fetch_date__gte=limit
)
names = candidates.values_list("name", flat=True)
logger.info("Launching periodic nodeinfo refresh on %s domains", len(names))
for domain_name in names:
update_domain_nodeinfo.delay(domain_name=domain_name)
def delete_qs(qs):
label = qs.model._meta.label
result = qs.delete()
......
......@@ -216,6 +216,31 @@ def test_update_domain_nodeinfo_error(factories, r_mock, now):
}
def test_refresh_nodeinfo_known_nodes(settings, factories, mocker, now):
settings.NODEINFO_REFRESH_DELAY = 666
refreshed = [
factories["federation.Domain"](nodeinfo_fetch_date=None),
factories["federation.Domain"](
nodeinfo_fetch_date=now
- datetime.timedelta(seconds=settings.NODEINFO_REFRESH_DELAY + 1)
),
]
factories["federation.Domain"](
nodeinfo_fetch_date=now
- datetime.timedelta(seconds=settings.NODEINFO_REFRESH_DELAY - 1)
)
update_domain_nodeinfo = mocker.patch.object(tasks.update_domain_nodeinfo, "delay")
tasks.refresh_nodeinfo_known_nodes()
assert update_domain_nodeinfo.call_count == len(refreshed)
for d in refreshed:
update_domain_nodeinfo.assert_any_call(domain_name=d.name)
def test_handle_purge_actors(factories, mocker):
to_purge = factories["federation.Actor"]()
keeped = [
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment