@fnndsc/salsa 3.5.0 → 3.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/connect/index.d.ts +11 -0
- package/dist/connect/index.js +11 -0
- package/dist/connect/index.js.map +1 -1
- package/dist/dag/feedJoins.js +4 -1
- package/dist/dag/feedJoins.js.map +1 -1
- package/dist/feeds/index.d.ts +15 -2
- package/dist/feeds/index.js.map +1 -1
- package/dist/files/index.d.ts +7 -0
- package/dist/files/index.js +12 -11
- package/dist/files/index.js.map +1 -1
- package/dist/files/regular_content.js +11 -3
- package/dist/files/regular_content.js.map +1 -1
- package/dist/groups/index.d.ts +59 -0
- package/dist/groups/index.js +89 -0
- package/dist/groups/index.js.map +1 -1
- package/dist/groups/membershipRevision.d.ts +19 -0
- package/dist/groups/membershipRevision.js +29 -0
- package/dist/groups/membershipRevision.js.map +1 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +7 -1
- package/dist/index.js.map +1 -1
- package/dist/jobs/jobOps.js +45 -2
- package/dist/jobs/jobOps.js.map +1 -1
- package/dist/pipelines/index.d.ts +28 -5
- package/dist/pipelines/index.js +110 -48
- package/dist/pipelines/index.js.map +1 -1
- package/dist/pipelines/invocation.d.ts +80 -0
- package/dist/pipelines/invocation.js +290 -0
- package/dist/pipelines/invocation.js.map +1 -0
- package/dist/pipelines/manifest.d.ts +102 -0
- package/dist/pipelines/manifest.js +204 -0
- package/dist/pipelines/manifest.js.map +1 -0
- package/dist/plugins/index.d.ts +29 -0
- package/dist/plugins/index.js +51 -10
- package/dist/plugins/index.js.map +1 -1
- package/dist/plugins/internal/plugin_executeNewFeed.d.ts +0 -14
- package/dist/plugins/internal/plugin_executeNewFeed.js +3 -3
- package/dist/plugins/internal/plugin_executeNewFeed.js.map +1 -1
- package/dist/plugins/plugin_register.js +5 -5
- package/dist/plugins/plugin_register.js.map +1 -1
- package/dist/plugins/store_import.js +1 -1
- package/dist/plugins/store_import.js.map +1 -1
- package/dist/retrieve/watch.d.ts +114 -0
- package/dist/retrieve/watch.js +360 -0
- package/dist/retrieve/watch.js.map +1 -0
- package/dist/store/index.d.ts +17 -4
- package/dist/store/index.js +9 -4
- package/dist/store/index.js.map +1 -1
- package/dist/users/index.d.ts +36 -0
- package/dist/users/index.js +50 -0
- package/dist/users/index.js.map +1 -0
- package/dist/vfs/dispatcher.d.ts +11 -0
- package/dist/vfs/dispatcher.js +37 -6
- package/dist/vfs/dispatcher.js.map +1 -1
- package/dist/vfs/index.d.ts +1 -0
- package/dist/vfs/index.js +3 -0
- package/dist/vfs/index.js.map +1 -1
- package/dist/vfs/provider.d.ts +13 -0
- package/dist/vfs/providers/etc.d.ts +2 -0
- package/dist/vfs/providers/etc.js +41 -2
- package/dist/vfs/providers/etc.js.map +1 -1
- package/dist/vfs/providers/native.js +41 -7
- package/dist/vfs/providers/native.js.map +1 -1
- package/dist/vfs/providers/pacs.d.ts +13 -1
- package/dist/vfs/providers/pacs.js +86 -107
- package/dist/vfs/providers/pacs.js.map +1 -1
- package/dist/vfs/providers/pacsHelpers.js +9 -5
- package/dist/vfs/providers/pacsHelpers.js.map +1 -1
- package/dist/vfs/providers/proc.d.ts +61 -6
- package/dist/vfs/providers/proc.js +445 -100
- package/dist/vfs/providers/proc.js.map +1 -1
- package/package.json +11 -8
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pipelineInvocation_prepare = pipelineInvocation_prepare;
|
|
4
|
+
/**
|
|
5
|
+
* @file Pure preparation of one registered Pipeline Workflow invocation.
|
|
6
|
+
*
|
|
7
|
+
* This module validates sparse or complete YAML overlays, applies global/file/CLI
|
|
8
|
+
* precedence, and produces the complete `nodes_info` payload CUBE expects. It
|
|
9
|
+
* assumes the manifest has already been fetched from the authenticated CUBE.
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
const cumin_1 = require("@fnndsc/cumin");
|
|
14
|
+
const EXECUTION_FIELDS = new Set([
|
|
15
|
+
'compute_resource_name',
|
|
16
|
+
'cpu_limit',
|
|
17
|
+
'memory_limit',
|
|
18
|
+
'gpu_limit',
|
|
19
|
+
'number_of_workers',
|
|
20
|
+
]);
|
|
21
|
+
const DOCUMENT_FIELDS = new Set(['name', 'pipeline_id', 'plugin_tree']);
|
|
22
|
+
const PLUGIN_TREE_FIELDS = new Set(['root_index', 'tree']);
|
|
23
|
+
const NODE_FIELDS = new Set([
|
|
24
|
+
'piping_id', 'title', 'plugin_name', 'plugin_version',
|
|
25
|
+
'compute_resource_name', 'cpu_limit', 'memory_limit', 'gpu_limit', 'number_of_workers',
|
|
26
|
+
'plugin_parameter_defaults', 'child_indices',
|
|
27
|
+
]);
|
|
28
|
+
const PARAMETER_FIELDS = new Set(['name', 'default']);
|
|
29
|
+
function record_is(value) {
|
|
30
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
31
|
+
}
|
|
32
|
+
function fields_validate(record, allowed, location) {
|
|
33
|
+
const unknown = Object.keys(record).find((field) => !allowed.has(field));
|
|
34
|
+
if (unknown === undefined)
|
|
35
|
+
return true;
|
|
36
|
+
cumin_1.errorStack.stack_push('error', `Unknown ${location} field '${unknown}'.`);
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
function node_resolve(nodes, selector) {
|
|
40
|
+
if (selector.startsWith('@') && /^@\d+$/.test(selector)) {
|
|
41
|
+
const pipingID = Number(selector.slice(1));
|
|
42
|
+
return nodes.find((node) => node.pipingID === pipingID) ?? null;
|
|
43
|
+
}
|
|
44
|
+
const matches = nodes.filter((node) => node.title === selector);
|
|
45
|
+
return matches.length === 1 ? matches[0] : null;
|
|
46
|
+
}
|
|
47
|
+
function executionField_set(node, field, value) {
|
|
48
|
+
if (field === 'compute_resource_name')
|
|
49
|
+
node.compute_resource_name = String(value);
|
|
50
|
+
else if (field === 'cpu_limit')
|
|
51
|
+
node.cpu_limit = value;
|
|
52
|
+
else if (field === 'memory_limit')
|
|
53
|
+
node.memory_limit = value;
|
|
54
|
+
else if (field === 'gpu_limit')
|
|
55
|
+
node.gpu_limit = value;
|
|
56
|
+
else if (field === 'number_of_workers')
|
|
57
|
+
node.number_of_workers = value;
|
|
58
|
+
}
|
|
59
|
+
function executionValue_isValid(field, value) {
|
|
60
|
+
if (field === 'compute_resource_name')
|
|
61
|
+
return typeof value === 'string' && value.trim().length > 0;
|
|
62
|
+
if (field === 'gpu_limit' || field === 'number_of_workers') {
|
|
63
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 0;
|
|
64
|
+
}
|
|
65
|
+
return (typeof value === 'number' && Number.isFinite(value) && value >= 0) ||
|
|
66
|
+
(typeof value === 'string' && value.trim().length > 0);
|
|
67
|
+
}
|
|
68
|
+
function parameter_set(node, name, value) {
|
|
69
|
+
const current = node.plugin_parameter_defaults
|
|
70
|
+
.find((parameter) => parameter.name === name);
|
|
71
|
+
if (current)
|
|
72
|
+
current.default = value;
|
|
73
|
+
else
|
|
74
|
+
node.plugin_parameter_defaults.push({ name, default: value });
|
|
75
|
+
}
|
|
76
|
+
function parameter_known(node, name) {
|
|
77
|
+
if (node.parameterDefinitions !== undefined) {
|
|
78
|
+
return node.parameterDefinitions.some((parameter) => parameter.name === name);
|
|
79
|
+
}
|
|
80
|
+
return node.parameterDefaults.some((parameter) => parameter.name === name);
|
|
81
|
+
}
|
|
82
|
+
function parameter_valueValid(node, name, value) {
|
|
83
|
+
const definition = node.parameterDefinitions
|
|
84
|
+
?.find((parameter) => parameter.name === name);
|
|
85
|
+
if (!definition || value === null || value === undefined)
|
|
86
|
+
return true;
|
|
87
|
+
const type = definition.type.toLowerCase();
|
|
88
|
+
if (type === 'integer' || type === 'int')
|
|
89
|
+
return typeof value === 'number' && Number.isInteger(value);
|
|
90
|
+
if (type === 'float' || type === 'number')
|
|
91
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
92
|
+
if (type === 'boolean' || type === 'bool')
|
|
93
|
+
return typeof value === 'boolean';
|
|
94
|
+
if (type === 'str' || type === 'string' || type === 'path' || type === 'unextpath') {
|
|
95
|
+
return typeof value === 'string';
|
|
96
|
+
}
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Build the complete `nodes_info` override set for one Workflow invocation.
|
|
101
|
+
*
|
|
102
|
+
* @param options - Registered manifest and optional global, file, and CLI overlays.
|
|
103
|
+
* @returns Prepared invocation, or an error after strict validation fails.
|
|
104
|
+
*/
|
|
105
|
+
function pipelineInvocation_prepare(options) {
|
|
106
|
+
const manifest = options.manifest;
|
|
107
|
+
const nodes = manifest.nodes;
|
|
108
|
+
const preparedByID = new Map();
|
|
109
|
+
for (const node of nodes) {
|
|
110
|
+
preparedByID.set(node.pipingID, {
|
|
111
|
+
piping_id: node.pipingID,
|
|
112
|
+
title: node.title,
|
|
113
|
+
compute_resource_name: options.globalCompute ?? node.computeResourceName,
|
|
114
|
+
cpu_limit: node.cpuLimit,
|
|
115
|
+
memory_limit: node.memoryLimit,
|
|
116
|
+
gpu_limit: node.gpuLimit,
|
|
117
|
+
number_of_workers: node.numberOfWorkers,
|
|
118
|
+
plugin_parameter_defaults: node.parameterDefaults.map((parameter) => ({
|
|
119
|
+
name: parameter.name,
|
|
120
|
+
default: parameter.value,
|
|
121
|
+
})),
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
if (options.parameterFile !== undefined) {
|
|
125
|
+
if (!record_is(options.parameterFile)) {
|
|
126
|
+
cumin_1.errorStack.stack_push('error', 'Parameter file must contain a YAML mapping.');
|
|
127
|
+
return (0, cumin_1.Err)();
|
|
128
|
+
}
|
|
129
|
+
const document = options.parameterFile;
|
|
130
|
+
if (!fields_validate(document, DOCUMENT_FIELDS, 'parameter-file'))
|
|
131
|
+
return (0, cumin_1.Err)();
|
|
132
|
+
if (document.name !== undefined && document.name !== manifest.name) {
|
|
133
|
+
cumin_1.errorStack.stack_push('error', `Parameter file names pipeline '${String(document.name)}', not '${manifest.name}'.`);
|
|
134
|
+
return (0, cumin_1.Err)();
|
|
135
|
+
}
|
|
136
|
+
if (document.pipeline_id !== undefined && document.pipeline_id !== manifest.pipelineID) {
|
|
137
|
+
cumin_1.errorStack.stack_push('error', `Parameter file pipeline_id ${String(document.pipeline_id)} does not match ${manifest.pipelineID}.`);
|
|
138
|
+
return (0, cumin_1.Err)();
|
|
139
|
+
}
|
|
140
|
+
const pluginTree = document.plugin_tree;
|
|
141
|
+
if (record_is(pluginTree) && !fields_validate(pluginTree, PLUGIN_TREE_FIELDS, 'plugin_tree'))
|
|
142
|
+
return (0, cumin_1.Err)();
|
|
143
|
+
if (record_is(pluginTree) && pluginTree.root_index !== undefined) {
|
|
144
|
+
const expectedRootIndex = manifest.nodes.findIndex((node) => node.pipingID === manifest.rootIDs[0]);
|
|
145
|
+
if (pluginTree.root_index !== expectedRootIndex) {
|
|
146
|
+
cumin_1.errorStack.stack_push('error', 'Parameter-file root_index does not match the registered pipeline.');
|
|
147
|
+
return (0, cumin_1.Err)();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const tree = record_is(pluginTree) ? pluginTree.tree : undefined;
|
|
151
|
+
if (!Array.isArray(tree)) {
|
|
152
|
+
cumin_1.errorStack.stack_push('error', 'Parameter file must contain plugin_tree.tree.');
|
|
153
|
+
return (0, cumin_1.Err)();
|
|
154
|
+
}
|
|
155
|
+
const fileBindingsSeen = new Set();
|
|
156
|
+
for (const rawNode of tree) {
|
|
157
|
+
if (!record_is(rawNode)) {
|
|
158
|
+
cumin_1.errorStack.stack_push('error', 'Each parameter-file node must be a mapping.');
|
|
159
|
+
return (0, cumin_1.Err)();
|
|
160
|
+
}
|
|
161
|
+
if (!fields_validate(rawNode, NODE_FIELDS, 'pipeline node'))
|
|
162
|
+
return (0, cumin_1.Err)();
|
|
163
|
+
const selector = rawNode.piping_id !== undefined
|
|
164
|
+
? `@${String(rawNode.piping_id)}`
|
|
165
|
+
: String(rawNode.title ?? '');
|
|
166
|
+
const source = node_resolve(nodes, selector);
|
|
167
|
+
if (!source) {
|
|
168
|
+
cumin_1.errorStack.stack_push('error', `Unknown or ambiguous pipeline node '${selector}'.`);
|
|
169
|
+
return (0, cumin_1.Err)();
|
|
170
|
+
}
|
|
171
|
+
if (rawNode.title !== undefined && rawNode.title !== source.title) {
|
|
172
|
+
cumin_1.errorStack.stack_push('error', `Node title assertion does not match piping ${source.pipingID}.`);
|
|
173
|
+
return (0, cumin_1.Err)();
|
|
174
|
+
}
|
|
175
|
+
if (rawNode.plugin_name !== undefined && rawNode.plugin_name !== source.pluginName) {
|
|
176
|
+
cumin_1.errorStack.stack_push('error', `Plugin assertion does not match node '${source.title}'.`);
|
|
177
|
+
return (0, cumin_1.Err)();
|
|
178
|
+
}
|
|
179
|
+
if (rawNode.plugin_version !== undefined && rawNode.plugin_version !== source.pluginVersion) {
|
|
180
|
+
cumin_1.errorStack.stack_push('error', `Plugin version assertion does not match node '${source.title}'.`);
|
|
181
|
+
return (0, cumin_1.Err)();
|
|
182
|
+
}
|
|
183
|
+
if (rawNode.child_indices !== undefined) {
|
|
184
|
+
if (!Array.isArray(rawNode.child_indices))
|
|
185
|
+
return (0, cumin_1.Err)();
|
|
186
|
+
const expectedChildren = manifest.nodes
|
|
187
|
+
.map((candidate, index) => [candidate, index])
|
|
188
|
+
.filter(([candidate]) => candidate.parentID === source.pipingID)
|
|
189
|
+
.map(([, index]) => index);
|
|
190
|
+
const supplied = rawNode.child_indices;
|
|
191
|
+
if (supplied.length !== expectedChildren.length || supplied.some((value, index) => value !== expectedChildren[index])) {
|
|
192
|
+
cumin_1.errorStack.stack_push('error', `child_indices assertion does not match node '${source.title}'.`);
|
|
193
|
+
return (0, cumin_1.Err)();
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
const prepared = preparedByID.get(source.pipingID);
|
|
197
|
+
for (const field of EXECUTION_FIELDS) {
|
|
198
|
+
if (rawNode[field] !== undefined) {
|
|
199
|
+
if (!executionValue_isValid(field, rawNode[field])) {
|
|
200
|
+
cumin_1.errorStack.stack_push('error', `Invalid ${field} value on node '${source.title}'.`);
|
|
201
|
+
return (0, cumin_1.Err)();
|
|
202
|
+
}
|
|
203
|
+
const bindingKey = `${source.pipingID}.${field}`;
|
|
204
|
+
if (fileBindingsSeen.has(bindingKey)) {
|
|
205
|
+
cumin_1.errorStack.stack_push('error', `Duplicate parameter-file binding '${source.title}.${field}'.`);
|
|
206
|
+
return (0, cumin_1.Err)();
|
|
207
|
+
}
|
|
208
|
+
fileBindingsSeen.add(bindingKey);
|
|
209
|
+
executionField_set(prepared, field, rawNode[field]);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
const defaults = rawNode.plugin_parameter_defaults;
|
|
213
|
+
if (defaults !== undefined) {
|
|
214
|
+
if (!Array.isArray(defaults))
|
|
215
|
+
return (0, cumin_1.Err)();
|
|
216
|
+
for (const rawParameter of defaults) {
|
|
217
|
+
if (!record_is(rawParameter) || typeof rawParameter.name !== 'string')
|
|
218
|
+
return (0, cumin_1.Err)();
|
|
219
|
+
if (!fields_validate(rawParameter, PARAMETER_FIELDS, 'parameter'))
|
|
220
|
+
return (0, cumin_1.Err)();
|
|
221
|
+
if (rawParameter.name === 'plugininstances') {
|
|
222
|
+
const registered = source.parameterDefaults.find((parameter) => parameter.name === 'plugininstances');
|
|
223
|
+
if (!registered || rawParameter.default !== registered.value) {
|
|
224
|
+
cumin_1.errorStack.stack_push('error', 'plugininstances encodes pipeline topology and cannot be overridden.');
|
|
225
|
+
return (0, cumin_1.Err)();
|
|
226
|
+
}
|
|
227
|
+
continue;
|
|
228
|
+
}
|
|
229
|
+
if (!parameter_known(source, rawParameter.name)) {
|
|
230
|
+
cumin_1.errorStack.stack_push('error', `Unknown parameter '${rawParameter.name}' on node '${source.title}'.`);
|
|
231
|
+
return (0, cumin_1.Err)();
|
|
232
|
+
}
|
|
233
|
+
if (!parameter_valueValid(source, rawParameter.name, rawParameter.default)) {
|
|
234
|
+
cumin_1.errorStack.stack_push('error', `Invalid ${rawParameter.name} value on node '${source.title}'.`);
|
|
235
|
+
return (0, cumin_1.Err)();
|
|
236
|
+
}
|
|
237
|
+
const bindingKey = `${source.pipingID}.${rawParameter.name}`;
|
|
238
|
+
if (fileBindingsSeen.has(bindingKey)) {
|
|
239
|
+
cumin_1.errorStack.stack_push('error', `Duplicate parameter-file binding '${source.title}.${rawParameter.name}'.`);
|
|
240
|
+
return (0, cumin_1.Err)();
|
|
241
|
+
}
|
|
242
|
+
fileBindingsSeen.add(bindingKey);
|
|
243
|
+
parameter_set(prepared, rawParameter.name, rawParameter.default);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
for (const binding of options.cliBindings ?? []) {
|
|
249
|
+
const source = node_resolve(nodes, binding.node);
|
|
250
|
+
if (!source) {
|
|
251
|
+
cumin_1.errorStack.stack_push('error', `Unknown or ambiguous pipeline node '${binding.node}'.`);
|
|
252
|
+
return (0, cumin_1.Err)();
|
|
253
|
+
}
|
|
254
|
+
const prepared = preparedByID.get(source.pipingID);
|
|
255
|
+
if (EXECUTION_FIELDS.has(binding.field)) {
|
|
256
|
+
if (!executionValue_isValid(binding.field, binding.value)) {
|
|
257
|
+
cumin_1.errorStack.stack_push('error', `Invalid ${binding.field} value on node '${source.title}'.`);
|
|
258
|
+
return (0, cumin_1.Err)();
|
|
259
|
+
}
|
|
260
|
+
executionField_set(prepared, binding.field, binding.value);
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
if (binding.field === 'plugininstances') {
|
|
264
|
+
cumin_1.errorStack.stack_push('error', 'plugininstances encodes pipeline topology and cannot be overridden.');
|
|
265
|
+
return (0, cumin_1.Err)();
|
|
266
|
+
}
|
|
267
|
+
if (!parameter_known(source, binding.field)) {
|
|
268
|
+
cumin_1.errorStack.stack_push('error', `Unknown parameter '${binding.field}' on node '${source.title}'.`);
|
|
269
|
+
return (0, cumin_1.Err)();
|
|
270
|
+
}
|
|
271
|
+
if (!parameter_valueValid(source, binding.field, binding.value)) {
|
|
272
|
+
cumin_1.errorStack.stack_push('error', `Invalid ${binding.field} value on node '${source.title}'.`);
|
|
273
|
+
return (0, cumin_1.Err)();
|
|
274
|
+
}
|
|
275
|
+
parameter_set(prepared, binding.field, binding.value);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
let computeInvalid = false;
|
|
279
|
+
for (const source of nodes) {
|
|
280
|
+
const effective = preparedByID.get(source.pipingID).compute_resource_name;
|
|
281
|
+
if (source.computeResources !== undefined && !source.computeResources.includes(effective)) {
|
|
282
|
+
cumin_1.errorStack.stack_push('error', `Node '${source.title}' (${source.pluginName} v${source.pluginVersion}) is not registered on compute '${effective}'.`);
|
|
283
|
+
computeInvalid = true;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
if (computeInvalid)
|
|
287
|
+
return (0, cumin_1.Err)();
|
|
288
|
+
return (0, cumin_1.Ok)({ pipelineID: manifest.pipelineID, nodeOverrides: [...preparedByID.values()] });
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../../src/pipelines/invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Read-only registered-pipeline invocation manifest.
|
|
3
|
+
*
|
|
4
|
+
* The manifest is the CUBE-specific executable projection behind `/bin`: it
|
|
5
|
+
* carries assigned pipeline/piping identities and the stored values required
|
|
6
|
+
* to prepare a Workflow invocation without changing the authoring source.
|
|
7
|
+
*/
|
|
8
|
+
import { Result, type PipelineRecord } from '@fnndsc/cumin';
|
|
9
|
+
/** One parameter value stored on a registered plugin piping. */
|
|
10
|
+
export interface PipelineManifestParameterDefault {
|
|
11
|
+
/** Hosted plugin parameter name. */
|
|
12
|
+
name: string;
|
|
13
|
+
/** Registered value, preserved without scalar coercion. */
|
|
14
|
+
value: unknown;
|
|
15
|
+
}
|
|
16
|
+
/** One CUBE-assigned piping in a registered pipeline. */
|
|
17
|
+
export interface PipelineManifestNode {
|
|
18
|
+
/** Registration-specific plugin piping ID. */
|
|
19
|
+
pipingID: number;
|
|
20
|
+
/** Authored node title used as the portable selector when unique. */
|
|
21
|
+
title: string;
|
|
22
|
+
/** Hosted plugin name. */
|
|
23
|
+
pluginName: string;
|
|
24
|
+
/** Hosted plugin version. */
|
|
25
|
+
pluginVersion: string;
|
|
26
|
+
/** Parent piping ID, or null for a root. */
|
|
27
|
+
parentID: number | null;
|
|
28
|
+
/** Effective registered compute placement. */
|
|
29
|
+
computeResourceName: string;
|
|
30
|
+
/** Registered CPU limit. */
|
|
31
|
+
cpuLimit?: unknown;
|
|
32
|
+
/** Registered memory limit. */
|
|
33
|
+
memoryLimit?: unknown;
|
|
34
|
+
/** Registered GPU limit. */
|
|
35
|
+
gpuLimit?: unknown;
|
|
36
|
+
/** Registered worker count. */
|
|
37
|
+
numberOfWorkers?: unknown;
|
|
38
|
+
/** Parameter values stored by the pipeline registration. */
|
|
39
|
+
parameterDefaults: PipelineManifestParameterDefault[];
|
|
40
|
+
/** Compute resources on which the hosted plugin is registered. */
|
|
41
|
+
computeResources?: string[];
|
|
42
|
+
/** Hosted plugin parameter schema used for help and validation. */
|
|
43
|
+
parameterDefinitions?: Array<{
|
|
44
|
+
/** Hosted parameter name. */
|
|
45
|
+
name: string;
|
|
46
|
+
/** CUBE plugin parameter type. */
|
|
47
|
+
type: string;
|
|
48
|
+
/** Whether the plugin permits omission. */
|
|
49
|
+
optional: boolean;
|
|
50
|
+
/** Plugin-declared default value. */
|
|
51
|
+
default?: unknown;
|
|
52
|
+
/** Plugin-declared help text. */
|
|
53
|
+
help?: string;
|
|
54
|
+
}>;
|
|
55
|
+
}
|
|
56
|
+
/** CUBE-specific executable projection of one registered pipeline. */
|
|
57
|
+
export interface PipelineManifest {
|
|
58
|
+
/** Registered Pipeline ID. */
|
|
59
|
+
pipelineID: number;
|
|
60
|
+
/** Registered Pipeline name. */
|
|
61
|
+
name: string;
|
|
62
|
+
/** Root plugin piping IDs. */
|
|
63
|
+
rootIDs: number[];
|
|
64
|
+
/** Complete registered piping set. */
|
|
65
|
+
nodes: PipelineManifestNode[];
|
|
66
|
+
}
|
|
67
|
+
/** Controls how much remote metadata is included in a Pipeline manifest. */
|
|
68
|
+
export interface PipelineManifestGetOptions {
|
|
69
|
+
/** `registered` omits hosted schemas; `execution` includes validation metadata. */
|
|
70
|
+
detail?: 'registered' | 'execution';
|
|
71
|
+
}
|
|
72
|
+
interface ItemList {
|
|
73
|
+
getItems: () => unknown[];
|
|
74
|
+
}
|
|
75
|
+
interface DataList {
|
|
76
|
+
data?: unknown;
|
|
77
|
+
}
|
|
78
|
+
/** Remote registered Pipeline resource used to build an invocation manifest. */
|
|
79
|
+
export interface PipelineManifestResource {
|
|
80
|
+
/** List the Pipeline's registered PluginPipings. */
|
|
81
|
+
getPluginPipings: (options: Record<string, unknown>) => Promise<ItemList>;
|
|
82
|
+
/** List the parameter and execution-control values stored on its pipings. */
|
|
83
|
+
getDefaultParameters: (options: Record<string, unknown>) => Promise<DataList>;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Fetch a manifest for an already-resolved Pipeline without resolving it again.
|
|
87
|
+
*
|
|
88
|
+
* @param pipeline - Exact Pipeline record already resolved by the caller.
|
|
89
|
+
* @param resource - Remote Pipeline resource obtained during that resolution.
|
|
90
|
+
* @param options - Projection detail required by the caller.
|
|
91
|
+
* @returns Result containing the requested registered Pipeline projection.
|
|
92
|
+
*/
|
|
93
|
+
export declare function pipelineManifestForPipeline_get(pipeline: PipelineRecord, resource: PipelineManifestResource, options?: PipelineManifestGetOptions): Promise<Result<PipelineManifest>>;
|
|
94
|
+
/**
|
|
95
|
+
* Fetch one registered pipeline as its CUBE-specific invocation manifest.
|
|
96
|
+
*
|
|
97
|
+
* @param specifier - Pipeline name or numeric ID string.
|
|
98
|
+
* @param options - Projection detail required by the caller.
|
|
99
|
+
* @returns Result containing the complete registered invocation manifest.
|
|
100
|
+
*/
|
|
101
|
+
export declare function pipelineManifest_get(specifier: string, options?: PipelineManifestGetOptions): Promise<Result<PipelineManifest>>;
|
|
102
|
+
export {};
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.pipelineManifestForPipeline_get = pipelineManifestForPipeline_get;
|
|
4
|
+
exports.pipelineManifest_get = pipelineManifest_get;
|
|
5
|
+
/**
|
|
6
|
+
* @file Read-only registered-pipeline invocation manifest.
|
|
7
|
+
*
|
|
8
|
+
* The manifest is the CUBE-specific executable projection behind `/bin`: it
|
|
9
|
+
* carries assigned pipeline/piping identities and the stored values required
|
|
10
|
+
* to prepare a Workflow invocation without changing the authoring source.
|
|
11
|
+
*/
|
|
12
|
+
const cumin_1 = require("@fnndsc/cumin");
|
|
13
|
+
const PIPELINE_MANIFEST_TTL_MS = 5 * 60 * 1000;
|
|
14
|
+
const manifestCaches = new WeakMap();
|
|
15
|
+
function timedCache_get(entries, key) {
|
|
16
|
+
const entry = entries.get(key);
|
|
17
|
+
if (entry === undefined)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (entry.expiresAt <= Date.now()) {
|
|
20
|
+
entries.delete(key);
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
return entry.value;
|
|
24
|
+
}
|
|
25
|
+
function timedCache_set(entries, key, value) {
|
|
26
|
+
entries.set(key, { value, expiresAt: Date.now() + PIPELINE_MANIFEST_TTL_MS });
|
|
27
|
+
}
|
|
28
|
+
function manifestClientCache_get(client) {
|
|
29
|
+
let cache = manifestCaches.get(client);
|
|
30
|
+
if (cache === undefined) {
|
|
31
|
+
cache = { aliases: new Map(), manifests: new Map(), pluginMetadata: new Map() };
|
|
32
|
+
manifestCaches.set(client, cache);
|
|
33
|
+
}
|
|
34
|
+
return cache;
|
|
35
|
+
}
|
|
36
|
+
async function pluginMetadata_get(cache, item, piping) {
|
|
37
|
+
if (item.getPlugin === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
const key = piping.plugin_name !== undefined && piping.plugin_version !== undefined
|
|
40
|
+
? `${piping.plugin_name}@${piping.plugin_version}`
|
|
41
|
+
: `piping:${piping.id}`;
|
|
42
|
+
let metadataPromise = timedCache_get(cache.pluginMetadata, key);
|
|
43
|
+
if (metadataPromise === undefined) {
|
|
44
|
+
metadataPromise = (async () => {
|
|
45
|
+
const plugin = await item.getPlugin();
|
|
46
|
+
const [parameterList, computeList] = await Promise.all([
|
|
47
|
+
plugin.getPluginParameters({ limit: 1000 }),
|
|
48
|
+
plugin.getPluginComputeResources({ limit: 1000 }),
|
|
49
|
+
]);
|
|
50
|
+
return {
|
|
51
|
+
parameterDefinitions: (0, cumin_1.items_get)(parameterList).map((parameter) => ({
|
|
52
|
+
name: parameter.data.name,
|
|
53
|
+
type: parameter.data.type ?? 'string',
|
|
54
|
+
optional: parameter.data.optional ?? false,
|
|
55
|
+
default: parameter.data.default,
|
|
56
|
+
help: parameter.data.help,
|
|
57
|
+
})),
|
|
58
|
+
computeResources: (0, cumin_1.items_get)(computeList)
|
|
59
|
+
.map((compute) => compute.data.name)
|
|
60
|
+
.filter((name) => typeof name === 'string'),
|
|
61
|
+
};
|
|
62
|
+
})();
|
|
63
|
+
timedCache_set(cache.pluginMetadata, key, metadataPromise);
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
return await metadataPromise;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
cache.pluginMetadata.delete(key);
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Fetch a manifest for an already-resolved Pipeline without resolving it again.
|
|
75
|
+
*
|
|
76
|
+
* @param pipeline - Exact Pipeline record already resolved by the caller.
|
|
77
|
+
* @param resource - Remote Pipeline resource obtained during that resolution.
|
|
78
|
+
* @param options - Projection detail required by the caller.
|
|
79
|
+
* @returns Result containing the requested registered Pipeline projection.
|
|
80
|
+
*/
|
|
81
|
+
async function pipelineManifestForPipeline_get(pipeline, resource, options = {}) {
|
|
82
|
+
const client = await cumin_1.chrisConnection.client_get();
|
|
83
|
+
if (!client) {
|
|
84
|
+
cumin_1.errorStack.stack_push('error', 'Not connected to ChRIS. Cannot inspect pipeline.');
|
|
85
|
+
return (0, cumin_1.Err)();
|
|
86
|
+
}
|
|
87
|
+
const cache = manifestClientCache_get(client);
|
|
88
|
+
timedCache_set(cache.aliases, String(pipeline.id), pipeline);
|
|
89
|
+
if (typeof pipeline.slug === 'string')
|
|
90
|
+
timedCache_set(cache.aliases, pipeline.slug, pipeline);
|
|
91
|
+
const detail = options.detail ?? 'execution';
|
|
92
|
+
const manifestKey = `${pipeline.id}:${detail}`;
|
|
93
|
+
const cachedManifest = timedCache_get(cache.manifests, manifestKey);
|
|
94
|
+
if (cachedManifest !== undefined)
|
|
95
|
+
return (0, cumin_1.Ok)(cachedManifest);
|
|
96
|
+
return pipelineManifest_project(pipeline, resource, detail, cache);
|
|
97
|
+
}
|
|
98
|
+
function definedValue_getFirst(...values) {
|
|
99
|
+
return values.find((value) => value !== undefined);
|
|
100
|
+
}
|
|
101
|
+
async function pipelineManifest_project(pipelineRecord, pipeline, detail, cache) {
|
|
102
|
+
const manifestKey = `${pipelineRecord.id}:${detail}`;
|
|
103
|
+
try {
|
|
104
|
+
const [pipingList, defaultList] = await Promise.all([
|
|
105
|
+
pipeline.getPluginPipings({ limit: 1000 }),
|
|
106
|
+
pipeline.getDefaultParameters({ limit: 1000 }),
|
|
107
|
+
]);
|
|
108
|
+
const pipingItems = (0, cumin_1.items_get)(pipingList);
|
|
109
|
+
const defaults = (0, cumin_1.listData_get)(defaultList);
|
|
110
|
+
const defaultsByPiping = new Map();
|
|
111
|
+
for (const parameter of defaults) {
|
|
112
|
+
const current = defaultsByPiping.get(parameter.plugin_piping_id) ?? [];
|
|
113
|
+
current.push(parameter);
|
|
114
|
+
defaultsByPiping.set(parameter.plugin_piping_id, current);
|
|
115
|
+
}
|
|
116
|
+
const nodes = await Promise.all(pipingItems.map(async (item) => {
|
|
117
|
+
const piping = item.data;
|
|
118
|
+
const stored = defaultsByPiping.get(piping.id) ?? [];
|
|
119
|
+
const resource = stored[0];
|
|
120
|
+
let computeResources;
|
|
121
|
+
let parameterDefinitions;
|
|
122
|
+
if (detail === 'execution' && item.getPlugin) {
|
|
123
|
+
const metadata = await pluginMetadata_get(cache, item, piping);
|
|
124
|
+
parameterDefinitions = metadata?.parameterDefinitions;
|
|
125
|
+
computeResources = metadata?.computeResources;
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
pipingID: piping.id,
|
|
129
|
+
title: piping.title ?? `piping_${piping.id}`,
|
|
130
|
+
pluginName: piping.plugin_name ?? '?',
|
|
131
|
+
pluginVersion: piping.plugin_version ?? '',
|
|
132
|
+
parentID: piping.previous_id ?? null,
|
|
133
|
+
computeResourceName: 'host',
|
|
134
|
+
cpuLimit: definedValue_getFirst(resource?.plugin_piping_cpu_limit, piping.cpu_limit),
|
|
135
|
+
memoryLimit: definedValue_getFirst(resource?.plugin_piping_memory_limit, piping.memory_limit),
|
|
136
|
+
gpuLimit: definedValue_getFirst(resource?.plugin_piping_gpu_limit, piping.gpu_limit),
|
|
137
|
+
numberOfWorkers: definedValue_getFirst(resource?.plugin_piping_number_of_workers, piping.number_of_workers),
|
|
138
|
+
parameterDefaults: stored.map((parameter) => ({
|
|
139
|
+
name: parameter.param_name,
|
|
140
|
+
value: parameter.value,
|
|
141
|
+
})),
|
|
142
|
+
computeResources,
|
|
143
|
+
parameterDefinitions,
|
|
144
|
+
};
|
|
145
|
+
}));
|
|
146
|
+
const manifest = {
|
|
147
|
+
pipelineID: pipelineRecord.id,
|
|
148
|
+
name: pipelineRecord.name,
|
|
149
|
+
rootIDs: nodes.filter((node) => node.parentID === null)
|
|
150
|
+
.map((node) => node.pipingID),
|
|
151
|
+
nodes,
|
|
152
|
+
};
|
|
153
|
+
timedCache_set(cache.manifests, manifestKey, manifest);
|
|
154
|
+
return (0, cumin_1.Ok)(manifest);
|
|
155
|
+
}
|
|
156
|
+
catch (error) {
|
|
157
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
158
|
+
cumin_1.errorStack.stack_push('error', `pipelineManifest_get: ${message}`);
|
|
159
|
+
return (0, cumin_1.Err)();
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Fetch one registered pipeline as its CUBE-specific invocation manifest.
|
|
164
|
+
*
|
|
165
|
+
* @param specifier - Pipeline name or numeric ID string.
|
|
166
|
+
* @param options - Projection detail required by the caller.
|
|
167
|
+
* @returns Result containing the complete registered invocation manifest.
|
|
168
|
+
*/
|
|
169
|
+
async function pipelineManifest_get(specifier, options = {}) {
|
|
170
|
+
const detail = options.detail ?? 'execution';
|
|
171
|
+
const client = await cumin_1.chrisConnection.client_get();
|
|
172
|
+
if (!client) {
|
|
173
|
+
cumin_1.errorStack.stack_push('error', 'Not connected to ChRIS. Cannot inspect pipeline.');
|
|
174
|
+
return (0, cumin_1.Err)();
|
|
175
|
+
}
|
|
176
|
+
const cache = manifestClientCache_get(client);
|
|
177
|
+
let pipelineRecord = timedCache_get(cache.aliases, specifier);
|
|
178
|
+
if (pipelineRecord === undefined) {
|
|
179
|
+
const resolved = await (0, cumin_1.pipeline_resolve)(specifier);
|
|
180
|
+
if (!resolved.ok)
|
|
181
|
+
return (0, cumin_1.Err)();
|
|
182
|
+
pipelineRecord = resolved.value;
|
|
183
|
+
timedCache_set(cache.aliases, specifier, pipelineRecord);
|
|
184
|
+
timedCache_set(cache.aliases, String(pipelineRecord.id), pipelineRecord);
|
|
185
|
+
}
|
|
186
|
+
const manifestKey = `${pipelineRecord.id}:${detail}`;
|
|
187
|
+
const cachedManifest = timedCache_get(cache.manifests, manifestKey);
|
|
188
|
+
if (cachedManifest !== undefined)
|
|
189
|
+
return (0, cumin_1.Ok)(cachedManifest);
|
|
190
|
+
try {
|
|
191
|
+
const pipeline = await client.getPipeline(pipelineRecord.id);
|
|
192
|
+
if (!pipeline) {
|
|
193
|
+
cumin_1.errorStack.stack_push('error', `Pipeline ${pipelineRecord.id} not found.`);
|
|
194
|
+
return (0, cumin_1.Err)();
|
|
195
|
+
}
|
|
196
|
+
return pipelineManifest_project(pipelineRecord, pipeline, detail, cache);
|
|
197
|
+
}
|
|
198
|
+
catch (error) {
|
|
199
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
200
|
+
cumin_1.errorStack.stack_push('error', `pipelineManifest_get: ${message}`);
|
|
201
|
+
return (0, cumin_1.Err)();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../../src/pipelines/manifest.ts"],"names":[],"mappings":"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"}
|