This is an automated email from the ASF dual-hosted git repository.
singhpk234 pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/polaris.git
The following commit(s) were added to refs/heads/main by this push:
new b8d210a0a Add Events for Policy Service APIs (#2479)
b8d210a0a is described below
commit b8d210a0a6b6322f32ccf33e1eb9851a7e3f94c0
Author: Adnan Hemani <[email protected]>
AuthorDate: Fri Sep 5 15:47:05 2025 -0700
Add Events for Policy Service APIs (#2479)
---
.../policy/CatalogPolicyEventServiceDelegator.java | 124 +++++++++++++++++----
.../service/events/CatalogPolicyServiceEvents.java | 101 +++++++++++++++++
.../events/listeners/PolarisEventListener.java | 52 +++++++++
3 files changed, 255 insertions(+), 22 deletions(-)
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/policy/CatalogPolicyEventServiceDelegator.java
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/policy/CatalogPolicyEventServiceDelegator.java
index 959de17ba..2bf671db2 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/catalog/policy/CatalogPolicyEventServiceDelegator.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/catalog/policy/CatalogPolicyEventServiceDelegator.java
@@ -26,11 +26,16 @@ import jakarta.inject.Inject;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.SecurityContext;
import org.apache.polaris.core.context.RealmContext;
+import org.apache.polaris.service.catalog.CatalogPrefixParser;
import org.apache.polaris.service.catalog.api.PolarisCatalogPolicyApiService;
import org.apache.polaris.service.catalog.common.CatalogAdapter;
+import org.apache.polaris.service.events.CatalogPolicyServiceEvents;
+import org.apache.polaris.service.events.listeners.PolarisEventListener;
import org.apache.polaris.service.types.AttachPolicyRequest;
import org.apache.polaris.service.types.CreatePolicyRequest;
import org.apache.polaris.service.types.DetachPolicyRequest;
+import org.apache.polaris.service.types.GetApplicablePoliciesResponse;
+import org.apache.polaris.service.types.LoadPolicyResponse;
import org.apache.polaris.service.types.UpdatePolicyRequest;
@Decorator
@@ -39,6 +44,8 @@ public class CatalogPolicyEventServiceDelegator
implements PolarisCatalogPolicyApiService, CatalogAdapter {
@Inject @Delegate PolicyCatalogAdapter delegate;
+ @Inject PolarisEventListener polarisEventListener;
+ @Inject CatalogPrefixParser prefixParser;
@Override
public Response createPolicy(
@@ -47,8 +54,17 @@ public class CatalogPolicyEventServiceDelegator
CreatePolicyRequest createPolicyRequest,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.createPolicy(
- prefix, namespace, createPolicyRequest, realmContext, securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeCreatePolicy(
+ new CatalogPolicyServiceEvents.BeforeCreatePolicyEvent(
+ catalogName, namespace, createPolicyRequest));
+ Response resp =
+ delegate.createPolicy(
+ prefix, namespace, createPolicyRequest, realmContext,
securityContext);
+ polarisEventListener.onAfterCreatePolicy(
+ new CatalogPolicyServiceEvents.AfterCreatePolicyEvent(
+ catalogName, namespace, (LoadPolicyResponse) resp.getEntity()));
+ return resp;
}
@Override
@@ -60,8 +76,15 @@ public class CatalogPolicyEventServiceDelegator
String policyType,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.listPolicies(
- prefix, namespace, pageToken, pageSize, policyType, realmContext,
securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeListPolicies(
+ new CatalogPolicyServiceEvents.BeforeListPoliciesEvent(catalogName,
namespace, policyType));
+ Response resp =
+ delegate.listPolicies(
+ prefix, namespace, pageToken, pageSize, policyType, realmContext,
securityContext);
+ polarisEventListener.onAfterListPolicies(
+ new CatalogPolicyServiceEvents.AfterListPoliciesEvent(catalogName,
namespace, policyType));
+ return resp;
}
@Override
@@ -71,7 +94,15 @@ public class CatalogPolicyEventServiceDelegator
String policyName,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.loadPolicy(prefix, namespace, policyName, realmContext,
securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeLoadPolicy(
+ new CatalogPolicyServiceEvents.BeforeLoadPolicyEvent(catalogName,
namespace, policyName));
+ Response resp =
+ delegate.loadPolicy(prefix, namespace, policyName, realmContext,
securityContext);
+ polarisEventListener.onAfterLoadPolicy(
+ new CatalogPolicyServiceEvents.AfterLoadPolicyEvent(
+ catalogName, namespace, (LoadPolicyResponse) resp.getEntity()));
+ return resp;
}
@Override
@@ -82,8 +113,17 @@ public class CatalogPolicyEventServiceDelegator
UpdatePolicyRequest updatePolicyRequest,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.updatePolicy(
- prefix, namespace, policyName, updatePolicyRequest, realmContext,
securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeUpdatePolicy(
+ new CatalogPolicyServiceEvents.BeforeUpdatePolicyEvent(
+ catalogName, namespace, policyName, updatePolicyRequest));
+ Response resp =
+ delegate.updatePolicy(
+ prefix, namespace, policyName, updatePolicyRequest, realmContext,
securityContext);
+ polarisEventListener.onAfterUpdatePolicy(
+ new CatalogPolicyServiceEvents.AfterUpdatePolicyEvent(
+ catalogName, namespace, (LoadPolicyResponse) resp.getEntity()));
+ return resp;
}
@Override
@@ -94,8 +134,17 @@ public class CatalogPolicyEventServiceDelegator
Boolean detachAll,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.dropPolicy(
- prefix, namespace, policyName, detachAll, realmContext,
securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeDropPolicy(
+ new CatalogPolicyServiceEvents.BeforeDropPolicyEvent(
+ catalogName, namespace, policyName, detachAll));
+ Response resp =
+ delegate.dropPolicy(
+ prefix, namespace, policyName, detachAll, realmContext,
securityContext);
+ polarisEventListener.onAfterDropPolicy(
+ new CatalogPolicyServiceEvents.AfterDropPolicyEvent(
+ catalogName, namespace, policyName, detachAll));
+ return resp;
}
@Override
@@ -106,8 +155,17 @@ public class CatalogPolicyEventServiceDelegator
AttachPolicyRequest attachPolicyRequest,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.attachPolicy(
- prefix, namespace, policyName, attachPolicyRequest, realmContext,
securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeAttachPolicy(
+ new CatalogPolicyServiceEvents.BeforeAttachPolicyEvent(
+ catalogName, namespace, policyName, attachPolicyRequest));
+ Response resp =
+ delegate.attachPolicy(
+ prefix, namespace, policyName, attachPolicyRequest, realmContext,
securityContext);
+ polarisEventListener.onAfterAttachPolicy(
+ new CatalogPolicyServiceEvents.AfterAttachPolicyEvent(
+ catalogName, namespace, policyName, attachPolicyRequest));
+ return resp;
}
@Override
@@ -118,8 +176,17 @@ public class CatalogPolicyEventServiceDelegator
DetachPolicyRequest detachPolicyRequest,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.detachPolicy(
- prefix, namespace, policyName, detachPolicyRequest, realmContext,
securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeDetachPolicy(
+ new CatalogPolicyServiceEvents.BeforeDetachPolicyEvent(
+ catalogName, namespace, policyName, detachPolicyRequest));
+ Response resp =
+ delegate.detachPolicy(
+ prefix, namespace, policyName, detachPolicyRequest, realmContext,
securityContext);
+ polarisEventListener.onAfterDetachPolicy(
+ new CatalogPolicyServiceEvents.AfterDetachPolicyEvent(
+ catalogName, namespace, policyName, detachPolicyRequest));
+ return resp;
}
@Override
@@ -132,14 +199,27 @@ public class CatalogPolicyEventServiceDelegator
String policyType,
RealmContext realmContext,
SecurityContext securityContext) {
- return delegate.getApplicablePolicies(
- prefix,
- pageToken,
- pageSize,
- namespace,
- targetName,
- policyType,
- realmContext,
- securityContext);
+ String catalogName = prefixParser.prefixToCatalogName(realmContext,
prefix);
+ polarisEventListener.onBeforeGetApplicablePolicies(
+ new CatalogPolicyServiceEvents.BeforeGetApplicablePoliciesEvent(
+ catalogName, namespace, targetName, policyType));
+ Response resp =
+ delegate.getApplicablePolicies(
+ prefix,
+ pageToken,
+ pageSize,
+ namespace,
+ targetName,
+ policyType,
+ realmContext,
+ securityContext);
+ polarisEventListener.onAfterGetApplicablePolicies(
+ new CatalogPolicyServiceEvents.AfterGetApplicablePoliciesEvent(
+ catalogName,
+ namespace,
+ targetName,
+ policyType,
+ (GetApplicablePoliciesResponse) resp.getEntity()));
+ return resp;
}
}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/events/CatalogPolicyServiceEvents.java
b/runtime/service/src/main/java/org/apache/polaris/service/events/CatalogPolicyServiceEvents.java
new file mode 100644
index 000000000..a550ed10d
--- /dev/null
+++
b/runtime/service/src/main/java/org/apache/polaris/service/events/CatalogPolicyServiceEvents.java
@@ -0,0 +1,101 @@
+/*
+ * 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.polaris.service.events;
+
+import org.apache.polaris.service.types.AttachPolicyRequest;
+import org.apache.polaris.service.types.CreatePolicyRequest;
+import org.apache.polaris.service.types.DetachPolicyRequest;
+import org.apache.polaris.service.types.GetApplicablePoliciesResponse;
+import org.apache.polaris.service.types.LoadPolicyResponse;
+import org.apache.polaris.service.types.UpdatePolicyRequest;
+
+/**
+ * Event records for Catalog Policy operations. Each operation has
corresponding "Before" and
+ * "After" event records.
+ */
+public class CatalogPolicyServiceEvents {
+
+ // Policy CRUD Events
+ public record BeforeCreatePolicyEvent(
+ String catalogName, String namespace, CreatePolicyRequest
createPolicyRequest) {}
+
+ public record AfterCreatePolicyEvent(
+ String catalogName, String namespace, LoadPolicyResponse
loadPolicyResponse) {}
+
+ public record BeforeListPoliciesEvent(String catalogName, String namespace,
String policyType) {}
+
+ public record AfterListPoliciesEvent(String catalogName, String namespace,
String policyType) {}
+
+ public record BeforeLoadPolicyEvent(String catalogName, String namespace,
String policyName) {}
+
+ public record AfterLoadPolicyEvent(
+ String catalogName, String namespace, LoadPolicyResponse
loadPolicyResponse) {}
+
+ public record BeforeUpdatePolicyEvent(
+ String catalogName,
+ String namespace,
+ String policyName,
+ UpdatePolicyRequest updatePolicyRequest) {}
+
+ public record AfterUpdatePolicyEvent(
+ String catalogName, String namespace, LoadPolicyResponse
loadPolicyResponse) {}
+
+ public record BeforeDropPolicyEvent(
+ String catalogName, String namespace, String policyName, Boolean
detachAll) {}
+
+ public record AfterDropPolicyEvent(
+ String catalogName, String namespace, String policyName, Boolean
detachAll) {}
+
+ // Policy Attachment Events
+ public record BeforeAttachPolicyEvent(
+ String catalogName,
+ String namespace,
+ String policyName,
+ AttachPolicyRequest attachPolicyRequest) {}
+
+ public record AfterAttachPolicyEvent(
+ String catalogName,
+ String namespace,
+ String policyName,
+ AttachPolicyRequest attachPolicyRequest) {}
+
+ public record BeforeDetachPolicyEvent(
+ String catalogName,
+ String namespace,
+ String policyName,
+ DetachPolicyRequest detachPolicyRequest) {}
+
+ public record AfterDetachPolicyEvent(
+ String catalogName,
+ String namespace,
+ String policyName,
+ DetachPolicyRequest detachPolicyRequest) {}
+
+ // Policy Query Events
+ public record BeforeGetApplicablePoliciesEvent(
+ String catalogName, String namespace, String targetName, String
policyType) {}
+
+ public record AfterGetApplicablePoliciesEvent(
+ String catalogName,
+ String namespace,
+ String targetName,
+ String policyType,
+ GetApplicablePoliciesResponse getApplicablePoliciesResponse) {}
+}
diff --git
a/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/PolarisEventListener.java
b/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/PolarisEventListener.java
index 1c72a0904..5e1122d25 100644
---
a/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/PolarisEventListener.java
+++
b/runtime/service/src/main/java/org/apache/polaris/service/events/listeners/PolarisEventListener.java
@@ -32,6 +32,7 @@ import
org.apache.polaris.service.events.BeforeTaskAttemptedEvent;
import org.apache.polaris.service.events.BeforeViewCommitedEvent;
import org.apache.polaris.service.events.BeforeViewRefreshedEvent;
import org.apache.polaris.service.events.CatalogGenericTableServiceEvents;
+import org.apache.polaris.service.events.CatalogPolicyServiceEvents;
/**
* Represents an event listener that can respond to notable moments during
Polaris's execution.
@@ -78,6 +79,57 @@ public abstract class PolarisEventListener {
/** {@link AfterCatalogCreatedEvent} */
public void onAfterCatalogCreated(AfterCatalogCreatedEvent event) {}
+ // Catalog Policy Service Events
+ /** {@link CatalogPolicyServiceEvents.BeforeCreatePolicyEvent} */
+ public void
onBeforeCreatePolicy(CatalogPolicyServiceEvents.BeforeCreatePolicyEvent event)
{}
+
+ /** {@link CatalogPolicyServiceEvents.AfterCreatePolicyEvent} */
+ public void
onAfterCreatePolicy(CatalogPolicyServiceEvents.AfterCreatePolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeListPoliciesEvent} */
+ public void
onBeforeListPolicies(CatalogPolicyServiceEvents.BeforeListPoliciesEvent event)
{}
+
+ /** {@link CatalogPolicyServiceEvents.AfterListPoliciesEvent} */
+ public void
onAfterListPolicies(CatalogPolicyServiceEvents.AfterListPoliciesEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeLoadPolicyEvent} */
+ public void
onBeforeLoadPolicy(CatalogPolicyServiceEvents.BeforeLoadPolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.AfterLoadPolicyEvent} */
+ public void
onAfterLoadPolicy(CatalogPolicyServiceEvents.AfterLoadPolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeUpdatePolicyEvent} */
+ public void
onBeforeUpdatePolicy(CatalogPolicyServiceEvents.BeforeUpdatePolicyEvent event)
{}
+
+ /** {@link CatalogPolicyServiceEvents.AfterUpdatePolicyEvent} */
+ public void
onAfterUpdatePolicy(CatalogPolicyServiceEvents.AfterUpdatePolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeDropPolicyEvent} */
+ public void
onBeforeDropPolicy(CatalogPolicyServiceEvents.BeforeDropPolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.AfterDropPolicyEvent} */
+ public void
onAfterDropPolicy(CatalogPolicyServiceEvents.AfterDropPolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeAttachPolicyEvent} */
+ public void
onBeforeAttachPolicy(CatalogPolicyServiceEvents.BeforeAttachPolicyEvent event)
{}
+
+ /** {@link CatalogPolicyServiceEvents.AfterAttachPolicyEvent} */
+ public void
onAfterAttachPolicy(CatalogPolicyServiceEvents.AfterAttachPolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeDetachPolicyEvent} */
+ public void
onBeforeDetachPolicy(CatalogPolicyServiceEvents.BeforeDetachPolicyEvent event)
{}
+
+ /** {@link CatalogPolicyServiceEvents.AfterDetachPolicyEvent} */
+ public void
onAfterDetachPolicy(CatalogPolicyServiceEvents.AfterDetachPolicyEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.BeforeGetApplicablePoliciesEvent} */
+ public void onBeforeGetApplicablePolicies(
+ CatalogPolicyServiceEvents.BeforeGetApplicablePoliciesEvent event) {}
+
+ /** {@link CatalogPolicyServiceEvents.AfterGetApplicablePoliciesEvent} */
+ public void onAfterGetApplicablePolicies(
+ CatalogPolicyServiceEvents.AfterGetApplicablePoliciesEvent event) {}
+
/** {@link CatalogGenericTableServiceEvents.BeforeCreateGenericTableEvent} */
public void onBeforeCreateGenericTable(
CatalogGenericTableServiceEvents.BeforeCreateGenericTableEvent event) {}