This is an automated email from the ASF dual-hosted git repository.

jerryshao pushed a commit to branch branch-1.3
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/branch-1.3 by this push:
     new d8da718efb [Cherry-pick to branch-1.3] [#12255] fix(lance): 
authenticate the Lance REST service to the Gravitino server (#12256) (#12338)
d8da718efb is described below

commit d8da718efbc95be7fcd247b445220a543c95ea5b
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Aug 4 14:03:46 2026 +0800

    [Cherry-pick to branch-1.3] [#12255] fix(lance): authenticate the Lance 
REST service to the Gravitino server (#12256) (#12338)
    
    **Cherry-pick Information:**
    - Original commit: 3cd9553800d12bfdc10b2009e7ff7932a7a2d322
    - Target branch: `branch-1.3`
    - Status: ✅ Clean cherry-pick (no conflicts)
    
    ---------
    
    Co-authored-by: Mark Hoerth <[email protected]>
    Co-authored-by: Mark Hoerth <[email protected]>
    Co-authored-by: yuqi <[email protected]>
---
 docs/lance-rest-service.md                         |  19 ++++
 lance/lance-common/build.gradle.kts                |   1 +
 .../gravitino/lance/common/config/LanceConfig.java |  51 +++++++++
 .../gravitino/GravitinoLanceNamespaceWrapper.java  |  74 ++++++++++++-
 .../gravitino/TestGravitinoLanceClientAuth.java    | 122 ++++++++++++++++++++
 .../integration/test/LanceRESTServiceAuthIT.java   | 123 +++++++++++++++++++++
 6 files changed, 384 insertions(+), 6 deletions(-)

diff --git a/docs/lance-rest-service.md b/docs/lance-rest-service.md
index 96e1af740a..8f78a9d671 100644
--- a/docs/lance-rest-service.md
+++ b/docs/lance-rest-service.md
@@ -134,6 +134,25 @@ To enable the Lance REST service within Gravitino server, 
configure the followin
 | `gravitino.lance-rest.gravitino-uri`      | Gravitino server URI (required 
when namespace-backend is `gravitino`)        | http://localhost:8090   | Yes   
   | 1.1.0         |
 | `gravitino.lance-rest.gravitino-metalake` | Gravitino metalake name 
(required when namespace-backend is `gravitino`)     | (none)                  
| Yes      | 1.1.0         |
 
+**Authentication to the Gravitino Server**
+
+The Lance REST service makes its own requests to the Gravitino server. Those 
requests must carry
+credentials, otherwise a Gravitino server configured with an authenticator 
other than `simple`
+rejects them and every Lance operation fails. Configure the auth type to match 
the Gravitino
+server:
+
+| Configuration Property                             | Description             
                                                           | Default Value      
 | Required          | Since Version |
+|----------------------------------------------------|------------------------------------------------------------------------------------|---------------------|-------------------|---------------|
+| `gravitino.lance-rest.gravitino-auth-type`         | Auth type used to reach 
the Gravitino server. Supported values: `simple`, `oauth2` | `simple`           
 | No                | 1.3.0         |
+| `gravitino.lance-rest.gravitino-simple.user-name`  | User name presented 
when the auth type is `simple`                                 | 
`lance-rest-server` | No                | 1.3.0         |
+| `gravitino.lance-rest.gravitino-oauth2.server-uri` | OAuth2 server URI       
                                                           | (none)             
 | Yes, for `oauth2` | 1.3.0         |
+| `gravitino.lance-rest.gravitino-oauth2.credential` | Credential used to 
request the OAuth2 token                                        | (none)        
      | Yes, for `oauth2` | 1.3.0         |
+| `gravitino.lance-rest.gravitino-oauth2.token-path` | Path on the OAuth2 
server used to request the token                                | (none)        
      | Yes, for `oauth2` | 1.3.0         |
+| `gravitino.lance-rest.gravitino-oauth2.scope`      | Scope of the requested 
OAuth2 token                                                | (none)            
  | Yes, for `oauth2` | 1.3.0         |
+
+This setting controls how the service authenticates to the Gravitino server. 
It does not change how
+callers authenticate to the Lance REST service itself.
+
 **Example Configuration:**
 
 ```properties
diff --git a/lance/lance-common/build.gradle.kts 
b/lance/lance-common/build.gradle.kts
index 618dc6a733..e9b5f6033d 100644
--- a/lance/lance-common/build.gradle.kts
+++ b/lance/lance-common/build.gradle.kts
@@ -26,6 +26,7 @@ plugins {
 
 dependencies {
   implementation(project(":api"))
+  implementation(project(":catalogs:catalog-common"))
   implementation(project(":clients:client-java"))
   implementation(project(":common")) {
     exclude("*")
diff --git 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/config/LanceConfig.java
 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/config/LanceConfig.java
index ccf1f0dc07..4b23175606 100644
--- 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/config/LanceConfig.java
+++ 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/config/LanceConfig.java
@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import org.apache.gravitino.Config;
 import org.apache.gravitino.OverwriteDefaultConfig;
+import org.apache.gravitino.auth.AuthProperties;
 import org.apache.gravitino.config.ConfigBuilder;
 import org.apache.gravitino.config.ConfigConstants;
 import org.apache.gravitino.config.ConfigEntry;
@@ -33,6 +34,8 @@ public class LanceConfig extends Config implements 
OverwriteDefaultConfig {
   public static final String CONFIG_NAMESPACE_BACKEND = "namespace-backend";
   public static final String CONFIG_METALAKE = "metalake";
   public static final String CONFIG_URI = "uri";
+  public static final String CONFIG_AUTH_TYPE = "auth-type";
+  public static final String DEFAULT_SIMPLE_USERNAME = "lance-rest-server";
 
   public static final int DEFAULT_LANCE_REST_SERVICE_HTTP_PORT = 9101;
   public static final int DEFAULT_LANCE_REST_SERVICE_HTTPS_PORT = 9533;
@@ -60,6 +63,50 @@ public class LanceConfig extends Config implements 
OverwriteDefaultConfig {
           .stringConf()
           .createWithDefault(GRAVITINO_URI);
 
+  public static final ConfigEntry<String> GRAVITINO_AUTH_TYPE =
+      new ConfigBuilder(GRAVITINO_NAMESPACE_BACKEND + "-" + CONFIG_AUTH_TYPE)
+          .doc(
+              "The auth type used when the Lance REST service communicates 
with the Gravitino "
+                  + "server. Supported values are `simple` and `oauth2`.")
+          .version(ConfigConstants.VERSION_1_3_0)
+          .stringConf()
+          .createWithDefault(AuthProperties.SIMPLE_AUTH_TYPE);
+
+  public static final ConfigEntry<String> GRAVITINO_SIMPLE_USERNAME =
+      new ConfigBuilder(GRAVITINO_NAMESPACE_BACKEND + "-simple.user-name")
+          .doc("The user name used when the auth type is `simple`")
+          .version(ConfigConstants.VERSION_1_3_0)
+          .stringConf()
+          .createWithDefault(DEFAULT_SIMPLE_USERNAME);
+
+  public static final ConfigEntry<String> GRAVITINO_OAUTH2_SERVER_URI =
+      new ConfigBuilder(GRAVITINO_NAMESPACE_BACKEND + "-oauth2.server-uri")
+          .doc("The OAuth2 server URI, required when the auth type is 
`oauth2`")
+          .version(ConfigConstants.VERSION_1_3_0)
+          .stringConf()
+          .create();
+
+  public static final ConfigEntry<String> GRAVITINO_OAUTH2_CREDENTIAL =
+      new ConfigBuilder(GRAVITINO_NAMESPACE_BACKEND + "-oauth2.credential")
+          .doc("The credential used to request the OAuth2 token, required for 
`oauth2`")
+          .version(ConfigConstants.VERSION_1_3_0)
+          .stringConf()
+          .create();
+
+  public static final ConfigEntry<String> GRAVITINO_OAUTH2_TOKEN_PATH =
+      new ConfigBuilder(GRAVITINO_NAMESPACE_BACKEND + "-oauth2.token-path")
+          .doc("The path on the OAuth2 server used to request the token, 
required for `oauth2`")
+          .version(ConfigConstants.VERSION_1_3_0)
+          .stringConf()
+          .create();
+
+  public static final ConfigEntry<String> GRAVITINO_OAUTH2_SCOPE =
+      new ConfigBuilder(GRAVITINO_NAMESPACE_BACKEND + "-oauth2.scope")
+          .doc("The scope of the requested OAuth2 token, required for 
`oauth2`")
+          .version(ConfigConstants.VERSION_1_3_0)
+          .stringConf()
+          .create();
+
   public LanceConfig(Map<String, String> properties) {
     super(false);
     loadFromMap(properties, key -> true);
@@ -81,6 +128,10 @@ public class LanceConfig extends Config implements 
OverwriteDefaultConfig {
     return get(METALAKE_NAME);
   }
 
+  public String getGravitinoAuthType() {
+    return get(GRAVITINO_AUTH_TYPE);
+  }
+
   @Override
   public Map<String, String> getOverwriteDefaultConfig() {
     return ImmutableMap.of(
diff --git 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceNamespaceWrapper.java
 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceNamespaceWrapper.java
index b7cc36ec23..058dbc311f 100644
--- 
a/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceNamespaceWrapper.java
+++ 
b/lance/lance-common/src/main/java/org/apache/gravitino/lance/common/ops/gravitino/GravitinoLanceNamespaceWrapper.java
@@ -27,7 +27,11 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.gravitino.Catalog;
+import org.apache.gravitino.auth.AuthProperties;
+import org.apache.gravitino.client.DefaultOAuth2TokenProvider;
 import org.apache.gravitino.client.GravitinoClient;
+import org.apache.gravitino.client.GravitinoClient.ClientBuilder;
+import org.apache.gravitino.config.ConfigEntry;
 import org.apache.gravitino.exceptions.NoSuchCatalogException;
 import org.apache.gravitino.lance.common.config.LanceConfig;
 import org.apache.gravitino.lance.common.ops.LanceNamespaceOperations;
@@ -78,14 +82,11 @@ public class GravitinoLanceNamespaceWrapper extends 
NamespaceWrapper {
               }
             });
 
-    this.client =
-        GravitinoClient.builder(uri)
-            .withMetalake(metalakeName)
-            .withClientConfig(clientProperties)
-            .build();
+    this.client = createGravitinoClient(uri, metalakeName, clientProperties, 
config());
 
     LOG.info(
-        "GravitinoClient initialized with {} client properties for metalake: 
{}",
+        "GravitinoClient initialized with auth type {} and {} client 
properties for metalake: {}",
+        config().getGravitinoAuthType(),
         clientProperties.size(),
         metalakeName);
 
@@ -135,4 +136,65 @@ public class GravitinoLanceNamespaceWrapper extends 
NamespaceWrapper {
     }
     return catalog;
   }
+
+  static GravitinoClient createGravitinoClient(
+      String uri, String metalake, Map<String, String> clientProperties, 
LanceConfig config) {
+    return newClientBuilder(uri, metalake, clientProperties, config).build();
+  }
+
+  /**
+   * Builds and configures the client builder, including the credentials the 
Lance REST service
+   * presents to the Gravitino server. Separated from {@link 
#createGravitinoClient} so that the
+   * configuration can be exercised without contacting a server.
+   *
+   * @param uri the Gravitino server URI
+   * @param metalake the metalake name
+   * @param clientProperties additional client properties, such as connection 
pool settings
+   * @param config the Lance REST service configuration holding the auth 
settings
+   * @return a configured client builder
+   */
+  @VisibleForTesting
+  static ClientBuilder newClientBuilder(
+      String uri, String metalake, Map<String, String> clientProperties, 
LanceConfig config) {
+    ClientBuilder builder = 
GravitinoClient.builder(uri).withMetalake(metalake);
+    builder.withClientConfig(clientProperties);
+    String authType = config.getGravitinoAuthType();
+    if (AuthProperties.isSimple(authType)) {
+      
builder.withSimpleAuth(config.get(LanceConfig.GRAVITINO_SIMPLE_USERNAME));
+    } else if (AuthProperties.isOAuth2(authType)) {
+      DefaultOAuth2TokenProvider tokenProvider =
+          DefaultOAuth2TokenProvider.builder()
+              .withUri(requireConfig(config, 
LanceConfig.GRAVITINO_OAUTH2_SERVER_URI, "server-uri"))
+              .withCredential(
+                  requireConfig(config, 
LanceConfig.GRAVITINO_OAUTH2_CREDENTIAL, "credential"))
+              .withPath(
+                  requireConfig(config, 
LanceConfig.GRAVITINO_OAUTH2_TOKEN_PATH, "token-path"))
+              .withScope(requireConfig(config, 
LanceConfig.GRAVITINO_OAUTH2_SCOPE, "scope"))
+              .build();
+      builder.withOAuth(tokenProvider);
+    } else {
+      throw new UnsupportedOperationException(
+          String.format(
+              "Unsupported value for %sgravitino-%s: %s. Supported values are 
%s and %s.",
+              LanceConfig.LANCE_CONFIG_PREFIX,
+              LanceConfig.CONFIG_AUTH_TYPE,
+              authType,
+              AuthProperties.SIMPLE_AUTH_TYPE,
+              AuthProperties.OAUTH2_AUTH_TYPE));
+    }
+    return builder;
+  }
+
+  private static String requireConfig(LanceConfig config, ConfigEntry<String> 
entry, String name) {
+    String value = config.get(entry);
+    Preconditions.checkArgument(
+        StringUtils.isNotBlank(value),
+        "%sgravitino-oauth2.%s must be set when %sgravitino-%s is %s",
+        LanceConfig.LANCE_CONFIG_PREFIX,
+        name,
+        LanceConfig.LANCE_CONFIG_PREFIX,
+        LanceConfig.CONFIG_AUTH_TYPE,
+        AuthProperties.OAUTH2_AUTH_TYPE);
+    return value;
+  }
 }
diff --git 
a/lance/lance-common/src/test/java/org/apache/gravitino/lance/common/ops/gravitino/TestGravitinoLanceClientAuth.java
 
b/lance/lance-common/src/test/java/org/apache/gravitino/lance/common/ops/gravitino/TestGravitinoLanceClientAuth.java
new file mode 100644
index 0000000000..b9e66116ac
--- /dev/null
+++ 
b/lance/lance-common/src/test/java/org/apache/gravitino/lance/common/ops/gravitino/TestGravitinoLanceClientAuth.java
@@ -0,0 +1,122 @@
+/*
+ * 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.lance.common.ops.gravitino;
+
+import com.google.common.collect.ImmutableMap;
+import java.util.Map;
+import org.apache.gravitino.auth.AuthProperties;
+import org.apache.gravitino.lance.common.config.LanceConfig;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+public class TestGravitinoLanceClientAuth {
+
+  private static final String URI = "http://localhost:8090";;
+  private static final String METALAKE = "test_metalake";
+
+  private static LanceConfig configOf(Map<String, String> properties) {
+    return new LanceConfig(properties);
+  }
+
+  @Test
+  void testAuthTypeDefaultsToSimple() {
+    LanceConfig config = configOf(ImmutableMap.of("gravitino-metalake", 
METALAKE));
+    Assertions.assertEquals(AuthProperties.SIMPLE_AUTH_TYPE, 
config.getGravitinoAuthType());
+    Assertions.assertEquals(
+        LanceConfig.DEFAULT_SIMPLE_USERNAME, 
config.get(LanceConfig.GRAVITINO_SIMPLE_USERNAME));
+  }
+
+  @Test
+  void testSimpleAuthUsesConfiguredUserName() {
+    LanceConfig config =
+        configOf(
+            ImmutableMap.of(
+                "gravitino-metalake", METALAKE,
+                "gravitino-auth-type", "simple",
+                "gravitino-simple.user-name", "svc_lance"));
+    Assertions.assertEquals("svc_lance", 
config.get(LanceConfig.GRAVITINO_SIMPLE_USERNAME));
+    Assertions.assertDoesNotThrow(
+        () ->
+            GravitinoLanceNamespaceWrapper.newClientBuilder(
+                URI, METALAKE, ImmutableMap.of(), config));
+  }
+
+  @Test
+  void testAuthTypeIsCaseInsensitive() {
+    LanceConfig config =
+        configOf(ImmutableMap.of("gravitino-metalake", METALAKE, 
"gravitino-auth-type", "SIMPLE"));
+    Assertions.assertDoesNotThrow(
+        () ->
+            GravitinoLanceNamespaceWrapper.newClientBuilder(
+                URI, METALAKE, ImmutableMap.of(), config));
+  }
+
+  @Test
+  void testOAuth2RequiresServerUri() {
+    LanceConfig config =
+        configOf(
+            ImmutableMap.of(
+                "gravitino-metalake", METALAKE,
+                "gravitino-auth-type", "oauth2",
+                "gravitino-oauth2.credential", "client:secret",
+                "gravitino-oauth2.token-path", "/oauth/token",
+                "gravitino-oauth2.scope", "test"));
+    IllegalArgumentException exception =
+        Assertions.assertThrows(
+            IllegalArgumentException.class,
+            () ->
+                GravitinoLanceNamespaceWrapper.newClientBuilder(
+                    URI, METALAKE, ImmutableMap.of(), config));
+    
Assertions.assertTrue(exception.getMessage().contains("gravitino-oauth2.server-uri"));
+  }
+
+  @Test
+  void testOAuth2RequiresCredential() {
+    LanceConfig config =
+        configOf(
+            ImmutableMap.of(
+                "gravitino-metalake", METALAKE,
+                "gravitino-auth-type", "oauth2",
+                "gravitino-oauth2.server-uri", "http://localhost:8177";,
+                "gravitino-oauth2.token-path", "/oauth/token",
+                "gravitino-oauth2.scope", "test"));
+    IllegalArgumentException exception =
+        Assertions.assertThrows(
+            IllegalArgumentException.class,
+            () ->
+                GravitinoLanceNamespaceWrapper.newClientBuilder(
+                    URI, METALAKE, ImmutableMap.of(), config));
+    
Assertions.assertTrue(exception.getMessage().contains("gravitino-oauth2.credential"));
+  }
+
+  @Test
+  void testUnsupportedAuthTypeIsRejected() {
+    LanceConfig config =
+        configOf(
+            ImmutableMap.of("gravitino-metalake", METALAKE, 
"gravitino-auth-type", "kerberos"));
+    UnsupportedOperationException exception =
+        Assertions.assertThrows(
+            UnsupportedOperationException.class,
+            () ->
+                GravitinoLanceNamespaceWrapper.newClientBuilder(
+                    URI, METALAKE, ImmutableMap.of(), config));
+    Assertions.assertTrue(exception.getMessage().contains("kerberos"));
+  }
+}
diff --git 
a/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceAuthIT.java
 
b/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceAuthIT.java
new file mode 100644
index 0000000000..f34fef6589
--- /dev/null
+++ 
b/lance/lance-rest-server/src/test/java/org/apache/gravitino/lance/integration/test/LanceRESTServiceAuthIT.java
@@ -0,0 +1,123 @@
+/*
+ * 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.lance.integration.test;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.arrow.memory.BufferAllocator;
+import org.apache.arrow.memory.RootAllocator;
+import org.apache.gravitino.Catalog;
+import org.apache.gravitino.auth.AuthConstants;
+import org.apache.gravitino.client.GravitinoMetalake;
+import org.apache.gravitino.integration.test.util.BaseIT;
+import org.apache.gravitino.integration.test.util.GravitinoITUtils;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.Test;
+import org.lance.namespace.LanceNamespace;
+import org.lance.namespace.model.CreateNamespaceRequest;
+
+/**
+ * Verifies that the Lance REST service authenticates to the Gravitino server 
as its configured
+ * identity rather than anonymously.
+ *
+ * <p>Before the service was given an {@code AuthDataProvider}, its requests 
to the Gravitino server
+ * carried no authorization header and were recorded against the anonymous 
user. Objects created
+ * through the Lance REST service therefore had {@code anonymous} as their 
creator.
+ */
+public class LanceRESTServiceAuthIT extends BaseIT {
+
+  private static final String SIMPLE_USER_NAME = "lance_rest_service_user";
+  private static final String USER_NAME_CONFIG_KEY =
+      "gravitino.lance-rest.gravitino-simple.user-name";
+
+  private final BufferAllocator allocator = new RootAllocator(Long.MAX_VALUE);
+  private GravitinoMetalake metalake;
+  private LanceNamespace ns;
+
+  @BeforeAll
+  public void startIntegrationTest() throws Exception {
+    super.ignoreLanceAuxRestService = false;
+    registerCustomConfigs(new HashMap<>(Map.of(USER_NAME_CONFIG_KEY, 
SIMPLE_USER_NAME)));
+    super.startIntegrationTest();
+
+    this.metalake =
+        client.createMetalake(
+            getLanceRESTServerMetalakeName(), "metalake for lance rest auth 
tests", null);
+
+    Map<String, String> props = new HashMap<>();
+    props.put("uri", getLanceRestServiceUrl());
+    props.put("delimiter", ".");
+    this.ns = LanceNamespace.connect("rest", props, allocator);
+  }
+
+  @AfterAll
+  public void clean() throws Exception {
+    Exception failure = null;
+
+    try {
+      if (client != null) {
+        client.dropMetalake(getLanceRESTServerMetalakeName(), true);
+      }
+    } catch (Exception e) {
+      failure = e;
+    }
+
+    try {
+      allocator.close();
+    } catch (Exception e) {
+      failure = failure == null ? e : failure;
+    }
+
+    try {
+      super.stopIntegrationTest();
+    } catch (Exception e) {
+      failure = failure == null ? e : failure;
+    }
+
+    if (failure != null) {
+      throw failure;
+    }
+  }
+
+  @Test
+  public void testCatalogCreatedViaLanceRestIsNotAnonymous() {
+    String catalogName = GravitinoITUtils.genRandomName("lance_auth_catalog");
+
+    CreateNamespaceRequest createNamespaceReq = new CreateNamespaceRequest();
+    createNamespaceReq.addIdItem(catalogName);
+    ns.createNamespace(createNamespaceReq);
+
+    Catalog catalog = metalake.loadCatalog(catalogName);
+    Assertions.assertEquals(
+        SIMPLE_USER_NAME,
+        catalog.auditInfo().creator(),
+        "The Lance REST service should act as its configured user, not "
+            + AuthConstants.ANONYMOUS_USER);
+    Assertions.assertNotEquals(AuthConstants.ANONYMOUS_USER, 
catalog.auditInfo().creator());
+
+    metalake.dropCatalog(catalogName, true);
+  }
+
+  private String getLanceRestServiceUrl() {
+    return String.format("http://%s:%d/lance";, "localhost", 
getLanceRESTServerPort());
+  }
+}

Reply via email to