This is an automated email from the ASF dual-hosted git repository. nehapawar pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/incubator-pinot.git
The following commit(s) were added to refs/heads/master by this push: new 6640aff Instance API to directly updateTags (#5902) 6640aff is described below commit 6640affe5b2ac6bc0a972c7a9e291c1d5189effb Author: Neha Pawar <neha.pawa...@gmail.com> AuthorDate: Thu Sep 3 16:23:57 2020 -0700 Instance API to directly updateTags (#5902) --- .../resources/PinotInstanceRestletResource.java | 23 ++++++++++++++++++++++ .../helix/ControllerRequestURLBuilder.java | 7 ++++++- .../helix/core/PinotHelixResourceManager.java | 19 ++++++++++++++++++ .../api/PinotInstanceRestletResourceTest.java | 13 ++++++++++++ .../pinot/controller/helix/ControllerTest.java | 8 ++++++++ 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotInstanceRestletResource.java b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotInstanceRestletResource.java index 4ba9ae2..cb6e629 100644 --- a/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotInstanceRestletResource.java +++ b/pinot-controller/src/main/java/org/apache/pinot/controller/api/resources/PinotInstanceRestletResource.java @@ -35,6 +35,7 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.apache.helix.model.InstanceConfig; @@ -196,4 +197,26 @@ public class PinotInstanceRestletResource { } return new SuccessResponse("Instance successfully updated"); } + + @PUT + @Path("/instances/{instanceName}/updateTags") + @Consumes(MediaType.APPLICATION_JSON) + @Produces(MediaType.APPLICATION_JSON) + @ApiOperation(value = "Update the tags of the specified instance", consumes = MediaType.APPLICATION_JSON, notes = "Update the tags of the specified instance") + @ApiResponses(value = {@ApiResponse(code = 200, message = "Success"), @ApiResponse(code = 500, message = "Internal error")}) + public SuccessResponse updateInstanceTags( + @ApiParam(value = "Instance name", required = true, example = "Server_a.b.com_20000 | Broker_my.broker.com_30000") @PathParam("instanceName") String instanceName, + @ApiParam(value = "Comma separated tags list", required = true) @QueryParam("tags") String tags) { + LOGGER.info("Instance update request received for instance: {} and tags: {}", instanceName, tags); + if (tags == null) { + throw new ControllerApplicationException(LOGGER, "Must provide tags to update", Response.Status.BAD_REQUEST); + } + PinotResourceManagerResponse response = pinotHelixResourceManager.updateInstanceTags(instanceName, tags); + if (!response.isSuccessful()) { + throw new ControllerApplicationException(LOGGER, + "Failure to update instance: " + instanceName + " with tags: " + tags + ". Reason: " + response.getMessage(), + Response.Status.INTERNAL_SERVER_ERROR); + } + return new SuccessResponse("Successfully updated tags for instance: " + instanceName + " tags: " + tags); + } } diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/ControllerRequestURLBuilder.java b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/ControllerRequestURLBuilder.java index 069b91b..6bd53b4 100644 --- a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/ControllerRequestURLBuilder.java +++ b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/ControllerRequestURLBuilder.java @@ -18,8 +18,9 @@ */ package org.apache.pinot.controller.helix; +import java.util.List; import javax.annotation.Nullable; -import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang3.StringUtils; import org.apache.pinot.common.utils.StringUtil; import org.apache.pinot.common.utils.URIUtils; import org.apache.pinot.controller.helix.core.rebalance.RebalanceConfigConstants; @@ -53,6 +54,10 @@ public class ControllerRequestURLBuilder { return StringUtil.join("/", _baseUrl, "instances", instanceName); } + public String forInstanceUpdateTags(String instanceName, List<String> tags) { + return StringUtil.join("/", _baseUrl, "instances", instanceName, "updateTags?tags=" + StringUtils.join(tags, ",")); + } + public String forInstanceList() { return StringUtil.join("/", _baseUrl, "instances"); } diff --git a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java index 7b6c468..1536128 100644 --- a/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java +++ b/pinot-controller/src/main/java/org/apache/pinot/controller/helix/core/PinotHelixResourceManager.java @@ -25,6 +25,7 @@ import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; +import com.google.common.collect.Lists; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -44,6 +45,7 @@ import java.util.concurrent.TimeoutException; import java.util.stream.Collectors; import javax.annotation.Nullable; import org.apache.commons.configuration.Configuration; +import org.apache.commons.lang3.StringUtils; import org.apache.helix.AccessOption; import org.apache.helix.ClusterMessagingService; import org.apache.helix.Criteria; @@ -400,6 +402,23 @@ public class PinotHelixResourceManager { } /** + * Updates the tags of the specified instance ID + */ + public synchronized PinotResourceManagerResponse updateInstanceTags(String instanceIdToUpdate, String tags) { + InstanceConfig instanceConfig = getHelixInstanceConfig(instanceIdToUpdate); + if (instanceConfig == null) { + return PinotResourceManagerResponse.failure("Instance " + instanceIdToUpdate + " does not exists"); + } + List<String> tagList = Arrays.asList(StringUtils.split(tags, ',')); + instanceConfig.getRecord().setListField(InstanceConfig.InstanceConfigProperty.TAG_LIST.name(), tagList); + if (!_helixDataAccessor.setProperty(_keyBuilder.instanceConfig(instanceIdToUpdate), instanceConfig)) { + return PinotResourceManagerResponse + .failure("Unable to update instance: " + instanceIdToUpdate + " to tags: " + tags); + } + return PinotResourceManagerResponse.SUCCESS; + } + + /** * Tenant related APIs */ // TODO: move tenant related APIs here diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotInstanceRestletResourceTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotInstanceRestletResourceTest.java index 1919b4f..a99e9d8 100644 --- a/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotInstanceRestletResourceTest.java +++ b/pinot-controller/src/test/java/org/apache/pinot/controller/api/PinotInstanceRestletResourceTest.java @@ -20,6 +20,7 @@ package org.apache.pinot.controller.api; import com.fasterxml.jackson.databind.JsonNode; import com.google.common.base.Function; +import com.google.common.collect.Lists; import java.io.IOException; import java.util.Arrays; import java.util.Collections; @@ -135,6 +136,18 @@ public class PinotInstanceRestletResourceTest extends ControllerTest { checkInstanceInfo(brokerInstanceId, "Broker_1.2.3.4", 1234, new String[]{newBrokerTag}, null, null); checkInstanceInfo(serverInstanceId, "Server_1.2.3.4", 2345, new String[]{newServerTag}, null, null); + + // Test Instance updateTags API + String brokerInstanceUpdateTagsUrl = _controllerRequestURLBuilder + .forInstanceUpdateTags(brokerInstanceId, Lists.newArrayList("tag_BROKER", "newTag_BROKER")); + sendPutRequest(brokerInstanceUpdateTagsUrl); + String serverInstanceUpdateTagsUrl = _controllerRequestURLBuilder.forInstanceUpdateTags(serverInstanceId, + Lists.newArrayList("tag_REALTIME", "newTag_OFFLINE", "newTag_REALTIME")); + sendPutRequest(serverInstanceUpdateTagsUrl); + checkInstanceInfo(brokerInstanceId, "Broker_1.2.3.4", 1234, new String[]{"tag_BROKER", "newTag_BROKER"}, null, + null); + checkInstanceInfo(serverInstanceId, "Server_1.2.3.4", 2345, + new String[]{"tag_REALTIME", "newTag_OFFLINE", "newTag_REALTIME"}, null, null); } private void checkInstanceInfo(String instanceName, String hostName, int port, String[] tags, String[] pools, diff --git a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/ControllerTest.java b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/ControllerTest.java index 0513566..2dd98d3 100644 --- a/pinot-controller/src/test/java/org/apache/pinot/controller/helix/ControllerTest.java +++ b/pinot-controller/src/test/java/org/apache/pinot/controller/helix/ControllerTest.java @@ -579,6 +579,14 @@ public abstract class ControllerTest { return constructResponse(httpConnection.getInputStream()); } + public static String sendPutRequest(String urlString) + throws IOException { + HttpURLConnection httpConnection = (HttpURLConnection) new URL(urlString).openConnection(); + httpConnection.setDoOutput(true); + httpConnection.setRequestMethod("PUT"); + return constructResponse(httpConnection.getInputStream()); + } + public static String sendDeleteRequest(String urlString) throws IOException { HttpURLConnection httpConnection = (HttpURLConnection) new URL(urlString).openConnection(); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org