This is an automated email from the ASF dual-hosted git repository.
jshao pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git
The following commit(s) were added to refs/heads/main by this push:
new fd71e6cd2 [#5518] feat(iceberg): add http header and remote addr
information to Iceberg Event (#5495)
fd71e6cd2 is described below
commit fd71e6cd26f5aae7f534d66a3d7573e64691380f
Author: FANNG <[email protected]>
AuthorDate: Tue Nov 12 11:20:38 2024 +0800
[#5518] feat(iceberg): add http header and remote addr information to
Iceberg Event (#5495)
### What changes were proposed in this pull request?
1. add HTTP header to event listener context
2. add remote IP addr to event listener context
### Why are the changes needed?
Fix: #5518
### Does this PR introduce _any_ user-facing change?
no
### How was this patch tested?
setup a local app and check IP addr and HTTP header was added to context
---
iceberg/iceberg-rest-server/build.gradle.kts | 1 -
.../iceberg/service/IcebergRestUtils.java | 17 ++++
.../dispatcher/IcebergTableEventDispatcher.java | 87 +++++++------------
.../IcebergTableOperationDispatcher.java | 2 +-
.../dispatcher/IcebergTableOperationExecutor.java | 18 ++--
.../service/rest/IcebergTableOperations.java | 20 +++--
.../service/rest/IcebergTableRenameOperations.java | 11 ++-
.../api/event/IcebergCreateTableEvent.java | 4 +-
.../api/event/IcebergCreateTableFailureEvent.java | 4 +-
.../api/event/IcebergCreateTablePreEvent.java | 6 +-
.../listener/api/event/IcebergDropTableEvent.java | 6 +-
.../api/event/IcebergDropTableFailureEvent.java | 7 +-
.../api/event/IcebergDropTablePreEvent.java | 6 +-
.../gravitino/listener/api/event/IcebergEvent.java | 12 ++-
.../listener/api/event/IcebergFailureEvent.java | 12 ++-
.../listener/api/event/IcebergListTableEvent.java | 5 +-
.../api/event/IcebergListTableFailureEvent.java | 5 +-
.../api/event/IcebergListTablePreEvent.java | 5 +-
.../listener/api/event/IcebergLoadTableEvent.java | 6 +-
.../api/event/IcebergLoadTableFailureEvent.java | 5 +-
.../api/event/IcebergLoadTablePreEvent.java | 5 +-
.../listener/api/event/IcebergPreEvent.java | 12 ++-
.../api/event/IcebergRenameTableEvent.java | 6 +-
.../api/event/IcebergRenameTableFailureEvent.java | 4 +-
.../api/event/IcebergRenameTablePreEvent.java | 6 +-
.../listener/api/event/IcebergRequestContext.java | 98 ++++++++++++++++++++++
.../listener/api/event/IcebergTableEvent.java | 5 +-
.../api/event/IcebergTableExistsEvent.java | 7 +-
.../api/event/IcebergTableExistsFailureEvent.java | 5 +-
.../api/event/IcebergTableExistsPreEvent.java | 5 +-
.../api/event/IcebergTableFailureEvent.java | 5 +-
.../listener/api/event/IcebergTablePreEvent.java | 4 +-
.../api/event/IcebergUpdateTableEvent.java | 4 +-
.../api/event/IcebergUpdateTableFailureEvent.java | 4 +-
.../api/event/IcebergUpdateTablePreEvent.java | 6 +-
.../iceberg/service/rest/DummyEventListener.java | 74 ++++++++++++++++
.../iceberg/service/rest/IcebergRestTestUtil.java | 21 ++++-
.../service/rest/MockIcebergTableOperations.java | 43 ++++++++++
.../rest/MockIcebergTableRenameOperations.java} | 22 +++--
.../service/rest/TestIcebergTableOperations.java | 86 ++++++++++++++++++-
40 files changed, 515 insertions(+), 146 deletions(-)
diff --git a/iceberg/iceberg-rest-server/build.gradle.kts
b/iceberg/iceberg-rest-server/build.gradle.kts
index c635ecd79..5d84ef778 100644
--- a/iceberg/iceberg-rest-server/build.gradle.kts
+++ b/iceberg/iceberg-rest-server/build.gradle.kts
@@ -60,7 +60,6 @@ dependencies {
implementation(libs.metrics.jersey2)
annotationProcessor(libs.lombok)
-
compileOnly(libs.lombok)
testImplementation(project(":bundles:aws-bundle"))
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
index 23ceb7790..ba747e060 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRestUtils.java
@@ -25,7 +25,11 @@ import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
import java.util.stream.Stream;
+import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
@@ -122,6 +126,19 @@ public class IcebergRestUtils {
return NameIdentifier.of(catalogNS.toArray(String[]::new));
}
+ public static Map<String, String> getHttpHeaders(HttpServletRequest
httpServletRequest) {
+ Map<String, String> headers = new HashMap<>();
+ Enumeration<String> headerNames = httpServletRequest.getHeaderNames();
+ while (headerNames.hasMoreElements()) {
+ String headerName = headerNames.nextElement();
+ String headerValue = httpServletRequest.getHeader(headerName);
+ if (headerValue != null) {
+ headers.put(headerName, headerValue);
+ }
+ }
+ return headers;
+ }
+
// remove the last '/' from the prefix, for example transform
'iceberg_catalog/' to
// 'iceberg_catalog'
private static String normalizePrefix(String rawPrefix) {
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
index 60bb517a0..aae0214a2 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableEventDispatcher.java
@@ -20,7 +20,6 @@
package org.apache.gravitino.iceberg.service.dispatcher;
import org.apache.gravitino.NameIdentifier;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
import org.apache.gravitino.iceberg.service.IcebergRestUtils;
import org.apache.gravitino.listener.EventBus;
import org.apache.gravitino.listener.api.event.IcebergCreateTableEvent;
@@ -38,13 +37,13 @@ import
org.apache.gravitino.listener.api.event.IcebergLoadTablePreEvent;
import org.apache.gravitino.listener.api.event.IcebergRenameTableEvent;
import org.apache.gravitino.listener.api.event.IcebergRenameTableFailureEvent;
import org.apache.gravitino.listener.api.event.IcebergRenameTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
import org.apache.gravitino.listener.api.event.IcebergTableExistsEvent;
import org.apache.gravitino.listener.api.event.IcebergTableExistsFailureEvent;
import org.apache.gravitino.listener.api.event.IcebergTableExistsPreEvent;
import org.apache.gravitino.listener.api.event.IcebergUpdateTableEvent;
import org.apache.gravitino.listener.api.event.IcebergUpdateTableFailureEvent;
import org.apache.gravitino.listener.api.event.IcebergUpdateTablePreEvent;
-import org.apache.gravitino.utils.PrincipalUtils;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.rest.requests.CreateTableRequest;
@@ -79,26 +78,21 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
TableIdentifier tableIdentifier = TableIdentifier.of(namespace,
createTableRequest.name());
NameIdentifier nameIdentifier =
IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), tableIdentifier);
+ metalakeName, context.catalogName(), tableIdentifier);
eventBus.dispatchEvent(
- new IcebergCreateTablePreEvent(
- PrincipalUtils.getCurrentUserName(), nameIdentifier,
createTableRequest));
+ new IcebergCreateTablePreEvent(context, nameIdentifier,
createTableRequest));
LoadTableResponse loadTableResponse;
try {
loadTableResponse =
icebergTableOperationDispatcher.createTable(context, namespace,
createTableRequest);
} catch (Exception e) {
eventBus.dispatchEvent(
- new IcebergCreateTableFailureEvent(
- PrincipalUtils.getCurrentUserName(), nameIdentifier,
createTableRequest, e));
+ new IcebergCreateTableFailureEvent(context, nameIdentifier,
createTableRequest, e));
throw e;
}
eventBus.dispatchEvent(
new IcebergCreateTableEvent(
- PrincipalUtils.getCurrentUserName(),
- nameIdentifier,
- createTableRequest,
- loadTableResponse));
+ context, nameIdentifier, createTableRequest, loadTableResponse));
return loadTableResponse;
}
@@ -109,10 +103,9 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
UpdateTableRequest updateTableRequest) {
NameIdentifier gravitinoNameIdentifier =
IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), tableIdentifier);
+ metalakeName, context.catalogName(), tableIdentifier);
eventBus.dispatchEvent(
- new IcebergUpdateTablePreEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
updateTableRequest));
+ new IcebergUpdateTablePreEvent(context, gravitinoNameIdentifier,
updateTableRequest));
LoadTableResponse loadTableResponse;
try {
loadTableResponse =
@@ -120,15 +113,12 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
} catch (Exception e) {
eventBus.dispatchEvent(
new IcebergUpdateTableFailureEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
updateTableRequest, e));
+ context, gravitinoNameIdentifier, updateTableRequest, e));
throw e;
}
eventBus.dispatchEvent(
new IcebergUpdateTableEvent(
- PrincipalUtils.getCurrentUserName(),
- gravitinoNameIdentifier,
- updateTableRequest,
- loadTableResponse));
+ context, gravitinoNameIdentifier, updateTableRequest,
loadTableResponse));
return loadTableResponse;
}
@@ -137,21 +127,18 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
IcebergRequestContext context, TableIdentifier tableIdentifier, boolean
purgeRequested) {
NameIdentifier gravitinoNameIdentifier =
IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), tableIdentifier);
+ metalakeName, context.catalogName(), tableIdentifier);
eventBus.dispatchEvent(
- new IcebergDropTablePreEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
purgeRequested));
+ new IcebergDropTablePreEvent(context, gravitinoNameIdentifier,
purgeRequested));
try {
icebergTableOperationDispatcher.dropTable(context, tableIdentifier,
purgeRequested);
} catch (Exception e) {
eventBus.dispatchEvent(
- new IcebergDropTableFailureEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
purgeRequested, e));
+ new IcebergDropTableFailureEvent(context, gravitinoNameIdentifier,
purgeRequested, e));
throw e;
}
eventBus.dispatchEvent(
- new IcebergDropTableEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
purgeRequested));
+ new IcebergDropTableEvent(context, gravitinoNameIdentifier,
purgeRequested));
}
@Override
@@ -159,42 +146,33 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
IcebergRequestContext context, TableIdentifier tableIdentifier) {
NameIdentifier gravitinoNameIdentifier =
IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), tableIdentifier);
- eventBus.dispatchEvent(
- new IcebergLoadTablePreEvent(PrincipalUtils.getCurrentUserName(),
gravitinoNameIdentifier));
+ metalakeName, context.catalogName(), tableIdentifier);
+ eventBus.dispatchEvent(new IcebergLoadTablePreEvent(context,
gravitinoNameIdentifier));
LoadTableResponse loadTableResponse;
try {
loadTableResponse = icebergTableOperationDispatcher.loadTable(context,
tableIdentifier);
} catch (Exception e) {
- eventBus.dispatchEvent(
- new IcebergLoadTableFailureEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
e));
+ eventBus.dispatchEvent(new IcebergLoadTableFailureEvent(context,
gravitinoNameIdentifier, e));
throw e;
}
eventBus.dispatchEvent(
- new IcebergLoadTableEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
loadTableResponse));
+ new IcebergLoadTableEvent(context, gravitinoNameIdentifier,
loadTableResponse));
return loadTableResponse;
}
@Override
public ListTablesResponse listTable(IcebergRequestContext context, Namespace
namespace) {
NameIdentifier gravitinoNameIdentifier =
- IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), namespace);
- eventBus.dispatchEvent(
- new IcebergListTablePreEvent(PrincipalUtils.getCurrentUserName(),
gravitinoNameIdentifier));
+ IcebergRestUtils.getGravitinoNameIdentifier(metalakeName,
context.catalogName(), namespace);
+ eventBus.dispatchEvent(new IcebergListTablePreEvent(context,
gravitinoNameIdentifier));
ListTablesResponse listTablesResponse;
try {
listTablesResponse = icebergTableOperationDispatcher.listTable(context,
namespace);
} catch (Exception e) {
- eventBus.dispatchEvent(
- new IcebergListTableFailureEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
e));
+ eventBus.dispatchEvent(new IcebergListTableFailureEvent(context,
gravitinoNameIdentifier, e));
throw e;
}
- eventBus.dispatchEvent(
- new IcebergListTableEvent(PrincipalUtils.getCurrentUserName(),
gravitinoNameIdentifier));
+ eventBus.dispatchEvent(new IcebergListTableEvent(context,
gravitinoNameIdentifier));
return listTablesResponse;
}
@@ -202,22 +180,17 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
public boolean tableExists(IcebergRequestContext context, TableIdentifier
tableIdentifier) {
NameIdentifier gravitinoNameIdentifier =
IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), tableIdentifier);
- eventBus.dispatchEvent(
- new IcebergTableExistsPreEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier));
+ metalakeName, context.catalogName(), tableIdentifier);
+ eventBus.dispatchEvent(new IcebergTableExistsPreEvent(context,
gravitinoNameIdentifier));
boolean isExists;
try {
isExists = icebergTableOperationDispatcher.tableExists(context,
tableIdentifier);
} catch (Exception e) {
eventBus.dispatchEvent(
- new IcebergTableExistsFailureEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
e));
+ new IcebergTableExistsFailureEvent(context, gravitinoNameIdentifier,
e));
throw e;
}
- eventBus.dispatchEvent(
- new IcebergTableExistsEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
isExists));
+ eventBus.dispatchEvent(new IcebergTableExistsEvent(context,
gravitinoNameIdentifier, isExists));
return isExists;
}
@@ -226,20 +199,18 @@ public class IcebergTableEventDispatcher implements
IcebergTableOperationDispatc
TableIdentifier sourceTable = renameTableRequest.source();
NameIdentifier gravitinoNameIdentifier =
IcebergRestUtils.getGravitinoNameIdentifier(
- metalakeName, context.getCatalogName(), sourceTable);
+ metalakeName, context.catalogName(), sourceTable);
eventBus.dispatchEvent(
- new IcebergRenameTablePreEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
renameTableRequest));
+ new IcebergRenameTablePreEvent(context, gravitinoNameIdentifier,
renameTableRequest));
try {
icebergTableOperationDispatcher.renameTable(context, renameTableRequest);
} catch (Exception e) {
eventBus.dispatchEvent(
new IcebergRenameTableFailureEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
renameTableRequest, e));
+ context, gravitinoNameIdentifier, renameTableRequest, e));
throw e;
}
eventBus.dispatchEvent(
- new IcebergRenameTableEvent(
- PrincipalUtils.getCurrentUserName(), gravitinoNameIdentifier,
renameTableRequest));
+ new IcebergRenameTableEvent(context, gravitinoNameIdentifier,
renameTableRequest));
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
index 49b910960..34c0a7174 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationDispatcher.java
@@ -19,7 +19,7 @@
package org.apache.gravitino.iceberg.service.dispatcher;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.rest.requests.CreateTableRequest;
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
index d2993b13e..e6385bfdc 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/dispatcher/IcebergTableOperationExecutor.java
@@ -20,7 +20,7 @@
package org.apache.gravitino.iceberg.service.dispatcher;
import org.apache.gravitino.iceberg.service.IcebergCatalogWrapperManager;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.TableIdentifier;
import org.apache.iceberg.rest.requests.CreateTableRequest;
@@ -41,7 +41,7 @@ public class IcebergTableOperationExecutor implements
IcebergTableOperationDispa
public LoadTableResponse createTable(
IcebergRequestContext context, Namespace namespace, CreateTableRequest
createTableRequest) {
return icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.createTable(namespace, createTableRequest);
}
@@ -51,7 +51,7 @@ public class IcebergTableOperationExecutor implements
IcebergTableOperationDispa
TableIdentifier tableIdentifier,
UpdateTableRequest updateTableRequest) {
return icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.updateTable(tableIdentifier, updateTableRequest);
}
@@ -60,11 +60,11 @@ public class IcebergTableOperationExecutor implements
IcebergTableOperationDispa
IcebergRequestContext context, TableIdentifier tableIdentifier, boolean
purgeRequested) {
if (purgeRequested) {
icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.purgeTable(tableIdentifier);
} else {
icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.dropTable(tableIdentifier);
}
}
@@ -73,28 +73,28 @@ public class IcebergTableOperationExecutor implements
IcebergTableOperationDispa
public LoadTableResponse loadTable(
IcebergRequestContext context, TableIdentifier tableIdentifier) {
return icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.loadTable(tableIdentifier);
}
@Override
public ListTablesResponse listTable(IcebergRequestContext context, Namespace
namespace) {
return icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.listTable(namespace);
}
@Override
public boolean tableExists(IcebergRequestContext context, TableIdentifier
tableIdentifier) {
return icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.tableExists(tableIdentifier);
}
@Override
public void renameTable(IcebergRequestContext context, RenameTableRequest
renameTableRequest) {
icebergCatalogWrapperManager
- .getCatalogWrapper(context.getCatalogName())
+ .getCatalogWrapper(context.catalogName())
.renameTable(renameTableRequest);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
index a9ffe1265..3ad5fa7ff 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableOperations.java
@@ -49,10 +49,10 @@ import org.apache.gravitino.credential.CredentialProvider;
import org.apache.gravitino.credential.CredentialUtils;
import org.apache.gravitino.iceberg.service.IcebergCatalogWrapperManager;
import org.apache.gravitino.iceberg.service.IcebergObjectMapper;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
import org.apache.gravitino.iceberg.service.IcebergRestUtils;
import
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
import org.apache.gravitino.iceberg.service.metrics.IcebergMetricsManager;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.iceberg.catalog.Namespace;
import org.apache.iceberg.catalog.TableIdentifier;
@@ -104,7 +104,7 @@ public class IcebergTableOperations {
String catalogName = IcebergRestUtils.getCatalogName(prefix);
Namespace icebergNS = RESTUtil.decodeNamespace(namespace);
LOG.info("List Iceberg tables, catalog: {}, namespace: {}", catalogName,
icebergNS);
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
ListTablesResponse listTablesResponse =
tableOperationDispatcher.listTable(context, icebergNS);
return IcebergRestUtils.ok(listTablesResponse);
}
@@ -129,7 +129,7 @@ public class IcebergTableOperations {
createTableRequest,
accessDelegation,
isCredentialVending);
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
LoadTableResponse loadTableResponse =
tableOperationDispatcher.createTable(context, icebergNS,
createTableRequest);
if (isCredentialVending) {
@@ -163,7 +163,7 @@ public class IcebergTableOperations {
table,
SerializeUpdateTableRequest(updateTableRequest));
}
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
LoadTableResponse loadTableResponse =
tableOperationDispatcher.updateTable(context, tableIdentifier,
updateTableRequest);
@@ -189,7 +189,7 @@ public class IcebergTableOperations {
table,
purgeRequested);
TableIdentifier tableIdentifier = TableIdentifier.of(namespace, table);
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
tableOperationDispatcher.dropTable(context, tableIdentifier,
purgeRequested);
return IcebergRestUtils.noContent();
}
@@ -218,7 +218,7 @@ public class IcebergTableOperations {
isCredentialVending);
// todo support snapshots
TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
LoadTableResponse loadTableResponse =
tableOperationDispatcher.loadTable(context, tableIdentifier);
if (isCredentialVending) {
@@ -245,7 +245,7 @@ public class IcebergTableOperations {
catalogName,
icebergNS,
table);
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
TableIdentifier tableIdentifier = TableIdentifier.of(icebergNS, table);
boolean exists = tableOperationDispatcher.tableExists(context,
tableIdentifier);
if (exists) {
@@ -269,6 +269,12 @@ public class IcebergTableOperations {
return IcebergRestUtils.noContent();
}
+ // HTTP request is null in Jersey test, override with a mock request when
testing.
+ @VisibleForTesting
+ HttpServletRequest httpServletRequest() {
+ return httpRequest;
+ }
+
private String SerializeUpdateTableRequest(UpdateTableRequest
updateTableRequest) {
try {
return icebergObjectMapper.writeValueAsString(updateTableRequest);
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
index bced33e77..bd2021d74 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/rest/IcebergTableRenameOperations.java
@@ -20,6 +20,7 @@ package org.apache.gravitino.iceberg.service.rest;
import com.codahale.metrics.annotation.ResponseMetered;
import com.codahale.metrics.annotation.Timed;
+import com.google.common.annotations.VisibleForTesting;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
@@ -30,9 +31,9 @@ import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
-import org.apache.gravitino.iceberg.service.IcebergRequestContext;
import org.apache.gravitino.iceberg.service.IcebergRestUtils;
import
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
+import org.apache.gravitino.listener.api.event.IcebergRequestContext;
import org.apache.gravitino.metrics.MetricNames;
import org.apache.iceberg.rest.requests.RenameTableRequest;
import org.slf4j.Logger;
@@ -65,8 +66,14 @@ public class IcebergTableRenameOperations {
catalogName,
renameTableRequest.source(),
renameTableRequest.destination());
- IcebergRequestContext context = new IcebergRequestContext(httpRequest,
catalogName);
+ IcebergRequestContext context = new
IcebergRequestContext(httpServletRequest(), catalogName);
tableOperationDispatcher.renameTable(context, renameTableRequest);
return IcebergRestUtils.okWithoutContent();
}
+
+ // HTTP request is null in Jersey test, override with a mock request when
testing.
+ @VisibleForTesting
+ HttpServletRequest httpServletRequest() {
+ return httpRequest;
+ }
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
index 1ce2d8f77..46b8514b8 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableEvent.java
@@ -33,11 +33,11 @@ public class IcebergCreateTableEvent extends
IcebergTableEvent {
private LoadTableResponse loadTableResponse;
public IcebergCreateTableEvent(
- String user,
+ IcebergRequestContext icebergRequestContext,
NameIdentifier resourceIdentifier,
CreateTableRequest createTableRequest,
LoadTableResponse loadTableResponse) {
- super(user, resourceIdentifier);
+ super(icebergRequestContext, resourceIdentifier);
this.createTableRequest =
IcebergRestUtils.cloneIcebergRESTObject(createTableRequest,
CreateTableRequest.class);
this.loadTableResponse =
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
index bc67ef2d5..07b033d3d 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTableFailureEvent.java
@@ -30,11 +30,11 @@ public class IcebergCreateTableFailureEvent extends
IcebergTableFailureEvent {
private CreateTableRequest createTableRequest;
public IcebergCreateTableFailureEvent(
- String user,
+ IcebergRequestContext icebergRequestContext,
NameIdentifier nameIdentifier,
CreateTableRequest createTableRequest,
Exception e) {
- super(user, nameIdentifier, e);
+ super(icebergRequestContext, nameIdentifier, e);
this.createTableRequest =
IcebergRestUtils.cloneIcebergRESTObject(createTableRequest,
CreateTableRequest.class);
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
index 81937e501..552f0d452 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergCreateTablePreEvent.java
@@ -29,8 +29,10 @@ public class IcebergCreateTablePreEvent extends
IcebergTablePreEvent {
private CreateTableRequest createTableRequest;
public IcebergCreateTablePreEvent(
- String user, NameIdentifier resourceIdentifier, CreateTableRequest
createTableRequest) {
- super(user, resourceIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ CreateTableRequest createTableRequest) {
+ super(icebergRequestContext, resourceIdentifier);
this.createTableRequest = createTableRequest;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
index 3b5c447bd..69f517676 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableEvent.java
@@ -28,8 +28,10 @@ public class IcebergDropTableEvent extends IcebergTableEvent
{
private boolean purgeRequested;
public IcebergDropTableEvent(
- String user, NameIdentifier resourceIdentifier, boolean purgeRequested) {
- super(user, resourceIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ boolean purgeRequested) {
+ super(icebergRequestContext, resourceIdentifier);
this.purgeRequested = purgeRequested;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
index e57ed35c5..8c58bc08f 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTableFailureEvent.java
@@ -28,8 +28,11 @@ public class IcebergDropTableFailureEvent extends
IcebergTableFailureEvent {
private boolean purgeRequested;
public IcebergDropTableFailureEvent(
- String user, NameIdentifier nameIdentifier, Boolean purgeRequested,
Exception e) {
- super(user, nameIdentifier, e);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier nameIdentifier,
+ Boolean purgeRequested,
+ Exception e) {
+ super(icebergRequestContext, nameIdentifier, e);
this.purgeRequested = purgeRequested;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
index 5e90a88ba..b8301229a 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergDropTablePreEvent.java
@@ -28,8 +28,10 @@ public class IcebergDropTablePreEvent extends
IcebergTablePreEvent {
private boolean purgeRequested;
public IcebergDropTablePreEvent(
- String user, NameIdentifier tableIdentifier, boolean purgeRequested) {
- super(user, tableIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier tableIdentifier,
+ boolean purgeRequested) {
+ super(icebergRequestContext, tableIdentifier);
this.purgeRequested = purgeRequested;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
index 50ec07863..51088faa8 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergEvent.java
@@ -25,7 +25,15 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represents an abstract post event in Gravitino Iceberg REST server. */
@DeveloperApi
public abstract class IcebergEvent extends Event {
- protected IcebergEvent(String user, NameIdentifier resourceIdentifier) {
- super(user, resourceIdentifier);
+ private IcebergRequestContext icebergRequestContext;
+
+ protected IcebergEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
resourceIdentifier) {
+ super(icebergRequestContext.userName(), resourceIdentifier);
+ this.icebergRequestContext = icebergRequestContext;
+ }
+
+ public IcebergRequestContext icebergRequestContext() {
+ return icebergRequestContext;
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
index e166bfdc9..b428e79bd 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergFailureEvent.java
@@ -25,7 +25,15 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represents an abstract failure event in Gravitino Iceberg REST server. */
@DeveloperApi
public abstract class IcebergFailureEvent extends FailureEvent {
- protected IcebergFailureEvent(String user, NameIdentifier nameIdentifier,
Exception e) {
- super(user, nameIdentifier, e);
+ private IcebergRequestContext icebergRequestContext;
+
+ protected IcebergFailureEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
nameIdentifier, Exception e) {
+ super(icebergRequestContext.userName(), nameIdentifier, e);
+ this.icebergRequestContext = icebergRequestContext;
+ }
+
+ public IcebergRequestContext icebergRequestContext() {
+ return icebergRequestContext;
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
index 22589d2cd..1e03c5d43 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableEvent.java
@@ -31,7 +31,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
*/
@DeveloperApi
public class IcebergListTableEvent extends IcebergTableEvent {
- public IcebergListTableEvent(String user, NameIdentifier resourceIdentifier)
{
- super(user, resourceIdentifier);
+ public IcebergListTableEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
resourceIdentifier) {
+ super(icebergRequestContext, resourceIdentifier);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
index 3cbda0f44..0047886cb 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTableFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a failure event when listing Iceberg table failed. */
@DeveloperApi
public class IcebergListTableFailureEvent extends IcebergTableFailureEvent {
- public IcebergListTableFailureEvent(String user, NameIdentifier
nameIdentifier, Exception e) {
- super(user, nameIdentifier, e);
+ public IcebergListTableFailureEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
nameIdentifier, Exception e) {
+ super(icebergRequestContext, nameIdentifier, e);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
index 7da059c7e..8657c8b2c 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergListTablePreEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a pre event before listing Iceberg table. */
@DeveloperApi
public class IcebergListTablePreEvent extends IcebergTablePreEvent {
- public IcebergListTablePreEvent(String user, NameIdentifier tableIdentifier)
{
- super(user, tableIdentifier);
+ public IcebergListTablePreEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
tableIdentifier) {
+ super(icebergRequestContext, tableIdentifier);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
index 7007fd706..16e5734c7 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableEvent.java
@@ -30,8 +30,10 @@ public class IcebergLoadTableEvent extends IcebergTableEvent
{
private LoadTableResponse loadTableResponse;
public IcebergLoadTableEvent(
- String user, NameIdentifier resourceIdentifier, LoadTableResponse
loadTableResponse) {
- super(user, resourceIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ LoadTableResponse loadTableResponse) {
+ super(icebergRequestContext, resourceIdentifier);
this.loadTableResponse =
IcebergRestUtils.cloneIcebergRESTObject(loadTableResponse,
LoadTableResponse.class);
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
index 03402583b..f4c4c881f 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTableFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a failure event when loading Iceberg table failed. */
@DeveloperApi
public class IcebergLoadTableFailureEvent extends IcebergTableFailureEvent {
- public IcebergLoadTableFailureEvent(String user, NameIdentifier
nameIdentifier, Exception e) {
- super(user, nameIdentifier, e);
+ public IcebergLoadTableFailureEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
nameIdentifier, Exception e) {
+ super(icebergRequestContext, nameIdentifier, e);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
index 9485b1b93..5c22884a4 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergLoadTablePreEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a pre event before loading Iceberg table. */
@DeveloperApi
public class IcebergLoadTablePreEvent extends IcebergTablePreEvent {
- public IcebergLoadTablePreEvent(String user, NameIdentifier tableIdentifier)
{
- super(user, tableIdentifier);
+ public IcebergLoadTablePreEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
tableIdentifier) {
+ super(icebergRequestContext, tableIdentifier);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
index e57edde65..dffe13685 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergPreEvent.java
@@ -25,7 +25,15 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represents an abstract pre event in Gravitino Iceberg REST server. */
@DeveloperApi
public abstract class IcebergPreEvent extends PreEvent {
- protected IcebergPreEvent(String user, NameIdentifier resourceIdentifier) {
- super(user, resourceIdentifier);
+ private IcebergRequestContext icebergRequestContext;
+
+ protected IcebergPreEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
resourceIdentifier) {
+ super(icebergRequestContext.userName(), resourceIdentifier);
+ this.icebergRequestContext = icebergRequestContext;
+ }
+
+ public IcebergRequestContext icebergRequestContext() {
+ return icebergRequestContext;
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
index 70b7ef4e9..f26b79714 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableEvent.java
@@ -30,8 +30,10 @@ public class IcebergRenameTableEvent extends
IcebergTableEvent {
private RenameTableRequest renameTableRequest;
public IcebergRenameTableEvent(
- String user, NameIdentifier resourceIdentifier, RenameTableRequest
renameTableRequest) {
- super(user, resourceIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ RenameTableRequest renameTableRequest) {
+ super(icebergRequestContext, resourceIdentifier);
this.renameTableRequest =
IcebergRestUtils.cloneIcebergRESTObject(renameTableRequest,
RenameTableRequest.class);
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
index 936e56d10..f64a85bac 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTableFailureEvent.java
@@ -29,11 +29,11 @@ public class IcebergRenameTableFailureEvent extends
IcebergTableFailureEvent {
private RenameTableRequest renameTableRequest;
public IcebergRenameTableFailureEvent(
- String user,
+ IcebergRequestContext icebergRequestContext,
NameIdentifier resourceIdentifier,
RenameTableRequest renameTableRequest,
Exception e) {
- super(user, resourceIdentifier, e);
+ super(icebergRequestContext, resourceIdentifier, e);
this.renameTableRequest = renameTableRequest;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
index 8b654ab03..579f23182 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRenameTablePreEvent.java
@@ -29,8 +29,10 @@ public class IcebergRenameTablePreEvent extends
IcebergTablePreEvent {
private RenameTableRequest renameTableRequest;
public IcebergRenameTablePreEvent(
- String user, NameIdentifier resourceIdentifier, RenameTableRequest
renameTableRequest) {
- super(user, resourceIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ RenameTableRequest renameTableRequest) {
+ super(icebergRequestContext, resourceIdentifier);
this.renameTableRequest = renameTableRequest;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRequestContext.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRequestContext.java
new file mode 100644
index 000000000..c0849a117
--- /dev/null
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergRequestContext.java
@@ -0,0 +1,98 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.listener.api.event;
+
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.gravitino.iceberg.service.IcebergRestUtils;
+import org.apache.gravitino.utils.PrincipalUtils;
+
+/** The general request context information for Iceberg REST operations. */
+public class IcebergRequestContext {
+
+ // To keep compatibility with old IcebergRequestContext, will remove in new
release.
+ @Deprecated private final HttpServletRequest httpServletRequest;
+ private final String catalogName;
+ private final String userName;
+ private final String remoteHostName;
+ private final Map<String, String> httpHeaders;
+
+ /**
+ * Constructs a new {@code IcebergRequestContext} with specified HTTP
request and catalog name.
+ *
+ * @param httpRequest The HttpServletRequest object containing request
details.
+ * @param catalogName The name of the catalog to be accessed in the request.
+ */
+ public IcebergRequestContext(HttpServletRequest httpRequest, String
catalogName) {
+ this.httpServletRequest = httpRequest;
+ this.remoteHostName = httpRequest.getRemoteHost();
+ this.httpHeaders = IcebergRestUtils.getHttpHeaders(httpRequest);
+ this.catalogName = catalogName;
+ this.userName = PrincipalUtils.getCurrentUserName();
+ }
+
+ /**
+ * Returns the catalog name.
+ *
+ * @return The catalog name.
+ */
+ public String catalogName() {
+ return catalogName;
+ }
+
+ /**
+ * Returns the username of the HTTP client.
+ *
+ * @return The username.
+ */
+ public String userName() {
+ return userName;
+ }
+
+ /**
+ * Returns the hostname of the HTTP client.
+ *
+ * @return The remote host name.
+ */
+ public String remoteHostName() {
+ return remoteHostName;
+ }
+
+ /**
+ * Returns the Map of the HTTP headers.
+ *
+ * @return The HTTP header.
+ */
+ public Map<String, String> httpHeaders() {
+ return httpHeaders;
+ }
+
+ /**
+ * Retrieves the HttpServletRequest object. This method is deprecated and
should be used
+ * cautiously.
+ *
+ * @return The HttpServletRequest associated with this context.
+ * @deprecated Use other methods to access specific request details instead.
+ */
+ @Deprecated
+ public HttpServletRequest getHttpServletRequest() {
+ return httpServletRequest;
+ }
+}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
index e94a1938c..adbe02497 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableEvent.java
@@ -23,7 +23,8 @@ import org.apache.gravitino.NameIdentifier;
/** Represents an abstract table post event in Gravitino Iceberg REST server.
*/
public abstract class IcebergTableEvent extends IcebergEvent {
- protected IcebergTableEvent(String user, NameIdentifier resourceIdentifier) {
- super(user, resourceIdentifier);
+ protected IcebergTableEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
resourceIdentifier) {
+ super(icebergRequestContext, resourceIdentifier);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
index 512deac06..4e54945f2 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsEvent.java
@@ -27,8 +27,11 @@ import org.apache.gravitino.annotation.DeveloperApi;
public class IcebergTableExistsEvent extends IcebergTableEvent {
private boolean isExists;
- public IcebergTableExistsEvent(String user, NameIdentifier
resourceIdentifier, boolean isExists) {
- super(user, resourceIdentifier);
+ public IcebergTableExistsEvent(
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ boolean isExists) {
+ super(icebergRequestContext, resourceIdentifier);
this.isExists = isExists;
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
index 04cb0d7e5..a482072c7 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a failure event when check Iceberg table exist failed. */
@DeveloperApi
public class IcebergTableExistsFailureEvent extends IcebergTableFailureEvent {
- public IcebergTableExistsFailureEvent(String user, NameIdentifier
nameIdentifier, Exception e) {
- super(user, nameIdentifier, e);
+ public IcebergTableExistsFailureEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
nameIdentifier, Exception e) {
+ super(icebergRequestContext, nameIdentifier, e);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
index bdd666776..87317c464 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableExistsPreEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a pre event before checking Iceberg table exists. */
@DeveloperApi
public class IcebergTableExistsPreEvent extends IcebergTablePreEvent {
- public IcebergTableExistsPreEvent(String user, NameIdentifier
tableIdentifier) {
- super(user, tableIdentifier);
+ public IcebergTableExistsPreEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
tableIdentifier) {
+ super(icebergRequestContext, tableIdentifier);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
index f052b0060..4e2187f1a 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTableFailureEvent.java
@@ -25,7 +25,8 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represent a failure event when do Iceberg table operation failed. */
@DeveloperApi
public class IcebergTableFailureEvent extends IcebergFailureEvent {
- protected IcebergTableFailureEvent(String user, NameIdentifier
nameIdentifier, Exception e) {
- super(user, nameIdentifier, e);
+ protected IcebergTableFailureEvent(
+ IcebergRequestContext icebergRequestContext, NameIdentifier
nameIdentifier, Exception e) {
+ super(icebergRequestContext, nameIdentifier, e);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
index 486c6f094..3e7bcaf50 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergTablePreEvent.java
@@ -25,7 +25,7 @@ import org.apache.gravitino.annotation.DeveloperApi;
/** Represents an abstract table pre event in Gravitino Iceberg REST server. */
@DeveloperApi
public abstract class IcebergTablePreEvent extends IcebergPreEvent {
- protected IcebergTablePreEvent(String user, NameIdentifier
resourceIdentifier) {
- super(user, resourceIdentifier);
+ protected IcebergTablePreEvent(IcebergRequestContext context, NameIdentifier
resourceIdentifier) {
+ super(context, resourceIdentifier);
}
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
index 82ea7732f..7e675213a 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableEvent.java
@@ -33,11 +33,11 @@ public class IcebergUpdateTableEvent extends
IcebergTableEvent {
private LoadTableResponse loadTableResponse;
public IcebergUpdateTableEvent(
- String user,
+ IcebergRequestContext icebergRequestContext,
NameIdentifier resourceIdentifier,
UpdateTableRequest updateTableRequest,
LoadTableResponse loadTableResponse) {
- super(user, resourceIdentifier);
+ super(icebergRequestContext, resourceIdentifier);
this.updateTableRequest =
IcebergRestUtils.cloneIcebergRESTObject(updateTableRequest,
UpdateTableRequest.class);
this.loadTableResponse =
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
index 7f5b478ce..7624e248e 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTableFailureEvent.java
@@ -30,11 +30,11 @@ public class IcebergUpdateTableFailureEvent extends
IcebergTableFailureEvent {
private UpdateTableRequest updateTableRequest;
public IcebergUpdateTableFailureEvent(
- String user,
+ IcebergRequestContext icebergRequestContext,
NameIdentifier nameIdentifier,
UpdateTableRequest updateTableRequest,
Exception e) {
- super(user, nameIdentifier, e);
+ super(icebergRequestContext, nameIdentifier, e);
this.updateTableRequest =
IcebergRestUtils.cloneIcebergRESTObject(updateTableRequest,
UpdateTableRequest.class);
}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
index 4681efbdb..a877a72fc 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
+++
b/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/listener/api/event/IcebergUpdateTablePreEvent.java
@@ -29,8 +29,10 @@ public class IcebergUpdateTablePreEvent extends
IcebergTablePreEvent {
private UpdateTableRequest updateTableRequest;
public IcebergUpdateTablePreEvent(
- String user, NameIdentifier resourceIdentifier, UpdateTableRequest
updateTableRequest) {
- super(user, resourceIdentifier);
+ IcebergRequestContext icebergRequestContext,
+ NameIdentifier resourceIdentifier,
+ UpdateTableRequest updateTableRequest) {
+ super(icebergRequestContext, resourceIdentifier);
this.updateTableRequest = updateTableRequest;
}
diff --git
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/DummyEventListener.java
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/DummyEventListener.java
new file mode 100644
index 000000000..84f96402f
--- /dev/null
+++
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/DummyEventListener.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.iceberg.service.rest;
+
+import java.util.LinkedList;
+import java.util.Map;
+import org.apache.gravitino.listener.api.EventListenerPlugin;
+import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.PreEvent;
+import org.junit.jupiter.api.Assertions;
+
+public class DummyEventListener implements EventListenerPlugin {
+ Map<String, String> properties;
+ LinkedList<Event> postEvents = new LinkedList<>();
+ LinkedList<PreEvent> preEvents = new LinkedList<>();
+
+ @Override
+ public void init(Map<String, String> properties) {
+ this.properties = properties;
+ }
+
+ @Override
+ public void start() {}
+
+ @Override
+ public void stop() {}
+
+ @Override
+ public void onPostEvent(Event event) {
+ postEvents.add(event);
+ }
+
+ @Override
+ public void onPreEvent(PreEvent preEvent) {
+ preEvents.add(preEvent);
+ }
+
+ @Override
+ public Mode mode() {
+ return Mode.SYNC;
+ }
+
+ public Event popPostEvent() {
+ Assertions.assertTrue(postEvents.size() > 0, "No post events to pop");
+ return postEvents.removeLast();
+ }
+
+ public PreEvent popPreEvent() {
+ Assertions.assertTrue(preEvents.size() > 0, "No pre events to pop");
+ return preEvents.removeLast();
+ }
+
+ public void clearEvent() {
+ preEvents.clear();
+ postEvents.clear();
+ }
+}
diff --git
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
index 1314a3bac..a2ee3d888 100644
---
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
+++
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/IcebergRestTestUtil.java
@@ -19,11 +19,17 @@
package org.apache.gravitino.iceberg.service.rest;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
import com.google.common.collect.Maps;
import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
+import javax.servlet.http.HttpServletRequest;
import org.apache.gravitino.catalog.lakehouse.iceberg.IcebergConstants;
import org.apache.gravitino.credential.CredentialConstants;
import org.apache.gravitino.iceberg.common.IcebergConfig;
@@ -39,6 +45,7 @@ import
org.apache.gravitino.iceberg.service.provider.IcebergConfigProvider;
import
org.apache.gravitino.iceberg.service.provider.IcebergConfigProviderFactory;
import
org.apache.gravitino.iceberg.service.provider.StaticIcebergConfigProvider;
import org.apache.gravitino.listener.EventBus;
+import org.apache.gravitino.listener.api.EventListenerPlugin;
import org.glassfish.hk2.utilities.binding.AbstractBinder;
import org.glassfish.jersey.jackson.JacksonFeature;
import org.glassfish.jersey.logging.LoggingFeature;
@@ -64,10 +71,11 @@ public class IcebergRestTestUtil {
public static final boolean DEBUG_SERVER_LOG_ENABLED = true;
public static ResourceConfig getIcebergResourceConfig(Class c) {
- return getIcebergResourceConfig(c, true);
+ return getIcebergResourceConfig(c, true, Arrays.asList());
}
- public static ResourceConfig getIcebergResourceConfig(Class c, boolean
bindIcebergTableOps) {
+ public static ResourceConfig getIcebergResourceConfig(
+ Class c, boolean bindIcebergTableOps, List<EventListenerPlugin>
eventListenerPlugins) {
ResourceConfig resourceConfig = new ResourceConfig();
resourceConfig.register(c);
resourceConfig.register(IcebergObjectMapperProvider.class).register(JacksonFeature.class);
@@ -98,7 +106,7 @@ public class IcebergRestTestUtil {
IcebergCatalogWrapperManager icebergCatalogWrapperManager =
new IcebergCatalogWrapperManagerForTest(catalogConf, configProvider);
- EventBus eventBus = new EventBus(Arrays.asList());
+ EventBus eventBus = new EventBus(eventListenerPlugins);
IcebergTableOperationExecutor icebergTableOperationExecutor =
new IcebergTableOperationExecutor(icebergCatalogWrapperManager);
@@ -119,4 +127,11 @@ public class IcebergRestTestUtil {
}
return resourceConfig;
}
+
+ static HttpServletRequest createMockHttpRequest() {
+ HttpServletRequest mockRequest = mock(HttpServletRequest.class);
+ when(mockRequest.getRemoteHost()).thenReturn("localhost");
+
when(mockRequest.getHeaderNames()).thenReturn(Collections.emptyEnumeration());
+ return mockRequest;
+ }
}
diff --git
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableOperations.java
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableOperations.java
new file mode 100644
index 000000000..9b9bd9306
--- /dev/null
+++
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableOperations.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.gravitino.iceberg.service.rest;
+
+import javax.inject.Inject;
+import javax.servlet.http.HttpServletRequest;
+import org.apache.gravitino.iceberg.service.IcebergCatalogWrapperManager;
+import
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
+import org.apache.gravitino.iceberg.service.metrics.IcebergMetricsManager;
+
+public class MockIcebergTableOperations extends IcebergTableOperations {
+
+ @Inject
+ public MockIcebergTableOperations(
+ IcebergCatalogWrapperManager icebergCatalogWrapperManager,
+ IcebergMetricsManager icebergMetricsManager,
+ IcebergTableOperationDispatcher tableOperationDispatcher) {
+ super(icebergCatalogWrapperManager, icebergMetricsManager,
tableOperationDispatcher);
+ }
+
+ // HTTP request is null in Jersey test, create a mock request
+ @Override
+ HttpServletRequest httpServletRequest() {
+ return IcebergRestTestUtil.createMockHttpRequest();
+ }
+}
diff --git
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRequestContext.java
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableRenameOperations.java
similarity index 59%
rename from
iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRequestContext.java
rename to
iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableRenameOperations.java
index ad8d7692f..8a71b8d70 100644
---
a/iceberg/iceberg-rest-server/src/main/java/org/apache/gravitino/iceberg/service/IcebergRequestContext.java
+++
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/MockIcebergTableRenameOperations.java
@@ -17,18 +17,22 @@
* under the License.
*/
-package org.apache.gravitino.iceberg.service;
+package org.apache.gravitino.iceberg.service.rest;
+import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
-import lombok.Getter;
+import
org.apache.gravitino.iceberg.service.dispatcher.IcebergTableOperationDispatcher;
-/** The general request context information for Iceberg REST operations. */
-public class IcebergRequestContext {
- @Getter private final HttpServletRequest httpRequest;
- @Getter private final String catalogName;
+public class MockIcebergTableRenameOperations extends
IcebergTableRenameOperations {
+ @Inject
+ public MockIcebergTableRenameOperations(
+ IcebergTableOperationDispatcher tableOperationDispatcher) {
+ super(tableOperationDispatcher);
+ }
- public IcebergRequestContext(HttpServletRequest httpRequest, String
catalogName) {
- this.httpRequest = httpRequest;
- this.catalogName = catalogName;
+ // HTTP request is null in Jersey test, create a mock request
+ @Override
+ HttpServletRequest httpServletRequest() {
+ return IcebergRestTestUtil.createMockHttpRequest();
}
}
diff --git
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
index 809a4ff2c..59822d4bf 100644
---
a/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
+++
b/iceberg/iceberg-rest-server/src/test/java/org/apache/gravitino/iceberg/service/rest/TestIcebergTableOperations.java
@@ -20,6 +20,7 @@
package org.apache.gravitino.iceberg.service.rest;
import com.google.common.collect.ImmutableSet;
+import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -31,6 +32,27 @@ import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import org.apache.gravitino.credential.Credential;
import org.apache.gravitino.iceberg.service.extension.DummyCredentialProvider;
+import org.apache.gravitino.listener.api.event.Event;
+import org.apache.gravitino.listener.api.event.IcebergCreateTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergCreateTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergCreateTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergDropTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergDropTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergDropTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergListTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergListTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergListTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergLoadTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergLoadTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergLoadTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergRenameTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergRenameTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergRenameTablePreEvent;
+import org.apache.gravitino.listener.api.event.IcebergTableExistsEvent;
+import org.apache.gravitino.listener.api.event.IcebergTableExistsPreEvent;
+import org.apache.gravitino.listener.api.event.IcebergUpdateTableEvent;
+import org.apache.gravitino.listener.api.event.IcebergUpdateTableFailureEvent;
+import org.apache.gravitino.listener.api.event.IcebergUpdateTablePreEvent;
import org.apache.iceberg.MetadataUpdate;
import org.apache.iceberg.Schema;
import org.apache.iceberg.TableMetadata;
@@ -63,13 +85,17 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
private static final Schema newTableSchema =
new Schema(NestedField.of(2, false, "foo_string1", StringType.get()));
+ private DummyEventListener dummyEventListener;
+
@Override
protected Application configure() {
+ this.dummyEventListener = new DummyEventListener();
ResourceConfig resourceConfig =
-
IcebergRestTestUtil.getIcebergResourceConfig(IcebergTableOperations.class);
+ IcebergRestTestUtil.getIcebergResourceConfig(
+ MockIcebergTableOperations.class, true,
Arrays.asList(dummyEventListener));
// create namespace before each table test
resourceConfig.register(IcebergNamespaceOperations.class);
- resourceConfig.register(IcebergTableRenameOperations.class);
+ resourceConfig.register(MockIcebergTableRenameOperations.class);
return resourceConfig;
}
@@ -77,10 +103,15 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
@Test
void testCreateTable() {
verifyCreateTableFail("create_foo1", 404);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergCreateTablePreEvent);
+ Assertions.assertTrue(
+ dummyEventListener.popPostEvent() instanceof
IcebergCreateTableFailureEvent);
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyCreateTableSucc("create_foo1");
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergCreateTablePreEvent);
+ Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof
IcebergCreateTableEvent);
verifyCreateTableFail("create_foo1", 409);
verifyCreateTableFail("", 400);
@@ -89,10 +120,17 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
@Test
void testLoadTable() {
verifyLoadTableFail("load_foo1", 404);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergLoadTablePreEvent);
+ Assertions.assertTrue(
+ dummyEventListener.popPostEvent() instanceof
IcebergLoadTableFailureEvent);
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyCreateTableSucc("load_foo1");
+
+ dummyEventListener.clearEvent();
verifyLoadTableSucc("load_foo1");
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergLoadTablePreEvent);
+ Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof
IcebergLoadTableEvent);
verifyLoadTableFail("load_foo2", 404);
}
@@ -100,11 +138,20 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
@Test
void testDropTable() {
verifyDropTableFail("drop_foo1", 404);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergDropTablePreEvent);
+ Assertions.assertTrue(
+ dummyEventListener.popPostEvent() instanceof
IcebergDropTableFailureEvent);
+
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyDropTableFail("drop_foo1", 404);
verifyCreateTableSucc("drop_foo1");
+
+ dummyEventListener.clearEvent();
verifyDropTableSucc("drop_foo1");
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergDropTablePreEvent);
+ Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof
IcebergDropTableEvent);
+
verifyLoadTableFail("drop_foo1", 404);
}
@@ -113,10 +160,19 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyCreateTableSucc("update_foo1");
TableMetadata metadata = getTableMeta("update_foo1");
+
+ dummyEventListener.clearEvent();
verifyUpdateSucc("update_foo1", metadata);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergUpdateTablePreEvent);
+ Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof
IcebergUpdateTableEvent);
verifyDropTableSucc("update_foo1");
+
+ dummyEventListener.clearEvent();
verifyUpdateTableFail("update_foo1", 404, metadata);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergUpdateTablePreEvent);
+ Assertions.assertTrue(
+ dummyEventListener.popPostEvent() instanceof
IcebergUpdateTableFailureEvent);
verifyDropNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyUpdateTableFail("update_foo1", 404, metadata);
@@ -127,21 +183,39 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
void testListTables(String prefix) {
setUrlPathWithPrefix(prefix);
verifyListTableFail(404);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergListTablePreEvent);
+ Assertions.assertTrue(
+ dummyEventListener.popPostEvent() instanceof
IcebergListTableFailureEvent);
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyCreateTableSucc("list_foo1");
verifyCreateTableSucc("list_foo2");
+
+ dummyEventListener.clearEvent();
verifyListTableSucc(ImmutableSet.of("list_foo1", "list_foo2"));
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergListTablePreEvent);
+ Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof
IcebergListTableEvent);
}
@Test
void testTableExits() {
verifyTableExistsStatusCode("exists_foo2", 404);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergTableExistsPreEvent);
+ Event postEvent = dummyEventListener.popPostEvent();
+ Assertions.assertTrue(postEvent instanceof IcebergTableExistsEvent);
+ Assertions.assertEquals(false, ((IcebergTableExistsEvent)
postEvent).isExists());
+
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyTableExistsStatusCode("exists_foo2", 404);
verifyCreateTableSucc("exists_foo1");
+ dummyEventListener.clearEvent();
verifyTableExistsStatusCode("exists_foo1", 200);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergTableExistsPreEvent);
+ postEvent = dummyEventListener.popPostEvent();
+ Assertions.assertTrue(postEvent instanceof IcebergTableExistsEvent);
+ Assertions.assertEquals(true, ((IcebergTableExistsEvent)
postEvent).isExists());
+
verifyLoadTableSucc("exists_foo1");
}
@@ -151,11 +225,19 @@ public class TestIcebergTableOperations extends
TestIcebergNamespaceOperations {
setUrlPathWithPrefix(prefix);
// namespace not exits
verifyRenameTableFail("rename_foo1", "rename_foo3", 404);
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergRenameTablePreEvent);
+ Assertions.assertTrue(
+ dummyEventListener.popPostEvent() instanceof
IcebergRenameTableFailureEvent);
verifyCreateNamespaceSucc(IcebergRestTestUtil.TEST_NAMESPACE_NAME);
verifyCreateTableSucc("rename_foo1");
+
+ dummyEventListener.clearEvent();
// rename
verifyRenameTableSucc("rename_foo1", "rename_foo2");
+ Assertions.assertTrue(dummyEventListener.popPreEvent() instanceof
IcebergRenameTablePreEvent);
+ Assertions.assertTrue(dummyEventListener.popPostEvent() instanceof
IcebergRenameTableEvent);
+
verifyLoadTableFail("rename_foo1", 404);
verifyLoadTableSucc("rename_foo2");