This is an automated email from the ASF dual-hosted git repository.

chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git


The following commit(s) were added to refs/heads/master by this push:
     new 02fb525e1 [KYUUBI #5010] Make Kyuubi server's connection URL 
configurable
02fb525e1 is described below

commit 02fb525e11fd060838175e1f0a8671c3ed133fca
Author: toshihiko.uchida <[email protected]>
AuthorDate: Mon Jul 17 11:47:29 2023 +0800

    [KYUUBI #5010] Make Kyuubi server's connection URL configurable
    
    ### _Why are the changes needed?_
    
    This PR resolves https://github.com/apache/kyuubi/issues/5010, by 
introducing a new configuration property that makes it possible to override the 
hostname or ip of the Kyuubi server's thrift frontend service that will be 
registered for the service discovery ensemble.
    
    ### _How was this patch tested?_
    - [X] Add some test cases that check the changes thoroughly including 
negative and positive cases if possible
    
    - [X] Add screenshots for manual tests if appropriate
    
    Before applying the patch, when we set `kyuubi.frontend.bind.host=0.0.0.0`, 
the znode becomes as follows.
    ```
    [zk: some_zk_host:some_zk_port(CONNECTED) 0] ls /some_kyuubi_zk_namespace
    [serviceUri=0.0.0.0:10009;version=1.8.0-SNAPSHOT;sequence=0000000007]
    ```
    After applying the patch, when we set `kyuubi.frontend.bind.host=0.0.0.0` 
and `kyuubi.frontend.advertised.host=some_kyuubi_host`, it becomes as follows.
    ```
    [zk: some_zk_host:some_zk_port(CONNECTED) 0] ls /some_kyuubi_zk_namespace
    
[serviceUri=some_kyuubi_host:10009;version=1.8.0-SNAPSHOT;sequence=0000000009]
    ```
    
    - [X] [Run 
test](https://kyuubi.readthedocs.io/en/master/contributing/code/testing.html#running-tests)
 locally before make a pull request
    
    `./build/mvn clean install -pl kyuubi-common` succeeded.
    
    Closes #5015 from touchida/issue-5010-connection-url.
    
    Closes #5010
    
    4598c2baf [Cheng Pan] Update 
kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
    bf53a8a13 [Cheng Pan] Update 
kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
    0ddf09f0f [toshihiko.uchida] Use pattern matching instead of if-else
    34c61d90d [toshihiko.uchida] Rename to kyuubi.frontend.advertised.host and 
apply to all frontends
    7fd980baf [toshihiko.uchida] [KYUUBI #5010] Make Kyuubi server's thrift 
frontend connection URL configurable
    
    Lead-authored-by: toshihiko.uchida <[email protected]>
    Co-authored-by: Cheng Pan <[email protected]>
    Signed-off-by: Cheng Pan <[email protected]>
---
 docs/deployment/settings.md                        |  1 +
 .../org/apache/kyuubi/config/KyuubiConf.scala      | 10 ++++++++
 .../apache/kyuubi/service/TFrontendService.scala   | 12 +++++-----
 .../kyuubi/service/TFrontendServiceSuite.scala     | 27 ++++++++++++++++++++++
 .../kyuubi/server/KyuubiMySQLFrontendService.scala |  5 +++-
 .../kyuubi/server/KyuubiRestFrontendService.scala  |  9 ++++++--
 .../kyuubi/server/KyuubiTrinoFrontendService.scala | 11 ++++++---
 .../server/KyuubiMySQLFrontendServiceSuite.scala   | 20 ++++++++++++++++
 8 files changed, 83 insertions(+), 12 deletions(-)

diff --git a/docs/deployment/settings.md b/docs/deployment/settings.md
index 2d2c589ae..5d795864d 100644
--- a/docs/deployment/settings.md
+++ b/docs/deployment/settings.md
@@ -201,6 +201,7 @@ You can configure the Kyuubi properties in 
`$KYUUBI_HOME/conf/kyuubi-defaults.co
 
 |                          Key                           |      Default       
|                                                                               
                                                                                
                                                                                
            Meaning                                                             
                                                                                
               [...]
 
|--------------------------------------------------------|--------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 [...]
+| kyuubi.frontend.advertised.host                        | &lt;undefined&gt;  
| Hostname or IP of the Kyuubi server's frontend services to publish to 
external systems such as the service discovery ensemble and metadata store. Use 
it when you want to advertise a different hostname or IP than the bind host.    
                                                                                
                                                                                
                       [...]
 | kyuubi.frontend.backoff.slot.length                    | PT0.1S             
| (deprecated) Time to back off during login to the thrift frontend service.    
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
 | kyuubi.frontend.bind.host                              | &lt;undefined&gt;  
| Hostname or IP of the machine on which to run the frontend services.          
                                                                                
                                                                                
                                                                                
                                                                                
               [...]
 | kyuubi.frontend.bind.port                              | 10009              
| (deprecated) Port of the machine on which to run the thrift frontend service 
via the binary protocol.                                                        
                                                                                
                                                                                
                                                                                
                [...]
diff --git 
a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala 
b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
index b8a75d27f..116455da7 100644
--- a/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
+++ b/kyuubi-common/src/main/scala/org/apache/kyuubi/config/KyuubiConf.scala
@@ -429,6 +429,16 @@ object KyuubiConf {
     .stringConf
     .createOptional
 
+  val FRONTEND_ADVERTISED_HOST: OptionalConfigEntry[String] =
+    buildConf("kyuubi.frontend.advertised.host")
+      .doc("Hostname or IP of the Kyuubi server's frontend services to publish 
to " +
+        "external systems such as the service discovery ensemble and metadata 
store. " +
+        "Use it when you want to advertise a different hostname or IP than the 
bind host.")
+      .version("1.8.0")
+      .serverOnly
+      .stringConf
+      .createOptional
+
   val FRONTEND_THRIFT_BINARY_BIND_HOST: ConfigEntry[Option[String]] =
     buildConf("kyuubi.frontend.thrift.binary.bind.host")
       .doc("Hostname or IP of the machine on which to run the thrift frontend 
service " +
diff --git 
a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala 
b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala
index 7532beccb..aa012ab56 100644
--- 
a/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala
+++ 
b/kyuubi-common/src/main/scala/org/apache/kyuubi/service/TFrontendService.scala
@@ -31,7 +31,7 @@ import org.apache.thrift.transport.TTransport
 
 import org.apache.kyuubi.{KyuubiSQLException, Logging, Utils}
 import org.apache.kyuubi.Utils.stringifyException
-import 
org.apache.kyuubi.config.KyuubiConf.{FRONTEND_CONNECTION_URL_USE_HOSTNAME, 
SESSION_CLOSE_ON_DISCONNECT}
+import org.apache.kyuubi.config.KyuubiConf.{FRONTEND_ADVERTISED_HOST, 
FRONTEND_CONNECTION_URL_USE_HOSTNAME, SESSION_CLOSE_ON_DISCONNECT}
 import org.apache.kyuubi.config.KyuubiReservedKeys._
 import org.apache.kyuubi.operation.{FetchOrientation, OperationHandle}
 import org.apache.kyuubi.service.authentication.KyuubiAuthenticationFactory
@@ -112,12 +112,12 @@ abstract class TFrontendService(name: String)
 
   override def connectionUrl: String = {
     checkInitialized()
-    val host = serverHost match {
-      case Some(h) => h // respect user's setting ahead
-      case None if conf.get(FRONTEND_CONNECTION_URL_USE_HOSTNAME) =>
+    val host = (conf.get(FRONTEND_ADVERTISED_HOST), serverHost) match {
+      case (Some(advertisedHost), _) => advertisedHost
+      case (None, Some(h)) => h
+      case (None, None) if conf.get(FRONTEND_CONNECTION_URL_USE_HOSTNAME) =>
         serverAddr.getCanonicalHostName
-      case None =>
-        serverAddr.getHostAddress
+      case (None, None) => serverAddr.getHostAddress
     }
 
     host + ":" + actualPort
diff --git 
a/kyuubi-common/src/test/scala/org/apache/kyuubi/service/TFrontendServiceSuite.scala
 
b/kyuubi-common/src/test/scala/org/apache/kyuubi/service/TFrontendServiceSuite.scala
index 914388b99..53e05f34b 100644
--- 
a/kyuubi-common/src/test/scala/org/apache/kyuubi/service/TFrontendServiceSuite.scala
+++ 
b/kyuubi-common/src/test/scala/org/apache/kyuubi/service/TFrontendServiceSuite.scala
@@ -115,6 +115,33 @@ class TFrontendServiceSuite extends KyuubiFunSuite {
     assert(service2.connectionUrl.split("\\.")(0).toInt > 0)
   }
 
+  test("advertised host") {
+
+    def newService: TBinaryFrontendService = {
+      new TBinaryFrontendService("DummyThriftBinaryFrontendService") {
+        override val serverable: Serverable = new NoopTBinaryFrontendServer
+        override val discoveryService: Option[Service] = None
+      }
+    }
+
+    val conf = new KyuubiConf()
+      .set(FRONTEND_THRIFT_BINARY_BIND_HOST.key, "localhost")
+      .set(FRONTEND_THRIFT_BINARY_BIND_PORT, 0)
+      .set(FRONTEND_ADVERTISED_HOST, "dummy.host")
+    val service = newService
+
+    service.initialize(conf)
+    assert(service.connectionUrl.startsWith("dummy.host"))
+
+    val service2 = newService
+    val conf2 = KyuubiConf()
+      .set(FRONTEND_THRIFT_BINARY_BIND_HOST.key, "localhost")
+      .set(FRONTEND_THRIFT_BINARY_BIND_PORT, 0)
+
+    service2.initialize(conf2)
+    assert(service2.connectionUrl.startsWith("localhost"))
+  }
+
   test("open session") {
     TClientTestUtils.withThriftClient(server.frontendServices.head) {
       client =>
diff --git 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
index 96a2114aa..1a449dde4 100644
--- 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
+++ 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendService.scala
@@ -94,7 +94,10 @@ class KyuubiMySQLFrontendService(override val serverable: 
Serverable)
 
   override def connectionUrl: String = {
     checkInitialized()
-    s"${serverAddr.getCanonicalHostName}:$port"
+    conf.get(FRONTEND_ADVERTISED_HOST) match {
+      case Some(advertisedHost) => s"$advertisedHost:$port"
+      case None => s"${serverAddr.getCanonicalHostName}:$port"
+    }
   }
 
   override def start(): Unit = synchronized {
diff --git 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
index fc9080e66..20df64df2 100644
--- 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
+++ 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiRestFrontendService.scala
@@ -68,19 +68,24 @@ class KyuubiRestFrontendService(override val serverable: 
Serverable)
       }
     }
 
+  private lazy val port: Int = conf.get(FRONTEND_REST_BIND_PORT)
+
   override def initialize(conf: KyuubiConf): Unit = synchronized {
     this.conf = conf
     server = JettyServer(
       getName,
       host,
-      conf.get(FRONTEND_REST_BIND_PORT),
+      port,
       conf.get(FRONTEND_REST_MAX_WORKER_THREADS))
     super.initialize(conf)
   }
 
   override def connectionUrl: String = {
     checkInitialized()
-    server.getServerUri
+    conf.get(FRONTEND_ADVERTISED_HOST) match {
+      case Some(advertisedHost) => s"$advertisedHost:$port"
+      case None => server.getServerUri
+    }
   }
 
   private def startInternal(): Unit = {
diff --git 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
index 573bb948f..95f6d5902 100644
--- 
a/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
+++ 
b/kyuubi-server/src/main/scala/org/apache/kyuubi/server/KyuubiTrinoFrontendService.scala
@@ -21,7 +21,7 @@ import java.util.concurrent.atomic.AtomicBoolean
 
 import org.apache.kyuubi.{KyuubiException, Utils}
 import org.apache.kyuubi.config.KyuubiConf
-import org.apache.kyuubi.config.KyuubiConf.{FRONTEND_TRINO_BIND_HOST, 
FRONTEND_TRINO_BIND_PORT, FRONTEND_TRINO_MAX_WORKER_THREADS}
+import org.apache.kyuubi.config.KyuubiConf.{FRONTEND_ADVERTISED_HOST, 
FRONTEND_TRINO_BIND_HOST, FRONTEND_TRINO_BIND_PORT, 
FRONTEND_TRINO_MAX_WORKER_THREADS}
 import org.apache.kyuubi.server.trino.api.v1.ApiRootResource
 import org.apache.kyuubi.server.ui.JettyServer
 import org.apache.kyuubi.service.{AbstractFrontendService, Serverable, Service}
@@ -46,19 +46,24 @@ class KyuubiTrinoFrontendService(override val serverable: 
Serverable)
       }
     }
 
+  private lazy val port: Int = conf.get(FRONTEND_TRINO_BIND_PORT)
+
   override def initialize(conf: KyuubiConf): Unit = synchronized {
     this.conf = conf
     server = JettyServer(
       getName,
       host,
-      conf.get(FRONTEND_TRINO_BIND_PORT),
+      port,
       conf.get(FRONTEND_TRINO_MAX_WORKER_THREADS))
     super.initialize(conf)
   }
 
   override def connectionUrl: String = {
     checkInitialized()
-    server.getServerUri
+    conf.get(FRONTEND_ADVERTISED_HOST) match {
+      case Some(advertisedHost) => s"$advertisedHost:$port"
+      case None => server.getServerUri
+    }
   }
 
   private def startInternal(): Unit = {
diff --git 
a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendServiceSuite.scala
 
b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendServiceSuite.scala
index 735863b8b..4bf8b8eda 100644
--- 
a/kyuubi-server/src/test/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendServiceSuite.scala
+++ 
b/kyuubi-server/src/test/scala/org/apache/kyuubi/server/KyuubiMySQLFrontendServiceSuite.scala
@@ -19,6 +19,7 @@ package org.apache.kyuubi.server
 
 import org.apache.kyuubi.KyuubiFunSuite
 import org.apache.kyuubi.config.KyuubiConf
+import org.apache.kyuubi.config.KyuubiConf.{FRONTEND_ADVERTISED_HOST, 
FRONTEND_MYSQL_BIND_HOST, FRONTEND_MYSQL_BIND_PORT}
 import org.apache.kyuubi.service.NoopMySQLFrontendServer
 import org.apache.kyuubi.service.ServiceState._
 
@@ -53,4 +54,23 @@ class KyuubiMySQLFrontendServiceSuite extends KyuubiFunSuite 
{
     assert(frontendService.getServiceState == STOPPED)
     server.stop()
   }
+
+  test("advertised host") {
+    val server = new NoopMySQLFrontendServer
+    val conf = KyuubiConf()
+      .set(FRONTEND_MYSQL_BIND_HOST.key, "localhost")
+      .set(FRONTEND_MYSQL_BIND_PORT, 0)
+      .set(FRONTEND_ADVERTISED_HOST, "dummy.host")
+
+    server.initialize(conf)
+    assert(server.frontendServices.head.connectionUrl.startsWith("dummy.host"))
+
+    val server2 = new NoopMySQLFrontendServer
+    val conf2 = KyuubiConf()
+      .set(FRONTEND_MYSQL_BIND_HOST.key, "localhost")
+      .set(FRONTEND_MYSQL_BIND_PORT, 0)
+
+    server2.initialize(conf2)
+    assert(server2.frontendServices.head.connectionUrl.startsWith("localhost"))
+  }
 }

Reply via email to