You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pinot.apache.org by ti...@apache.org on 2023/07/11 23:05:29 UTC
[pinot] branch master updated: New API to get tenant tags (#10937)
This is an automated email from the ASF dual-hosted git repository.
tingchen 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 1cdcf70dce New API to get tenant tags (#10937)
1cdcf70dce is described below
commit 1cdcf70dce5a7e145c14fd617449a431863b8fae
Author: npuppala111 <44...@users.noreply.github.com>
AuthorDate: Tue Jul 11 16:05:23 2023 -0700
New API to get tenant tags (#10937)
* Added InstanceResource.java
* Added intial Executor service to InstanceResource
* Added JavaDoc
* [partial cherry-pick] Added InstanceResource for Server/Broker
* Fixed BaseResourceTest.java
* Fixed BaseResourceTest.java
* Deleted unused variable
* Minor changes to InstanceResource
* Updated InstanceResource
* Updated InstanceResource
* Fized checkstyle error in InstanceResource
* Fixed JavaDoc typo in InstanceResource
---
.../broker/api/resources/InstanceResource.java | 75 +++++++++++++++++++++
.../broker/broker/BrokerAdminApiApplication.java | 5 +-
.../broker/broker/helix/BaseBrokerStarter.java | 2 +-
.../pinot/server/api/AdminApiApplication.java | 2 +
.../server/api/resources/InstanceResource.java | 76 ++++++++++++++++++++++
.../apache/pinot/server/api/AccessControlTest.java | 2 +
.../apache/pinot/server/api/BaseResourceTest.java | 1 +
7 files changed, 161 insertions(+), 2 deletions(-)
diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/api/resources/InstanceResource.java b/pinot-broker/src/main/java/org/apache/pinot/broker/api/resources/InstanceResource.java
new file mode 100644
index 0000000000..3b6a80f6d6
--- /dev/null
+++ b/pinot-broker/src/main/java/org/apache/pinot/broker/api/resources/InstanceResource.java
@@ -0,0 +1,75 @@
+/**
+ * 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.broker.api.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiKeyAuthDefinition;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.SecurityDefinition;
+import io.swagger.annotations.SwaggerDefinition;
+import java.util.Collections;
+import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import org.apache.helix.HelixManager;
+import org.apache.helix.model.InstanceConfig;
+import org.apache.pinot.broker.broker.BrokerAdminApiApplication;
+import org.apache.pinot.common.utils.helix.HelixHelper;
+
+import static org.apache.pinot.spi.utils.CommonConstants.SWAGGER_AUTHORIZATION_KEY;
+
+/**
+ * This resource API can be used to retrieve instance level information like instance tags.
+ */
+@Api(description = "Metadata for this instance (like tenant tags)", tags = "instance",
+ authorizations = {@Authorization(value = SWAGGER_AUTHORIZATION_KEY)})
+@SwaggerDefinition(securityDefinition = @SecurityDefinition(apiKeyAuthDefinitions = @ApiKeyAuthDefinition(name =
+ HttpHeaders.AUTHORIZATION, in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, key = SWAGGER_AUTHORIZATION_KEY)))
+@Path("instance")
+public class InstanceResource {
+ @Inject
+ @Named(BrokerAdminApiApplication.BROKER_INSTANCE_ID)
+ private String _instanceId;
+ @Inject
+ private HelixManager _helixManager;
+
+ @GET
+ @Path("tags")
+ @ApiOperation(value = "Tenant tags for current instance")
+ @ApiResponses(value = {
+ @ApiResponse(code = 200, message = "Success"),
+ @ApiResponse(code = 500, message = "Internal server error")
+ })
+ @Produces(MediaType.APPLICATION_JSON)
+ public List<String> getInstanceTags() {
+ InstanceConfig config = HelixHelper.getInstanceConfig(_helixManager, _instanceId);
+ if (config != null && config.getTags() != null) {
+ return config.getTags();
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BrokerAdminApiApplication.java b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BrokerAdminApiApplication.java
index 74f5718cc4..b6f5d3291a 100644
--- a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BrokerAdminApiApplication.java
+++ b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/BrokerAdminApiApplication.java
@@ -29,6 +29,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.apache.commons.httpclient.HttpConnectionManager;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
+import org.apache.helix.HelixManager;
import org.apache.pinot.broker.requesthandler.BrokerRequestHandler;
import org.apache.pinot.broker.routing.BrokerRoutingManager;
import org.apache.pinot.common.metrics.BrokerMetrics;
@@ -67,7 +68,8 @@ public class BrokerAdminApiApplication extends ResourceConfig {
public BrokerAdminApiApplication(BrokerRoutingManager routingManager, BrokerRequestHandler brokerRequestHandler,
BrokerMetrics brokerMetrics, PinotConfiguration brokerConf, SqlQueryExecutor sqlQueryExecutor,
- ServerRoutingStatsManager serverRoutingStatsManager, AccessControlFactory accessFactory) {
+ ServerRoutingStatsManager serverRoutingStatsManager, AccessControlFactory accessFactory,
+ HelixManager helixManager) {
_brokerResourcePackages = brokerConf.getProperty(CommonConstants.Broker.BROKER_RESOURCE_PACKAGES,
CommonConstants.Broker.DEFAULT_BROKER_RESOURCE_PACKAGES);
String[] pkgs = _brokerResourcePackages.split(",");
@@ -90,6 +92,7 @@ public class BrokerAdminApiApplication extends ResourceConfig {
protected void configure() {
bind(connMgr).to(HttpConnectionManager.class);
bind(_executorService).to(Executor.class);
+ bind(helixManager).to(HelixManager.class);
bind(sqlQueryExecutor).to(SqlQueryExecutor.class);
bind(routingManager).to(BrokerRoutingManager.class);
bind(brokerRequestHandler).to(BrokerRequestHandler.class);
diff --git a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/helix/BaseBrokerStarter.java b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/helix/BaseBrokerStarter.java
index 1682de1881..c54183da8b 100644
--- a/pinot-broker/src/main/java/org/apache/pinot/broker/broker/helix/BaseBrokerStarter.java
+++ b/pinot-broker/src/main/java/org/apache/pinot/broker/broker/helix/BaseBrokerStarter.java
@@ -331,7 +331,7 @@ public abstract class BaseBrokerStarter implements ServiceStartable {
LOGGER.info("Starting broker admin application on: {}", ListenerConfigUtil.toString(_listenerConfigs));
_brokerAdminApplication =
new BrokerAdminApiApplication(_routingManager, _brokerRequestHandler, _brokerMetrics, _brokerConf,
- _sqlQueryExecutor, _serverRoutingStatsManager, _accessControlFactory);
+ _sqlQueryExecutor, _serverRoutingStatsManager, _accessControlFactory, _spectatorHelixManager);
registerExtraComponents(_brokerAdminApplication);
_brokerAdminApplication.start(_listenerConfigs);
diff --git a/pinot-server/src/main/java/org/apache/pinot/server/api/AdminApiApplication.java b/pinot-server/src/main/java/org/apache/pinot/server/api/AdminApiApplication.java
index 5a3e0acb67..a1bf4053cb 100644
--- a/pinot-server/src/main/java/org/apache/pinot/server/api/AdminApiApplication.java
+++ b/pinot-server/src/main/java/org/apache/pinot/server/api/AdminApiApplication.java
@@ -29,6 +29,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
+import org.apache.helix.HelixManager;
import org.apache.pinot.common.metrics.ServerMetrics;
import org.apache.pinot.common.utils.log.DummyLogFileServer;
import org.apache.pinot.common.utils.log.LocalLogFileServer;
@@ -70,6 +71,7 @@ public class AdminApiApplication extends ResourceConfig {
protected void configure() {
bind(_shutDownInProgress).to(AtomicBoolean.class);
bind(_serverInstance).to(ServerInstance.class);
+ bind(_serverInstance.getHelixManager()).to(HelixManager.class);
bind(_serverInstance.getServerMetrics()).to(ServerMetrics.class);
bind(accessControlFactory).to(AccessControlFactory.class);
bind(serverConf.getProperty(CommonConstants.Server.CONFIG_OF_INSTANCE_ID)).named(SERVER_INSTANCE_ID);
diff --git a/pinot-server/src/main/java/org/apache/pinot/server/api/resources/InstanceResource.java b/pinot-server/src/main/java/org/apache/pinot/server/api/resources/InstanceResource.java
new file mode 100644
index 0000000000..5b90d5935c
--- /dev/null
+++ b/pinot-server/src/main/java/org/apache/pinot/server/api/resources/InstanceResource.java
@@ -0,0 +1,76 @@
+/**
+ * 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.server.api.resources;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiKeyAuthDefinition;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
+import io.swagger.annotations.Authorization;
+import io.swagger.annotations.SecurityDefinition;
+import io.swagger.annotations.SwaggerDefinition;
+import java.util.Collections;
+import java.util.List;
+import javax.inject.Inject;
+import javax.inject.Named;
+import javax.ws.rs.GET;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.HttpHeaders;
+import javax.ws.rs.core.MediaType;
+import org.apache.helix.HelixManager;
+import org.apache.helix.model.InstanceConfig;
+import org.apache.pinot.common.utils.helix.HelixHelper;
+import org.apache.pinot.server.api.AdminApiApplication;
+
+import static org.apache.pinot.spi.utils.CommonConstants.SWAGGER_AUTHORIZATION_KEY;
+
+
+/**
+ * This resource API can be used to retrieve instance level information like instance tags.
+ */
+@Api(description = "Metadata for this instance (like tenant tags)", tags = "instance", authorizations =
+ {@Authorization(value = SWAGGER_AUTHORIZATION_KEY)})
+@SwaggerDefinition(securityDefinition = @SecurityDefinition(apiKeyAuthDefinitions = @ApiKeyAuthDefinition(name =
+ HttpHeaders.AUTHORIZATION, in = ApiKeyAuthDefinition.ApiKeyLocation.HEADER, key = SWAGGER_AUTHORIZATION_KEY)))
+@Path("instance")
+public class InstanceResource {
+ @Inject
+ @Named(AdminApiApplication.SERVER_INSTANCE_ID)
+ private String _instanceId;
+ @Inject
+ private HelixManager _helixManager;
+
+ @GET
+ @Path("tags")
+ @ApiOperation(value = "Tenant tags for current instance")
+ @ApiResponses(value = {
+ @ApiResponse(code = 200, message = "Success"), @ApiResponse(code = 500, message = "Internal server error")
+ })
+ @Produces(MediaType.APPLICATION_JSON)
+ public List<String> getInstanceTags() {
+ InstanceConfig config = HelixHelper.getInstanceConfig(_helixManager, _instanceId);
+ if (config != null && config.getTags() != null) {
+ return config.getTags();
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/pinot-server/src/test/java/org/apache/pinot/server/api/AccessControlTest.java b/pinot-server/src/test/java/org/apache/pinot/server/api/AccessControlTest.java
index e100484c5c..3cafcf102b 100644
--- a/pinot-server/src/test/java/org/apache/pinot/server/api/AccessControlTest.java
+++ b/pinot-server/src/test/java/org/apache/pinot/server/api/AccessControlTest.java
@@ -30,6 +30,7 @@ import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.Response;
import org.apache.commons.io.FileUtils;
+import org.apache.helix.HelixManager;
import org.apache.pinot.common.config.TlsConfig;
import org.apache.pinot.common.metrics.ServerMetrics;
import org.apache.pinot.core.auth.BasicAuthUtils;
@@ -73,6 +74,7 @@ public class AccessControlTest {
// Mock the server instance
ServerInstance serverInstance = mock(ServerInstance.class);
when(serverInstance.getServerMetrics()).thenReturn(mock(ServerMetrics.class));
+ when(serverInstance.getHelixManager()).thenReturn(mock(HelixManager.class));
PinotConfiguration serverConf = new PinotConfiguration();
String hostname = serverConf.getProperty(CommonConstants.Helix.KEY_OF_SERVER_NETTY_HOST,
diff --git a/pinot-server/src/test/java/org/apache/pinot/server/api/BaseResourceTest.java b/pinot-server/src/test/java/org/apache/pinot/server/api/BaseResourceTest.java
index 2065471438..3723f7a259 100644
--- a/pinot-server/src/test/java/org/apache/pinot/server/api/BaseResourceTest.java
+++ b/pinot-server/src/test/java/org/apache/pinot/server/api/BaseResourceTest.java
@@ -110,6 +110,7 @@ public abstract class BaseResourceTest {
when(serverInstance.getInstanceDataManager()).thenReturn(instanceDataManager);
when(serverInstance.getInstanceDataManager().getSegmentFileDirectory())
.thenReturn(FileUtils.getTempDirectoryPath());
+ when(serverInstance.getHelixManager()).thenReturn(mock(HelixManager.class));
// Mock the segment uploader
SegmentUploader segmentUploader = mock(SegmentUploader.class);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@pinot.apache.org
For additional commands, e-mail: commits-help@pinot.apache.org