This is an automated email from the ASF dual-hosted git repository. jackie pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/pinot.git
The following commit(s) were added to refs/heads/master by this push: new ffc72b1019 Add @JsonProperty annotation to LeadControllerEntry & LeadControllerResponse (#13950) ffc72b1019 is described below commit ffc72b1019079b0e716b274af74ae3f9bfee7098 Author: Chaitanya Deepthi <45308220+deepthi...@users.noreply.github.com> AuthorDate: Mon Sep 9 20:45:38 2024 -0400 Add @JsonProperty annotation to LeadControllerEntry & LeadControllerResponse (#13950) --- .../utils/SegmentsReloadCheckResponseTest.java | 90 ------- .../PinotLeadControllerRestletResource.java | 17 +- .../pinot/controller/util/JsonSerializerTest.java | 283 +++++++++++++++++++++ 3 files changed, 294 insertions(+), 96 deletions(-) diff --git a/pinot-common/src/test/java/org/apache/pinot/common/utils/SegmentsReloadCheckResponseTest.java b/pinot-common/src/test/java/org/apache/pinot/common/utils/SegmentsReloadCheckResponseTest.java deleted file mode 100644 index f63a607a12..0000000000 --- a/pinot-common/src/test/java/org/apache/pinot/common/utils/SegmentsReloadCheckResponseTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * 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.pinot.common.utils; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.JsonNode; -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; -import org.apache.pinot.common.restlet.resources.ServerSegmentsReloadCheckResponse; -import org.apache.pinot.common.restlet.resources.TableSegmentsReloadCheckResponse; -import org.apache.pinot.spi.utils.JsonUtils; -import org.testng.annotations.Test; - -import static org.testng.Assert.assertEquals; -import static org.testng.Assert.assertFalse; -import static org.testng.Assert.assertNotNull; -import static org.testng.Assert.assertTrue; - - -/** - * Tests some of the serializer and deserialization responses from SegmentsReloadCheckResponse class - * needReload will have to be carefully evaluated - */ -public class SegmentsReloadCheckResponseTest { - - @Test - public void testSerialization() - throws IOException { - // Given - boolean needReload = true; - String instanceId = "instance123"; - ServerSegmentsReloadCheckResponse response = new ServerSegmentsReloadCheckResponse(needReload, instanceId); - Map<String, ServerSegmentsReloadCheckResponse> serversResponse = new HashMap<>(); - serversResponse.put(instanceId, response); - TableSegmentsReloadCheckResponse tableResponse = new TableSegmentsReloadCheckResponse(needReload, serversResponse); - String responseString = JsonUtils.objectToPrettyString(response); - String tableResponseString = JsonUtils.objectToPrettyString(tableResponse); - - assertNotNull(responseString); - assertNotNull(tableResponseString); - JsonNode tableResponseJsonNode = JsonUtils.stringToJsonNode(tableResponseString); - assertTrue(tableResponseJsonNode.get("needReload").asBoolean()); - - JsonNode serversList = tableResponseJsonNode.get("serverToSegmentsCheckReloadList"); - JsonNode serverResp = serversList.get("instance123"); - assertEquals(serverResp.get("instanceId").asText(), "instance123"); - assertTrue(serverResp.get("needReload").asBoolean()); - - assertEquals("{\n" + " \"needReload\" : true,\n" + " \"serverToSegmentsCheckReloadList\" : {\n" - + " \"instance123\" : {\n" + " \"needReload\" : true,\n" + " \"instanceId\" : \"instance123\"\n" - + " }\n" + " }\n" + "}", tableResponseString); - assertEquals("{\n" + " \"needReload\" : true,\n" + " \"instanceId\" : \"instance123\"\n" + "}", responseString); - } - - @Test - public void testDeserialization() - throws Exception { - String jsonResponse = "{\n" + " \"needReload\": false,\n" + " \"serverToSegmentsCheckReloadList\": {\n" - + " \"Server_10.0.0.215_7050\": {\n" + " \"needReload\": false,\n" - + " \"instanceId\": \"Server_10.0.0.215_7050\"\n" + " }\n" + " }\n" + "}"; - JsonNode jsonNode = JsonUtils.stringToJsonNode(jsonResponse); - TableSegmentsReloadCheckResponse tableReloadResponse = - JsonUtils.stringToObject(jsonResponse, new TypeReference<TableSegmentsReloadCheckResponse>() { - }); - // Then - assertNotNull(jsonNode); - assertFalse(tableReloadResponse.isNeedReload()); - assertNotNull(tableReloadResponse.getServerToSegmentsCheckReloadList()); - Map<String, ServerSegmentsReloadCheckResponse> serverSegmentReloadResp = - tableReloadResponse.getServerToSegmentsCheckReloadList(); - assertEquals(serverSegmentReloadResp.get("Server_10.0.0.215_7050").isNeedReload(), false); - } -} diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotLeadControllerRestletResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotLeadControllerRestletResource.java index 953bef41c7..709bd39a2f 100644 --- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotLeadControllerRestletResource.java +++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotLeadControllerRestletResource.java @@ -193,7 +193,8 @@ public class PinotLeadControllerRestletResource { private List<String> _tableNames; @JsonCreator - public LeadControllerEntry(String leadControllerId, List<String> tableNames) { + public LeadControllerEntry(@JsonProperty("leadControllerId") String leadControllerId, + @JsonProperty("tableNames") List<String> tableNames) { _leadControllerId = leadControllerId; _tableNames = tableNames; } @@ -211,18 +212,22 @@ public class PinotLeadControllerRestletResource { @JsonIgnoreProperties(ignoreUnknown = true) public static class LeadControllerResponse { - private boolean _isLeadControllerResourceEnabled; + @JsonProperty("leadControllerResourceEnabled") + private boolean _leadControllerResourceEnabled; + + @JsonProperty("leadControllerEntryMap") private Map<String, LeadControllerEntry> _leadControllerEntryMap; @JsonCreator - public LeadControllerResponse(boolean isLeadControllerResourceEnabled, - Map<String, LeadControllerEntry> leadControllerEntryMap) { - _isLeadControllerResourceEnabled = isLeadControllerResourceEnabled; + public LeadControllerResponse( + @JsonProperty("leadControllerResourceEnabled") boolean leadControllerResourceEnabled, + @JsonProperty("leadControllerEntryMap") Map<String, LeadControllerEntry> leadControllerEntryMap) { + _leadControllerResourceEnabled = leadControllerResourceEnabled; _leadControllerEntryMap = leadControllerEntryMap; } public boolean isLeadControllerResourceEnabled() { - return _isLeadControllerResourceEnabled; + return _leadControllerResourceEnabled; } public Map<String, LeadControllerEntry> getLeadControllerEntryMap() { diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/util/JsonSerializerTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/util/JsonSerializerTest.java new file mode 100644 index 0000000000..e89686aa28 --- /dev/null +++ b/pinot-controller/src/test/java/org/apache/pinot/controller/util/JsonSerializerTest.java @@ -0,0 +1,283 @@ +/** + * 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.pinot.controller.util; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.JsonNode; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.apache.pinot.common.restlet.resources.ServerSegmentsReloadCheckResponse; +import org.apache.pinot.common.restlet.resources.TableSegmentsReloadCheckResponse; +import org.apache.pinot.controller.api.resources.PinotLeadControllerRestletResource; +import org.apache.pinot.spi.utils.JsonUtils; +import org.testng.annotations.Test; + +import static org.testng.Assert.assertEquals; +import static org.testng.Assert.assertFalse; +import static org.testng.Assert.assertNotNull; +import static org.testng.Assert.assertTrue; + + +/** + * Test class to check for json responses during serialization and deserialization + */ +public class JsonSerializerTest { + @Test + public void testTableReloadResponseSerialization() + throws IOException { + boolean needReload = true; + String instanceId = "instance123"; + ServerSegmentsReloadCheckResponse response = new ServerSegmentsReloadCheckResponse(needReload, instanceId); + Map<String, ServerSegmentsReloadCheckResponse> serversResponse = new HashMap<>(); + serversResponse.put(instanceId, response); + TableSegmentsReloadCheckResponse tableResponse = new TableSegmentsReloadCheckResponse(needReload, serversResponse); + String responseString = JsonUtils.objectToPrettyString(response); + String tableResponseString = JsonUtils.objectToPrettyString(tableResponse); + + assertNotNull(responseString); + assertNotNull(tableResponseString); + JsonNode tableResponseJsonNode = JsonUtils.stringToJsonNode(tableResponseString); + assertTrue(tableResponseJsonNode.get("needReload").asBoolean()); + + JsonNode serversList = tableResponseJsonNode.get("serverToSegmentsCheckReloadList"); + JsonNode serverResp = serversList.get("instance123"); + assertEquals(serverResp.get("instanceId").asText(), "instance123"); + assertTrue(serverResp.get("needReload").asBoolean()); + //@formatter:off + assertEquals("{\n" + + " \"needReload\" : true,\n" + + " \"serverToSegmentsCheckReloadList\" : {\n" + + " \"instance123\" : {\n" + + " \"needReload\" : true,\n" + + " \"instanceId\" : \"instance123\"\n" + + " }\n" + + " }\n" + + "}", tableResponseString); + assertEquals("{\n" + + " \"needReload\" : true,\n" + + " \"instanceId\" : \"instance123\"\n" + + "}", responseString); + //@formatter:on + } + + @Test + public void testTableReloadResponseDeserialization() + throws Exception { + //@formatter:off + String jsonResponse = "{\n" + + " \"needReload\": false,\n" + + " \"serverToSegmentsCheckReloadList\": {\n" + + " \"Server_10.0.0.215_7050\": {\n" + + " \"needReload\": false,\n" + + " \"instanceId\": \"Server_10.0.0.215_7050\"\n" + + " }\n" + + " }\n" + + "}\n"; + //@formatter:on + JsonNode jsonNode = JsonUtils.stringToJsonNode(jsonResponse); + TableSegmentsReloadCheckResponse tableReloadResponse = + JsonUtils.stringToObject(jsonResponse, new TypeReference<TableSegmentsReloadCheckResponse>() { + }); + assertNotNull(jsonNode); + assertFalse(tableReloadResponse.isNeedReload()); + assertNotNull(tableReloadResponse.getServerToSegmentsCheckReloadList()); + Map<String, ServerSegmentsReloadCheckResponse> serverSegmentReloadResp = + tableReloadResponse.getServerToSegmentsCheckReloadList(); + assertEquals(serverSegmentReloadResp.get("Server_10.0.0.215_7050").isNeedReload(), false); + } + + @Test + public void testLeadControllerResponseSerialization() + throws IOException { + boolean leadControllerResourceEnabled = true; + Map<String, PinotLeadControllerRestletResource.LeadControllerEntry> leadControllerEntryMap = new HashMap<>(); + List<String> tableNames = new ArrayList<>(); + tableNames.add("fineFoodReviews_OFFLINE"); + tableNames.add("dimBaseballTeams_OFFLINE"); + PinotLeadControllerRestletResource.LeadControllerEntry leadControllerEntry = + new PinotLeadControllerRestletResource.LeadControllerEntry("Controller_192.168.1.148_9000", tableNames); + leadControllerEntryMap.put("leadControllerResource_0", leadControllerEntry); + PinotLeadControllerRestletResource.LeadControllerResponse leadControllerResponse = + new PinotLeadControllerRestletResource.LeadControllerResponse(leadControllerResourceEnabled, + leadControllerEntryMap); + String leaderControllerRespStr = JsonUtils.objectToPrettyString(leadControllerResponse); + String leadControllerEntryRespStr = JsonUtils.objectToPrettyString(leadControllerEntry); + //@formatter:off + assertEquals("{\n" + + " \"leadControllerResourceEnabled\" : true,\n" + + " \"leadControllerEntryMap\" : {\n" + + " \"leadControllerResource_0\" : {\n" + + " \"leadControllerId\" : \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\" : [ \"fineFoodReviews_OFFLINE\", \"dimBaseballTeams_OFFLINE\" ]\n" + + " }\n" + + " }\n" + + "}", leaderControllerRespStr); + assertEquals("{\n" + + " \"leadControllerId\" : \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\" : [ \"fineFoodReviews_OFFLINE\", \"dimBaseballTeams_OFFLINE\" ]\n" + + "}", + leadControllerEntryRespStr); + //@formatter:on + assertNotNull(leaderControllerRespStr); + assertNotNull(leadControllerEntryRespStr); + JsonNode leadControllerRespNodeStr = JsonUtils.stringToJsonNode(leaderControllerRespStr); + JsonNode leadControllerEntryRespNodeStr = JsonUtils.stringToJsonNode(leadControllerEntryRespStr); + + assertTrue(leadControllerRespNodeStr.get("leadControllerResourceEnabled").asBoolean()); + JsonNode controllerEntryMap = leadControllerRespNodeStr.get("leadControllerEntryMap"); + JsonNode controllerEntry = controllerEntryMap.get("leadControllerResource_0"); + assertEquals(controllerEntry.get("leadControllerId").asText(), "Controller_192.168.1.148_9000"); + assertEquals(controllerEntry.get("tableNames").size(), 2); + PinotLeadControllerRestletResource.LeadControllerEntry tableReloadResponse = + JsonUtils.stringToObject(leadControllerEntryRespStr, new TypeReference<>() { + }); + assertEquals(tableReloadResponse.getLeadControllerId(), "Controller_192.168.1.148_9000"); + assertEquals(tableReloadResponse.getTableNames().size(), 2); + assertTrue(tableReloadResponse.getTableNames().contains("fineFoodReviews_OFFLINE")); + assertTrue(tableReloadResponse.getTableNames().contains("dimBaseballTeams_OFFLINE")); + } + + @Test + public void testLeadControllerResponseDeserialization() + throws Exception { + //@formatter:off + String jsonResponse = "{\n" + + " \"leadControllerResourceEnabled\": true,\n" + + " \"leadControllerEntryMap\": {\n" + + " \"leadControllerResource_0\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_1\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_2\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_3\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_4\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_5\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_6\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_7\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": [\n" + + " \"baseballStats_OFFLINE\"\n" + + " ]\n" + + " },\n" + + " \"leadControllerResource_8\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_9\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_10\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_11\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_12\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_13\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_14\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_15\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_16\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_17\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": [\n" + + " \"clickstreamFunnel_OFFLINE\"\n" + + " ]\n" + + " },\n" + + " \"leadControllerResource_18\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_19\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": [\n" + + " \"airlineStats_OFFLINE\"\n" + + " ]\n" + + " },\n" + + " \"leadControllerResource_20\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_21\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_22\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " },\n" + + " \"leadControllerResource_23\": {\n" + + " \"leadControllerId\": \"Controller_192.168.1.148_9000\",\n" + + " \"tableNames\": []\n" + + " }\n" + + " }\n" + + "}"; + //@formatter:on + JsonNode jsonNode = JsonUtils.stringToJsonNode(jsonResponse); + PinotLeadControllerRestletResource.LeadControllerResponse tableReloadResponse = + JsonUtils.stringToObject(jsonResponse, new TypeReference<>() { + }); + assertNotNull(jsonNode); + assertTrue(tableReloadResponse.isLeadControllerResourceEnabled()); + assertNotNull(tableReloadResponse.getLeadControllerEntryMap()); + Map<String, PinotLeadControllerRestletResource.LeadControllerEntry> serverSegmentReloadResp = + tableReloadResponse.getLeadControllerEntryMap(); + assertTrue( + serverSegmentReloadResp.get("leadControllerResource_17").getTableNames().contains("clickstreamFunnel_OFFLINE")); + } +} --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org