// 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; import java.util.stream.Stream; /** * @author bjorncs */ public class CloudConfigInstallVariables implements CloudConfigOptions { @Override public Optional rpcPort() { return getInstallVariable("port_configserver_rpc", "services", Integer::parseInt); } @Override public Optional multiTenant() { return getInstallVariable("multitenant", Boolean::parseBoolean); } @Override public ConfigServer[] allConfigServers() { return Optional.ofNullable(System.getenv("VESPA_CONFIGSERVERS")) .or(() -> getRawInstallVariable("services.addr_configserver")) .map(CloudConfigInstallVariables::toConfigServers) .orElseGet(() -> new ConfigServer[0]); } @Override public int[] configServerZookeeperIds() { return Optional.ofNullable(System.getenv("VESPA_CONFIGSERVER_ZOOKEEPER_IDS")) .map(CloudConfigInstallVariables::multiValueParameterStream) .orElseGet(Stream::empty) .mapToInt(Integer::valueOf) .toArray(); } @Override public Optional zookeeperBarrierTimeout() { return getInstallVariable("zookeeper_barrier_timeout", Long::parseLong); } @Override public Optional 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 zookeeperClientPort() { return getInstallVariable("zookeeper_clientPort", Integer::parseInt); } @Override public Optional zookeeperQuorumPort() { return getInstallVariable("zookeeper_quorumPort", Integer::parseInt); } @Override public Optional zookeeperElectionPort() { return getInstallVariable("zookeeper_electionPort", Integer::parseInt); } // TODO: Remove when 7.146 is the oldest version in use @Override public Optional payloadCompressionType() { return getInstallVariable("payload_compression_type", Function.identity()); } @Override public Optional environment() { return Optional.ofNullable(System.getenv("VESPA_ENVIRONMENT")) .or(() -> getInstallVariable("environment")); } @Override public Optional region() { return Optional.ofNullable(System.getenv("VESPA_REGION")) .or(() -> getInstallVariable("region")); } @Override public Optional system() { return Optional.ofNullable(System.getenv("VESPA_SYSTEM")) .or(() -> getInstallVariable("system")); } @Override public Optional useVespaVersionInRequest() { return getInstallVariable("use_vespa_version_in_request", Boolean::parseBoolean); } @Override public Optional hostedVespa() { return getInstallVariable("hosted_vespa", Boolean::parseBoolean); } // TODO: Remove when 7.146 is the oldest version in use @Override public Optional numParallelTenantLoaders() { return getInstallVariable("num_parallel_tenant_loaders", Integer::parseInt); } @Override public Optional loadBalancerAddress() { return getInstallVariable("load_balancer_address"); } @Override public Optional athenzDnsSuffix() { return getInstallVariable("athenz_dns_suffix"); } @Override public Optional ztsUrl() { return getInstallVariable("zts_url"); } static ConfigServer[] toConfigServers(String configserversString) { return multiValueParameterStream(configserversString) .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 multiValueParameterStream(configModelsPluginDirString).toArray(String[]::new); } private static Optional getInstallVariable(String name) { return getInstallVariable(name, Function.identity()); } private static Optional getInstallVariable(String name, Function converter) { return getInstallVariable(name, "cloudconfig_server", converter); } private static Optional getInstallVariable(String name, String installPackage, Function converter) { return getRawInstallVariable(installPackage + "." + name).map(converter); } private static Optional getRawInstallVariable(String name) { return Optional.ofNullable( Optional.ofNullable(System.getenv(name.replace(".", "__"))) .orElseGet(() -> System.getProperty(name))); } private static Stream multiValueParameterStream(String param) { return Arrays.stream(param.split("[, ]")).filter(value -> !value.isEmpty()); } }