diff --git a/assets/src/bundles/admin/origin-save.js b/assets/src/bundles/admin/origin-save.js --- a/assets/src/bundles/admin/origin-save.js +++ b/assets/src/bundles/admin/origin-save.js @@ -1,5 +1,5 @@ /** - * Copyright (C) 2018-2020 The Software Heritage developers + * Copyright (C) 2018-2021 The Software Heritage developers * See the AUTHORS file at the top-level directory of this distribution * License: GNU Affero General Public License version 3, or any later version * See top-level LICENSE file for more information @@ -122,6 +122,20 @@ enableRowSelection('#swh-origin-save-pending-requests'); swh.webapp.addJumpToPagePopoverToDataTable(pendingSaveRequestsTable); + columnsData.push({ + name: 'info', + render: (data, type, row) => { + if (row.save_task_status === 'succeeded' || row.save_task_status === 'failed' || + row.note != null) { + return ``; + } else { + return ''; + } + } + }); + rejectedSaveRequestsTable = $('#swh-origin-save-rejected-requests').DataTable({ serverSide: true, processing: true, @@ -143,23 +157,11 @@ enableRowSelection('#swh-origin-save-rejected-requests'); swh.webapp.addJumpToPagePopoverToDataTable(rejectedSaveRequestsTable); - columnsData.push({ + columnsData.splice(columnsData.length - 1, 0, { data: 'save_task_status', name: 'save_task_status' }); - columnsData.push({ - name: 'info', - render: (data, type, row) => { - if (row.save_task_status === 'succeeded' || row.save_task_status === 'failed') { - return '`; - } else { - return ''; - } - } - }); - acceptedSaveRequestsTable = $('#swh-origin-save-accepted-requests').DataTable({ serverSide: true, processing: true, diff --git a/assets/src/bundles/save/index.js b/assets/src/bundles/save/index.js --- a/assets/src/bundles/save/index.js +++ b/assets/src/bundles/save/index.js @@ -206,10 +206,11 @@ { name: 'info', render: (data, type, row) => { - if (row.save_task_status === 'succeeded' || row.save_task_status === 'failed') { - return ``; + if (row.save_task_status === 'succeeded' || row.save_task_status === 'failed' || + row.note != null) { + return ``; } else { return ''; } @@ -500,6 +501,9 @@ let content; if ($.isEmptyObject(saveRequestTaskInfo)) { content = 'Not available'; + + } else if (saveRequestTaskInfo.note != null) { + content = saveRequestTaskInfo.note; } else { const saveRequestInfo = []; const taskData = { diff --git a/cypress/integration/admin.spec.js b/cypress/integration/admin.spec.js --- a/cypress/integration/admin.spec.js +++ b/cypress/integration/admin.spec.js @@ -263,6 +263,20 @@ expect(response.body[0]['note']).to.equal(rejectionNote); }); + // check rejection note is displayed by clicking on the info icon + // in requests table from public save code now page + cy.visit(this.Urls.origin_save()); + cy.get('#swh-origin-save-requests-list-tab') + .click(); + + cy.contains('#swh-origin-save-requests tr', originUrl); + cy.get('.swh-save-request-info') + .eq(0) + .click(); + + cy.get('.popover-body') + .should('have.text', rejectionNote); + // remove rejected request from swh-web database to avoid side effects // in tests located in origin-save.spec.js cy.visit(this.Urls.admin_origin_save()); diff --git a/swh/web/common/origin_save.py b/swh/web/common/origin_save.py --- a/swh/web/common/origin_save.py +++ b/swh/web/common/origin_save.py @@ -730,26 +730,37 @@ except ObjectDoesNotExist: return {} - task = scheduler().get_tasks([save_request.loading_task_id]) + task_info: Dict[str, Any] = {} + if save_request.note is not None: + task_info["note"] = save_request.note + + try: + task = scheduler().get_tasks([save_request.loading_task_id]) + except Exception: + # to avoid mocking GET responses of /save/task/info/ endpoint when running + # cypress tests as scheduler is not available in that case + task = None + task = task[0] if task else None if task is None: - return {} + return task_info task_run = scheduler().get_task_runs([task["id"]]) task_run = task_run[0] if task_run else None if task_run is None: - return {} - task_run["type"] = task["type"] - task_run["arguments"] = task["arguments"] - task_run["id"] = task_run["task"] - del task_run["task"] - del task_run["metadata"] - # Enrich the task run with the loading visit status - task_run["visit_status"] = save_request.visit_status + return task_info + task_info.update(task_run) + task_info["type"] = task["type"] + task_info["arguments"] = task["arguments"] + task_info["id"] = task_run["task"] + del task_info["task"] + del task_info["metadata"] + # Enrich the task info with the loading visit status + task_info["visit_status"] = save_request.visit_status es_workers_index_url = get_config()["es_workers_index_url"] if not es_workers_index_url: - return task_run + return task_info es_workers_index_url += "/_search" if save_request.visit_date: @@ -793,17 +804,17 @@ task_run_info = results["hits"]["hits"][-1]["_source"] if "swh_logging_args_runtime" in task_run_info: duration = task_run_info["swh_logging_args_runtime"] - task_run["duration"] = duration + task_info["duration"] = duration if "message" in task_run_info: - task_run["message"] = task_run_info["message"] + task_info["message"] = task_run_info["message"] if "swh_logging_args_name" in task_run_info: - task_run["name"] = task_run_info["swh_logging_args_name"] + task_info["name"] = task_run_info["swh_logging_args_name"] elif "swh_task_name" in task_run_info: - task_run["name"] = task_run_info["swh_task_name"] + task_info["name"] = task_run_info["swh_task_name"] if "hostname" in task_run_info: - task_run["worker"] = task_run_info["hostname"] + task_info["worker"] = task_run_info["hostname"] elif "host" in task_run_info: - task_run["worker"] = task_run_info["host"] + task_info["worker"] = task_run_info["host"] except Exception as exc: logger.warning("Request to Elasticsearch failed\n%s", exc) sentry_sdk.capture_exception(exc) @@ -811,19 +822,19 @@ if not full_info: for field in ("id", "backend_id", "worker"): # remove some staff only fields - task_run.pop(field, None) + task_info.pop(field, None) if "message" in task_run and "Loading failure" in task_run["message"]: # hide traceback for non staff users, only display exception - message_lines = task_run["message"].split("\n") + message_lines = task_info["message"].split("\n") message = "" for line in message_lines: if line.startswith("Traceback"): break message += f"{line}\n" message += message_lines[-1] - task_run["message"] = message + task_info["message"] = message - return task_run + return task_info SUBMITTED_SAVE_REQUESTS_METRIC = "swh_web_submitted_save_requests" diff --git a/swh/web/templates/admin/origin-save.html b/swh/web/templates/admin/origin-save.html --- a/swh/web/templates/admin/origin-save.html +++ b/swh/web/templates/admin/origin-save.html @@ -98,6 +98,7 @@ Date Type Url + Info