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

Reply via email to