firmament-vita
Version:
Firmament module for automating VITA tasks
114 lines (109 loc) • 4.85 kB
text/typescript
import {injectable, inject} from 'inversify';
import {EtlFlow} from 'etl-typings';
import {PostalAgent} from '../interfaces/postal-agent';
import {ForceErrorImpl, IPostal, CommandUtil} from 'firmament-yargs';
import {ProcessFileWithFlowOptions, FullPipeline, ProcessFullPipelineStatus} from '../interfaces/vita-options-results';
import {VitaTasks} from '../interfaces/vita-tasks';
import kernel from "../inversify.config";
const path = require('path');
()
export class PostalAgentImpl extends ForceErrorImpl implements PostalAgent {
constructor(('IPostal') private postal: IPostal,
('CommandUtil') private commandUtil: CommandUtil,
('VitaTasks') private vitaTasks: VitaTasks) {
super();
let me = this;
me.postal.subscribe({
channel: 'FirmamentVita',
topic: 'ProcessFileWithFlow',
callback: (ppfwf: ProcessFileWithFlowOptions) => {
ppfwf.etlFile.addFlows([{name: ppfwf.flowName}], (err, etlFlows: EtlFlow[]) => {
if (me.commandUtil.logError(err)
|| !etlFlows
|| etlFlows.length != 1) {
return;
}
//We've got the flow, now fire up the VitaTask
let etlFlow = etlFlows[0];
etlFlow.addSteps([
{
name: 'decryptAndUnTar',
index: 0
},
{
name: 'unZipFile',
index: 1
},
{
name: 'mergePcap',
index: 2
}
], (err, etlSteps) => {
if (me.commandUtil.logError(err)
|| !etlSteps
|| etlSteps.length != 3) {
return;
}
etlFlow.loadEntireObject((err, etlFlow: EtlFlow) => {
let fullPipeline = kernel.get<FullPipeline>('FullPipeline');
fullPipeline.decryptAndUnTarOptions.encryptedFiles = [path.resolve(ppfwf.etlFile.path, ppfwf.etlFile.name)];
fullPipeline.decryptAndUnTarOptions.password = ppfwf.fileEncryptionPassword;
etlFlow.currentStepIndex = Number.MAX_SAFE_INTEGER;
vitaTasks.processFullPipelineInstance(
fullPipeline,
(err, status: ProcessFullPipelineStatus) => {
if (status.mergePcapFilesStatus && etlFlow.currentStepIndex !== 2) {
etlFlow.currentStepIndex = 2;
etlFlow.steps[etlFlow.currentStepIndex].startTime =
etlFlow.steps[etlFlow.currentStepIndex - 1].endTime = new Date();
}
else if (status.unZipFileStatus && etlFlow.currentStepIndex !== 1) {
etlFlow.currentStepIndex = 1;
etlFlow.steps[etlFlow.currentStepIndex].startTime =
etlFlow.steps[etlFlow.currentStepIndex - 1].endTime = new Date();
}
else if (status.decryptAndUnTarStatus && etlFlow.currentStepIndex !== 0) {
etlFlow.currentStepIndex = 0;
etlFlow.steps[etlFlow.currentStepIndex].startTime = new Date();
}
switch (etlFlow.currentStepIndex) {
case 0:
etlFlow.steps[etlFlow.currentStepIndex].progress =
status.decryptAndUnTarStatus.current / status.decryptAndUnTarStatus.total;
break;
case 1:
etlFlow.steps[etlFlow.currentStepIndex].progress =
status.unZipFileStatus.current / status.unZipFileStatus.total;
break;
case 2:
etlFlow.steps[etlFlow.currentStepIndex].progress =
status.mergePcapFilesStatus.current / status.mergePcapFilesStatus.total;
break;
}
status = status || {status: 'Running'};
etlFlow.steps[etlFlow.currentStepIndex].status = status.status;
etlFlow.steps[etlFlow.currentStepIndex].currentTime = new Date();
etlFlow.steps[etlFlow.currentStepIndex].writeToDb(() => {
me.postal.publish({
channel: 'FirmamentVita',
topic: ppfwf.operationUUID,
data: {err, status}
});
});
},
(err, result) => {
result = result || {status: 'Finished'};
me.postal.publish({
channel: 'FirmamentVita',
topic: ppfwf.operationUUID,
data: {err, result}
});
}
);
});
});
});
}
});
}
}