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 6bb2e2f3ae [Cherry-pick to branch-1.3] [MINOR] improvement(server):
expose schema separator via the /configs endpoint (#11322) (#11341)
6bb2e2f3ae is described below
commit 6bb2e2f3aee96592b83578385b125abd5bbbdb10
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Jun 2 17:38:44 2026 +0800
[Cherry-pick to branch-1.3] [MINOR] improvement(server): expose schema
separator via the /configs endpoint (#11322) (#11341)
**Cherry-pick Information:**
- Original commit: 235b8f876a18c4d93b2000e78082cf807c152533
- Target branch: `branch-1.3`
- Status: ✅ Clean cherry-pick (no conflicts)
Co-authored-by: roryqi <[email protected]>
---
.../apache/gravitino/server/web/ConfigServlet.java | 3 +-
.../gravitino/server/web/TestConfigServlet.java | 84 +++++++++++-----------
2 files changed, 46 insertions(+), 41 deletions(-)
diff --git
a/server/src/main/java/org/apache/gravitino/server/web/ConfigServlet.java
b/server/src/main/java/org/apache/gravitino/server/web/ConfigServlet.java
index a567a0ddcf..b8bdbfaa1b 100644
--- a/server/src/main/java/org/apache/gravitino/server/web/ConfigServlet.java
+++ b/server/src/main/java/org/apache/gravitino/server/web/ConfigServlet.java
@@ -49,7 +49,8 @@ public class ConfigServlet extends HttpServlet {
OAuthConfig.SCOPE);
private static final ImmutableSet<ConfigEntry<?>> basicConfigEntries =
- ImmutableSet.of(Configs.AUTHENTICATORS, Configs.ENABLE_AUTHORIZATION);
+ ImmutableSet.of(
+ Configs.AUTHENTICATORS, Configs.ENABLE_AUTHORIZATION,
Configs.SCHEMA_SEPARATOR);
private final Map<String, Object> configs = Maps.newHashMap();
diff --git
a/server/src/test/java/org/apache/gravitino/server/web/TestConfigServlet.java
b/server/src/test/java/org/apache/gravitino/server/web/TestConfigServlet.java
index 24f3ac5122..a3ddee599f 100644
---
a/server/src/test/java/org/apache/gravitino/server/web/TestConfigServlet.java
+++
b/server/src/test/java/org/apache/gravitino/server/web/TestConfigServlet.java
@@ -25,9 +25,11 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
+import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.io.PrintWriter;
+import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.gravitino.Configs;
import org.apache.gravitino.auth.AuthenticatorType;
@@ -36,23 +38,28 @@ import org.apache.gravitino.config.ConfigConstants;
import org.apache.gravitino.config.ConfigEntry;
import org.apache.gravitino.server.ServerConfig;
import org.apache.gravitino.server.authentication.OAuthConfig;
+import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
+import org.mockito.ArgumentCaptor;
public class TestConfigServlet {
@Test
public void testConfigServlet() throws Exception {
+ Map<String, Object> configs = fetchConfigs(new ServerConfig());
+ Assertions.assertEquals(
+ Lists.newArrayList("simple"),
configs.get(Configs.AUTHENTICATORS.getKey()));
+ Assertions.assertEquals(false,
configs.get(Configs.ENABLE_AUTHORIZATION.getKey()));
+ Assertions.assertEquals(":",
configs.get(Configs.SCHEMA_SEPARATOR.getKey()));
+ }
+
+ @Test
+ public void testConfigServletExposesCustomSchemaSeparator() throws Exception
{
+ // The schema separator must reflect the configured value, not a
hard-coded default.
ServerConfig serverConfig = new ServerConfig();
- ConfigServlet configServlet = new ConfigServlet(serverConfig);
- configServlet.init();
- HttpServletResponse res = mock(HttpServletResponse.class);
- PrintWriter writer = mock(PrintWriter.class);
- when(res.getWriter()).thenReturn(writer);
- configServlet.doGet(null, res);
- verify(writer)
- .write(
-
"{\"gravitino.authorization.enable\":false,\"gravitino.authenticators\":[\"simple\"]}");
- configServlet.destroy();
+ serverConfig.set(Configs.SCHEMA_SEPARATOR, "|");
+ Map<String, Object> configs = fetchConfigs(serverConfig);
+ Assertions.assertEquals("|",
configs.get(Configs.SCHEMA_SEPARATOR.getKey()));
}
@Test
@@ -61,16 +68,9 @@ public class TestConfigServlet {
// absent from the response (no crash) rather than null or empty.
ServerConfig serverConfig = new ServerConfig();
serverConfig.set(Configs.ENABLE_AUTHORIZATION, true);
- ConfigServlet configServlet = new ConfigServlet(serverConfig);
- configServlet.init();
- HttpServletResponse res = mock(HttpServletResponse.class);
- PrintWriter writer = mock(PrintWriter.class);
- when(res.getWriter()).thenReturn(writer);
- configServlet.doGet(null, res);
- verify(writer)
- .write(
-
"{\"gravitino.authorization.enable\":true,\"gravitino.authenticators\":[\"simple\"]}");
- configServlet.destroy();
+ Map<String, Object> configs = fetchConfigs(serverConfig);
+ Assertions.assertEquals(true,
configs.get(Configs.ENABLE_AUTHORIZATION.getKey()));
+
Assertions.assertFalse(configs.containsKey(Configs.SERVICE_ADMINS.getKey()));
}
@Test
@@ -78,16 +78,10 @@ public class TestConfigServlet {
ServerConfig serverConfig = new ServerConfig();
serverConfig.set(Configs.ENABLE_AUTHORIZATION, true);
serverConfig.set(Configs.SERVICE_ADMINS, Lists.newArrayList("admin1",
"admin2"));
- ConfigServlet configServlet = new ConfigServlet(serverConfig);
- configServlet.init();
- HttpServletResponse res = mock(HttpServletResponse.class);
- PrintWriter writer = mock(PrintWriter.class);
- when(res.getWriter()).thenReturn(writer);
- configServlet.doGet(null, res);
- verify(writer)
- .write(
-
"{\"gravitino.authorization.enable\":true,\"gravitino.authenticators\":[\"simple\"],\"gravitino.authorization.serviceAdmins\":[\"admin1\",\"admin2\"]}");
- configServlet.destroy();
+ Map<String, Object> configs = fetchConfigs(serverConfig);
+ Assertions.assertEquals(true,
configs.get(Configs.ENABLE_AUTHORIZATION.getKey()));
+ Assertions.assertEquals(
+ Lists.newArrayList("admin1", "admin2"),
configs.get(Configs.SERVICE_ADMINS.getKey()));
}
@Test
@@ -103,16 +97,8 @@ public class TestConfigServlet {
serverConfig.set(customConfig, "test");
serverConfig.set(Configs.VISIBLE_CONFIGS,
Lists.newArrayList(customConfig.getKey()));
- ConfigServlet configServlet = new ConfigServlet(serverConfig);
- configServlet.init();
- HttpServletResponse res = mock(HttpServletResponse.class);
- PrintWriter writer = mock(PrintWriter.class);
- when(res.getWriter()).thenReturn(writer);
- configServlet.doGet(null, res);
- verify(writer)
- .write(
-
"{\"gravitino.extended.custom.config\":\"test\",\"gravitino.authorization.enable\":false,\"gravitino.authenticators\":[\"simple\"]}");
- configServlet.destroy();
+ Map<String, Object> configs = fetchConfigs(serverConfig);
+ Assertions.assertEquals("test", configs.get(customConfig.getKey()));
}
@Test
@@ -157,4 +143,22 @@ public class TestConfigServlet {
verify(res).setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
configServlet.destroy();
}
+
+ /**
+ * Invokes the servlet and parses the JSON it writes back into a map, so
tests can assert on
+ * individual config entries instead of matching a brittle, order-dependent
JSON string.
+ */
+ private Map<String, Object> fetchConfigs(ServerConfig serverConfig) throws
Exception {
+ ConfigServlet configServlet = new ConfigServlet(serverConfig);
+ configServlet.init();
+ HttpServletResponse res = mock(HttpServletResponse.class);
+ PrintWriter writer = mock(PrintWriter.class);
+ when(res.getWriter()).thenReturn(writer);
+ configServlet.doGet(null, res);
+ ArgumentCaptor<String> captor = ArgumentCaptor.forClass(String.class);
+ verify(writer).write(captor.capture());
+ configServlet.destroy();
+ return ObjectMapperProvider.objectMapper()
+ .readValue(captor.getValue(), new TypeReference<Map<String, Object>>()
{});
+ }
}