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 1a08d54df [#5552] feat(core): add metalake pre event to Gravitino 
event (#5583)
1a08d54df is described below

commit 1a08d54df906ba743b466de464dec62d976e0892
Author: Qiang-Liu <[email protected]>
AuthorDate: Thu Nov 21 12:11:11 2024 +0800

    [#5552] feat(core): add metalake pre event to Gravitino event (#5583)
    
    ### What changes were proposed in this pull request?
    
    1. add corresponding MetalakePreEvent
    2. generate pre-event in MetalakeEventDispatcher
    3. add test in TestMetalakeEvent
    4. add a document in gravitino-server-config.md
    
    ### Why are the changes needed?
    
    Fix: #5552
    
    
    ### Does this PR introduce _any_ user-facing change?
    
    no
    
    ### How was this patch tested?
    
    (Please test your changes, and provide instructions on how to test it:
    
    UT
---
 .../listener/MetalakeEventDispatcher.java          | 14 +++++++
 .../listener/api/event/AlterMetalakePreEvent.java  | 46 ++++++++++++++++++++++
 .../listener/api/event/CreateMetalakePreEvent.java | 45 +++++++++++++++++++++
 .../listener/api/event/DropMetalakePreEvent.java   | 31 +++++++++++++++
 .../listener/api/event/ListMetalakePreEvent.java   | 30 ++++++++++++++
 .../listener/api/event/LoadMetalakePreEvent.java   | 31 +++++++++++++++
 .../listener/api/event/MetalakePreEvent.java       | 32 +++++++++++++++
 .../listener/api/event/TestMetalakeEvent.java      | 21 ++++++++++
 docs/gravitino-server-config.md                    |  1 +
 9 files changed, 251 insertions(+)

diff --git 
a/core/src/main/java/org/apache/gravitino/listener/MetalakeEventDispatcher.java 
b/core/src/main/java/org/apache/gravitino/listener/MetalakeEventDispatcher.java
index 535d337b3..0ff109a48 100644
--- 
a/core/src/main/java/org/apache/gravitino/listener/MetalakeEventDispatcher.java
+++ 
b/core/src/main/java/org/apache/gravitino/listener/MetalakeEventDispatcher.java
@@ -29,14 +29,19 @@ import 
org.apache.gravitino.exceptions.NoSuchMetalakeException;
 import org.apache.gravitino.exceptions.NonEmptyEntityException;
 import org.apache.gravitino.listener.api.event.AlterMetalakeEvent;
 import org.apache.gravitino.listener.api.event.AlterMetalakeFailureEvent;
+import org.apache.gravitino.listener.api.event.AlterMetalakePreEvent;
 import org.apache.gravitino.listener.api.event.CreateMetalakeEvent;
 import org.apache.gravitino.listener.api.event.CreateMetalakeFailureEvent;
+import org.apache.gravitino.listener.api.event.CreateMetalakePreEvent;
 import org.apache.gravitino.listener.api.event.DropMetalakeEvent;
 import org.apache.gravitino.listener.api.event.DropMetalakeFailureEvent;
+import org.apache.gravitino.listener.api.event.DropMetalakePreEvent;
 import org.apache.gravitino.listener.api.event.ListMetalakeEvent;
 import org.apache.gravitino.listener.api.event.ListMetalakeFailureEvent;
+import org.apache.gravitino.listener.api.event.ListMetalakePreEvent;
 import org.apache.gravitino.listener.api.event.LoadMetalakeEvent;
 import org.apache.gravitino.listener.api.event.LoadMetalakeFailureEvent;
+import org.apache.gravitino.listener.api.event.LoadMetalakePreEvent;
 import org.apache.gravitino.listener.api.info.MetalakeInfo;
 import org.apache.gravitino.metalake.MetalakeDispatcher;
 import org.apache.gravitino.utils.PrincipalUtils;
@@ -65,6 +70,7 @@ public class MetalakeEventDispatcher implements 
MetalakeDispatcher {
 
   @Override
   public Metalake[] listMetalakes() {
+    eventBus.dispatchEvent(new 
ListMetalakePreEvent(PrincipalUtils.getCurrentUserName()));
     try {
       Metalake[] metalakes = dispatcher.listMetalakes();
       eventBus.dispatchEvent(new 
ListMetalakeEvent(PrincipalUtils.getCurrentUserName()));
@@ -77,6 +83,7 @@ public class MetalakeEventDispatcher implements 
MetalakeDispatcher {
 
   @Override
   public Metalake loadMetalake(NameIdentifier ident) throws 
NoSuchMetalakeException {
+    eventBus.dispatchEvent(new 
LoadMetalakePreEvent(PrincipalUtils.getCurrentUserName(), ident));
     try {
       Metalake metalake = dispatcher.loadMetalake(ident);
       eventBus.dispatchEvent(
@@ -99,6 +106,10 @@ public class MetalakeEventDispatcher implements 
MetalakeDispatcher {
   public Metalake createMetalake(
       NameIdentifier ident, String comment, Map<String, String> properties)
       throws MetalakeAlreadyExistsException {
+    MetalakeInfo createMetalakeRequest = new MetalakeInfo(ident.name(), 
comment, properties, null);
+    eventBus.dispatchEvent(
+        new CreateMetalakePreEvent(
+            PrincipalUtils.getCurrentUserName(), ident, 
createMetalakeRequest));
     try {
       Metalake metalake = dispatcher.createMetalake(ident, comment, 
properties);
       eventBus.dispatchEvent(
@@ -117,6 +128,8 @@ public class MetalakeEventDispatcher implements 
MetalakeDispatcher {
   @Override
   public Metalake alterMetalake(NameIdentifier ident, MetalakeChange... 
changes)
       throws NoSuchMetalakeException, IllegalArgumentException {
+    eventBus.dispatchEvent(
+        new AlterMetalakePreEvent(PrincipalUtils.getCurrentUserName(), ident, 
changes));
     try {
       Metalake metalake = dispatcher.alterMetalake(ident, changes);
       eventBus.dispatchEvent(
@@ -133,6 +146,7 @@ public class MetalakeEventDispatcher implements 
MetalakeDispatcher {
   @Override
   public boolean dropMetalake(NameIdentifier ident, boolean force)
       throws NonEmptyEntityException, MetalakeInUseException {
+    eventBus.dispatchEvent(new 
DropMetalakePreEvent(PrincipalUtils.getCurrentUserName(), ident));
     try {
       boolean isExists = dispatcher.dropMetalake(ident, force);
       eventBus.dispatchEvent(
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/AlterMetalakePreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/AlterMetalakePreEvent.java
new file mode 100644
index 000000000..68fede7ba
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/AlterMetalakePreEvent.java
@@ -0,0 +1,46 @@
+/*
+ * 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 org.apache.gravitino.MetalakeChange;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+/** Represents an event triggered before altering a metalake. */
+@DeveloperApi
+public class AlterMetalakePreEvent extends PreEvent {
+  private final MetalakeChange[] metalakeChanges;
+
+  public AlterMetalakePreEvent(
+      String user, NameIdentifier identifier, MetalakeChange[] 
metalakeChanges) {
+    super(user, identifier);
+    this.metalakeChanges = metalakeChanges;
+  }
+
+  /**
+   * Retrieves the specific changes that were made to the metalake during the 
alteration process.
+   *
+   * @return An array of {@link MetalakeChange} objects detailing each 
modification applied to the
+   *     metalake.
+   */
+  public MetalakeChange[] metalakeChanges() {
+    return metalakeChanges;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/CreateMetalakePreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/CreateMetalakePreEvent.java
new file mode 100644
index 000000000..951c03670
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/CreateMetalakePreEvent.java
@@ -0,0 +1,45 @@
+/*
+ *  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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+import org.apache.gravitino.listener.api.info.MetalakeInfo;
+
+/** Represents an event triggered before creating a metalake. */
+@DeveloperApi
+public class CreateMetalakePreEvent extends MetalakePreEvent {
+
+  private final MetalakeInfo createMetalakeRequest;
+
+  public CreateMetalakePreEvent(
+      String user, NameIdentifier identifier, MetalakeInfo 
createMetalakeRequest) {
+    super(user, identifier);
+    this.createMetalakeRequest = createMetalakeRequest;
+  }
+
+  /**
+   * @return A {@link MetalakeInfo} instance encapsulating the comprehensive 
details of create
+   *     metalake
+   */
+  public MetalakeInfo createMetalakeRequest() {
+    return createMetalakeRequest;
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/DropMetalakePreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/DropMetalakePreEvent.java
new file mode 100644
index 000000000..91ee886ff
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/DropMetalakePreEvent.java
@@ -0,0 +1,31 @@
+/*
+ *  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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+/** Represents an event triggered before dropping a metalake. */
+@DeveloperApi
+public class DropMetalakePreEvent extends MetalakePreEvent {
+
+  public DropMetalakePreEvent(String user, NameIdentifier identifier) {
+    super(user, identifier);
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/ListMetalakePreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListMetalakePreEvent.java
new file mode 100644
index 000000000..f97198e34
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/ListMetalakePreEvent.java
@@ -0,0 +1,30 @@
+/*
+ *  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 org.apache.gravitino.annotation.DeveloperApi;
+
+/** Represents an event triggered before listing a metalake. */
+@DeveloperApi
+public class ListMetalakePreEvent extends MetalakePreEvent {
+
+  public ListMetalakePreEvent(String user) {
+    super(user, null);
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/LoadMetalakePreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/LoadMetalakePreEvent.java
new file mode 100644
index 000000000..58a805e93
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/LoadMetalakePreEvent.java
@@ -0,0 +1,31 @@
+/*
+ *  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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+/** Represents an event triggered before loading a metalake. */
+@DeveloperApi
+public class LoadMetalakePreEvent extends MetalakePreEvent {
+  public LoadMetalakePreEvent(String user, NameIdentifier identifier) {
+    super(user, identifier);
+  }
+}
diff --git 
a/core/src/main/java/org/apache/gravitino/listener/api/event/MetalakePreEvent.java
 
b/core/src/main/java/org/apache/gravitino/listener/api/event/MetalakePreEvent.java
new file mode 100644
index 000000000..a44ad8063
--- /dev/null
+++ 
b/core/src/main/java/org/apache/gravitino/listener/api/event/MetalakePreEvent.java
@@ -0,0 +1,32 @@
+/*
+ *  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 org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.annotation.DeveloperApi;
+
+/** Represents a pre-event for metalake operations. */
+@DeveloperApi
+public abstract class MetalakePreEvent extends PreEvent {
+
+  protected MetalakePreEvent(String user, NameIdentifier identifier) {
+    super(user, identifier);
+  }
+}
diff --git 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
index 2b5377f75..39f727dc5 100644
--- 
a/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
+++ 
b/core/src/test/java/org/apache/gravitino/listener/api/event/TestMetalakeEvent.java
@@ -69,6 +69,12 @@ public class TestMetalakeEvent {
     Assertions.assertEquals(CreateMetalakeEvent.class, event.getClass());
     MetalakeInfo metalakeInfo = ((CreateMetalakeEvent) 
event).createdMetalakeInfo();
     checkMetalakeInfo(metalakeInfo, metalake);
+
+    PreEvent preEvent = dummyEventListener.popPreEvent();
+    Assertions.assertEquals(identifier, preEvent.identifier());
+    Assertions.assertEquals(CreateMetalakePreEvent.class, preEvent.getClass());
+    metalakeInfo = ((CreateMetalakePreEvent) preEvent).createMetalakeRequest();
+    checkMetalakeInfo(metalakeInfo, metalake);
   }
 
   @Test
@@ -80,6 +86,10 @@ public class TestMetalakeEvent {
     Assertions.assertEquals(LoadMetalakeEvent.class, event.getClass());
     MetalakeInfo metalakeInfo = ((LoadMetalakeEvent) 
event).loadedMetalakeInfo();
     checkMetalakeInfo(metalakeInfo, metalake);
+
+    PreEvent preEvent = dummyEventListener.popPreEvent();
+    Assertions.assertEquals(identifier, preEvent.identifier());
+    Assertions.assertEquals(LoadMetalakePreEvent.class, preEvent.getClass());
   }
 
   @Test
@@ -95,6 +105,13 @@ public class TestMetalakeEvent {
     MetalakeChange[] metalakeChanges = ((AlterMetalakeEvent) 
event).metalakeChanges();
     Assertions.assertTrue(metalakeChanges.length == 1);
     Assertions.assertEquals(metalakeChange, metalakeChanges[0]);
+
+    PreEvent preEvent = dummyEventListener.popPreEvent();
+    Assertions.assertEquals(identifier, preEvent.identifier());
+    Assertions.assertEquals(AlterMetalakePreEvent.class, preEvent.getClass());
+    Assertions.assertEquals(1, ((AlterMetalakePreEvent) 
preEvent).metalakeChanges().length);
+    Assertions.assertEquals(
+        metalakeChange, ((AlterMetalakePreEvent) 
preEvent).metalakeChanges()[0]);
   }
 
   @Test
@@ -105,6 +122,10 @@ public class TestMetalakeEvent {
     Assertions.assertEquals(identifier, event.identifier());
     Assertions.assertEquals(DropMetalakeEvent.class, event.getClass());
     Assertions.assertTrue(((DropMetalakeEvent) event).isExists());
+
+    PreEvent preEvent = dummyEventListener.popPreEvent();
+    Assertions.assertEquals(identifier, preEvent.identifier());
+    Assertions.assertEquals(DropMetalakePreEvent.class, preEvent.getClass());
   }
 
   @Test
diff --git a/docs/gravitino-server-config.md b/docs/gravitino-server-config.md
index 35838393a..9049be5b8 100644
--- a/docs/gravitino-server-config.md
+++ b/docs/gravitino-server-config.md
@@ -135,6 +135,7 @@ Gravitino triggers a pre-event before the operation, a 
post-event after the comp
 | Gravitino server table operation    | `CreateTablePreEvent`, 
`AlterTablePreEvent`, `DropTablePreEvent`, `PurgeTablePreEvent`, 
`LoadTablePreEvent`, `ListTablePreEvent`                                        
                                   | 0.8.0-incubating  |
 | Gravitino server schema operation   | `CreateSchemaPreEvent`, 
`AlterSchemaPreEvent`, `DropSchemaPreEvent`, `LoadSchemaPreEvent`, 
`ListSchemaPreEvent`                                                            
                                | 0.8.0-incubating  |
 | Gravitino server catalog operation  | `CreateCatalogPreEvent`, 
`AlterCatalogPreEvent`, `DropCatalogPreEvent`, `LoadCatalogPreEvent`, 
`ListCatalogPreEvent`                                                           
                            | 0.8.0-incubating  |
+| Gravitino server metalake operation | `CreateMetalakePreEvent`, 
`AlterMetalakePreEvent`,`DropMetalakePreEvent`,`LoadMetalakePreEvent`,`ListMetalakePreEvent`
                                                                                
     | 0.8.0-incubating |
 
 #### Event listener plugin
 

Reply via email to