// Copyright Yahoo. 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 Optional.ofNullable(System.getenv("VESPA_CONFIGSERVER_RPC_PORT")) .or(() -> getRawInstallVariable("services.port_configserver_rpc")) .map(Integer::parseInt); } @Override public Optional multiTenant() { return Optional.ofNullable(System.getenv("VESPA_CONFIGSERVER_MULTITENANT")) .or(() -> getInstallVariable("multitenant")) .map(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); } @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 Optional.ofNullable(System.getenv("VESPA_CONFIGSERVER_HOSTED")) .or(() -> getInstallVariable("hosted_vespa")) .map(Boolean::parseBoolean); } @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"); } @Override public String zooKeeperSnapshotMethod() { String vespaZookeeperSnapshotMethod = System.getenv("VESPA_ZOOKEEPER_SNAPSHOT_METHOD"); return vespaZookeeperSnapshotMethod == null ? "" : vespaZookeeperSnapshotMethod; } 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 getRawInstallVariable("cloudconfig_server." + 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()); } }