Skip to content

Commit cea9939

Browse files
authored
add CloudWatch Logs endpoint configuration for SDKv1 (#18)
1 parent 019653e commit cea9939

File tree

6 files changed

+137
-1
lines changed

6 files changed

+137
-1
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ make build
8989

9090
## Change Log
9191

92+
* v0.2.2: Addition of CloudWatch Logs endpoint configuration
9293
* v0.2.1: Move Java sources into separate project; mark non-Docker Java `LocalstackExtension` as deprecated; update paths for Python code lookup in Docker container
9394

9495
## License

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<groupId>cloud.localstack</groupId>
66
<artifactId>localstack-utils</artifactId>
77
<packaging>jar</packaging>
8-
<version>0.2.1</version>
8+
<version>0.2.2</version>
99
<name>localstack-utils</name>
1010

1111
<description>Java utilities for the LocalStack platform.</description>

src/main/java/cloud/localstack/Localstack.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,10 @@ public String getEndpointCloudWatch() {
169169
return endpointForService(ServiceName.CLOUDWATCH);
170170
}
171171

172+
public String getEndpointCloudWatchLogs() {
173+
return endpointForService(ServiceName.CLOUDWATCH_LOGS);
174+
}
175+
172176
public String getEndpointSES() {
173177
return endpointForService(ServiceName.SES);
174178
}

src/main/java/cloud/localstack/ServiceName.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class ServiceName {
1717
public static final String ROUTE53 = "route53";
1818
public static final String CLOUDFORMATION = "cloudformation";
1919
public static final String CLOUDWATCH = "cloudwatch";
20+
public static final String CLOUDWATCH_LOGS = "logs";
2021
public static final String SSM = "ssm";
2122
public static final String SECRETSMANAGER = "secretsmanager";
2223
public static final String STEPFUNCTIONS = "stepfunctions";

src/main/java/cloud/localstack/awssdkv1/TestUtils.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import com.amazonaws.services.lambda.AWSLambdaAsync;
2323
import com.amazonaws.services.lambda.AWSLambdaAsyncClientBuilder;
2424
import com.amazonaws.services.lambda.AWSLambdaClientBuilder;
25+
import com.amazonaws.services.logs.AWSLogs;
26+
import com.amazonaws.services.logs.AWSLogsClientBuilder;
2527
import com.amazonaws.services.s3.AmazonS3;
2628
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
2729
import com.amazonaws.services.sns.AmazonSNS;
@@ -156,6 +158,12 @@ public static AmazonCloudWatch getClientCloudWatch() {
156158
withEndpointConfiguration(getEndpointConfigurationCloudWatch()).
157159
withCredentials(getCredentialsProvider()).build();
158160
}
161+
162+
public static AWSLogs getClientCloudWatchLogs() {
163+
return AWSLogsClientBuilder.standard().
164+
withEndpointConfiguration(getEndpointConfigurationCloudWatchLogs()).
165+
withCredentials(getCredentialsProvider()).build();
166+
}
159167

160168
public static AmazonIdentityManagement getClientIAM() {
161169
return AmazonIdentityManagementClientBuilder.standard().
@@ -198,6 +206,10 @@ protected static AwsClientBuilder.EndpointConfiguration getEndpointConfiguration
198206
protected static AwsClientBuilder.EndpointConfiguration getEndpointConfigurationCloudWatch() {
199207
return getEndpointConfiguration(Localstack.INSTANCE.getEndpointCloudWatch());
200208
}
209+
210+
private static AwsClientBuilder.EndpointConfiguration getEndpointConfigurationCloudWatchLogs() {
211+
return getEndpointConfiguration(Localstack.INSTANCE.getEndpointCloudWatchLogs());
212+
}
201213

202214
protected static AwsClientBuilder.EndpointConfiguration getEndpointConfigurationSecretsManager() {
203215
return getEndpointConfiguration(Localstack.INSTANCE.getEndpointSecretsmanager());
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package cloud.localstack;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.UUID;
6+
import java.util.stream.Collectors;
7+
8+
import org.junit.jupiter.api.Assertions;
9+
import org.junit.jupiter.api.extension.ExtendWith;
10+
import org.junit.runner.RunWith;
11+
12+
import com.amazonaws.services.logs.AWSLogs;
13+
import com.amazonaws.services.logs.model.CreateLogGroupRequest;
14+
import com.amazonaws.services.logs.model.CreateLogStreamRequest;
15+
import com.amazonaws.services.logs.model.DescribeLogGroupsResult;
16+
import com.amazonaws.services.logs.model.GetLogEventsRequest;
17+
import com.amazonaws.services.logs.model.GetLogEventsResult;
18+
import com.amazonaws.services.logs.model.InputLogEvent;
19+
import com.amazonaws.services.logs.model.LogGroup;
20+
import com.amazonaws.services.logs.model.OutputLogEvent;
21+
import com.amazonaws.services.logs.model.PutLogEventsRequest;
22+
23+
import cloud.localstack.awssdkv1.TestUtils;
24+
import cloud.localstack.docker.LocalstackDockerExtension;
25+
import cloud.localstack.docker.annotation.LocalstackDockerProperties;
26+
27+
/**
28+
* Test service usage of CloudWatchLogs with example connection, creation of log group stream
29+
* and manual publication of sample events and their basic retrieval
30+
*
31+
* Issue: https://github.com/localstack/localstack-java-utils/issues/11
32+
*
33+
* @author Andrew Duffy
34+
*
35+
*/
36+
@RunWith(LocalstackTestRunner.class)
37+
@ExtendWith(LocalstackDockerExtension.class)
38+
@LocalstackDockerProperties(services = {"logs"}, ignoreDockerRunErrors=true)
39+
class CloudWatchLogsTest {
40+
41+
@org.junit.Test
42+
@org.junit.jupiter.api.Test
43+
void testLogGroupSetupAndPublish() {
44+
AWSLogs cloudWatchLogs = TestUtils.getClientCloudWatchLogs();
45+
DescribeLogGroupsResult groups = cloudWatchLogs.describeLogGroups();
46+
Assertions.assertTrue(groups.getLogGroups().isEmpty());
47+
48+
String logGroupName = createLogGroup();
49+
50+
DescribeLogGroupsResult groupsAfterCreation = cloudWatchLogs.describeLogGroups();
51+
Assertions.assertFalse(groupsAfterCreation.getLogGroups().isEmpty());
52+
Assertions.assertEquals(1, groupsAfterCreation.getLogGroups().size());
53+
54+
LogGroup newGroup = groupsAfterCreation.getLogGroups().get(0);
55+
Assertions.assertEquals(logGroupName, newGroup.getLogGroupName());
56+
Assertions.assertNotNull(newGroup.getArn());
57+
Assertions.assertEquals(0, newGroup.getStoredBytes());
58+
59+
String logStream = createLogStream(logGroupName);
60+
61+
List<InputLogEvent> events = publishLogEvents(logGroupName, logStream);
62+
63+
GetLogEventsResult publishedEvents = fetchEvents(logGroupName, logStream);
64+
Assertions.assertEquals(events.size(), publishedEvents.getEvents().size());
65+
66+
List<String> messagesSent = events.stream().map(InputLogEvent::getMessage).collect(Collectors.toList());
67+
for (OutputLogEvent publishedOutputEvent: publishedEvents.getEvents()) {
68+
Assertions.assertTrue(messagesSent.contains(publishedOutputEvent.getMessage()));
69+
}
70+
}
71+
72+
public String createLogGroup() {
73+
CreateLogGroupRequest createLogGroupRequest = new CreateLogGroupRequest();
74+
createLogGroupRequest.setLogGroupName("testLogGroupName-" + UUID.randomUUID().toString());
75+
76+
TestUtils.getClientCloudWatchLogs().createLogGroup(createLogGroupRequest);
77+
return createLogGroupRequest.getLogGroupName();
78+
}
79+
80+
public String createLogStream(String newGroup) {
81+
CreateLogStreamRequest newStreamRequest = new CreateLogStreamRequest();
82+
newStreamRequest.setLogGroupName(newGroup);
83+
newStreamRequest.setLogStreamName("stream-" + UUID.randomUUID().toString());
84+
85+
TestUtils.getClientCloudWatchLogs().createLogStream(newStreamRequest);
86+
return newStreamRequest.getLogStreamName();
87+
}
88+
89+
public List<InputLogEvent> publishLogEvents(String groupName, String logStream) {
90+
InputLogEvent event1 = new InputLogEvent();
91+
event1.setMessage("Event1-" + UUID.randomUUID().toString());
92+
event1.setTimestamp(System.currentTimeMillis());
93+
94+
InputLogEvent event2 = new InputLogEvent();
95+
event2.setMessage("Event2-" + UUID.randomUUID().toString());
96+
event2.setTimestamp(System.currentTimeMillis());
97+
List<InputLogEvent> events = new ArrayList<>();
98+
events.add(event1);
99+
events.add(event2);
100+
101+
PutLogEventsRequest putLogEventsRequest = new PutLogEventsRequest();
102+
putLogEventsRequest.setLogGroupName(groupName);
103+
putLogEventsRequest.setLogStreamName(logStream);
104+
putLogEventsRequest.setLogEvents(events);
105+
106+
TestUtils.getClientCloudWatchLogs().putLogEvents(putLogEventsRequest);
107+
return events;
108+
}
109+
110+
public GetLogEventsResult fetchEvents(String groupName, String logStream) {
111+
GetLogEventsRequest getLogEventsRequest = new GetLogEventsRequest();
112+
getLogEventsRequest.setLogStreamName(logStream);
113+
getLogEventsRequest.setLogGroupName(groupName);
114+
115+
return TestUtils.getClientCloudWatchLogs().getLogEvents(getLogEventsRequest);
116+
}
117+
118+
}

0 commit comments

Comments
 (0)