diff options
author | Bjørn Christian Seime <bjorncs@oath.com> | 2018-05-15 14:19:30 +0200 |
---|---|---|
committer | Bjørn Christian Seime <bjorncs@oath.com> | 2018-05-15 14:20:34 +0200 |
commit | c1f4afc49e765e4555ccdf86ee89f46358dd4082 (patch) | |
tree | f6cd8b6948b4061f8b63e097c8ed1d093baca7e1 /standalone-container | |
parent | a33ad1f617968549d69a8aca7a80b371db4c12c3 (diff) |
Convert CloudConfigInstallVariables to Java
Diffstat (limited to 'standalone-container')
3 files changed, 184 insertions, 120 deletions
diff --git a/standalone-container/src/main/java/com/yahoo/container/standalone/CloudConfigInstallVariables.java b/standalone-container/src/main/java/com/yahoo/container/standalone/CloudConfigInstallVariables.java new file mode 100644 index 00000000000..6fed115cb96 --- /dev/null +++ b/standalone-container/src/main/java/com/yahoo/container/standalone/CloudConfigInstallVariables.java @@ -0,0 +1,170 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.standalone; + +import com.yahoo.vespa.model.container.configserver.option.CloudConfigOptions; + +import java.util.Arrays; +import java.util.Optional; +import java.util.function.Function; + +/** + * @author bjorncs + */ +public class CloudConfigInstallVariables implements CloudConfigOptions { + + @Override + public Optional<Integer> rpcPort() { + return getInstallVariable("port_configserver_rpc", "services", Integer::parseInt); + } + + @Override + public Optional<Boolean> multiTenant() { + return getInstallVariable("multitenant", Boolean::parseBoolean); + } + + @Override + public ConfigServer[] allConfigServers() { + String newVar = System.getenv("VESPA_CONFIGSERVERS"); + if (newVar != null && !newVar.isEmpty()) { + return toConfigServers(newVar); + } + String oldVar = getRawInstallVariable("services.addr_configserver").orElse(null); + if (oldVar != null && !oldVar.isEmpty()) { + return toConfigServers(oldVar); + } + return new ConfigServer[0]; + } + + @Override + public Optional<Long> zookeeperBarrierTimeout() { + return getInstallVariable("zookeeper_barrier_timeout", Long::parseLong); + } + + @Override + public Optional<Long> sessionLifeTimeSecs() { + return getInstallVariable("session_lifetime", Long::parseLong); + } + + @Override + public String[] configModelPluginDirs() { + return getRawInstallVariable("cloudconfig_server.config_model_plugin_dirs") + .map(CloudConfigInstallVariables::toConfigModelsPluginDir) + .orElseGet(() -> new String[0]); + } + + @Override + public Optional<Integer> zookeeperClientPort() { + return getInstallVariable("zookeeper_clientPort", Integer::parseInt); + } + + @Override + public Optional<Integer> zookeeperQuorumPort() { + return getInstallVariable("zookeeper_quoromPort", Integer::parseInt); + } + + @Override + public Optional<Integer> zookeeperElectionPort() { + return getInstallVariable("zookeeper_electionPort", Integer::parseInt); + } + + @Override + public Optional<String> payloadCompressionType() { + return getInstallVariable("payload_compression_type", Function.identity()); + } + + @Override + public Optional<String> environment() { + return getInstallVariable("environment"); + } + + @Override + public Optional<String> region() { + return getInstallVariable("region"); + } + + @Override + public Optional<String> system() { + return getInstallVariable("system"); + } + + @Override + public Optional<String> defaultFlavor() { + return getInstallVariable("default_flavor"); + } + + @Override + public Optional<String> defaultAdminFlavor() { + return getInstallVariable("default_admin_flavor"); + } + + @Override + public Optional<String> defaultContainerFlavor() { + return getInstallVariable("default_container_flavor"); + } + + @Override + public Optional<String> defaultContentFlavor() { + return getInstallVariable("default_content_flavor"); + } + + @Override + public Optional<Boolean> useVespaVersionInRequest() { + return getInstallVariable("use_vespa_version_in_request", Boolean::parseBoolean); + } + + @Override + public Optional<Boolean> hostedVespa() { + return getInstallVariable("hosted_vespa", Boolean::parseBoolean); + } + + @Override + public Optional<Integer> numParallelTenantLoaders() { + return getInstallVariable("num_parallel_tenant_loaders", Integer::parseInt); + } + + @Override + public Optional<String> loadBalancerAddress() { + return getInstallVariable("load_balancer_address"); + } + + static ConfigServer[] toConfigServers(String configserversString) { + return Arrays.stream(configserversString.split(",|\\s+")) + .map(CloudConfigInstallVariables::toConfigServer) + .toArray(ConfigServer[]::new); + } + + static ConfigServer toConfigServer(String configserverString) { + try { + String[] hostPortTuple = configserverString.split(":"); + if (configserverString.contains(":")) { + return new ConfigServer(hostPortTuple[0], Optional.of(Integer.parseInt(hostPortTuple[1]))); + } else { + return new ConfigServer(configserverString, Optional.empty()); + } + } catch (Exception e) { + throw new IllegalArgumentException("Invalid config server " + configserverString, e); + } + } + + static String[] toConfigModelsPluginDir(String configModelsPluginDirString) { + return configModelsPluginDirString.split(",|\\s+"); + } + + private static Optional<String> getInstallVariable(String name) { + return getInstallVariable(name, Function.identity()); + } + + private static <T> Optional<T> getInstallVariable(String name, Function<String, T> converter) { + return getInstallVariable(name, "cloudconfig_server", converter); + } + + private static <T> Optional<T> getInstallVariable(String name, String installPackage, Function<String, T> converter) { + return getRawInstallVariable(installPackage + "." + name).map(converter); + } + + private static Optional<String> getRawInstallVariable(String name) { + return Optional.ofNullable( + Optional.ofNullable(System.getenv(name.replace(".", "__"))) + .orElseGet(() -> System.getProperty(name))); + } +} diff --git a/standalone-container/src/main/scala/com/yahoo/container/standalone/CloudConfigInstallVariables.scala b/standalone-container/src/main/scala/com/yahoo/container/standalone/CloudConfigInstallVariables.scala deleted file mode 100644 index 9a6456cb8fc..00000000000 --- a/standalone-container/src/main/scala/com/yahoo/container/standalone/CloudConfigInstallVariables.scala +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.container.standalone - -import java.util.Optional - -import com.yahoo.vespa.model.container.configserver.option.CloudConfigOptions -import com.yahoo.vespa.model.container.configserver.option.CloudConfigOptions.ConfigServer - -import scala.language.implicitConversions -import scala.util.Try - -/** - * @author Tony Vaagenes - */ -class CloudConfigInstallVariables extends CloudConfigOptions { - import CloudConfigInstallVariables._ - - override val rpcPort = optionalInstallVar[Integer]("port_configserver_rpc", "services") - override val allConfigServers = getConfigservers - override val multiTenant = optionalInstallVar[java.lang.Boolean]("multitenant") - - override val zookeeperBarrierTimeout = optionalInstallVar[java.lang.Long]("zookeeper_barrier_timeout") - override val sessionLifeTimeSecs = optionalInstallVar[java.lang.Long]("session_lifetime") - override val configModelPluginDirs = installVar("config_model_plugin_dirs") withDefault Array[String]() - override val zookeeperClientPort = optionalInstallVar[Integer]("zookeeper_clientPort") - override val zookeeperQuorumPort = optionalInstallVar[Integer]("zookeeper_quoromPort") - override val zookeeperElectionPort = optionalInstallVar[Integer]("zookeeper_electionPort") - override val payloadCompressionType = optionalInstallVar[java.lang.String]("payload_compression_type") - override val environment = optionalInstallVar[java.lang.String]("environment") - override val region = optionalInstallVar[java.lang.String]("region") - override val system = optionalInstallVar[java.lang.String]("system") - override val defaultFlavor = optionalInstallVar[java.lang.String]("default_flavor") - override val defaultAdminFlavor = optionalInstallVar[java.lang.String]("default_admin_flavor") - override val defaultContainerFlavor = optionalInstallVar[java.lang.String]("default_container_flavor") - override val defaultContentFlavor = optionalInstallVar[java.lang.String]("default_content_flavor") - override val useVespaVersionInRequest = optionalInstallVar[java.lang.Boolean]("use_vespa_version_in_request") - override val hostedVespa = optionalInstallVar[java.lang.Boolean]("hosted_vespa") - override val numParallelTenantLoaders = optionalInstallVar[java.lang.Integer]("num_parallel_tenant_loaders") - override val loadBalancerAddress = optionalInstallVar[java.lang.String]("load_balancer_address") - - private def getConfigservers = { - val newVar = envVar("VESPA_CONFIGSERVERS") withDefault Array[ConfigServer]() - val oldVar = installVar("addr_configserver", "services") withDefault Array[ConfigServer]() - if (newVar.nonEmpty) newVar else oldVar - } -} - -object CloudConfigInstallVariables { - private class InstallVariable(installPkg:String, name: String) { - val value = Environment.optionalInstallVariable(installPkg + "." + name) - - def withDefault[T](defaultValue: T)(implicit c: Converter[T]) : T = { - value map { implicitly[Converter[T]].convert } getOrElse defaultValue - } - } - - private def installVar(setting:String, installPkg: String = "cloudconfig_server") = new InstallVariable(installPkg, setting) - - private class EnvVariable(name: String) { - val value = Environment.env(name) - - def withDefault[T](defaultValue: T)(implicit c: Converter[T]) : T = { - value map { implicitly[Converter[T]].convert } getOrElse defaultValue - } - } - - private def envVar(name:String) = new EnvVariable(name) - - private def optionalInstallVar[T](setting:String, installPkg: String = "cloudconfig_server")(implicit c: Converter[T]): Optional[T] = { - Environment.optionalInstallVariable(installPkg + "." + setting) map ( c.convert ) - } - - implicit val configServerConverter: Converter[Array[ConfigServer]] = new Converter[Array[ConfigServer]] { - override def convert(s: String) = { - s split "[, ]" filter { !_.isEmpty } map { toConfigServer } - } - } - - implicit val stringArrayConverter: Converter[Array[String]] = new Converter[Array[String]] { - override def convert(s: String) = { - s split "[, ]" filter { !_.isEmpty } - } - } - - private def toConfigServer(hostPort: String): ConfigServer = Try { - val (host, portStr) = splitFirst(hostPort, ':') - val port = portStr map { _.toInt } - new ConfigServer(host, port) - }.getOrElse(throw new IllegalArgumentException(s"Invalid config server '$hostPort'")) - - private def splitFirst(string: String, separator: Character): (String, Option[String]) = { - val (beginning, endWithSeparator) = string span { _ != separator } - (beginning, tailOption(endWithSeparator)) - } - - def tailOption(s: String) = { - if (s.isEmpty) None - else Some(s.tail) - } - - implicit def toJavaOptional[U <% V, V](option: Option[U]): Optional[V] = option match { - case Some(u) => Optional.of(u: V) - case None => Optional.empty() - } -} diff --git a/standalone-container/src/test/scala/com/yahoo/container/standalone/CloudConfigInstallVariablesTest.scala b/standalone-container/src/test/scala/com/yahoo/container/standalone/CloudConfigInstallVariablesTest.scala index efa3edb7b7e..d4baea43ba2 100644 --- a/standalone-container/src/test/scala/com/yahoo/container/standalone/CloudConfigInstallVariablesTest.scala +++ b/standalone-container/src/test/scala/com/yahoo/container/standalone/CloudConfigInstallVariablesTest.scala @@ -1,35 +1,34 @@ -// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.container.standalone -import org.junit.Test -import org.junit.Assert.assertThat +import com.yahoo.container.standalone.CloudConfigInstallVariables.{toConfigModelsPluginDir, toConfigServer, toConfigServers} import org.hamcrest.CoreMatchers.is -import org.hamcrest.Matchers.{arrayContaining} +import org.hamcrest.Matchers.arrayContaining +import org.junit.Assert.assertThat +import org.junit.Test /** - * @author lulf - * @author tonytv - * @since 5. + * @author Ulf Lilleengen + * @author Tony Vaagenes */ class CloudConfigInstallVariablesTest { - def convert = CloudConfigInstallVariables.configServerConverter.convert _ @Test def test_configserver_parsing { - val parsed = convert("myhost.mydomain.com") + val parsed = toConfigServers("myhost.mydomain.com") assertThat(parsed.length, is(1)) } @Test def port_can_be_configured { - val parsed = convert("myhost:123") + val parsed = toConfigServers("myhost:123") val port: Int = parsed(0).port.get() assertThat(port, is(123)) } @Test def multiple_spaces_are_supported { - val parsed = convert("test1 test2") + val parsed = toConfigServers("test1 test2") assertThat(parsed.size, is(2)) val hostNames = parsed.map(_.hostName) @@ -38,23 +37,23 @@ class CloudConfigInstallVariablesTest { @Test(expected = classOf[IllegalArgumentException]) def missing_port_gives_exception { - convert("myhost:") + toConfigServer("myhost:") } @Test(expected = classOf[IllegalArgumentException]) def non_numeric_port_gives_exception { - convert("myhost:non-numeric") + toConfigServer("myhost:non-numeric") } @Test def string_arrays_are_split_on_spaces { - val parsed = convert("/home/vespa/foo /home/vespa/bar ") + val parsed = toConfigModelsPluginDir("/home/vespa/foo /home/vespa/bar ") assertThat(parsed.size, is(2)) } @Test def string_arrays_are_split_on_comma { - val parsed = convert("/home/vespa/foo,/home/vespa/bar,") + val parsed = toConfigModelsPluginDir("/home/vespa/foo,/home/vespa/bar,") assertThat(parsed.size, is(2)) } } |