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 <44955679+npuppala...@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-unsubscr...@pinot.apache.org For additional commands, e-mail: commits-h...@pinot.apache.org