From 280b9255148130f6d9eff3bb7d949198ebf70baf Mon Sep 17 00:00:00 2001 From: Dan Torrey Date: Thu, 13 Jun 2019 07:30:00 -0500 Subject: [PATCH] Resolves #50: Add Available Services API call --- .../aws/resources/AWSResource.java | 18 +++++++ .../responses/AvailableAWSService.java | 41 +++++++++++++++ .../AvailableAWSServiceSummmary.java | 28 +++++++++++ .../integrations/aws/service/AWSService.java | 50 +++++++++++++++++++ 4 files changed, 137 insertions(+) create mode 100644 src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSService.java create mode 100644 src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSServiceSummmary.java diff --git a/src/main/java/org/graylog/integrations/aws/resources/AWSResource.java b/src/main/java/org/graylog/integrations/aws/resources/AWSResource.java index 21b7103b4..9b9b4e59a 100644 --- a/src/main/java/org/graylog/integrations/aws/resources/AWSResource.java +++ b/src/main/java/org/graylog/integrations/aws/resources/AWSResource.java @@ -8,6 +8,7 @@ import org.graylog.integrations.aws.CloudWatchService; import org.graylog.integrations.aws.KinesisService; import org.graylog.integrations.aws.resources.requests.KinesisHealthCheckRequest; +import org.graylog.integrations.aws.resources.responses.AvailableAWSServiceSummmary; import org.graylog.integrations.aws.resources.responses.KinesisHealthCheckResponse; import org.graylog.integrations.aws.resources.responses.RegionResponse; import org.graylog.integrations.aws.service.AWSService; @@ -58,6 +59,23 @@ public List getAwsRegions() { return awsService.getAvailableRegions(); } + /** + * Performs an AWS HealthCheck + * + * Sample CURL command for executing this method. Use this to model the UI request. + * Note the --data-binary param that includes the put body JSON with region and AWS credentials. + * + * curl http://someuser:somepass@localhost:9000/api/plugins/org.graylog.integrations/aws/availableServices + */ + @GET + @Timed + @Path("/availableServices") + @ApiOperation(value = "Get all available AWS services") + public AvailableAWSServiceSummmary getAvailableServices() { + + return awsService.getAvailableServices(); + } + // GET CloudWatch log group names @GET @Timed diff --git a/src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSService.java b/src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSService.java new file mode 100644 index 000000000..597401fbd --- /dev/null +++ b/src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSService.java @@ -0,0 +1,41 @@ +package org.graylog.integrations.aws.resources.responses; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.auto.value.AutoValue; +import org.graylog.autovalue.WithBeanGetter; + +@JsonAutoDetect +@AutoValue +@WithBeanGetter +public abstract class AvailableAWSService { + + private static final String NAME = "name"; + private static final String DESCRIPTION = "description"; + private static final String POLICY = "policy"; + private static final String HELPER_TEXT = "helper_text"; + private static final String LEARN_MORE_LINK = "learn_more_link"; + + @JsonProperty(NAME) + public abstract String name(); + + @JsonProperty(DESCRIPTION) + public abstract String description(); + + @JsonProperty(POLICY) + public abstract String policy(); + + @JsonProperty(HELPER_TEXT) + public abstract String helperText(); + + @JsonProperty(LEARN_MORE_LINK) + public abstract String LearnMoreLink(); + + public static AvailableAWSService create(@JsonProperty(NAME) String name, + @JsonProperty(DESCRIPTION) String description, + @JsonProperty(POLICY) String policy, + @JsonProperty(HELPER_TEXT) String helperText, + @JsonProperty(LEARN_MORE_LINK) String LearnMoreLink) { + return new AutoValue_AvailableAWSService(name, description, policy, helperText, LearnMoreLink); + } +} \ No newline at end of file diff --git a/src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSServiceSummmary.java b/src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSServiceSummmary.java new file mode 100644 index 000000000..3bdbc23a3 --- /dev/null +++ b/src/main/java/org/graylog/integrations/aws/resources/responses/AvailableAWSServiceSummmary.java @@ -0,0 +1,28 @@ +package org.graylog.integrations.aws.resources.responses; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.auto.value.AutoValue; +import org.graylog.autovalue.WithBeanGetter; + +import java.util.List; + +@JsonAutoDetect +@AutoValue +@WithBeanGetter +public abstract class AvailableAWSServiceSummmary { + + private static final String SERVICES = "services"; + private static final String TOTAL = "total"; + + @JsonProperty(SERVICES) + public abstract List services(); + + @JsonProperty(TOTAL) + public abstract long total(); + + public static AvailableAWSServiceSummmary create(@JsonProperty(SERVICES) List services, + @JsonProperty(TOTAL) long total) { + return new AutoValue_AvailableAWSServiceSummmary(services, total); + } +} \ No newline at end of file diff --git a/src/main/java/org/graylog/integrations/aws/service/AWSService.java b/src/main/java/org/graylog/integrations/aws/service/AWSService.java index fea66a136..ac5b98751 100644 --- a/src/main/java/org/graylog/integrations/aws/service/AWSService.java +++ b/src/main/java/org/graylog/integrations/aws/service/AWSService.java @@ -1,11 +1,14 @@ package org.graylog.integrations.aws.service; +import org.graylog.integrations.aws.resources.responses.AvailableAWSService; +import org.graylog.integrations.aws.resources.responses.AvailableAWSServiceSummmary; import org.graylog.integrations.aws.resources.responses.RegionResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.regions.RegionMetadata; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -34,6 +37,53 @@ public List getAvailableRegions() { }).collect(Collectors.toList()); } + /** + * @return A list of available AWS services supported by the AWS Graylog AWS integration. + */ + public AvailableAWSServiceSummmary getAvailableServices() { + + ArrayList services = new ArrayList<>(); + AvailableAWSService cloudWatchService = + AvailableAWSService.create("CloudWatch", + "Retrieve CloudWatch logs via Kinesis. Kinesis allows streaming of the logs" + + "in real time. Amazon CloudWatch is a monitoring and management service built" + + "for developers, system operators, site reliability engineers (SRE), " + + "and IT managers.", + "{\n" + + " \"Version\": \"2012-10-17\",\n" + + " \"Statement\": [\n" + + " {\n" + + " \"Sid\": \"VisualEditor0\",\n" + + " \"Effect\": \"Allow\",\n" + + " \"Action\": [\n" + + " \"cloudwatch:PutMetricData\",\n" + + " \"dynamodb:CreateTable\",\n" + + " \"dynamodb:DescribeTable\",\n" + + " \"dynamodb:GetItem\",\n" + + " \"dynamodb:PutItem\",\n" + + " \"dynamodb:Scan\",\n" + + " \"dynamodb:UpdateItem\",\n" + + " \"ec2:DescribeInstances\",\n" + + " \"ec2:DescribeNetworkInterfaceAttribute\",\n" + + " \"ec2:DescribeNetworkInterfaces\",\n" + + " \"elasticloadbalancing:DescribeLoadBalancerAttributes\",\n" + + " \"elasticloadbalancing:DescribeLoadBalancers\",\n" + + " \"kinesis:GetRecords\",\n" + + " \"kinesis:GetShardIterator\",\n" + + " \"kinesis:ListShards\"\n" + + " ],\n" + + " \"Resource\": \"*\"\n" + + " }\n" + + " ]\n" + + "}", + "Requires Kinesis", + "https://aws.amazon.com/cloudwatch/" + ); + services.add(cloudWatchService); + + return AvailableAWSServiceSummmary.create(services, services.size()); + } + //TODO Add getAWSServices List //List that contains all the supported AWS services (i.e. Cloudwatch, Kinesis)