refactor: expire last calls via celery (#7417)
* feat: expire_last_calls_task * feat: create periodic task for last calls * test: test new task * chore: remove expire-last-calls script
This commit is contained in:
parent
46a00acefc
commit
c9f35987bc
|
@ -40,9 +40,5 @@ $DTDIR/ietf/manage.py populate_yang_model_dirs -v0
|
||||||
# Re-run yang checks on active documents
|
# Re-run yang checks on active documents
|
||||||
$DTDIR/ietf/manage.py run_yang_model_checks -v0
|
$DTDIR/ietf/manage.py run_yang_model_checks -v0
|
||||||
|
|
||||||
# Expire last calls
|
|
||||||
# Enable when removed from /a/www/ietf-datatracker/scripts/Cron-runner:
|
|
||||||
$DTDIR/ietf/bin/expire-last-calls
|
|
||||||
|
|
||||||
# Purge older PersonApiKeyEvents
|
# Purge older PersonApiKeyEvents
|
||||||
$DTDIR/ietf/manage.py purge_old_personal_api_key_events 14
|
$DTDIR/ietf/manage.py purge_old_personal_api_key_events 14
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# This script requires that the proper virtual python environment has been
|
|
||||||
# invoked before start
|
|
||||||
|
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import syslog
|
|
||||||
|
|
||||||
# boilerplate
|
|
||||||
basedir = os.path.abspath(os.path.join(os.path.dirname(__file__), "../.."))
|
|
||||||
sys.path = [ basedir ] + sys.path
|
|
||||||
os.environ["DJANGO_SETTINGS_MODULE"] = "ietf.settings"
|
|
||||||
|
|
||||||
virtualenv_activation = os.path.join(basedir, "env", "bin", "activate_this.py")
|
|
||||||
if os.path.exists(virtualenv_activation):
|
|
||||||
execfile(virtualenv_activation, dict(__file__=virtualenv_activation))
|
|
||||||
|
|
||||||
syslog.openlog(os.path.basename(__file__), syslog.LOG_PID, syslog.LOG_USER)
|
|
||||||
|
|
||||||
import django
|
|
||||||
django.setup()
|
|
||||||
|
|
||||||
# ----------------------------------------------------------------------
|
|
||||||
|
|
||||||
from ietf.doc.lastcall import get_expired_last_calls, expire_last_call
|
|
||||||
|
|
||||||
drafts = get_expired_last_calls()
|
|
||||||
for doc in drafts:
|
|
||||||
try:
|
|
||||||
expire_last_call(doc)
|
|
||||||
syslog.syslog("Expired last call for %s (id=%s)" % (doc.file_tag(), doc.pk))
|
|
||||||
except Exception as e:
|
|
||||||
syslog.syslog(syslog.LOG_ERR, "ERROR: Failed to expire last call for %s (id=%s)" % (doc.file_tag(), doc.pk))
|
|
|
@ -23,6 +23,7 @@ from .expire import (
|
||||||
get_soon_to_expire_drafts,
|
get_soon_to_expire_drafts,
|
||||||
send_expire_warning_for_draft,
|
send_expire_warning_for_draft,
|
||||||
)
|
)
|
||||||
|
from .lastcall import get_expired_last_calls, expire_last_call
|
||||||
from .models import Document
|
from .models import Document
|
||||||
from .utils import generate_idnits2_rfc_status, generate_idnits2_rfcs_obsoleted
|
from .utils import generate_idnits2_rfc_status, generate_idnits2_rfcs_obsoleted
|
||||||
|
|
||||||
|
@ -61,6 +62,17 @@ def notify_expirations_task(notify_days=14):
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
|
def expire_last_calls_task():
|
||||||
|
for doc in get_expired_last_calls():
|
||||||
|
try:
|
||||||
|
expire_last_call(doc)
|
||||||
|
except Exception:
|
||||||
|
log.log(f"ERROR: Failed to expire last call for {doc.file_tag()} (id={doc.pk})")
|
||||||
|
else:
|
||||||
|
log.log(f"Expired last call for {doc.file_tag()} (id={doc.pk})")
|
||||||
|
|
||||||
|
|
||||||
|
@shared_task
|
||||||
def generate_idnits2_rfc_status_task():
|
def generate_idnits2_rfc_status_task():
|
||||||
outpath = Path(settings.DERIVED_DIR) / "idnits2-rfc-status"
|
outpath = Path(settings.DERIVED_DIR) / "idnits2-rfc-status"
|
||||||
blob = generate_idnits2_rfc_status()
|
blob = generate_idnits2_rfc_status()
|
||||||
|
|
|
@ -12,6 +12,7 @@ from .factories import DocumentFactory
|
||||||
from .models import Document
|
from .models import Document
|
||||||
from .tasks import (
|
from .tasks import (
|
||||||
expire_ids_task,
|
expire_ids_task,
|
||||||
|
expire_last_calls_task,
|
||||||
generate_idnits2_rfcs_obsoleted_task,
|
generate_idnits2_rfcs_obsoleted_task,
|
||||||
generate_idnits2_rfc_status_task,
|
generate_idnits2_rfc_status_task,
|
||||||
notify_expirations_task,
|
notify_expirations_task,
|
||||||
|
@ -71,6 +72,29 @@ class TaskTests(TestCase):
|
||||||
self.assertEqual(send_warning_mock.call_count, 1)
|
self.assertEqual(send_warning_mock.call_count, 1)
|
||||||
self.assertEqual(send_warning_mock.call_args[0], ("sentinel",))
|
self.assertEqual(send_warning_mock.call_args[0], ("sentinel",))
|
||||||
|
|
||||||
|
@mock.patch("ietf.doc.tasks.expire_last_call")
|
||||||
|
@mock.patch("ietf.doc.tasks.get_expired_last_calls")
|
||||||
|
def test_expire_last_calls_task(self, mock_get_expired, mock_expire):
|
||||||
|
docs = DocumentFactory.create_batch(3)
|
||||||
|
mock_get_expired.return_value = docs
|
||||||
|
expire_last_calls_task()
|
||||||
|
self.assertTrue(mock_get_expired.called)
|
||||||
|
self.assertEqual(mock_expire.call_count, 3)
|
||||||
|
self.assertEqual(mock_expire.call_args_list[0], mock.call(docs[0]))
|
||||||
|
self.assertEqual(mock_expire.call_args_list[1], mock.call(docs[1]))
|
||||||
|
self.assertEqual(mock_expire.call_args_list[2], mock.call(docs[2]))
|
||||||
|
|
||||||
|
# Check that it runs even if exceptions occur
|
||||||
|
mock_get_expired.reset_mock()
|
||||||
|
mock_expire.reset_mock()
|
||||||
|
mock_expire.side_effect = ValueError
|
||||||
|
expire_last_calls_task()
|
||||||
|
self.assertTrue(mock_get_expired.called)
|
||||||
|
self.assertEqual(mock_expire.call_count, 3)
|
||||||
|
self.assertEqual(mock_expire.call_args_list[0], mock.call(docs[0]))
|
||||||
|
self.assertEqual(mock_expire.call_args_list[1], mock.call(docs[1]))
|
||||||
|
self.assertEqual(mock_expire.call_args_list[2], mock.call(docs[2]))
|
||||||
|
|
||||||
@mock.patch("ietf.doc.tasks.generate_idnits2_rfc_status")
|
@mock.patch("ietf.doc.tasks.generate_idnits2_rfc_status")
|
||||||
def test_generate_idnits2_rfc_status_task(self, mock_generate):
|
def test_generate_idnits2_rfc_status_task(self, mock_generate):
|
||||||
mock_generate.return_value = "dåtå"
|
mock_generate.return_value = "dåtå"
|
||||||
|
@ -90,4 +114,3 @@ class TaskTests(TestCase):
|
||||||
"dåtå".encode("utf8"),
|
"dåtå".encode("utf8"),
|
||||||
(Path(settings.DERIVED_DIR) / "idnits2-rfcs-obsoleted").read_bytes(),
|
(Path(settings.DERIVED_DIR) / "idnits2-rfcs-obsoleted").read_bytes(),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -141,6 +141,16 @@ class Command(BaseCommand):
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
PeriodicTask.objects.get_or_create(
|
||||||
|
name="Expire Last Calls",
|
||||||
|
task="ietf.doc.tasks.expire_last_calls_task",
|
||||||
|
defaults=dict(
|
||||||
|
enabled=False,
|
||||||
|
crontab=self.crontabs["daily"],
|
||||||
|
description="Move docs whose last call has expired to their next states",
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
PeriodicTask.objects.get_or_create(
|
PeriodicTask.objects.get_or_create(
|
||||||
name="Sync with IANA changes",
|
name="Sync with IANA changes",
|
||||||
task="ietf.sync.tasks.iana_changes_update_task",
|
task="ietf.sync.tasks.iana_changes_update_task",
|
||||||
|
|
Loading…
Reference in a new issue