From 9979cb0b6f3ea3bd5b9afb24c6d24afacb2abed7 Mon Sep 17 00:00:00 2001 From: Stanislaw Adaszewski Date: Sat, 11 Apr 2020 00:35:58 +0200 Subject: [PATCH] Started implementing running processes in automatically created sub-projects, needs testing. --- .../process/wb-submit-container-request.js | 164 +++++++++++++----- .../src/js/page/wb-launch-workflow-page.js | 18 +- 2 files changed, 131 insertions(+), 51 deletions(-) diff --git a/frontend/src/js/arvados/process/wb-submit-container-request.js b/frontend/src/js/arvados/process/wb-submit-container-request.js index 060b2c1..074ce09 100644 --- a/frontend/src/js/arvados/process/wb-submit-container-request.js +++ b/frontend/src/js/arvados/process/wb-submit-container-request.js @@ -21,65 +21,133 @@ function wbParseWorkflowInputs(workflowDefinition, userInputs, errors) { return inputs; } +function ensureSubProject(arvHost, arvToken, projectUuid) { + const filters = [ + [ 'type', '=', 'project' ], + [ 'owner_uuid', '=', projectUuid ], + [ 'properties.type', '=', 'daily_process_subproject_container' ] + ]; + + let prom = makeArvadosRequest(arvHost, arvToken, + '/arvados/v1/groups?filters=' + encodeURIComponent(JSON.stringify(filters))); + + prom = prom.then(xhr => { + if (xhr.response.items.length === 0) { + let prom_1 = new Promise(accept => accept()); + prom_1 = prom_1.then(() => makeArvadosRequest(arvHost, arvToken, + '/arvados/v1/groups', { method: 'POST', + data: { owner_uuid: projectUuid, + name: 'Container for daily sub-projects for processes', + properties: { type: 'daily_process_subproject_container' } } })); + prom_1 = prom_1.then(xhr_1 => xhr_1.response.uuid); + return prom_1; + } + return xhr.items[0].uuid; + }); + + let date = new Date(); + date = (date.getYear() + 1900) + '-' + + ('00' + (date.getMonth() + 1)).slice(-2) + '-' + + ('00' + date.getDate()).slice(-2); + + prom = prom.then(containerUuid => { + const filters_1 = [ + [ 'type', '=', 'project'], + [ 'owner_uuid', '=', containerUuid ], + [ 'properties.type', '=', 'daily_process_subproject' ], + [ 'properties.date', '=', date ] + ]; + return makeArvadosRequest(arvHost, arvToken, + '/arvados/v1/groups?filters=' + encodeURIComponent(JSON.stringify(filters_1))); + }); + + prom = prom.then(xhr => { + if (xhr.reponse.items.length === 0) { + let prom_1 = new Promise(accept => accept()); + prom_1 = prom_1.then(() => makeArvadosRequest(arvHost, arvToken, + '/arvados/v1/groups', { method: 'POST', + data: { owner_uuid: containerUuid, + name: 'Daily processes sub-project for ' + date, + properties: { type: 'daily_process_subproject', date } } })); + prom_1 = prom_1.then(xhr => xhr.response.uuid); + return prom_1; + } + return xhr.items[0].uuid; + }); + return prom; +} + // params: // arvHost, arvToken, inputs, // projectUuid, workflowDefinition, workflowUuid -// processName, processDescription +// processName, processDescription, placeInSubProject function wbSubmitContainerRequest(params) { const { workflowDefinition, workflowUuid, processName, processDescription, inputs, - arvHost, arvToken, projectUuid } = params; - - // prepare a request - const req = { - name: processName, - description: processDescription, - owner_uuid: projectUuid, - container_image: 'arvados/jobs', - properties: { - template_uuid: workflowUuid - }, - runtime_constraints: { - API: true, - vcpus: 1, - ram: 1073741824 - }, - cwd: '/var/spool/cwl', - command: [ - 'arvados-cwl-runner', - '--local', - '--api=containers', - '--project-uuid=' + projectUuid, - '--collection-cache-size=256', - '/var/lib/cwl/workflow.json#main', - '/var/lib/cwl/cwl.input.json'], - output_path: '/var/spool/cwl', - priority: 1, - state: 'Committed', - mounts: { - 'stdout': { - kind: 'file', - path: '/var/spool/cwl/cwl.output.json' - }, - '/var/spool/cwl': { - kind: 'collection', - writable: true + arvHost, arvToken, + placeInSubProject } = params; + + let { projectUuid } = params; + + let prom = new Promise(accept => accept()); + + if (placeInSubProject) { + prom = prom.then(() => ensureSubProject(arvHost, arvToken, projectUuid)); + prom = prom.then(subProjUuid => (projectUuid = subProjUuid)); + } + + prom = prom.then(() => { + // prepare a request + const req = { + name: processName, + description: processDescription, + owner_uuid: projectUuid, + container_image: 'arvados/jobs', + properties: { + template_uuid: workflowUuid }, - '/var/lib/cwl/workflow.json': { - kind: 'json', - content: workflowDefinition + runtime_constraints: { + API: true, + vcpus: 1, + ram: 1073741824 }, - '/var/lib/cwl/cwl.input.json': { - kind: 'json', - content: inputs + cwd: '/var/spool/cwl', + command: [ + 'arvados-cwl-runner', + '--local', + '--api=containers', + '--project-uuid=' + projectUuid, + '--collection-cache-size=256', + '/var/lib/cwl/workflow.json#main', + '/var/lib/cwl/cwl.input.json'], + output_path: '/var/spool/cwl', + priority: 1, + state: 'Committed', + mounts: { + 'stdout': { + kind: 'file', + path: '/var/spool/cwl/cwl.output.json' + }, + '/var/spool/cwl': { + kind: 'collection', + writable: true + }, + '/var/lib/cwl/workflow.json': { + kind: 'json', + content: workflowDefinition + }, + '/var/lib/cwl/cwl.input.json': { + kind: 'json', + content: inputs + } } - } - }; + }; - const prom = makeArvadosRequest(arvHost, arvToken, - '/arvados/v1/container_requests', - { method: 'POST', data: JSON.stringify(req) }); + return makeArvadosRequest(arvHost, arvToken, + '/arvados/v1/container_requests', + { method: 'POST', data: JSON.stringify(req) }); + }); return prom; } diff --git a/frontend/src/js/page/wb-launch-workflow-page.js b/frontend/src/js/page/wb-launch-workflow-page.js index 603ad5b..8397aad 100644 --- a/frontend/src/js/page/wb-launch-workflow-page.js +++ b/frontend/src/js/page/wb-launch-workflow-page.js @@ -17,6 +17,7 @@ class WBLaunchWorkflowPage extends Component { this.browseDialogRef = createRef(); this.state.inputs = {}; this.state.errors = []; + this.state.placeInSubProject = true; } componentDidMount() { @@ -46,7 +47,8 @@ class WBLaunchWorkflowPage extends Component { const { arvHost, arvToken, currentUser } = app.state; const { workflowDefinition, projectUuid, processName, processDescription, - defaultProcessName, defaultProcessDescription } = this.state; + defaultProcessName, defaultProcessDescription, + placeInSubProject } = this.state; const errors = []; const inputs = wbParseWorkflowInputs(workflowDefinition, @@ -61,7 +63,7 @@ class WBLaunchWorkflowPage extends Component { processName: processName || defaultProcessName, processDescription: processDescription || defaultProcessDescription, projectUuid: projectUuid || currentUser.uuid, - workflowUuid, workflowDefinition + workflowUuid, workflowDefinition, placeInSubProject } wbDisableControls(); @@ -78,7 +80,7 @@ class WBLaunchWorkflowPage extends Component { render({ app, workflowUuid }, { workflow, workflowDefinition, projectUuid, processName, processDescription, - defaultProcessName, defaultProcessDescription, errors }) { + defaultProcessName, defaultProcessDescription, errors, placeInSubProject }) { return (
@@ -116,6 +118,16 @@ class WBLaunchWorkflowPage extends Component { ) : null }
+
+ (this.state.placeInSubProject = e.target.checked) } + id="placeInSubProject" /> + +
+