Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[DRAFT - DO NOT MERGE]PP-13575 Investigate AWS SDK Java V2 upgrade #5721

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
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
15 changes: 8 additions & 7 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<pay-java-commons.version>1.0.20250203100445</pay-java-commons.version>
<pay-java-commons.version>1.0.20250213120003</pay-java-commons.version>
<surefire.version>3.5.2</surefire.version>
<jjwt.version>0.12.6</jjwt.version>
<pact.version>4.6.16</pact.version>
Expand Down Expand Up @@ -39,9 +39,9 @@
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-bom</artifactId>
<version>1.12.780</version>
<groupId>software.amazon.awssdk</groupId>
<artifactId>bom</artifactId>
<version>2.30.18</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Expand Down Expand Up @@ -177,8 +177,9 @@
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-sqs</artifactId>
<groupId>software.amazon.awssdk</groupId>
<artifactId>sqs</artifactId>
<version>2.30.18</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.connectors</groupId>
Expand Down Expand Up @@ -218,7 +219,7 @@
</dependency>
<dependency>
<groupId>uk.gov.service.payments</groupId>
<artifactId>queue</artifactId>
<artifactId>queue-java-aws-sdk-v2</artifactId>
<version>${pay-java-commons.version}</version>
</dependency>
<dependency>
Expand Down
37 changes: 16 additions & 21 deletions src/main/java/uk/gov/pay/connector/app/ConnectorModule.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
package uk.gov.pay.connector.app;

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.AmazonSQSClientBuilder;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
Expand All @@ -14,6 +9,12 @@
import io.dropwizard.core.setup.Environment;
import io.dropwizard.db.DataSourceFactory;
import org.apache.commons.validator.routines.InetAddressValidator;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.awscore.client.builder.AwsSyncClientBuilder;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.SqsClientBuilder;
import uk.gov.pay.connector.charge.service.Worldpay3dsFlexJwtService;
import uk.gov.pay.connector.charge.util.JwtGenerator;
import uk.gov.pay.connector.common.validator.RequestValidator;
Expand Down Expand Up @@ -306,34 +307,28 @@ protected StateTransitionQueue getStateTransitionQueue() {
}

