Skip to content

Commit

Permalink
More updates
Browse files Browse the repository at this point in the history
  • Loading branch information
timyates committed Mar 30, 2022
1 parent 8089f30 commit dca8a6c
Show file tree
Hide file tree
Showing 17 changed files with 130 additions and 66 deletions.
4 changes: 4 additions & 0 deletions aws-alexa-httpserver/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ plugins {

dependencies {
annotationProcessor libs.micronaut.validation
annotationProcessor libs.micronaut.serde.processor

implementation libs.micronaut.validation
implementation libs.spotbugs.annotations

implementation libs.micronaut.serde
implementation libs.micronaut.serde.jackson

api project(":aws-alexa")

implementation libs.micronaut.http.server
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,32 @@
*/
package io.micronaut.aws.alexa.httpserver.conf;

import com.amazon.ask.model.Application;
import com.amazon.ask.model.Context;
import com.amazon.ask.model.LaunchRequest;
import com.amazon.ask.model.RequestEnvelope;
import com.amazon.ask.model.ResponseEnvelope;
import com.amazon.ask.model.Session;
import com.amazon.ask.model.User;
import com.amazon.ask.model.interfaces.system.SystemState;
import edu.umd.cs.findbugs.annotations.Nullable;
import io.micronaut.core.util.Toggleable;
import io.micronaut.serde.annotation.SerdeImport;

/**
* Defines configuration for the Alexa controller.
*
* @author sdelamo
* @since 2.0.0
*/
@SerdeImport(RequestEnvelope.class)
@SerdeImport(ResponseEnvelope.class)
@SerdeImport(Session.class)
@SerdeImport(User.class)
@SerdeImport(Application.class)
@SerdeImport(Context.class)
@SerdeImport(SystemState.class)
@SerdeImport(LaunchRequest.class)
public interface AlexaControllerConfiguration extends Toggleable {

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import com.amazon.ask.model.RequestEnvelope;
import com.amazon.ask.model.ResponseEnvelope;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micronaut.aws.alexa.httpserver.AskHttpServerConstants;
import io.micronaut.aws.alexa.httpserver.conf.AlexaControllerConfigurationProperties;
import io.micronaut.aws.alexa.httpserver.services.RequestEnvelopeService;
Expand All @@ -29,6 +28,7 @@
import io.micronaut.http.annotation.Body;
import io.micronaut.http.annotation.Controller;
import io.micronaut.http.annotation.Post;
import io.micronaut.serde.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down
4 changes: 4 additions & 0 deletions aws-alexa/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,14 @@ plugins {

dependencies {
annotationProcessor libs.micronaut.validation
annotationProcessor libs.micronaut.serde.processor

implementation libs.micronaut.validation
implementation libs.spotbugs.annotations

implementation libs.micronaut.serde
implementation libs.micronaut.serde.jackson

compileOnly(libs.alexa.ask.sdk)
api(libs.managed.alexa.ask.sdk.core)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,8 @@
import com.fasterxml.jackson.annotation.JsonInclude;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.core.annotation.Nullable;
import io.micronaut.core.annotation.Introspected;
import io.micronaut.serde.annotation.Serdeable;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.PastOrPresent;
Expand All @@ -32,7 +33,7 @@
* @author sdelamo
* @since 2.0.0
*/
@Introspected
@Serdeable
public class FlashBriefingItem implements Comparable<FlashBriefingItem> {

/**
Expand All @@ -49,7 +50,7 @@ public class FlashBriefingItem implements Comparable<FlashBriefingItem> {
@NotNull
@NonNull
@PastOrPresent
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ssZ")
private ZonedDateTime updateDate;

/**
Expand All @@ -65,7 +66,7 @@ public class FlashBriefingItem implements Comparable<FlashBriefingItem> {
@NonNull
@NotNull
@Size(max = 4500)
@JsonInclude()
@JsonInclude(value = JsonInclude.Include.ALWAYS)
private String mainText;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package io.micronaut.aws.alexa.flashbriefing

import com.fasterxml.jackson.databind.ObjectMapper
import groovy.json.JsonSlurper
import io.micronaut.aws.ApplicationContextSpecification
import io.micronaut.serde.ObjectMapper
import spock.lang.PendingFeature
import spock.lang.Shared
import spock.lang.Unroll
Expand Down
6 changes: 6 additions & 0 deletions aws-common/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,12 @@ plugins {
}

dependencies {
annotationProcessor libs.micronaut.serde.processor

compileOnly libs.micronaut.runtime

implementation libs.micronaut.serde
implementation libs.micronaut.serde.jackson

testImplementation libs.micronaut.runtime
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,15 +15,18 @@
*/
package io.micronaut.discovery.cloud.aws;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.core.JsonFactory;
import io.micronaut.context.annotation.Primary;
import io.micronaut.context.annotation.Requires;
import io.micronaut.context.env.Environment;
import io.micronaut.core.io.IOUtils;
import io.micronaut.core.util.StringUtils;
import io.micronaut.discovery.cloud.ComputeInstanceMetadata;
import io.micronaut.discovery.cloud.ComputeInstanceMetadataResolver;
import io.micronaut.jackson.core.tree.JsonNodeTreeCodec;
import io.micronaut.json.tree.JsonNode;
import io.micronaut.serde.ObjectMapper;
import io.micronaut.serde.annotation.SerdeImport;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

Expand Down Expand Up @@ -53,6 +56,7 @@
@Requires(property = AmazonMetadataConfiguration.PREFIX + ".enabled", value = StringUtils.TRUE, defaultValue = StringUtils.TRUE)
@Requires(classes = ComputeInstanceMetadataResolver.class)
@Primary
@SerdeImport(value = JsonNode.class)
public class AmazonComputeInstanceMetadataResolver implements ComputeInstanceMetadataResolver {

private static final Logger LOG = LoggerFactory.getLogger(AmazonComputeInstanceMetadataResolver.class);
Expand All @@ -62,6 +66,7 @@ public class AmazonComputeInstanceMetadataResolver implements ComputeInstanceMet
private static final Pattern DRIVE_LETTER_PATTERN = Pattern.compile("^\\/*[a-zA-z]:.*$");

private final ObjectMapper objectMapper;
private final JsonFactory jsonFactory = new JsonFactory();
private final AmazonMetadataConfiguration configuration;
private AmazonEC2InstanceMetadata cachedMetadata;

Expand All @@ -77,12 +82,8 @@ public AmazonComputeInstanceMetadataResolver(ObjectMapper objectMapper, AmazonMe
this.configuration = configuration;
}

/**
* Create a new instance to resolve {@link ComputeInstanceMetadata} for Amazon EC2 with default configurations.
*/
public AmazonComputeInstanceMetadataResolver() {
this.objectMapper = new ObjectMapper();
this.configuration = new AmazonMetadataConfiguration();
private static Optional<String> stringValue(JsonNode json, String key) {
return Optional.ofNullable(json.get(key)).map(JsonNode::coerceStringValue);
}

@Override
Expand All @@ -98,7 +99,7 @@ public Optional<ComputeInstanceMetadata> resolve(Environment environment) {
try {
String ec2InstanceIdentityDocURL = configuration.getInstanceDocumentUrl();
String ec2InstanceMetadataURL = configuration.getMetadataUrl();
JsonNode metadataJson = readMetadataUrl(new URL(ec2InstanceIdentityDocURL), CONNECTION_TIMEOUT_IN_MILLS, READ_TIMEOUT_IN_MILLS, objectMapper, new HashMap<>());
JsonNode metadataJson = readMetadataUrl(new URL(ec2InstanceIdentityDocURL), CONNECTION_TIMEOUT_IN_MILLS, READ_TIMEOUT_IN_MILLS, JsonNodeTreeCodec.getInstance().withConfig(objectMapper.getStreamConfig()), jsonFactory, new HashMap<>());
if (metadataJson != null) {
stringValue(metadataJson, EC2MetadataKeys.instanceId.name()).ifPresent(ec2InstanceMetadata::setInstanceId);
stringValue(metadataJson, EC2MetadataKeys.accountId.name()).ifPresent(ec2InstanceMetadata::setAccount);
Expand Down Expand Up @@ -138,7 +139,7 @@ public Optional<ComputeInstanceMetadata> resolve(Environment environment) {
LOG.error("error getting public host name from:{}{}", ec2InstanceMetadataURL, EC2MetadataKeys.publicHostname.getName(), e);
}

Map<?, ?> metadata = objectMapper.convertValue(ec2InstanceMetadata, Map.class);
Map<?, ?> metadata = objectMapper.readValue(objectMapper.writeValueAsString(ec2InstanceMetadata), Map.class);
populateMetadata(ec2InstanceMetadata, metadata);
LOG.debug("EC2 Metadata found:{}", ec2InstanceMetadata.getMetadata());
//TODO make individual calls for building network interfaces.. required recursive http calls for all mac addresses
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@

import com.fasterxml.jackson.annotation.JsonIgnore;
import io.micronaut.context.env.ComputePlatform;
import io.micronaut.core.annotation.Introspected;
import io.micronaut.discovery.cloud.AbstractComputeInstanceMetadata;
import io.micronaut.serde.annotation.Serdeable;

/**
* Represents {@link io.micronaut.discovery.cloud.ComputeInstanceMetadata} for Amazon's EC2.
Expand All @@ -27,7 +27,7 @@
* @author Graeme Rocher
* @since 1.0
*/
@Introspected
@Serdeable
public class AmazonEC2InstanceMetadata extends AbstractComputeInstanceMetadata {

private final ComputePlatform computePlatform = ComputePlatform.AMAZON_EC2;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import io.micronaut.core.annotation.Internal;
import io.micronaut.discovery.cloud.NetworkInterface;
import io.micronaut.serde.annotation.Serdeable;

/**
* A {@link NetworkInterface} implementation for Amazon.
Expand All @@ -25,6 +26,7 @@
* @since 1.0
*/
@Internal
@Serdeable
class AmazonNetworkInterface extends NetworkInterface {

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,18 +15,23 @@
*/
package io.micronaut.discovery.cloud

import com.fasterxml.jackson.databind.ObjectMapper
import io.micronaut.context.ApplicationContext
import io.micronaut.context.env.ComputePlatform
import io.micronaut.context.env.Environment
import io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver
import io.micronaut.discovery.cloud.aws.AmazonMetadataConfiguration
import io.micronaut.serde.ObjectMapper
import spock.lang.AutoCleanup
import spock.lang.Specification

import java.nio.file.Path
import java.nio.file.Paths

class AmazonEC2InstanceResolverSpec extends Specification {

@AutoCleanup
ApplicationContext context = ApplicationContext.run()

void "test building ec2 metadata"() {
given:
Environment environment = Mock(Environment)
Expand All @@ -35,7 +40,6 @@ class AmazonEC2InstanceResolverSpec extends Specification {

Optional<ComputeInstanceMetadata> computeInstanceMetadata = resolver.resolve(environment)


expect:
computeInstanceMetadata.isPresent()
computeInstanceMetadata.get().getInterfaces() != null
Expand All @@ -46,7 +50,6 @@ class AmazonEC2InstanceResolverSpec extends Specification {
networkInterface.gateway == "vpc-75d5d111"
networkInterface.id == "eni-d88bca3d"


computeInstanceMetadata.get().publicIpV4 == "34.230.77.169"
computeInstanceMetadata.get().account == "057654311259"
computeInstanceMetadata.get().availabilityZone == "us-east-1d"
Expand All @@ -67,7 +70,7 @@ class AmazonEC2InstanceResolverSpec extends Specification {
configuration.metadataUrl = "file:///${s}/src/test/groovy/io/micronaut/discovery/cloud/"
configuration.instanceDocumentUrl = "file:///${s}/src/test/groovy/io/micronaut/discovery/cloud/identity-document.json"
AmazonComputeInstanceMetadataResolver resolver = new AmazonComputeInstanceMetadataResolver(
new ObjectMapper(),
context.getBean(ObjectMapper),
configuration
)
resolver
Expand Down
5 changes: 5 additions & 0 deletions aws-secretsmanager/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,12 @@ plugins {
}

dependencies {
annotationProcessor libs.micronaut.serde.processor

api project(":aws-sdk-v2")
api project(":aws-distributed-configuration")
api libs.awssdk.secretsmanager

implementation libs.micronaut.serde
implementation libs.micronaut.serde.jackson
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,12 @@
*/
package io.micronaut.aws.secretsmanager;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.micronaut.aws.distributedconfiguration.KeyValueFetcher;
import io.micronaut.context.annotation.BootstrapContextCompatible;
import io.micronaut.context.annotation.Requires;
import io.micronaut.core.annotation.Experimental;
import io.micronaut.core.annotation.NonNull;
import io.micronaut.serde.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient;
Expand All @@ -39,6 +38,8 @@
import software.amazon.awssdk.services.secretsmanager.model.SecretListEntry;
import software.amazon.awssdk.services.secretsmanager.model.SecretsManagerException;
import jakarta.inject.Singleton;

import java.io.IOException;
import java.util.Base64;
import java.util.HashMap;
import java.util.List;
Expand Down Expand Up @@ -105,7 +106,7 @@ public Optional<Map> keyValuesByPrefix(@NonNull String prefix) {
if (secretValueOptional.isPresent()) {
try {
result.putAll(objectMapper.readValue(secretValueOptional.get(), Map.class));
} catch (JsonProcessingException e) {
} catch (IOException e) {
if (LOG.isWarnEnabled()) {
LOG.warn("could not read secret ({}) value from JSON to Map", secret.name());
}
Expand Down
Loading

0 comments on commit dca8a6c

Please sign in to comment.