Skip to content

Commit 8d5a922

Browse files
committed
Handle GlueException
`GlueException` must be converted to bad request with the correct Amazon header.
1 parent 14869b6 commit 8d5a922

File tree

4 files changed

+60
-7
lines changed

4 files changed

+60
-7
lines changed

trino-aws-proxy-glue/pom.xml

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@
6464
<artifactId>jakarta.ws.rs-api</artifactId>
6565
</dependency>
6666

67+
<dependency>
68+
<groupId>software.amazon.awssdk</groupId>
69+
<artifactId>aws-core</artifactId>
70+
</dependency>
71+
72+
<dependency>
73+
<groupId>software.amazon.awssdk</groupId>
74+
<artifactId>aws-json-protocol</artifactId>
75+
</dependency>
76+
6777
<dependency>
6878
<groupId>software.amazon.awssdk</groupId>
6979
<artifactId>glue</artifactId>
@@ -115,12 +125,6 @@
115125
<scope>runtime</scope>
116126
</dependency>
117127

118-
<dependency>
119-
<groupId>software.amazon.awssdk</groupId>
120-
<artifactId>aws-core</artifactId>
121-
<scope>runtime</scope>
122-
</dependency>
123-
124128
<dependency>
125129
<groupId>software.amazon.awssdk</groupId>
126130
<artifactId>regions</artifactId>
@@ -170,4 +174,19 @@
170174
<scope>test</scope>
171175
</dependency>
172176
</dependencies>
177+
178+
<build>
179+
<plugins>
180+
<plugin>
181+
<groupId>org.apache.maven.plugins</groupId>
182+
<artifactId>maven-dependency-plugin</artifactId>
183+
<configuration>
184+
<ignoredNonTestScopedDependencies>
185+
<!-- I can't figure out what the dependency plugin is complaining about - punt for now -->
186+
<ignoredDependency>software.amazon.awssdk:aws-core</ignoredDependency>
187+
</ignoredNonTestScopedDependencies>
188+
</configuration>
189+
</plugin>
190+
</plugins>
191+
</build>
173192
</project>

trino-aws-proxy-glue/src/main/java/io/trino/aws/proxy/glue/rest/TrinoGlueResource.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,18 @@
2626
import jakarta.ws.rs.core.Context;
2727
import jakarta.ws.rs.core.MediaType;
2828
import jakarta.ws.rs.core.Response;
29+
import software.amazon.awssdk.services.glue.model.GlueException;
2930
import software.amazon.awssdk.services.glue.model.GlueRequest;
3031
import software.amazon.awssdk.services.glue.model.GlueResponse;
32+
import software.amazon.awssdk.services.glue.model.InternalServiceException;
3133

3234
import java.io.InputStream;
3335

3436
import static jakarta.ws.rs.core.Response.Status.BAD_REQUEST;
37+
import static jakarta.ws.rs.core.Response.Status.INTERNAL_SERVER_ERROR;
3538
import static jakarta.ws.rs.core.Response.Status.NOT_FOUND;
3639
import static java.util.Objects.requireNonNull;
40+
import static software.amazon.awssdk.protocols.json.internal.unmarshall.JsonErrorCodeParser.X_AMZN_ERROR_TYPE;
3741

3842
@ResourceSecurity(GlueResourceSecurity.class)
3943
public class TrinoGlueResource
@@ -78,9 +82,18 @@ public Response gluePost(@Context Request request, @Context SigningMetadata sign
7882
try {
7983
glueResponse = requestHandler.handleRequest(parsedGlueRequest, signingMetadata, requestLoggingSession);
8084
}
85+
catch (GlueException e) {
86+
requestLoggingSession.logException(e);
87+
88+
return Response.status(BAD_REQUEST)
89+
.header(X_AMZN_ERROR_TYPE, e.getClass().getSimpleName() + ":" + e.getMessage())
90+
.build();
91+
}
8192
catch (Exception e) {
8293
requestLoggingSession.logException(e);
83-
throw e;
94+
return Response.status(INTERNAL_SERVER_ERROR)
95+
.header(X_AMZN_ERROR_TYPE, InternalServiceException.class.getSimpleName() + ":" + e.getMessage())
96+
.build();
8497
}
8598

8699
return Response.ok(glueResponse).build();

trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestGlueBase.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,9 @@
2929
import software.amazon.awssdk.services.glue.model.Database;
3030
import software.amazon.awssdk.services.glue.model.DatabaseIdentifier;
3131
import software.amazon.awssdk.services.glue.model.DatabaseInput;
32+
import software.amazon.awssdk.services.glue.model.EntityNotFoundException;
3233
import software.amazon.awssdk.services.glue.model.FederatedDatabase;
34+
import software.amazon.awssdk.services.glue.model.GetDatabaseRequest;
3335
import software.amazon.awssdk.services.glue.model.GetDatabasesRequest;
3436
import software.amazon.awssdk.services.glue.model.GetDatabasesResponse;
3537
import software.amazon.awssdk.services.glue.model.GetResourcePoliciesRequest;
@@ -52,6 +54,7 @@
5254
import static io.trino.aws.proxy.glue.TestingGlueRequestHandler.POLICY_B;
5355
import static java.util.Objects.requireNonNull;
5456
import static org.assertj.core.api.Assertions.assertThat;
57+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
5558

5659
public abstract class TestGlueBase<T extends TestingGlueContext>
5760
{
@@ -152,4 +155,15 @@ public void testComplexSerialization()
152155
.transactionId("t1")
153156
.build());
154157
}
158+
159+
@Test
160+
public void testNotFoundException()
161+
{
162+
assertThatThrownBy(() -> glueClient.getDatabase(
163+
GetDatabaseRequest.builder()
164+
.catalogId("1")
165+
.name("blahblah")
166+
.build()))
167+
.isInstanceOf(EntityNotFoundException.class);
168+
}
155169
}

trino-aws-proxy-glue/src/test/java/io/trino/aws/proxy/glue/TestingGlueRequestHandler.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@
2323
import software.amazon.awssdk.services.glue.model.CreateDatabaseResponse;
2424
import software.amazon.awssdk.services.glue.model.CreateTableRequest;
2525
import software.amazon.awssdk.services.glue.model.Database;
26+
import software.amazon.awssdk.services.glue.model.EntityNotFoundException;
27+
import software.amazon.awssdk.services.glue.model.GetDatabaseRequest;
2628
import software.amazon.awssdk.services.glue.model.GetDatabasesRequest;
2729
import software.amazon.awssdk.services.glue.model.GetDatabasesResponse;
2830
import software.amazon.awssdk.services.glue.model.GetResourcePoliciesRequest;
@@ -82,6 +84,11 @@ public GlueResponse handleRequest(ParsedGlueRequest request, SigningMetadata sig
8284
.databaseList(Database.builder().name(DATABASE_1).build(), Database.builder().name(DATABASE_2).build())
8385
.build();
8486

87+
// TODO: add more cases
88+
case GetDatabaseRequest getDatabaseRequest -> throw EntityNotFoundException.builder()
89+
.message("'%s.%s' not found".formatted(getDatabaseRequest.catalogId(), getDatabaseRequest.name()))
90+
.build();
91+
8592
case GetResourcePoliciesRequest _ -> GetResourcePoliciesResponse.builder()
8693
.getResourcePoliciesResponseList(gluePolicies())
8794
.build();

0 commit comments

Comments
 (0)