@Provides
public AmazonSQS sqsClient(ConnectorConfiguration connectorConfiguration) {

AmazonSQSClientBuilder clientBuilder = AmazonSQSClientBuilder
.standard();
public SqsClient sqsClient(ConnectorConfiguration connectorConfiguration) {

SqsClientBuilder clientBuilder = SqsClient.builder();

if (connectorConfiguration.getSqsConfig().isNonStandardServiceEndpoint()) {

BasicAWSCredentials basicAWSCredentials = new BasicAWSCredentials(
connectorConfiguration.getSqsConfig().getAccessKey(),
connectorConfiguration.getSqsConfig().getSecretKey());

AwsBasicCredentials basicAWSCredentials = AwsBasicCredentials.create(connectorConfiguration.getSqsConfig().getAccessKey(), connectorConfiguration.getSqsConfig().getSecretKey());

clientBuilder
.withCredentials(new AWSStaticCredentialsProvider(basicAWSCredentials))
.withEndpointConfiguration(
new AwsClientBuilder.EndpointConfiguration(
connectorConfiguration.getSqsConfig().getEndpoint(),
connectorConfiguration.getSqsConfig().getRegion())
);
.credentialsProvider(StaticCredentialsProvider.create(basicAWSCredentials))
.endpointOverride(URI.create(connectorConfiguration.getSqsConfig().getEndpoint()))
.region(Region.of(connectorConfiguration.getSqsConfig().getRegion()));
} else {
// uses AWS SDK's DefaultAWSCredentialsProviderChain to obtain credentials
clientBuilder.withRegion(connectorConfiguration.getSqsConfig().getRegion());
clientBuilder.region(Region.of(connectorConfiguration.getSqsConfig().getRegion()));
}

return clientBuilder.build();
}

@Provides
public SqsQueueService provideSqsQueueService(AmazonSQS amazonSQS, ConnectorConfiguration connectorConfiguration) {
public SqsQueueService provideSqsQueueService(SqsClient amazonSQS, ConnectorConfiguration connectorConfiguration) {
return new SqsQueueService(
amazonSQS,
connectorConfiguration.getSqsConfig().getMessageMaximumWaitTimeInSeconds(),
Expand Down
20 changes: 11 additions & 9 deletions src/main/java/uk/gov/pay/connector/healthcheck/SQSHealthCheck.java
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package uk.gov.pay.connector.healthcheck;

import com.amazonaws.SdkClientException;
import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.model.AmazonSQSException;
import com.amazonaws.services.sqs.model.GetQueueAttributesRequest;
import com.codahale.metrics.health.HealthCheck;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.core.exception.SdkClientException;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.GetQueueAttributesRequest;
import software.amazon.awssdk.services.sqs.model.SqsException;
import uk.gov.pay.connector.app.ConnectorConfiguration;

import javax.inject.Inject;
Expand All @@ -21,12 +21,12 @@

public class SQSHealthCheck extends HealthCheck {

private final AmazonSQS sqsClient;
private final SqsClient sqsClient;
private final Logger logger = LoggerFactory.getLogger(SQSHealthCheck.class);
private List<NameValuePair> checkList = new ArrayList<>();

@Inject
public SQSHealthCheck(AmazonSQS sqsClient, ConnectorConfiguration connectorConfiguration) {
public SQSHealthCheck(SqsClient sqsClient, ConnectorConfiguration connectorConfiguration) {
this.sqsClient = sqsClient;
setUpCheckList(connectorConfiguration);
}
Expand All @@ -51,11 +51,13 @@ private void setUpCheckList(ConnectorConfiguration connectorConfiguration) {

private Optional<String> checkQueue(NameValuePair nameValuePair) {
GetQueueAttributesRequest queueAttributesRequest =
new GetQueueAttributesRequest(nameValuePair.getValue())
.withAttributeNames("All");
GetQueueAttributesRequest.builder()
.queueUrl(nameValuePair.getValue()) // Set the queue URL
.attributeNamesWithStrings("All") // Fix: Use attributeNamesWithStrings()
.build();
try {
sqsClient.getQueueAttributes(queueAttributesRequest);
} catch (AmazonSQSException | UnsupportedOperationException e) {
} catch (SqsException | UnsupportedOperationException e) {
logger.error("Failed to retrieve [{}] queue attributes - {}", nameValuePair.getName(), e.getMessage());
return Optional.of(e.getMessage());
} catch (SdkClientException e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package uk.gov.pay.connector.extension;

import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.model.PurgeQueueRequest;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.github.tomakehurst.wiremock.WireMockServer;
import com.google.inject.Injector;
Expand All @@ -19,6 +17,8 @@
import org.junit.jupiter.api.extension.ExtensionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.PurgeQueueRequest;
import uk.gov.pay.connector.app.ConnectorApp;
import uk.gov.pay.connector.app.ConnectorConfiguration;
import uk.gov.pay.connector.app.InjectorLookup;
Expand Down Expand Up @@ -51,7 +51,7 @@ public class AppWithPostgresAndSqsExtension implements BeforeEachCallback, Befor
private static final String JPA_UNIT = "ConnectorUnit";
private static String CONFIG_PATH = resourceFilePath("config/test-it-config.yaml");
private final Jdbi jdbi;
private final AmazonSQS sqsClient;
private final SqsClient sqsClient;
private final DropwizardAppExtension<ConnectorConfiguration> dropwizardAppExtension;
private Injector injector;
private final int wireMockPort;
Expand Down Expand Up @@ -255,7 +255,7 @@ public Jdbi getJdbi() {
return jdbi;
}

public AmazonSQS getSqsClient() {
public SqsClient getSqsClient() {
return sqsClient;
}

Expand Down Expand Up @@ -308,7 +308,11 @@ public String getEventQueueUrl() {
}

public void purgeEventQueue() {
AmazonSQS sqsClient = getInstanceFromGuiceContainer(AmazonSQS.class);
sqsClient.purgeQueue(new PurgeQueueRequest(getEventQueueUrl()));
SqsClient sqsClient = getInstanceFromGuiceContainer(SqsClient.class);
sqsClient.purgeQueue(
PurgeQueueRequest.builder()
.queueUrl(getEventQueueUrl())
.build()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package uk.gov.pay.connector.gateway.worldpay.wallets;

import com.amazonaws.util.json.Jackson;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
Expand Down Expand Up @@ -363,7 +363,8 @@ void shouldSendGooglePay3dsRequestWithEmailWhenSendingPayerEmailToGatewayEnabled

private GooglePayAuthorisationGatewayRequest getGooglePayAuthorisationGatewayRequest(boolean withPayerEmail) throws IOException {
String fixturePath = withPayerEmail ? "googlepay/example-auth-request.json" : "googlepay/example-auth-request-without-email.json";
GooglePayAuthRequest googlePayAuthRequest = Jackson.getObjectMapper().readValue(load(fixturePath), GooglePayAuthRequest.class);
ObjectMapper objectMapper = new ObjectMapper();
GooglePayAuthRequest googlePayAuthRequest = objectMapper.readValue(load(fixturePath), GooglePayAuthRequest.class);
return new GooglePayAuthorisationGatewayRequest(chargeEntity, googlePayAuthRequest);
}

Expand All @@ -373,7 +374,8 @@ private GooglePayAuthorisationGatewayRequest getGooglePayAuthorisationGatewayReq
String fixturePath = withDDCResult ? "googlepay/example-3ds-auth-request-with-ddc.json" :
withPayerEmail ? "googlepay/example-3ds-auth-request.json" :
"googlepay/example-3ds-auth-request-without-email.json";
GooglePayAuthRequest googlePayAuthRequest = Jackson.getObjectMapper().readValue(load(fixturePath), GooglePayAuthRequest.class);
ObjectMapper objectMapper = new ObjectMapper();
GooglePayAuthRequest googlePayAuthRequest = objectMapper.readValue(load(fixturePath), GooglePayAuthRequest.class);
chargeEntity.getGatewayAccount().setRequires3ds(isRequires3ds);
chargeEntity.getGatewayAccount().setSendPayerIpAddressToGateway(withIpAddress);
chargeEntity.setExternalId(GOOGLE_PAY_3DS_WITHOUT_IP_ADDRESS);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,5 @@
package uk.gov.pay.connector.it.events;

import com.amazonaws.services.sqs.AmazonSQS;
import com.amazonaws.services.sqs.model.Message;
import com.amazonaws.services.sqs.model.ReceiveMessageRequest;
import com.amazonaws.services.sqs.model.ReceiveMessageResult;
import com.google.common.collect.ImmutableMap;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
Expand All @@ -13,6 +9,10 @@
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import software.amazon.awssdk.services.sqs.SqsClient;
import software.amazon.awssdk.services.sqs.model.Message;
import software.amazon.awssdk.services.sqs.model.ReceiveMessageRequest;
import software.amazon.awssdk.services.sqs.model.ReceiveMessageResponse;
import uk.gov.pay.connector.extension.AppWithPostgresAndSqsExtension;
import uk.gov.pay.connector.it.base.ITestBaseExtension;

Expand Down Expand Up @@ -62,7 +62,7 @@ void shouldPutPaymentStateTransitionMessageOntoQueueGivenAuthCancel() throws Int
assertThat(messages.size(), is(2));

JsonObject cancelledMessage = messages.stream()
.map(m -> new JsonParser().parse(m.getBody()).getAsJsonObject())
.map(m -> new JsonParser().parse(m.body()).getAsJsonObject())
.filter(e -> e.get("event_type").getAsString().equals("CANCELLED_BY_EXTERNAL_SERVICE"))
.findFirst().get();

Expand All @@ -72,7 +72,7 @@ void shouldPutPaymentStateTransitionMessageOntoQueueGivenAuthCancel() throws Int
assertThat(cancelledMessage.get("live").getAsBoolean(), is(false));

Optional<JsonObject> refundMessage = messages.stream()
.map(m -> new JsonParser().parse(m.getBody()).getAsJsonObject())
.map(m -> new JsonParser().parse(m.body()).getAsJsonObject())
.filter(e -> e.get("event_type").getAsString().equals("REFUND_AVAILABILITY_UPDATED"))
.findFirst();
assertThat(refundMessage.isPresent(), is(true));
Expand Down Expand Up @@ -109,7 +109,7 @@ void shouldEmitCorrectRefundEvents() throws Exception{
assertThat(messages.size(), is(4));

JsonObject message1 = messages.stream()
.map(m -> new JsonParser().parse(m.getBody()).getAsJsonObject())
.map(m -> new JsonParser().parse(m.body()).getAsJsonObject())
.filter(m -> "REFUND_CREATED_BY_SERVICE".equals(m.get("event_type").getAsString()))
.findFirst().get();
assertThat(message1.get("event_type").getAsString(), is("REFUND_CREATED_BY_SERVICE"));
Expand All @@ -120,7 +120,7 @@ void shouldEmitCorrectRefundEvents() throws Exception{
assertThat(message1.get("event_details").getAsJsonObject().get("amount").getAsInt(), is(50));

JsonObject message2 = messages.stream()
.map(m -> new JsonParser().parse(m.getBody()).getAsJsonObject())
.map(m -> new JsonParser().parse(m.body()).getAsJsonObject())
.filter(m -> "REFUND_AVAILABILITY_UPDATED".equals(m.get("event_type").getAsString()))
.findFirst().get();
assertThat(message2.get("event_type").getAsString(), is("REFUND_AVAILABILITY_UPDATED"));
Expand All @@ -132,7 +132,7 @@ void shouldEmitCorrectRefundEvents() throws Exception{
assertThat(message2.get("event_details").getAsJsonObject().get("refund_status").getAsString(), is("available"));

JsonObject message3 = messages.stream()
.map(m -> new JsonParser().parse(m.getBody()).getAsJsonObject())
.map(m -> new JsonParser().parse(m.body()).getAsJsonObject())
.filter(m -> "REFUND_SUBMITTED".equals(m.get("event_type").getAsString()))
.findFirst().get();
assertThat(message3.get("event_type").getAsString(), is("REFUND_SUBMITTED"));
Expand All @@ -141,7 +141,7 @@ void shouldEmitCorrectRefundEvents() throws Exception{
assertThat(message3.get("live").getAsBoolean(), is(false));

JsonObject message4 = messages.stream()
.map(m -> new JsonParser().parse(m.getBody()).getAsJsonObject())
.map(m -> new JsonParser().parse(m.body()).getAsJsonObject())
.filter(m -> "REFUND_SUCCEEDED".equals(m.get("event_type").getAsString()))
.findFirst().get();

Expand All @@ -153,16 +153,17 @@ void shouldEmitCorrectRefundEvents() throws Exception{
}

private List<Message> readMessagesFromEventQueue() {
AmazonSQS sqsClient = app.getInstanceFromGuiceContainer(AmazonSQS.class);
SqsClient sqsClient = app.getInstanceFromGuiceContainer(SqsClient.class);

ReceiveMessageRequest receiveMessageRequest = new ReceiveMessageRequest(app.getEventQueueUrl());
receiveMessageRequest
.withMessageAttributeNames()
.withWaitTimeSeconds(1)
.withMaxNumberOfMessages(10);
ReceiveMessageRequest receiveMessageRequest = ReceiveMessageRequest.builder()
.queueUrl(app.getEventQueueUrl())
.messageAttributeNames()
.waitTimeSeconds(1)
.maxNumberOfMessages(10)
.build();

ReceiveMessageResult receiveMessageResult = sqsClient.receiveMessage(receiveMessageRequest);
ReceiveMessageResponse receiveMessageResult = sqsClient.receiveMessage(receiveMessageRequest);

return receiveMessageResult.getMessages();
return receiveMessageResult.messages();
}
}
Loading
Loading