Skip to content

Commit

Permalink
Merge pull request #229 from cumulus-nasa/CUMULUS-200-lambda-test
Browse files Browse the repository at this point in the history
Cumulus 200 lambda test
  • Loading branch information
laurenfrederick committed Mar 2, 2018
2 parents 7aa4c7d + ad7c70f commit 60256eb
Show file tree
Hide file tree
Showing 3 changed files with 94 additions and 0 deletions.
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.

## [Unreleased]

### Added
- Integration test package with command line tool [CUMULUS-200] by @laurenfrederick

## [v1.0.1] - 2018-02-27

### Added
Expand Down
2 changes: 2 additions & 0 deletions packages/integration-tests/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
const uuidv4 = require('uuid/v4');
const fs = require('fs-extra');
const { s3, sfn } = require('@cumulus/common/aws');
const lambda = require('./lambda');

const executionStatusNumRetries = 20;
const waitPeriodMs = 5000;
Expand Down Expand Up @@ -159,3 +160,4 @@ async function testWorkflow(stackName, bucketName, workflowName, inputFile) {

exports.testWorkflow = testWorkflow;
exports.executeWorkflow = executeWorkflow;
exports.getLambdaOutput = lambda.getLambdaOutputPayload;
89 changes: 89 additions & 0 deletions packages/integration-tests/lambda.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
'use strict';

const { sfn } = require('@cumulus/common/aws');

const lambdaScheduleEvents = [
'LambdaFunctionScheduled',
'LambdaFunctionScheduleFailed'
];

const lambdaStartedEvents = [
'LambdaFunctionStartFailed',
'LambdaFunctionStarted'
];

const lambdaCompletedEvents = [
'LambdaFunctionFailed',
'LambdaFunctionSucceeded',
'LambdaFunctionTimedOut'
];

/**
* Get the events for the lambda execution for the given workflow execution.
* This function currently assumes one execution of the given lambda per workflow.
*
* @param {string} workflowExecutionArn - Arn of the workflow execution
* @param {string} lambdaName - name of the lambda
* @returns {Object} an object containing a schedule event, start event, and complete
* event if exist, null if cannot find the lambda
*/
async function getLambdaExecution(workflowExecutionArn, lambdaName) {
const executionHistory = (
await sfn().getExecutionHistory({ executionArn: workflowExecutionArn }).promise()
);

// Get the event where the lambda was scheduled
const scheduleEvent = executionHistory.events.find((event) => (
lambdaScheduleEvents.includes(event.type)) &&
(event.lambdaFunctionScheduledEventDetails.resource.includes(lambdaName))
);

if (scheduleEvent === null) {
console.log(`Could not find lambda ${lambdaName} in execution.`);
return null;
}

let startEvent = null;
let completeEvent = null;

if (scheduleEvent.type !== 'LambdaFunctionScheduleFailed') {
startEvent = executionHistory.events.find((event) =>
(lambdaStartedEvents.includes(event.type)) &&
(event.previousEventId === scheduleEvent.id));

if (startEvent !== null && startEvent.type !== 'LambdaFunctionStartFailed') {
completeEvent = executionHistory.events.find((event) =>
(lambdaCompletedEvents.includes(event.type)) &&
(event.previousEventId === startEvent.id));
}
}

return { scheduleEvent, startEvent, completeEvent };
}

/**
* Get the output payload from the lambda, if the lambda succeeds
*
* @param {string} workflowExecutionArn - Arn of the workflow execution
* @param {string} lambdaName - name of the lambda
* @returns {Object} object containing the payload, null if error
*/
async function getLambdaOutputPayload(workflowExecutionArn, lambdaName) {
const lambdaExecution = await getLambdaExecution(workflowExecutionArn, lambdaName);

if (lambdaExecution === null) {
console.log(`Could not find lambda ${lambdaName} in execution.`);
return null;
}

if (lambdaExecution.completeEvent === null ||
lambdaExecution.completeEvent.type !== 'LambdaFunctionSucceeded') {
console.log(`Lambda ${lambdaName} was not successful.`);
return null;
}

const succeededDetails = JSON.parse(lambdaExecution.completeEvent.lambdaFunctionSucceededEventDetails.output.toString());
return succeededDetails.payload;
}

exports.getLambdaOutputPayload = getLambdaOutputPayload;

0 comments on commit 60256eb

Please sign in to comment.