Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
1 change: 1 addition & 0 deletions aws-service-discovery/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ dependencies {
api project(":aws-sdk-v2")

implementation libs.awssdk.servicediscovery
implementation libs.micronaut.serde

testImplementation libs.projectreactor
testImplementation libs.micronaut.http.server.netty
Expand Down
157 changes: 157 additions & 0 deletions config/accepted-api-changes.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,157 @@
[
{
"type": "io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver",
"member": "Class io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver",
"member": "Constructor io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver(com.fasterxml.jackson.databind.ObjectMapper,io.micronaut.discovery.cloud.aws.AmazonMetadataConfiguration)",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver",
"member": "Constructor io.micronaut.discovery.cloud.aws.AmazonComputeInstanceMetadataResolver()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.aws.secretsmanager.SecretsManagerKeyValueFetcher",
"member": "Class io.micronaut.aws.secretsmanager.SecretsManagerKeyValueFetcher",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.aws.secretsmanager.SecretsManagerKeyValueFetcher",
"member": "Constructor io.micronaut.aws.secretsmanager.SecretsManagerKeyValueFetcher(software.amazon.awssdk.services.secretsmanager.SecretsManagerClient,com.fasterxml.jackson.databind.ObjectMapper)",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"member": "Class io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"member": "Field $ANNOTATION_METADATA",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"member": "Method io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference.getBeanDefinitionType()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"member": "Method io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference.getBeanType()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"member": "Method io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference.load()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference",
"member": "Constructor io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$Definition$Reference()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"member": "Class io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"member": "Field $ANNOTATION_METADATA",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"member": "Method io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference.getBeanDefinitionType()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"member": "Method io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference.getBeanType()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"member": "Method io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference.load()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference",
"member": "Constructor io.micronaut.function.aws.proxy.$AwsObjectMapperFactory$ObjectMapper0$Definition$Reference()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler",
"member": "Class io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler",
"member": "Method io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler.objectMapper()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler",
"member": "Method io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler.readerFor(java.lang.Class)",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler",
"member": "Method io.micronaut.function.aws.proxy.AbstractLambdaContainerHandler.writerFor(java.lang.Class)",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AwsObjectMapperFactory",
"member": "Class io.micronaut.function.aws.proxy.AwsObjectMapperFactory",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AwsObjectMapperFactory",
"member": "Method io.micronaut.function.aws.proxy.AwsObjectMapperFactory.objectMapper()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.AwsObjectMapperFactory",
"member": "Constructor io.micronaut.function.aws.proxy.AwsObjectMapperFactory()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerContext",
"member": "Class io.micronaut.function.aws.proxy.MicronautLambdaContainerContext",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerContext",
"member": "Method io.micronaut.function.aws.proxy.MicronautLambdaContainerContext.getJsonCodec()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerContext",
"member": "Method io.micronaut.function.aws.proxy.MicronautLambdaContainerContext.getObjectMapper()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler",
"member": "Class io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler",
"member": "Method io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.objectMapper()",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler",
"member": "Method io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.readerFor(java.lang.Class)",
"reason": "Rewrite to use Serde instead of Jackson"
},
{
"type": "io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler",
"member": "Method io.micronaut.function.aws.proxy.MicronautLambdaContainerHandler.writerFor(java.lang.Class)",
"reason": "Rewrite to use Serde instead of Jackson"
}
]
Loading