IF YOU WOULD LIKE TO GET AN ACCOUNT, please write an email to s dot adaszewski at gmail dot com. User accounts are meant only to report issues and/or generate pull requests. This is a purpose-specific Git hosting for ADARED projects. Thank you for your understanding!
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

156 lines
4.7KB

  1. import makeArvadosRequest from 'make-arvados-request';
  2. import wbUuidsToCwl from 'wb-uuids-to-cwl';
  3. function wbParseWorkflowInputs(workflowDefinition, userInputs, errors) {
  4. // first see if all inputs are parseable
  5. const inputs = {};
  6. const main = workflowDefinition['$graph'].find(a => (a.id === '#main'));
  7. for (let k in userInputs) {
  8. try {
  9. let val = jsyaml.safeLoad(userInputs[k]);
  10. val = wbUuidsToCwl(val);
  11. k = k.split('/').slice(1).join('/');
  12. inputs[k] = (val === undefined ? null : val);
  13. } catch (exc) {
  14. errors.push('Error parsing ' + k + ': ' + exc.message);
  15. }
  16. }
  17. return inputs;
  18. }
  19. function ensureSubProject(arvHost, arvToken, projectUuid) {
  20. const filters = [
  21. [ 'type', '=', 'project' ],
  22. [ 'owner_uuid', '=', projectUuid ],
  23. [ 'properties.type', '=', 'daily_process_subproject_container' ]
  24. ];
  25. let prom = makeArvadosRequest(arvHost, arvToken,
  26. '/arvados/v1/groups?filters=' + encodeURIComponent(JSON.stringify(filters)));
  27. prom = prom.then(xhr => {
  28. if (xhr.response.items.length === 0) {
  29. let prom_1 = new Promise(accept => accept());
  30. prom_1 = prom_1.then(() => makeArvadosRequest(arvHost, arvToken,
  31. '/arvados/v1/groups', { method: 'POST',
  32. data: { owner_uuid: projectUuid,
  33. name: 'Container for daily sub-projects for processes',
  34. properties: { type: 'daily_process_subproject_container' } } }));
  35. prom_1 = prom_1.then(xhr_1 => xhr_1.response.uuid);
  36. return prom_1;
  37. }
  38. return xhr.items[0].uuid;
  39. });
  40. let date = new Date();
  41. date = (date.getYear() + 1900) + '-' +
  42. ('00' + (date.getMonth() + 1)).slice(-2) + '-' +
  43. ('00' + date.getDate()).slice(-2);
  44. prom = prom.then(containerUuid => {
  45. const filters_1 = [
  46. [ 'type', '=', 'project'],
  47. [ 'owner_uuid', '=', containerUuid ],
  48. [ 'properties.type', '=', 'daily_process_subproject' ],
  49. [ 'properties.date', '=', date ]
  50. ];
  51. return makeArvadosRequest(arvHost, arvToken,
  52. '/arvados/v1/groups?filters=' + encodeURIComponent(JSON.stringify(filters_1)));
  53. });
  54. prom = prom.then(xhr => {
  55. if (xhr.reponse.items.length === 0) {
  56. let prom_1 = new Promise(accept => accept());
  57. prom_1 = prom_1.then(() => makeArvadosRequest(arvHost, arvToken,
  58. '/arvados/v1/groups', { method: 'POST',
  59. data: { owner_uuid: containerUuid,
  60. name: 'Daily processes sub-project for ' + date,
  61. properties: { type: 'daily_process_subproject', date } } }));
  62. prom_1 = prom_1.then(xhr => xhr.response.uuid);
  63. return prom_1;
  64. }
  65. return xhr.items[0].uuid;
  66. });
  67. return prom;
  68. }
  69. // params:
  70. // arvHost, arvToken, inputs,
  71. // projectUuid, workflowDefinition, workflowUuid
  72. // processName, processDescription, placeInSubProject
  73. function wbSubmitContainerRequest(params) {
  74. const { workflowDefinition, workflowUuid,
  75. processName, processDescription, inputs,
  76. arvHost, arvToken,
  77. placeInSubProject } = params;
  78. let { projectUuid } = params;
  79. let prom = new Promise(accept => accept());
  80. if (placeInSubProject) {
  81. prom = prom.then(() => ensureSubProject(arvHost, arvToken, projectUuid));
  82. prom = prom.then(subProjUuid => (projectUuid = subProjUuid));
  83. }
  84. prom = prom.then(() => {
  85. // prepare a request
  86. const req = {
  87. name: processName,
  88. description: processDescription,
  89. owner_uuid: projectUuid,
  90. container_image: 'arvados/jobs',
  91. properties: {
  92. template_uuid: workflowUuid
  93. },
  94. runtime_constraints: {
  95. API: true,
  96. vcpus: 1,
  97. ram: 1073741824
  98. },
  99. cwd: '/var/spool/cwl',
  100. command: [
  101. 'arvados-cwl-runner',
  102. '--local',
  103. '--api=containers',
  104. '--project-uuid=' + projectUuid,
  105. '--collection-cache-size=256',
  106. '/var/lib/cwl/workflow.json#main',
  107. '/var/lib/cwl/cwl.input.json'],
  108. output_path: '/var/spool/cwl',
  109. priority: 1,
  110. state: 'Committed',
  111. mounts: {
  112. 'stdout': {
  113. kind: 'file',
  114. path: '/var/spool/cwl/cwl.output.json'
  115. },
  116. '/var/spool/cwl': {
  117. kind: 'collection',
  118. writable: true
  119. },
  120. '/var/lib/cwl/workflow.json': {
  121. kind: 'json',
  122. content: workflowDefinition
  123. },
  124. '/var/lib/cwl/cwl.input.json': {
  125. kind: 'json',
  126. content: inputs
  127. }
  128. }
  129. };
  130. return makeArvadosRequest(arvHost, arvToken,
  131. '/arvados/v1/container_requests',
  132. { method: 'POST', data: JSON.stringify(req) });
  133. });
  134. return prom;
  135. }
  136. export { wbParseWorkflowInputs, wbSubmitContainerRequest };