Skip to content

Commit

Permalink
fix: refactor getDestFromSrc (#39)
Browse files Browse the repository at this point in the history
  • Loading branch information
wahapo committed Jan 18, 2022
1 parent 409ea68 commit 52503aa
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 36 deletions.
55 changes: 33 additions & 22 deletions lib/getWorkflow.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,13 @@ const buildExternalNodes = async (children, nodes, triggerFactory) => {
/**
* Get the list of nodes for the graph
* @method calculateNodes
* @param {Object} jobs Hash of job configs
* @param {TriggerFactory} triggerFactory Trigger Factory to find external triggers
* @param {Number} pipelineId Id of the current pipeline
* @param {Object} jobs Hash of job configs
* @param {TriggerFactory} triggerFactory Trigger Factory to find external triggers
* @param {Object} externalDownstreamOrs Hash of externalDownstreamOr. ex: {jobName: externalDownstreamOr}
* @param {Object} externalDownstreamAnds Hash of externalDownstreamAnd. ex {jobName: externalDownstreamAnd}
* @return {Array} List of nodes (jobs)
*/
const calculateNodes = async (jobs, triggerFactory, pipelineId) => {
const calculateNodes = async (jobs, triggerFactory, externalDownstreamOrs, externalDownstreamAnds) => {
const nodes = new Set(['~pr', '~commit']);

// for backward compatibility. TODO: remove this block later
Expand All @@ -64,12 +65,8 @@ const calculateNodes = async (jobs, triggerFactory, pipelineId) => {
}

// downstream nodes
const srcName = `sd@${pipelineId}:${jobName}`;

// Calculate which downstream jobs are triggered BY current job
// Only need to take care of external triggers, since internal will be taken care automatically
const externalDownstreamOr = await triggerFactory.getDestFromSrc(`~${srcName}`);
const externalDownstreamAnd = await triggerFactory.getDestFromSrc(srcName);
const externalDownstreamOr = jobName in externalDownstreamOrs ? externalDownstreamOrs[jobName] : [];
const externalDownstreamAnd = jobName in externalDownstreamAnds ? externalDownstreamAnds[jobName] : [];

externalDownstreamOr.forEach(dest => {
nodes.add(dest.replace('~sd@', 'sd@'));
Expand Down Expand Up @@ -118,12 +115,13 @@ const buildExternalEdges = async (root, children, edges, triggerFactory) => {
/**
* Calculate edges of directed graph based on "requires" property of jobs
* @method calculateEdges
* @param {Object} jobs Hash of job configurations
* @param {TriggerFactory} triggerFactory Trigger Factory to find external triggers
* @param {Number} pipelineId Id of the current pipeline
* @param {Object} jobs Hash of job configurations
* @param {TriggerFactory} triggerFactory Trigger Factory to find external triggers
* @param {Object} externalDownstreamOrs Hash of externalDownstreamOr. ex: {jobName: externalDownstreamOr}
* @param {Object} externalDownstreamAnds Hash of externalDownstreamAnd. ex {jobName: externalDownstreamAnd}
* @return {Array} List of graph edges { src, dest }
*/
const calculateEdges = async (jobs, triggerFactory, pipelineId) => {
const calculateEdges = async (jobs, triggerFactory, externalDownstreamOrs, externalDownstreamAnds) => {
const edges = [];

// for backward compatibility. TODO: remove this block later
Expand Down Expand Up @@ -180,12 +178,8 @@ const calculateEdges = async (jobs, triggerFactory, pipelineId) => {
});
}

const srcName = `sd@${pipelineId}:${jobName}`;

// Calculate which downstream jobs are triggered BY current job
// Only need to take care of external triggers, since internal will be taken care automatically
const externalDownstreamOr = await triggerFactory.getDestFromSrc(`~${srcName}`);
const externalDownstreamAnd = await triggerFactory.getDestFromSrc(srcName);
const externalDownstreamOr = jobName in externalDownstreamOrs ? externalDownstreamOrs[jobName] : [];
const externalDownstreamAnd = jobName in externalDownstreamAnds ? externalDownstreamAnds[jobName] : [];

externalDownstreamOr.forEach(dest => {
edges.push({ src: jobName, dest: dest.replace('~sd@', 'sd@') });
Expand All @@ -210,12 +204,29 @@ const calculateEdges = async (jobs, triggerFactory, pipelineId) => {
*/
const getWorkflow = async (pipelineConfig, triggerFactory, pipelineId) => {
const jobConfig = pipelineConfig.jobs;
const externalDownstreamOrs = {};
const externalDownstreamAnds = {};

if (!jobConfig) {
throw new Error('No Job config provided');
}
const nodes = await calculateNodes(jobConfig, triggerFactory, pipelineId);
const edges = await calculateEdges(jobConfig, triggerFactory, pipelineId);

// Consolidate necessary items for calculateNodes() and calculateEdges()
if (triggerFactory) {
await Promise.all(
Object.keys(jobConfig).map(async jobName => {
const srcName = `sd@${pipelineId}:${jobName}`;

// Calculate which downstream jobs are triggered BY current job
// Only need to take care of external triggers, since internal will be taken care automatically
externalDownstreamOrs[jobName] = await triggerFactory.getDestFromSrc(`~${srcName}`);
externalDownstreamAnds[jobName] = await triggerFactory.getDestFromSrc(srcName);
})
);
}

const nodes = await calculateNodes(jobConfig, triggerFactory, externalDownstreamOrs, externalDownstreamAnds);
const edges = await calculateEdges(jobConfig, triggerFactory, externalDownstreamOrs, externalDownstreamAnds);

return { nodes, edges };
};
Expand Down
12 changes: 6 additions & 6 deletions test/data/expected-external-complex.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,27 @@
{ "name": "~pr" },
{ "name": "~commit" },
{ "name": "A" },
{ "name": "sd@777:external-level1" },
{ "name": "sd@111:external-level1" },
{ "name": "sd@333:external-level1" },
{ "name": "B" },
{ "name": "C" },
{ "name": "sd@222:external-level2" },
{ "name": "sd@444:external-level2" },
{ "name": "sd@555:external-level2" },
{ "name": "~sd@888:external-level2" },
{ "name": "sd@777:external-level1" },
{ "name": "sd@111:external-level1" },
{ "name": "sd@333:external-level1" },
{ "name": "sd@666:external-level3" }
],
"edges": [
{ "src": "A", "dest": "sd@777:external-level1" },
{ "src": "A", "dest": "sd@111:external-level1" },
{ "src": "A", "dest": "sd@333:external-level1" },
{ "src": "A", "dest": "B" },
{ "src": "~sd@888:external-level2", "dest": "C" },
{ "src": "B", "dest": "C", "join": true },
{ "src": "sd@222:external-level2", "dest": "C", "join": true },
{ "src": "sd@444:external-level2", "dest": "C", "join": true },
{ "src": "sd@555:external-level2", "dest": "C", "join": true },
{ "src": "A", "dest": "sd@777:external-level1" },
{ "src": "A", "dest": "sd@111:external-level1" },
{ "src": "A", "dest": "sd@333:external-level1" },
{ "src": "sd@111:external-level1", "dest": "sd@222:external-level2" },
{ "src": "sd@333:external-level1", "dest": "sd@444:external-level2" },
{ "src": "sd@333:external-level1", "dest": "sd@555:external-level2" },
Expand Down
12 changes: 6 additions & 6 deletions test/data/expected-external-join.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,17 @@
{ "name": "~commit" },
{ "name": "main" },
{ "name": "foo" },
{ "name": "bar" },
{ "name": "sd@111:baz" },
{ "name": "sd@1234:foo" }
{ "name": "sd@1234:foo" },
{ "name": "bar" }
],
"edges": [
{ "src": "~pr", "dest": "main" },
{ "src": "~commit", "dest": "main" },
{ "src": "main", "dest": "foo" },
{ "src": "sd@111:baz", "dest": "bar", "join": true },
{ "src": "sd@1234:foo", "dest": "bar", "join": true },
{ "src": "foo", "dest": "sd@111:baz" },
{ "src": "foo", "dest": "sd@1234:foo" }
{ "src": "foo", "dest": "sd@1234:foo" },
{ "src": "sd@111:baz", "dest": "bar", "join": true },
{ "src": "sd@1234:foo", "dest": "bar", "join": true }
]
}
}
4 changes: 2 additions & 2 deletions test/lib/getNextJobs.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,10 +140,10 @@ describe('getNextJobs', () => {
\ ~sd@777:external-level1 -> ~sd@888:external-level2 /
*/
assert.deepEqual(getNextJobs(EXTERNAL_COMPLEX_WORKFLOW, { trigger: 'A' }), [
'B',
'sd@777:external-level1',
'sd@111:external-level1',
'sd@333:external-level1'
'sd@333:external-level1',
'B'
]);
assert.deepEqual(getNextJobs(EXTERNAL_COMPLEX_WORKFLOW, { trigger: 'B' }), ['C']);
});
Expand Down

0 comments on commit 52503aa

Please sign in to comment.