From 936726a8929ede456d31c1b2d70ba3d26400b61c Mon Sep 17 00:00:00 2001 From: Oleg Zhurakousky Date: Tue, 14 Jan 2025 15:45:30 +0100 Subject: [PATCH] GH-1222 Add initial support for AWS ScheduledEvent Resolves #1222 --- .../adapter/aws/FunctionInvokerTests.java | 58 +++++++++++++++++++ spring-cloud-function-context/pom.xml | 4 ++ ...ntextFunctionCatalogAutoConfiguration.java | 3 +- 3 files changed, 64 insertions(+), 1 deletion(-) diff --git a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java index 1a855d4f1..e25489242 100644 --- a/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java +++ b/spring-cloud-function-adapters/spring-cloud-function-adapter-aws/src/test/java/org/springframework/cloud/function/adapter/aws/FunctionInvokerTests.java @@ -45,6 +45,7 @@ import com.amazonaws.services.lambda.runtime.events.KinesisEvent; import com.amazonaws.services.lambda.runtime.events.S3Event; import com.amazonaws.services.lambda.runtime.events.SNSEvent; import com.amazonaws.services.lambda.runtime.events.SQSEvent; +import com.amazonaws.services.lambda.runtime.events.ScheduledEvent; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -107,6 +108,36 @@ public class FunctionInvokerTests { + " \"timestamp\": 1712716805129\n" + " }\n" + "}"; + + String scheduleEvent = "{\n" + + " \"version\": \"0\",\n" + + " \"id\": \"17793124-05d4-b198-2fde-7ededc63b103\",\n" + + " \"detail-type\": \"Object Created\",\n" + + " \"source\": \"aws.s3\",\n" + + " \"account\": \"111122223333\",\n" + + " \"time\": \"2021-11-12T00:00:00Z\",\n" + + " \"region\": \"ca-central-1\",\n" + + " \"resources\": [\n" + + " \"arn:aws:s3:::amzn-s3-demo-bucket1\"\n" + + " ],\n" + + " \"detail\": {\n" + + " \"version\": \"0\",\n" + + " \"bucket\": {\n" + + " \"name\": \"amzn-s3-demo-bucket1\"\n" + + " },\n" + + " \"object\": {\n" + + " \"key\": \"example-key\",\n" + + " \"size\": 5,\n" + + " \"etag\": \"b1946ac92492d2347c6235b4d2611184\",\n" + + " \"version-id\": \"IYV3p45BT0ac8hjHg1houSdS1a.Mro8e\",\n" + + " \"sequencer\": \"617f08299329d189\"\n" + + " },\n" + + " \"request-id\": \"N4N7GDK58NMKJ12R\",\n" + + " \"requester\": \"123456789012\",\n" + + " \"source-ip-address\": \"1.2.3.4\",\n" + + " \"reason\": \"PutObject\"\n" + + " }\n" + + "} "; String dynamoDbEvent = "{\n" + " \"Records\": [\n" @@ -735,6 +766,20 @@ public class FunctionInvokerTests { System.clearProperty("spring.cloud.function.definition"); //this.getEnvironment().clear(); } + + @Test + public void testScheduledEvent() throws Exception { + System.setProperty("MAIN_CLASS", ScheduledEventConfiguration.class.getName()); + System.setProperty("spring.cloud.function.definition", "event"); + FunctionInvoker invoker = new FunctionInvoker(); + + InputStream targetStream = new ByteArrayInputStream(this.scheduleEvent.getBytes()); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + invoker.handleRequest(targetStream, output, null); + String result = new String(output.toByteArray(), StandardCharsets.UTF_8); + System.out.println("Result: " + result); + //assertThat(result).contains("APIGatewayCustomAuthorizerEvent(version=null, type=TOKEN"); + } @SuppressWarnings({ "rawtypes", "unchecked" }) @Test @@ -1969,4 +2014,17 @@ public class FunctionInvokerTests { return this.name; } } + + @EnableAutoConfiguration + @Configuration + public static class ScheduledEventConfiguration { + + @Bean + public Function event() { + return event -> { + System.out.println("Event: " + event); + return event; + }; + } + } } diff --git a/spring-cloud-function-context/pom.xml b/spring-cloud-function-context/pom.xml index 13fdffd37..4f4867dbf 100644 --- a/spring-cloud-function-context/pom.xml +++ b/spring-cloud-function-context/pom.xml @@ -55,6 +55,10 @@ com.fasterxml.jackson.datatype jackson-datatype-jsr310 + + com.fasterxml.jackson.datatype + jackson-datatype-joda + org.springframework.boot spring-boot-starter-test diff --git a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java index e2037f58d..110d200c6 100644 --- a/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java +++ b/spring-cloud-function-context/src/main/java/org/springframework/cloud/function/context/config/ContextFunctionCatalogAutoConfiguration.java @@ -28,6 +28,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.joda.JodaModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.google.gson.Gson; import io.cloudevents.spring.messaging.CloudEventMessageConverter; @@ -232,7 +233,7 @@ public class ContextFunctionCatalogAutoConfiguration { mapper = new ObjectMapper(); mapper.registerModule(new JavaTimeModule()); } - + mapper.registerModule(new JodaModule()); if (KotlinDetector.isKotlinPresent()) { try { if (!mapper.getRegisteredModuleIds().contains("com.fasterxml.jackson.module.kotlin.KotlinModule")) {