Skip to content

Commit 18b629b

Browse files
committed
Refresh token if expired for classify-ms-file job, as it is anyway a job queued by system, so token expiry renewal should not be a risk
1 parent 08b4a20 commit 18b629b

File tree

3 files changed

+49
-6
lines changed

3 files changed

+49
-6
lines changed

src/backend/rawstatus/jobs.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from urllib.parse import urlsplit, urlparse, urljoin
44
import ftplib
55
from datetime import datetime
6+
from django.utils import timezone
67

78
from rawstatus import tasks
89
from rawstatus import models as rm
@@ -327,6 +328,10 @@ def process(self, **kwargs):
327328
'path').first()
328329

329330
self.queue = self.get_server_based_queue(fss['server__name'], settings.QUEUE_FASTSTORAGE)
331+
# Renew token in case it's old
332+
up_token = rm.UploadToken.objects.get(token=kwargs['token'])
333+
if up_token.expired:
334+
up_token.renew()
330335
self.run_tasks.append((kwargs['token'], sfloc['pk'], sfloc['sfile__filetype__name'],
331336
fss['path'], sfloc['path'], sfloc['sfile__filename']))
332337

src/backend/rawstatus/models.py

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import os
22
import re
3-
from datetime import datetime
3+
from datetime import datetime, timedelta
44
from base64 import b64encode
55

66
from django.db import models
@@ -343,6 +343,17 @@ def invalidate(self):
343343
self.expired = True
344344
self.save()
345345

346+
def renew(self, expires=False):
347+
if not expires:
348+
if self.producer.internal:
349+
expi_sec = settings.MAX_TIME_PROD_TOKEN
350+
else :
351+
expi_sec = settings.MAX_TIME_UPLOADTOKEN
352+
expires = timezone.now() + timedelta(seconds=expi_sec)
353+
self.expired = False
354+
self.expires = expires
355+
self.save()
356+
346357

347358
class UserFile(models.Model):
348359
sfile = models.OneToOneField(StoredFile, on_delete=models.CASCADE)

src/backend/rawstatus/tests.py

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from string import Template
99
from time import sleep, time
1010
from io import BytesIO
11-
from base64 import b64encode
11+
from base64 import b64encode, b64decode
1212
import subprocess
1313
from datetime import timedelta, datetime
1414
from tempfile import mkdtemp
@@ -443,13 +443,14 @@ def test_transfer_qc(self):
443443
'filetype_ext': os.path.splitext(fullp)[1][1:], 'injection_waittime': 5}, fp)
444444
sp = self.run_script(False, config=os.path.join(tmpdir, 'config.json'), session=True)
445445
sleep(5)
446+
446447
newraw = rm.RawFile.objects.last()
447448
newsfloc = rm.StoredFileLoc.objects.last()
448449
self.assertEqual(newraw.pk, lastraw.pk + 1)
449450
self.assertEqual(newsfloc.sfile_id, lastsf.pk + 1)
450451
self.assertFalse(newraw.claimed)
451452
self.assertEqual(newraw.usetype, rm.UploadFileType.RAWFILE)
452-
# Run rsync
453+
# Run rsync fromweb
453454
self.run_job()
454455
classifyjob = jm.Job.objects.filter(funcname='classify_msrawfile', kwargs={
455456
'sfloc_id': newsfloc.pk, 'token': self.token})
@@ -758,10 +759,12 @@ def test_transfer_dset_assoc(self):
758759
state=dm.DCStates.NEW)
759760
self.do_transfer_dset_assoc(ds_exists=True, ds_hasfiles=False)
760761

761-
def test_classify_fail_nometadata(self):
762+
def test_classify_fail_nometadata_and_renew_token(self):
762763
# This file is of filetype self.ft which is is_folder
763764
self.f3raw.delete()
764765
self.get_token()
766+
strtoken, _h, _d = b64decode(self.token['user_token']).decode('utf-8').split('|')
767+
token = rm.UploadToken.objects.get(token=strtoken)
765768
fpath = os.path.join(self.rootdir, self.newstorctrl.path, self.f3sss.path)
766769
fullp = os.path.join(fpath, self.f3sf.filename)
767770
old_raw = rm.RawFile.objects.last()
@@ -774,6 +777,10 @@ def test_classify_fail_nometadata(self):
774777
# Run rsync
775778
self.run_job()
776779
sf.refresh_from_db()
780+
# Expire token so classify gets 403, make it run again
781+
token.expires = timezone.now()
782+
token.save()
783+
self.assertFalse(token.expired)
777784
# Delete classify input xml and run classify
778785
os.unlink(os.path.join(self.rootdir, self.inboxctrl.path, sss.path, sf.filename, 'HyStarMetadata.xml'))
779786
self.run_job()
@@ -785,9 +792,29 @@ def test_classify_fail_nometadata(self):
785792
os.killpg(os.getpgid(sp.pid), signal.SIGTERM)
786793
spout, sperr = sp.communicate()
787794
self.fail()
788-
cjob = jm.Job.objects.filter(funcname='classify_msrawfile', kwargs__sfloc_id=sss.pk).get()
795+
# Classify task call w "old" token, will set token to expired
796+
cjob = jm.Job.objects.filter(funcname='classify_msrawfile', kwargs__sfloc_id=sss.pk)
797+
cj_g = cjob.get()
798+
token.refresh_from_db()
799+
self.assertTrue(token.expired)
800+
self.assertEqual(cj_g.task_set.get().state, states.FAILURE)
801+
# Call retry job which will update the expired
802+
self.user.is_staff = True
803+
self.user.save()
804+
resp = self.cl.post('/jobs/retry/', content_type='application/json',
805+
data={'item_id': cj_g.pk})
806+
self.assertEqual(resp.status_code, 200)
807+
self.run_job()
808+
try:
809+
spout, sperr = sp.communicate(timeout=10)
810+
except subprocess.TimeoutExpired:
811+
sp.terminate()
812+
# Properly kill children since upload.py uses multiprocessing
813+
os.killpg(os.getpgid(sp.pid), signal.SIGTERM)
814+
spout, sperr = sp.communicate()
815+
self.fail()
789816
new_raw.refresh_from_db()
790-
self.assertEqual(cjob.task_set.get().state, states.SUCCESS)
817+
self.assertEqual(cjob.get().task_set.get().state, states.SUCCESS)
791818
classifytask = jm.Task.objects.filter(job__funcname='classify_msrawfile', job__kwargs__sfloc_id=sss.pk)
792819
self.assertEqual(classifytask.filter(state=states.SUCCESS).count(), 1)
793820
self.assertFalse(new_raw.claimed) # not QC

0 commit comments

Comments
 (0)