@Test public void testInvokeLambdaFunctionAsynchronous() throws Exception { InvokeConfig invokeConfig = new InvokeConfig("function", "{\"key1\": \"value1\"}", false, null); when(awsLambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(new InvokeResult()); String result = lambdaInvokeService.invokeLambdaFunction(invokeConfig); verify(awsLambdaClient, times(1)).invoke(invokeRequestArg.capture()); InvokeRequest invokeRequest = invokeRequestArg.getValue(); assertEquals("function", invokeRequest.getFunctionName()); assertEquals("{\"key1\": \"value1\"}", new String(invokeRequest.getPayload().array(), Charset.forName("UTF-8"))); assertEquals(InvocationType.Event.toString(), invokeRequest.getInvocationType()); verify(jenkinsLogger).log(eq("Lambda invoke request:%n%s%nPayload:%n%s%n"), anyVararg()); verify(jenkinsLogger).log(eq("Lambda invoke response:%n%s%nPayload:%n%s%n"), anyVararg()); assertEquals("", result); }
public String translate(final String testPhrase, final String language) { final Map<String, Slot> slots = new HashMap<>(); slots.put("termA", Slot.builder().withName("termA").withValue(testPhrase).build()); slots.put("termB", Slot.builder().withName("termB").build()); slots.put("language", Slot.builder().withName("language").withValue(language).build()); final SpeechletRequestEnvelope envelope = givenIntentSpeechletRequestEnvelope("Translate", slots); final ObjectMapper mapper = new ObjectMapper(); String response = null; try { final AWSLambdaClient awsLambda = new AWSLambdaClient(); final InvokeRequest invokeRequest = new InvokeRequest() .withInvocationType(InvocationType.RequestResponse) .withFunctionName(lambdaName) .withPayload(mapper.writeValueAsString(envelope)); final InvokeResult invokeResult = awsLambda.invoke(invokeRequest); response = new String(invokeResult.getPayload().array()); } catch (JsonProcessingException e) { log.error(e.getMessage()); } return response; }
@Test public void testInvokeLambdaFunctionAsynchronousError() throws Exception { InvokeConfig invokeConfig = new InvokeConfig("function", "{\"key1\": \"value1\"}", false, null); when(awsLambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(new InvokeResult().withFunctionError("Handled")); try { lambdaInvokeService.invokeLambdaFunction(invokeConfig); fail("Should fail with LambdaInvokeException"); } catch (LambdaInvokeException lie){ assertEquals("Function returned error of type: Handled", lie.getMessage()); } verify(awsLambdaClient, times(1)).invoke(invokeRequestArg.capture()); InvokeRequest invokeRequest = invokeRequestArg.getValue(); assertEquals("function", invokeRequest.getFunctionName()); assertEquals("{\"key1\": \"value1\"}", new String(invokeRequest.getPayload().array(), Charset.forName("UTF-8"))); assertEquals(InvocationType.Event.toString(), invokeRequest.getInvocationType()); verify(jenkinsLogger).log(eq("Lambda invoke request:%n%s%nPayload:%n%s%n"), anyVararg()); verify(jenkinsLogger).log(eq("Lambda invoke response:%n%s%nPayload:%n%s%n"), anyVararg()); }
@Test public void testLambdaInvokeSubsegmentContainsFunctionName() { // Setup test AWSLambda lambda = AWSLambdaClientBuilder.standard().withRequestHandlers(new TracingHandler()).withRegion(Regions.US_EAST_1).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials("fake", "fake"))).build(); AmazonHttpClient amazonHttpClient = new AmazonHttpClient(new ClientConfiguration()); ConnectionManagerAwareHttpClient apacheHttpClient = Mockito.mock(ConnectionManagerAwareHttpClient.class); HttpResponse httpResponse = new BasicHttpResponse(new BasicStatusLine(HttpVersion.HTTP_1_1, 200, "OK")); BasicHttpEntity responseBody = new BasicHttpEntity(); responseBody.setContent(new ByteArrayInputStream("null".getBytes(StandardCharsets.UTF_8))); // Lambda returns "null" on successful fn. with no return value httpResponse.setEntity(responseBody); try { Mockito.doReturn(httpResponse).when(apacheHttpClient).execute(Mockito.any(HttpUriRequest.class), Mockito.any(HttpContext.class)); } catch (IOException e) { } Whitebox.setInternalState(amazonHttpClient, "httpClient", apacheHttpClient); Whitebox.setInternalState(lambda, "client", amazonHttpClient); // Test logic Segment segment = AWSXRay.beginSegment("test"); InvokeRequest request = new InvokeRequest(); request.setFunctionName("testFunctionName"); InvokeResult r = lambda.invoke(request); System.out.println(r.getStatusCode()); System.out.println(r); Assert.assertEquals(1, segment.getSubsegments().size()); Assert.assertEquals("Invoke", segment.getSubsegments().get(0).getAws().get("operation")); System.out.println(segment.getSubsegments().get(0).getAws()); Assert.assertEquals("testFunctionName", segment.getSubsegments().get(0).getAws().get("function_name")); }
public Optional<AlexaResponse> fire(AlexaRequest request, String payload) { final InvocationType invocationType = request.expectsResponse() ? InvocationType.RequestResponse : InvocationType.Event; final InvokeRequest invokeRequest = new InvokeRequest() .withInvocationType(invocationType) .withFunctionName(lambdaFunctionName) .withPayload(payload); log.info(String.format("->[INFO] Invoke lambda function '%s'.", lambdaFunctionName)); log.debug(String.format("->[INFO] with request payload '%s'.", payload)); final InvokeResult invokeResult = lambdaClient.invoke(invokeRequest); return invocationType.equals(InvocationType.RequestResponse) ? Optional.of(new AlexaResponse(request, payload, new String(invokeResult.getPayload().array()))) : Optional.empty(); }
/** * Forces the lambda to run and sync the IPs for CloudFront to be white listed on the origin elb */ private void forceLambdaToUpdateSgs(String arn) { String json; try { json = IOUtils.toString(this.getClass().getClassLoader().getResourceAsStream("aws-ip-space-change-sns-sample-event.json")); } catch (IOException e) { String msg = "Failed to load mock sns message, to force Lambda first run"; logger.error(msg, e); throw new RuntimeException(msg, e); } // this will fail InvokeResult result = awsLambda.invoke(new InvokeRequest().withFunctionName(arn).withPayload(String.format(json, BAD_HASH)).withLogType(LogType.Tail)); // collect the error so we can parse it for the latest hash String log = new String(Base64.getDecoder().decode(result.getLogResult()), Charset.forName("UTF-8")); Pattern pattern = Pattern.compile("MD5 Mismatch: got\\s(.*?)\\sexp.*?"); Matcher matcher = pattern.matcher(log); boolean matched = matcher.find(); if (! matched) { throw new RuntimeException("failed to extract hash from: " + log); } String realHash = matcher.group(1); result = awsLambda.invoke(new InvokeRequest().withFunctionName(arn).withPayload(String.format(json, realHash)).withLogType(LogType.Tail)); logger.info("Forcing the Lambda to run and update Security Groups"); logger.info(new String(result.getPayload().array(), Charset.forName("UTF-8"))); }
/** * Synchronously or asynchronously invokes an AWS Lambda function. * If synchronously invoked, the AWS Lambda log is collected and the response payload is returned * @param invokeConfig AWS Lambda invocation configuration * @return response payload */ public String invokeLambdaFunction(InvokeConfig invokeConfig) throws LambdaInvokeException { InvokeRequest invokeRequest = new InvokeRequest() .withFunctionName(invokeConfig.getFunctionName()) .withPayload(invokeConfig.getPayload()); if(invokeConfig.isSynchronous()){ invokeRequest .withInvocationType(InvocationType.RequestResponse) .withLogType(LogType.Tail); } else { invokeRequest .withInvocationType(InvocationType.Event); } logger.log("Lambda invoke request:%n%s%nPayload:%n%s%n", invokeRequest.toString(), invokeConfig.getPayload()); InvokeResult invokeResult = client.invoke(invokeRequest); String payload = ""; if(invokeResult.getPayload() != null){ payload = new String(invokeResult.getPayload().array(), Charset.forName("UTF-8")); } logger.log("Lambda invoke response:%n%s%nPayload:%n%s%n", invokeResult.toString(), payload); if(invokeResult.getLogResult() != null){ logger.log("Log:%n%s%n", new String(Base64.decode(invokeResult.getLogResult()), Charset.forName("UTF-8"))); } if(StringUtils.isNotEmpty(invokeResult.getFunctionError())){ throw new LambdaInvokeException("Function returned error of type: " + invokeResult.getFunctionError()); } return payload; }
@Test public void testPerform() throws IOException, ExecutionException, InterruptedException { List<JsonParameterVariables> jsonParameterVariables = new ArrayList<>(); jsonParameterVariables.add(new JsonParameterVariables("KEY", "$.key2")); LambdaInvokeVariables clone = new LambdaInvokeVariables(false, "accessKeyId", Secret.fromString("secretKey"), "eu-west-1", "function", "payload", true, true, jsonParameterVariables); LambdaInvokeVariables spy = Mockito.spy(clone); when(original.getClone()).thenReturn(spy); when(spy.getLambdaClientConfig()).thenReturn(clientConfig); when(clientConfig.getClient()).thenReturn(lambdaClient); final String logBase64 = "bGFtYmRh"; final String responsePayload = "{\"key2\": \"value2\"}"; InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())); when(lambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new LambdaInvokePublisher(Arrays.asList(original, original))); FreeStyleBuild build = p.scheduleBuild2(0).get(); EnvVars environment = build.getEnvironment(new LogTaskListener(LOGGER, Level.INFO)); assertEquals("value2", environment.get("KEY")); assertEquals(Result.SUCCESS, build.getResult()); }
@Test public void testPerformInstanceRole() throws IOException, ExecutionException, InterruptedException { List<JsonParameterVariables> jsonParameterVariables = new ArrayList<>(); jsonParameterVariables.add(new JsonParameterVariables("KEY", "$.key2")); LambdaInvokeVariables clone = new LambdaInvokeVariables(true, "accessKeyId", Secret.fromString("secretKey"), "eu-west-1", "function", "payload", true, true, jsonParameterVariables); LambdaInvokeVariables spy = Mockito.spy(clone); when(original.getClone()).thenReturn(spy); when(spy.getLambdaClientConfig()).thenReturn(clientConfig); when(clientConfig.getClient()).thenReturn(lambdaClient); final String logBase64 = "bGFtYmRh"; final String responsePayload = "{\"key2\": \"value2\"}"; InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())); when(lambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new LambdaInvokePublisher(Arrays.asList(original, original))); FreeStyleBuild build = p.scheduleBuild2(0).get(); EnvVars environment = build.getEnvironment(new LogTaskListener(LOGGER, Level.INFO)); assertEquals("value2", environment.get("KEY")); assertEquals(Result.SUCCESS, build.getResult()); }
@Test public void testPerform() throws IOException, ExecutionException, InterruptedException { List<JsonParameterVariables> jsonParameterVariables = new ArrayList<JsonParameterVariables>(); jsonParameterVariables.add(new JsonParameterVariables("KEY", "$.key2")); LambdaInvokeBuildStepVariables clone = new LambdaInvokeBuildStepVariables(false, "accessKeyId", Secret.fromString("secretKey"), "eu-west-1", "function", "payload", true, jsonParameterVariables); LambdaInvokeBuildStepVariables spy = Mockito.spy(clone); when(original.getClone()).thenReturn(spy); when(spy.getLambdaClientConfig()).thenReturn(clientConfig); when(clientConfig.getClient()).thenReturn(lambdaClient); final String logBase64 = "bGFtYmRh"; final String responsePayload = "{\"key2\": \"value2\"}"; InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())); when(lambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new LambdaInvokeBuildStep(original)); FreeStyleBuild build = p.scheduleBuild2(0).get(); EnvVars environment = build.getEnvironment(new LogTaskListener(LOGGER, Level.INFO)); assertEquals("value2", environment.get("KEY")); assertEquals(Result.SUCCESS, build.getResult()); }
@Test public void testPerformFailure() throws IOException, ExecutionException, InterruptedException { List<JsonParameterVariables> jsonParameterVariables = new ArrayList<JsonParameterVariables>(); jsonParameterVariables.add(new JsonParameterVariables("KEY", "$.key2")); LambdaInvokeBuildStepVariables clone = new LambdaInvokeBuildStepVariables(false, "accessKeyId", Secret.fromString("secretKey"), "eu-west-1", "function", "payload", true, jsonParameterVariables); LambdaInvokeBuildStepVariables spy = Mockito.spy(clone); when(original.getClone()).thenReturn(spy); when(spy.getLambdaClientConfig()).thenReturn(clientConfig); when(clientConfig.getClient()).thenReturn(lambdaClient); final String logBase64 = "bGFtYmRh"; final String responsePayload = "{\"errorMessage\":\"event_fail\"}"; InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())) .withFunctionError("Unhandled"); when(lambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); FreeStyleProject p = j.createFreeStyleProject(); p.getBuildersList().add(new LambdaInvokeBuildStep(original)); FreeStyleBuild build = p.scheduleBuild2(0).get(); EnvVars environment = build.getEnvironment(new LogTaskListener(LOGGER, Level.INFO)); assertEquals(null, environment.get("KEY")); assertEquals(Result.FAILURE, build.getResult()); }
@Test public void testInvokeLambdaFunctionSynchronous() throws Exception { final String logBase64 = "bGFtYmRh"; final String log = "lambda"; final String requestPayload = "{\"key1\": \"value1\"}"; final String responsePayload = "{\"key2\": \"value2\"}"; InvokeConfig invokeConfig = new InvokeConfig("function", requestPayload, true, null); InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())); when(awsLambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); String result = lambdaInvokeService.invokeLambdaFunction(invokeConfig); verify(awsLambdaClient, times(1)).invoke(invokeRequestArg.capture()); InvokeRequest invokeRequest = invokeRequestArg.getValue(); assertEquals("function", invokeRequest.getFunctionName()); assertEquals(LogType.Tail.toString(), invokeRequest.getLogType()); assertEquals(requestPayload, new String(invokeRequest.getPayload().array(), Charset.forName("UTF-8"))); assertEquals(InvocationType.RequestResponse.toString(), invokeRequest.getInvocationType()); ArgumentCaptor<String> stringArgs = ArgumentCaptor.forClass(String.class); verify(jenkinsLogger).log(eq("Lambda invoke request:%n%s%nPayload:%n%s%n"), stringArgs.capture()); List<String> stringArgValues = stringArgs.getAllValues(); assertEquals(Arrays.asList(invokeRequest.toString(), requestPayload), stringArgValues); verify(jenkinsLogger).log(eq("Log:%n%s%n"), eq(log)); stringArgs = ArgumentCaptor.forClass(String.class); verify(jenkinsLogger).log(eq("Lambda invoke response:%n%s%nPayload:%n%s%n"), stringArgs.capture()); stringArgValues = stringArgs.getAllValues(); assertEquals(Arrays.asList(invokeResult.toString(), responsePayload), stringArgValues); assertEquals(responsePayload, result); }
@Test public void testPerformFailure() throws IOException, ExecutionException, InterruptedException { List<JsonParameterVariables> jsonParameterVariables = new ArrayList<>(); jsonParameterVariables.add(new JsonParameterVariables("KEY", "$.key2")); LambdaInvokeVariables clone = new LambdaInvokeVariables(false, "accessKeyId", Secret.fromString("secretKey"), "eu-west-1", "function", "payload", true, true, jsonParameterVariables); LambdaInvokeVariables spy = Mockito.spy(clone); when(original.getClone()).thenReturn(spy); when(spy.getLambdaClientConfig()).thenReturn(clientConfig); when(clientConfig.getClient()).thenReturn(lambdaClient); final String logBase64 = "bGFtYmRh"; final String responsePayload = "{\"key2\": \"value2\"}"; InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())); when(lambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); LambdaInvokeVariables spy2 = Mockito.spy(clone); when(original2.getClone()).thenReturn(spy2); when(spy2.getLambdaClientConfig()).thenReturn(clientConfig2); when(clientConfig2.getClient()).thenReturn(lambdaClient2); final String responsePayload2 = "{\"errorMessage\":\"event_fail\"}"; InvokeResult invokeResult2 = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload2.getBytes())) .withFunctionError("Unhandled"); when(lambdaClient2.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult2); FreeStyleProject p = j.createFreeStyleProject(); p.getPublishersList().add(new LambdaInvokePublisher(Arrays.asList(original, original2))); FreeStyleBuild build = p.scheduleBuild2(0).get(); EnvVars environment = build.getEnvironment(new LogTaskListener(LOGGER, Level.INFO)); assertEquals("value2", environment.get("KEY")); assertEquals(Result.FAILURE, build.getResult()); }
@Test public void testInvokeLambdaFunctionSynchronousError() throws Exception { final String logBase64 = "bGFtYmRh"; final String log = "lambda"; final String requestPayload = "{\"key1\": \"value1\"}"; final String responsePayload = "{\"errorMessage\":\"event_fail\"}"; InvokeConfig invokeConfig = new InvokeConfig("function", requestPayload, true, null); InvokeResult invokeResult = new InvokeResult() .withLogResult(logBase64) .withPayload(ByteBuffer.wrap(responsePayload.getBytes())) .withFunctionError("Unhandled"); when(awsLambdaClient.invoke(any(InvokeRequest.class))) .thenReturn(invokeResult); try { lambdaInvokeService.invokeLambdaFunction(invokeConfig); fail("Should fail with LambdaInvokeException"); } catch (LambdaInvokeException lie){ assertEquals("Function returned error of type: Unhandled", lie.getMessage()); } verify(awsLambdaClient, times(1)).invoke(invokeRequestArg.capture()); InvokeRequest invokeRequest = invokeRequestArg.getValue(); assertEquals("function", invokeRequest.getFunctionName()); assertEquals(LogType.Tail.toString(), invokeRequest.getLogType()); assertEquals(requestPayload, new String(invokeRequest.getPayload().array(), Charset.forName("UTF-8"))); assertEquals(InvocationType.RequestResponse.toString(), invokeRequest.getInvocationType()); ArgumentCaptor<String> stringArgs = ArgumentCaptor.forClass(String.class); verify(jenkinsLogger).log(eq("Lambda invoke request:%n%s%nPayload:%n%s%n"), stringArgs.capture()); List<String> stringArgValues = stringArgs.getAllValues(); assertEquals(Arrays.asList(invokeRequest.toString(), requestPayload), stringArgValues); verify(jenkinsLogger).log(eq("Log:%n%s%n"), eq(log)); stringArgs = ArgumentCaptor.forClass(String.class); verify(jenkinsLogger).log(eq("Lambda invoke response:%n%s%nPayload:%n%s%n"), stringArgs.capture()); stringArgValues = stringArgs.getAllValues(); assertEquals(Arrays.asList(invokeResult.toString(), responsePayload), stringArgValues); }
/** * Executes a lambda function and returns the result of the execution. */ @Override public cfData execute( cfSession _session, cfArgStructData argStruct ) throws cfmRunTimeException { AmazonKey amazonKey = getAmazonKey( _session, argStruct ); // Arguments to extract String payload = getNamedStringParam( argStruct, "payload", null ); String functionName = getNamedStringParam( argStruct, "function", null ); String qualifier = getNamedStringParam( argStruct, "qualifier", null ); try { // Construct the Lambda Client InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.setInvocationType( InvocationType.RequestResponse ); invokeRequest.setLogType( LogType.Tail ); invokeRequest.setFunctionName( functionName ); invokeRequest.setPayload( payload ); if ( qualifier != null ) { invokeRequest.setQualifier( qualifier ); } // Lambda client must be created with credentials BasicAWSCredentials awsCreds = new BasicAWSCredentials( amazonKey.getKey(), amazonKey.getSecret() ); AWSLambda awsLambda = AWSLambdaClientBuilder.standard() .withRegion( amazonKey.getAmazonRegion().toAWSRegion().getName() ) .withCredentials( new AWSStaticCredentialsProvider( awsCreds ) ).build(); // Execute and process the results InvokeResult result = awsLambda.invoke( invokeRequest ); // Convert the returned result ByteBuffer resultPayload = result.getPayload(); String resultJson = new String( resultPayload.array(), "UTF-8" ); Map<String, Object> resultMap = Jackson.fromJsonString( resultJson, Map.class ); return tagUtils.convertToCfData( resultMap ); } catch ( Exception e ) { throwException( _session, "AmazonLambdaExecute: " + e.getMessage() ); return cfBooleanData.FALSE; } }