aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjørn Christian Seime <bjorncs@oath.com>2018-05-15 14:19:30 +0200
committerBjørn Christian Seime <bjorncs@oath.com>2018-05-15 14:20:34 +0200
commitc1f4afc49e765e4555ccdf86ee89f46358dd4082 (patch)
treef6cd8b6948b4061f8b63e097c8ed1d093baca7e1
parenta33ad1f617968549d69a8aca7a80b371db4c12c3 (diff)
Convert CloudConfigInstallVariables to Java
-rw-r--r--standalone-container/src/main/java/com/yahoo/container/standalone/CloudConfigInstallVariables.java170
-rw-r--r--standalone-container/src/main/scala/com/yahoo/container/standalone/CloudConfigInstallVariables.scala105
-rw-r--r--standalone-container/src/test/scala/com/yahoo/container/standalone/CloudConfigInstallVariablesTest.scala29
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))
}
}