diff --git a/integration/integration-test.robot b/integration/integration-test.robot index 5cca3e57e6a76e17dd51fd88fb196146d5997a67..3f792607bdf47fbabbf00b02365fa172fabeef7f 100644 --- a/integration/integration-test.robot +++ b/integration/integration-test.robot @@ -20,6 +20,7 @@ Setup ATDB and LDVSPEC Add Data Product 1 srm://lofar-srm.fz-juelich.de:8443/pnfs/fz-juelich.de/data/lofar/ops/projects/idols/1/L876420_SAP000_SB019_uv.MS_5840d22a.tar Add Data Product 5 srm://lofar-srm.fz-juelich.de:8443/pnfs/fz-juelich.de/data/lofar/ops/projects/idols/5/L876420_SAP000_SB019_uv.MS_5840d22b.tar Add Data Product 13 srm://lofar-srm.fz-juelich.de:8443/pnfs/fz-juelich.de/data/lofar/ops/projects/idols/13/L876420_SAP000_SB019_uv.MS_5840d22c.tar + Add Data Product 13 srm://lofar-srm.fz-juelich.de:8443/pnfs/fz-juelich.de/data/lofar/ops/projects/idols/13/L876420_SAP000_SB019_uv.MS_1234567b.tar *** Test Cases *** @@ -30,7 +31,18 @@ Test create and submit a work specification ${id}= Add Work Specification 5 Submit Work Specification ${id} - Check if Task Exists in ATDB ldv-spec:${id} + ${count}= Get Tasks Count In ATDB ldv-spec:${id} + Should Be Equal As Integers ${count} 1 + +Test create work specification with auto-submit and 2 batches + [Tags] Workspecification + Login to LDV Spec Admin Interface + + ${id}= Add Work Specification 13 + Alter Work Specification Batches And Auto Submit ${id} + + ${count}= Get Tasks Count In ATDB ldv-spec:${id} + Should Be Equal As Integers ${count} 2 Test create a group with a few work specifications [Tags] Workspecification diff --git a/integration/local/test/keywords-tests.robot b/integration/local/test/keywords-tests.robot index e34b0639219d3105180200e38507e1c940ea06ba..ca723d505755a61d64b90123dfba6ca90a9e2730 100644 --- a/integration/local/test/keywords-tests.robot +++ b/integration/local/test/keywords-tests.robot @@ -62,12 +62,25 @@ Submit Work Specification Submit Work Specification 1 [Teardown] Close Browser -Check if Task Exists in ATDB +Alter Work Specification Batches And Auto Submit [Tags] Keyword [Documentation] ***Description*** - ... Prerequisite: submission of work specification with ID 1 succeeded + ... Altering work specification depends on a non-submitted work specification to be present. + ... To ensure this, also a work specification is created in this test. + ... The rules w.r.t. adding a work specification thus also apply here + Login to LDV Spec Admin Interface + ${id}= Add Work Specification 1 + Alter Work Specification Batches And Auto Submit ${id} + [Teardown] Close Browser + +Get Tasks Count in ATDB Should Equal One + [Tags] Keyword + [Documentation] ***Description*** + ... Prerequisite: submission of work specification with ID 1 succeeded. + ... Note that checking for equality should specify the type (integers, numbers, strings). Login To ATDB Admin Interface - Check if Task Exists in ATDB ldv-spec:1 + ${count}= Get Tasks Count In ATDB ldv-spec:1 + Should Be Equal As Integers ${count} 1 [Teardown] Close Browser diff --git a/integration/resource/keywords.robot b/integration/resource/keywords.robot index c8a40bfd175d26270cb990649c5f03357b387cac..5e53bcb62b471407001e4fe610bc1fc43e69ee87 100644 --- a/integration/resource/keywords.robot +++ b/integration/resource/keywords.robot @@ -49,9 +49,20 @@ Add Work Specification Select From List By Value //*[@data-test-id="workflow"] https://example.com/workflow-1 Input Text //*[@data-test-id="obs_id"] ${obs_id} Click Button //*[@data-test-id="create-update"] - ${id}= Get Text (//a[@data-test-id="specification-id"])[1] + ${id}= Get Text (//div[@data-test-id="ungrouped"]/..//a[@data-test-id="specification-id"])[last()] RETURN ${id} +Alter Work Specification Batches And Auto Submit + [Arguments] ${specification_id} + Go To ${LDVSPEC}specification/update/${specification_id}/ + Select Checkbox //*[@data-test-id="auto-submit-checkbox"] + Checkbox Should Be Selected //*[@data-test-id="auto-submit-checkbox"] + Input Text //*[@data-test-id="batch-size-input"] 2 + Click Button //*[@data-test-id="create-update"] + Go To ${LDVSPEC}specification/${specification_id}/ + Element Should Contain //*[@data-test-id="batch-size"] 2 + Wait Until Element Contains //*[@data-test-id="submission-status"] Submitted timeout=30s + Add Data Product [Arguments] ${obs_id} ${uniqueSurl} Go To ${LDVSPEC}admin/lofardata/dataproduct/add/ @@ -120,10 +131,12 @@ Login to ATDB Admin Interface Input Django Admin Password admin Submit credentials -Check if Task Exists in ATDB +Get Tasks Count in ATDB [Arguments] ${element} Open Browser to ATDB landing page - Page Should Contain ${element} + ${count}= Get Element Count //*[text()[contains(.,'${element}')]] + RETURN ${count} + # Shared diff --git a/ldvspec/lofardata/models.py b/ldvspec/lofardata/models.py index 4ae2ace09240f082fd0176079390995ca5ef7c74..0d7bba8fea5cada776c4dfb27645fc028e683288 100644 --- a/ldvspec/lofardata/models.py +++ b/ldvspec/lofardata/models.py @@ -157,6 +157,12 @@ class WorkSpecification(models.Model): max_length=16, choices=PURGE_POLICY.choices, default=PURGE_POLICY.NO ) + __original_submission_status = None + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.__original_submission_status = self.submission_status + def created_by_display_value(self): if self.created_by is None: return "Unknown" @@ -206,6 +212,16 @@ class WorkSpecification(models.Model): total_size, number_of_files, average_file_size = inputs_processor.compute_size_of_inputs(self.inputs) return total_size, number_of_files, average_file_size + @property + def did_submission_status_change(self): + return self.submission_status != self.__original_submission_status + + @property + def should_auto_submit(self): + is_ready = self.submission_status == SUBMISSION_STATUS.READY + contains_files = self.get_file_info[1] > 0 + return is_ready and contains_files and self.is_auto_submit + def __str__(self): return str(self.id) + ' - ' + str(self.filters) + " (" + str(self.created_on) + ")" @@ -228,9 +244,14 @@ class WorkSpecification(models.Model): using=using, update_fields=update_fields, ) + if self.should_auto_submit: + from lofardata.task.tasks import insert_task_into_atdb + insert_task_into_atdb.delay(self.pk) + if self.async_task_result is None: from lofardata.task.tasks import define_work_specification res: AsyncResult = define_work_specification.delay(self.pk) self.async_task_result = res.id + super(WorkSpecification, self).save(update_fields=["async_task_result"]) diff --git a/ldvspec/lofardata/templates/lofardata/workspecification/create_update.html b/ldvspec/lofardata/templates/lofardata/workspecification/create_update.html index e12f3b4b03258173b4abe0df39a9d0153c13d2a9..a6f689b973f095bcdba9b070bc021c0d1d542396 100644 --- a/ldvspec/lofardata/templates/lofardata/workspecification/create_update.html +++ b/ldvspec/lofardata/templates/lofardata/workspecification/create_update.html @@ -127,11 +127,11 @@ <a class="tooltip-dias tooltip-dias-right custom--tooltip" data-tooltip="{{ form.batch_size.help_text }}">m</a> </div> - {% render_field form.batch_size class="input input--select custom__input--fixed-width margin-left margin-bottom" type="number" %} + {% render_field form.batch_size class="input input--select custom__input--fixed-width margin-left margin-bottom" type="number" data-test-id='batch-size-input' %} </div> <div class="flex-wrapper flex-wrapper--row" id="div_id_auto_submit"> - {% render_field form.is_auto_submit class="input custom--checkbox margin-top" type="checkbox" %} + {% render_field form.is_auto_submit class="input custom--checkbox margin-top" type="checkbox" data-test-id='auto-submit-checkbox' %} <label class="input__label">{{ form.is_auto_submit.label }}</label> <a class="tooltip-dias tooltip-dias-right custom--tooltip" data-tooltip="{{ form.is_auto_submit.help_text }}">m</a> diff --git a/ldvspec/lofardata/templates/lofardata/workspecification/detail.html b/ldvspec/lofardata/templates/lofardata/workspecification/detail.html index 5f90ab1581d7c4c3e29defb8500d151c8e31ab68..5d58d00653735e0f00fb529bdc03766fcf25e5f1 100644 --- a/ldvspec/lofardata/templates/lofardata/workspecification/detail.html +++ b/ldvspec/lofardata/templates/lofardata/workspecification/detail.html @@ -206,11 +206,13 @@ <div class="table__row table__row--dark table__row--padding"> <div class="table__cell table__cell--title">Files per task</div> - {% if object.batch_size == 0 %} - <div class="table__cell">{{ number_of_files }}</div> - {% else %} - <div class="table__cell">{{ object.batch_size }}</div> - {% endif %} + <div class="table__cell" data-test-id="batch-size"> + {% if object.batch_size == 0 %} + {{ number_of_files }} + {% else %} + {{ object.batch_size }} + {% endif %} + </div> </div> <div class="table__row table__row--dark table__row--padding"> diff --git a/ldvspec/lofardata/tests/test_workspecification_properties.py b/ldvspec/lofardata/tests/test_workspecification_properties.py new file mode 100644 index 0000000000000000000000000000000000000000..214d0bf579c98c1118b374fecd0c19516a9185cd --- /dev/null +++ b/ldvspec/lofardata/tests/test_workspecification_properties.py @@ -0,0 +1,53 @@ +import unittest + +from lofardata.models import WorkSpecification, SUBMISSION_STATUS + + +class WorkSpecificationShouldAutoSubmit(unittest.TestCase): + @unittest.mock.patch('lofardata.models.WorkSpecification.get_file_info') + def test_submission_status_ready_auto_submit_with_files(self, mock_file_info): + mock_file_info.__get__ = unittest.mock.Mock(return_value=[10, 10, 10]) + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.READY, + is_auto_submit=True) + self.assertTrue(work_spec.should_auto_submit) + + def test_submission_status_loading(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.LOADING) + self.assertFalse(work_spec.should_auto_submit) + + def test_submission_status_ready_no_auto_submit(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.READY) + self.assertFalse(work_spec.should_auto_submit) + + def test_submission_status_ready_auto_submit_no_files(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.READY, + is_auto_submit=True) + self.assertFalse(work_spec.should_auto_submit) + + def test_submission_status_defining(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.DEFINING) + self.assertFalse(work_spec.should_auto_submit) + + def test_submission_status_submitted(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.SUBMITTED) + self.assertFalse(work_spec.should_auto_submit) + + def test_submission_status_error(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.ERROR) + self.assertFalse(work_spec.should_auto_submit) + + +class WorkSpecificationDidSubmissionStatusChange(unittest.TestCase): + def test_change(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.READY) + work_spec.submission_status = SUBMISSION_STATUS.LOADING + self.assertTrue(work_spec.did_submission_status_change) + + def test_no_change(self): + work_spec = WorkSpecification() + self.assertFalse(work_spec.did_submission_status_change) + + def test_no_change_with_setters(self): + work_spec = WorkSpecification(submission_status=SUBMISSION_STATUS.READY) + work_spec.submission_status = SUBMISSION_STATUS.READY + self.assertFalse(work_spec.did_submission_status_change)