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 <adna...@berkeley.edu> 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) {}