Skip to content

Commit b4d1696

Browse files
Merge pull request #109 from Exabyte-io/feature/SOF-7731
Feature/SOF-7731
2 parents ebb33d9 + 4fa53e5 commit b4d1696

File tree

4 files changed

+75
-14
lines changed

4 files changed

+75
-14
lines changed

src/subworkflows/subworkflow.js

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,18 @@ export class Subworkflow extends BaseSubworkflow {
5050
);
5151
}
5252

53-
static generateSubworkflowId(...args) {
54-
args[0] = `subworkflow-${args[0]}`;
55-
if (this.usePredefinedIds) return Utils.uuid.getUUIDFromNamespace(...args);
53+
static generateSubworkflowId(name, application = null, model = null, method = null) {
54+
const appName = application ? application.name || application : "";
55+
const modelInfo = model
56+
? `${(model.toJSON?.() || model).type}-${(model.toJSON?.() || model).subtype || ""}`
57+
: "";
58+
const methodInfo = method
59+
? `${(method.toJSON?.() || method).type}-${(method.toJSON?.() || method).subtype || ""}`
60+
: "";
61+
const seed = [`subworkflow-${name}`, appName, modelInfo, methodInfo]
62+
.filter((p) => p)
63+
.join("-");
64+
if (this.usePredefinedIds) return Utils.uuid.getUUIDFromNamespace(seed);
5665
return Utils.uuid.getUUID();
5766
}
5867

@@ -96,7 +105,7 @@ export class Subworkflow extends BaseSubworkflow {
96105

97106
return new Cls({
98107
...cleanConfig,
99-
_id: Cls.generateSubworkflowId(nameForIdGeneration),
108+
_id: Cls.generateSubworkflowId(nameForIdGeneration, application, model, method),
100109
name,
101110
application: application.toJSON(),
102111
properties: lodash.sortedUniq(

src/units/execution.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ export class ExecutionUnit extends BaseUnit {
249249
}
250250

251251
toJSON() {
252-
return this.clean({
252+
const json = this.clean({
253253
...super.toJSON(),
254254
executable: this.executable.toJSON(),
255255
flavor: this.flavor.toJSON(),
@@ -259,5 +259,10 @@ export class ExecutionUnit extends BaseUnit {
259259
// TODO: figure out the problem with storing context below
260260
// context: this.storedContext,
261261
});
262+
263+
// Remove results from executable
264+
if (json.executable?.results) delete json.executable.results;
265+
266+
return json;
262267
}
263268
}

src/workflows/workflow.js

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,14 @@ export class Workflow extends BaseWorkflow {
3838
_Workflow = Workflow,
3939
_MapUnit = MapUnit,
4040
) {
41-
if (!config._id) config._id = Workflow.generateWorkflowId(config.name);
41+
if (!config._id) {
42+
config._id = Workflow.generateWorkflowId(
43+
config.name,
44+
config.properties,
45+
config.subworkflows,
46+
config.applicationName,
47+
);
48+
}
4249
super(config);
4350
this._Subworkflow = _Subworkflow;
4451
this._UnitFactory = _UnitFactory;
@@ -59,9 +66,20 @@ export class Workflow extends BaseWorkflow {
5966
return defaultWorkflowConfig;
6067
}
6168

62-
static generateWorkflowId(...args) {
63-
args[0] = `workflow-${args[0]}`;
64-
if (this.usePredefinedIds) return Utils.uuid.getUUIDFromNamespace(...args);
69+
static generateWorkflowId(
70+
name,
71+
properties = null,
72+
subworkflows = null,
73+
applicationName = null,
74+
) {
75+
const propsInfo = properties?.length ? properties.sort().join(",") : "";
76+
const swInfo = subworkflows?.length
77+
? subworkflows.map((sw) => sw.name || "unknown").join(",")
78+
: "";
79+
const seed = [`workflow-${name}`, applicationName, propsInfo, swInfo]
80+
.filter((p) => p)
81+
.join("-");
82+
if (this.usePredefinedIds) return Utils.uuid.getUUIDFromNamespace(seed);
6583
return Utils.uuid.getUUID();
6684
}
6785

@@ -71,6 +89,7 @@ export class Workflow extends BaseWorkflow {
7189
subworkflows: [subworkflow.toJSON()],
7290
units: setNextLinks(setUnitsHead([subworkflow.getAsUnit().toJSON()])),
7391
properties: subworkflow.properties,
92+
applicationName: subworkflow.application.name,
7493
};
7594
return new ClsConstructor(config);
7695
}
@@ -292,7 +311,12 @@ export class Workflow extends BaseWorkflow {
292311
const workflowConfig = defaultWorkflowConfig;
293312
// eslint-disable-next-line no-case-declarations
294313
const mapUnit = new this._MapUnit();
295-
workflowConfig._id = this._Workflow.generateWorkflowId(workflowConfig.name);
314+
workflowConfig._id = this._Workflow.generateWorkflowId(
315+
workflowConfig.name,
316+
workflowConfig.properties,
317+
workflowConfig.subworkflows,
318+
this.applicationName,
319+
);
296320
this.prop("workflows").push(workflowConfig);
297321
this._workflows = this.prop("workflows").map((x) => new this._Workflow(x));
298322
mapUnit.setWorkflowId(workflowConfig._id);
@@ -308,8 +332,14 @@ export class Workflow extends BaseWorkflow {
308332

309333
addMapUnit(mapUnit, mapWorkflow) {
310334
const mapWorkflowConfig = mapWorkflow.toJSON();
311-
if (!mapWorkflowConfig._id)
312-
mapWorkflowConfig._id = this._Workflow.generateWorkflowId(mapWorkflowConfig.name);
335+
if (!mapWorkflowConfig._id) {
336+
mapWorkflowConfig._id = this._Workflow.generateWorkflowId(
337+
mapWorkflowConfig.name,
338+
mapWorkflowConfig.properties,
339+
mapWorkflowConfig.subworkflows,
340+
mapWorkflow.applicationName || this.applicationName,
341+
);
342+
}
313343
mapUnit.setWorkflowId(mapWorkflowConfig._id);
314344
this.addUnit(mapUnit);
315345
this._json.workflows.push(mapWorkflowConfig);

tests/workflow.test.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ import { builders, createWorkflows, Subworkflow, UnitFactory, Workflow } from ".
55
import { createWorkflow } from "../src/workflows/create";
66

77
// Expected predefined IDs constants - update these after running test to see actual values
8-
const EXPECTED_WORKFLOW_ID = "512cb2cc-5cca-52c7-9dd9-1d2b57196188";
9-
const EXPECTED_SUBWORKFLOW_ID = "82673aa1-c4d7-5b2c-b216-7579760fdfaf";
8+
const EXPECTED_WORKFLOW_ID = "cd826954-8c96-59f7-b2de-f36ce2d86105";
9+
const EXPECTED_SUBWORKFLOW_ID = "233bb8cf-3b4a-5378-84d9-a6a95a2ab43d";
1010
const EXPECTED_UNIT_ID = "9fc7a088-5533-5f70-bb33-f676ec65f565";
1111

1212
describe("workflows", () => {
@@ -100,6 +100,23 @@ describe("workflows", () => {
100100
UnitFactory.ProcessingUnit.usePredefinedIds = false;
101101
}
102102
});
103+
104+
it("generates non-colliding predefined IDs", () => {
105+
Workflow.usePredefinedIds = true;
106+
const workflow1 = createWorkflow({
107+
appName: "espresso",
108+
workflowData: workflowSubforkflowMapByApplication.workflows.espresso.total_energy,
109+
workflowSubworkflowMapByApplication: workflowSubforkflowMapByApplication,
110+
workflowCls: Workflow,
111+
});
112+
const workflow2 = createWorkflow({
113+
appName: "vasp",
114+
workflowData: workflowSubforkflowMapByApplication.workflows.vasp.total_energy,
115+
workflowSubworkflowMapByApplication: workflowSubforkflowMapByApplication,
116+
workflowCls: Workflow,
117+
});
118+
expect(workflow1._id).to.not.equal(workflow2._id);
119+
});
103120
});
104121

105122
describe("workflow property", () => {

0 commit comments

Comments
 (0)