blob: fa4505cc24828b52221b7c74a8b4c54a9de1fd76 [file]
/*
* 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.kyuubi.plugin
import scala.collection.JavaConverters._
import org.apache.kyuubi.{KyuubiException, KyuubiFunSuite}
import org.apache.kyuubi.config.KyuubiConf
import org.apache.kyuubi.session.{FileSessionConfAdvisor, HadoopGroupProvider}
class PluginLoaderSuite extends KyuubiFunSuite {
test("SessionConfAdvisor - wrong class") {
val conf = new KyuubiConf(false)
assert(PluginLoader.loadSessionConfAdvisor(conf).head.isInstanceOf[DefaultSessionConfAdvisor])
conf.set(KyuubiConf.SESSION_CONF_ADVISOR, Seq(classOf[InvalidSessionConfAdvisor].getName))
val msg1 = intercept[KyuubiException] {
PluginLoader.loadSessionConfAdvisor(conf)
}.getMessage
assert(msg1.contains(s"is not a child of '${classOf[SessionConfAdvisor].getName}'"))
conf.set(KyuubiConf.SESSION_CONF_ADVISOR, Seq("non.exists"))
val msg2 = intercept[IllegalArgumentException] {
PluginLoader.loadSessionConfAdvisor(conf)
}.getMessage
assert(msg2.startsWith("Error while instantiating 'non.exists'"))
}
test("FileSessionConfAdvisor") {
val conf = new KyuubiConf(false)
conf.set(KyuubiConf.SESSION_CONF_ADVISOR, Seq(classOf[FileSessionConfAdvisor].getName))
val advisor = PluginLoader.loadSessionConfAdvisor(conf)
val emptyConfig =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(emptyConfig.isEmpty)
conf.set(KyuubiConf.SESSION_CONF_PROFILE, Seq("non.exists"))
val nonExistsConfig =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(nonExistsConfig.isEmpty)
conf.set(KyuubiConf.SESSION_CONF_PROFILE, Seq("cluster-a"))
val clusterAConf =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(clusterAConf.get("kyuubi.ha.namespace") == "kyuubi-ns-a")
assert(clusterAConf.get("kyuubi.zk.ha.namespace") == null)
assert(clusterAConf.size() == 5)
val clusterAConfFromCache =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(clusterAConfFromCache.get("kyuubi.ha.namespace") == "kyuubi-ns-a")
assert(clusterAConfFromCache.get("kyuubi.zk.ha.namespace") == null)
assert(clusterAConfFromCache.size() == 5)
conf.set(KyuubiConf.SESSION_CONF_PROFILE, Seq("cluster-a", "cluster-b"))
val clusterABConf =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(clusterABConf.get("kyuubi.ha.namespace") == "kyuubi-ns-b")
assert(clusterABConf.get("kyuubi.zk.ha.namespace") == null)
assert(clusterABConf.get("kyuubi.engineEnv.HIVE_DIR") == "/opt/hive_conf_dir")
assert(clusterABConf.size() == 6)
val clusterABConfFromCache =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(clusterABConfFromCache.get("kyuubi.ha.namespace") == "kyuubi-ns-b")
assert(clusterABConfFromCache.get("kyuubi.zk.ha.namespace") == null)
assert(clusterABConf.get("kyuubi.engineEnv.HIVE_DIR") == "/opt/hive_conf_dir")
assert(clusterABConfFromCache.size() == 6)
}
test("SessionConfAdvisor - multi class") {
val conf = new KyuubiConf(false)
conf.set(
KyuubiConf.SESSION_CONF_ADVISOR,
Seq(classOf[FileSessionConfAdvisor].getName, classOf[TestSessionConfAdvisor].getName))
val advisor = PluginLoader.loadSessionConfAdvisor(conf)
conf.set(KyuubiConf.SESSION_CONF_PROFILE, Seq("cluster-a"))
val clusterAConf =
advisor.map(_.getConfOverlay("chris", conf.getAll.asJava).asScala).reduce(_ ++ _).asJava
assert(clusterAConf.get("kyuubi.ha.namespace") == "kyuubi-ns-a")
assert(clusterAConf.get("kyuubi.zk.ha.namespace") == null)
assert(clusterAConf.get("spark.k3") == "v3")
assert(clusterAConf.size() == 7)
}
test("GroupProvider - wrong class") {
val conf = new KyuubiConf(false)
conf.set(KyuubiConf.GROUP_PROVIDER, "hadoop")
assert(PluginLoader.loadGroupProvider(conf).isInstanceOf[HadoopGroupProvider])
conf.set(KyuubiConf.GROUP_PROVIDER, classOf[HadoopGroupProvider].getName)
assert(PluginLoader.loadGroupProvider(conf).isInstanceOf[HadoopGroupProvider])
conf.set(KyuubiConf.GROUP_PROVIDER, classOf[InvalidGroupProvider].getName)
val msg1 = intercept[KyuubiException] {
PluginLoader.loadGroupProvider(conf)
}.getMessage
assert(msg1.contains(s"is not a child of '${classOf[GroupProvider].getName}'"))
conf.set(KyuubiConf.GROUP_PROVIDER, "non.exists")
val msg2 = intercept[IllegalArgumentException] {
PluginLoader.loadGroupProvider(conf)
}.getMessage
assert(msg2.startsWith("Error while instantiating 'non.exists'"))
}
test("HadoopGroupProvider") {
val conf = new KyuubiConf(false)
conf.set(KyuubiConf.GROUP_PROVIDER, "hadoop")
val groupProvider = PluginLoader.loadGroupProvider(conf)
assert(groupProvider.isInstanceOf[HadoopGroupProvider])
val user = "somebody"
assert(groupProvider.primaryGroup(user, Map.empty[String, String].asJava) === user)
assert(groupProvider.groups(user, Map.empty[String, String].asJava) === Array(user))
}
}
class InvalidSessionConfAdvisor
class InvalidGroupProvider
class TestSessionConfAdvisor extends SessionConfAdvisor {
override def getConfOverlay(
user: String,
sessionConf: java.util.Map[String, String]): java.util.Map[String, String] = {
Map("spark.k3" -> "v3", "spark.k4" -> "v4").asJava
}
}