// Copyright 2017 Twitter. All rights reserved. // // Licensed 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 com.twitter.heron.spi.common; import com.twitter.heron.common.basics.ByteAmount; /** * Enum of all configuration key values. The following methods exist: * * name() - return a string representation of the member name (e.g. HERON_HOME) * value() - return a key value bound to the enum (e.g. heron.directory.home) * getDefault() - return the default value bound to the enum * getType() - return the type of the key entry */ @SuppressWarnings({"checkstyle:MethodParamPad", "checkstyle:LineLength"}) public enum Key { //keys for heron environment HERON_HOME ("heron.directory.home", "/usr/local/heron"), HERON_BIN ("heron.directory.bin", "${HERON_HOME}/bin"), HERON_CONF ("heron.directory.conf", "${HERON_HOME}/conf"), HERON_LIB ("heron.directory.lib", "${HERON_HOME}/lib"), HERON_DIST ("heron.directory.dist", "${HERON_HOME}/dist"), HERON_ETC ("heron.directory.etc", "${HERON_HOME}/etc"), JAVA_HOME ("heron.directory.java.home", "${JAVA_HOME}"), //keys for heron configuration files CLUSTER_YAML ("heron.config.file.cluster.yaml", "${HERON_CONF}/cluster.yaml"), CLIENT_YAML ("heron.config.file.client.yaml", "${HERON_CONF}/client.yaml"), METRICS_YAML ("heron.config.file.metrics.yaml", "${HERON_CONF}/metrics_sinks.yaml"), PACKING_YAML ("heron.config.file.packing.yaml", "${HERON_CONF}/packing.yaml"), SCHEDULER_YAML ("heron.config.file.scheduler.yaml", "${HERON_CONF}/scheduler.yaml"), STATEMGR_YAML ("heron.config.file.statemgr.yaml", "${HERON_CONF}/statemgr.yaml"), SYSTEM_YAML ("heron.config.file.system.yaml", "${HERON_CONF}/heron_internals.yaml"), UPLOADER_YAML ("heron.config.file.uploader.yaml", "${HERON_CONF}/uploader.yaml"), STATEFUL_YAML ("heron.config.file.stateful.yaml", "${HERON_CONF}/stateful.yaml"), //keys for config provided in the command line CLUSTER ("heron.config.cluster", Type.STRING), ROLE ("heron.config.role", Type.STRING), ENVIRON ("heron.config.environ", Type.STRING), DRY_RUN ("heron.config.dry_run", Boolean.FALSE), DRY_RUN_FORMAT_TYPE ("heron.config.dry_run_format_type", Type.DRY_RUN_FORMAT_TYPE), VERBOSE ("heron.config.verbose", Boolean.FALSE), CONFIG_PROPERTY ("heron.config.property", Type.STRING), //keys for release/build information BUILD_VERSION ("heron.build.version", Type.STRING), BUILD_TIME ("heron.build.time", Type.STRING), BUILD_TIMESTAMP ("heron.build.timestamp", Type.STRING), BUILD_HOST ("heron.build.host", Type.STRING), BUILD_USER ("heron.build.user", Type.STRING), //keys for config provided user classes UPLOADER_CLASS ("heron.class.uploader", Type.STRING), LAUNCHER_CLASS ("heron.class.launcher", Type.STRING), SCHEDULER_CLASS ("heron.class.scheduler", Type.STRING), PACKING_CLASS ("heron.class.packing.algorithm", Type.STRING), REPACKING_CLASS ("heron.class.repacking.algorithm", Type.STRING), STATE_MANAGER_CLASS ("heron.class.state.manager", Type.STRING), //keys for scheduler config SCHEDULER_IS_SERVICE ("heron.scheduler.is.service", Boolean.TRUE), SCHEDULER_PROPERTIES ("heron.scheduler.properties", Type.PROPERTIES), //keys for config provided user binaries and jars SCHEDULER_JAR ("heron.jars.scheduler", "${HERON_LIB}/scheduler/heron-scheduler.jar"), //keys for config provided files and directories INTERNALS_CONFIG_FILE ("heron.internals.config.file", Type.STRING), //keys for packages URIs CORE_PACKAGE_URI ("heron.package.core.uri", "${HERON_DIST}/heron-core.tar.gz"), TOPOLOGY_PACKAGE_URI ("heron.package.topology.uri", Type.STRING), //keys for topology TOPOLOGY_ID ("heron.topology.id", Type.STRING), TOPOLOGY_NAME ("heron.topology.name", Type.STRING), TOPOLOGY_DEFINITION_FILE ("heron.topology.definition.file", Type.STRING), TOPOLOGY_DEFINITION ("heron.topology.definition", Type.STRING), TOPOLOGY_BINARY_FILE ("heron.topology.binary.file", Type.STRING), TOPOLOGY_PACKAGE_FILE ("heron.topology.package.file", Type.STRING), TOPOLOGY_PACKAGE_TYPE ("heron.topology.package.type", Type.PACKAGE_TYPE), TOPOLOGY_CONTAINER_ID ("heron.topology.container.id", Type.STRING), //keys for proxy config during submission SCHEDULER_PROXY_CONNECTION_STRING("heron.proxy.connection.string", Type.STRING), SCHEDULER_PROXY_CONNECTION_TYPE ("heron.proxy.connection.type", Type.STRING), //keys for storing state"), STATEMGR_CONNECTION_STRING("heron.statemgr.connection.string", Type.STRING), STATEMGR_ROOT_PATH ("heron.statemgr.root.path", Type.STRING), //keys for config provided default values for resources STMGR_RAM ("heron.resources.stmgr.ram", ByteAmount.fromBytes(1073741824)), INSTANCE_RAM ("heron.resources.instance.ram", ByteAmount.fromBytes(1073741824)), INSTANCE_CPU ("heron.resources.instance.cpu", 1.0), INSTANCE_DISK ("heron.resources.instance.disk", ByteAmount.fromBytes(1073741824)), //keys for checkpoint management IS_STATEFUL ("heron.is.stateful", Boolean.FALSE), IS_CLEAN_STATEFUL_CHECKPOINTS ("heron.is.clean.stateful.checkpoints", Boolean.FALSE), CKPTMGR_STATEFUL_STORAGE ("heron.statefulstorage.type", Type.STRING), STATEFUL_STORAGE_CONF ("heron.statefulstorage.config", Type.MAP), STATEFUL_STORAGE_CLASSPATH ("heron.statefulstorage.classpath", Type.STRING), //keys for config provided paths INSTANCE_CLASSPATH ("heron.classpath.instance", "${HERON_LIB}/instance/*"), METRICSMGR_CLASSPATH ("heron.classpath.metrics.manager", "${HERON_LIB}/metricsmgr/*"), METRICSCACHEMGR_CLASSPATH ("heron.classpath.metricscache.manager", "${HERON_LIB}/metricscachemgr/*"), PACKING_CLASSPATH ("heron.classpath.packing", "${HERON_LIB}/packing/*"), SCHEDULER_CLASSPATH ("heron.classpath.scheduler", "${HERON_LIB}/scheduler/*"), STATEMGR_CLASSPATH ("heron.classpath.statemgr", "${HERON_LIB}/statemgr/*"), UPLOADER_CLASSPATH ("heron.classpath.uploader", "${HERON_LIB}/uploader/*"), CKPTMGR_CLASSPATH ("heron.classpath.ckptmgr", "${HERON_LIB}/ckptmgr/*"), //keys for run time config TOPOLOGY_CLASSPATH ("heron.runtime.topology.class.path", Type.STRING), SCHEDULER_STATE_MANAGER_ADAPTOR("heron.runtime.scheduler.state.manager.adaptor", Type.STRING), SCHEDULER_SHUTDOWN ("heron.runtime.scheduler.shutdown", Type.STRING), PACKING_CLASS_INSTANCE ("heron.runtime.packing.class.instance", Type.STRING), LAUNCHER_CLASS_INSTANCE ("heron.runtime.launcher.class.instance", Type.STRING), COMPONENT_RAMMAP ("heron.runtime.component.rammap", Type.STRING), COMPONENT_JVM_OPTS_IN_BASE64 ("heron.runtime.component.jvm.opts.in.base64", Type.STRING), INSTANCE_JVM_OPTS_IN_BASE64 ("heron.runtime.instance.jvm.opts.in.base64", Type.STRING), NUM_CONTAINERS ("heron.runtime.num.containers", Type.INTEGER), //release info HERON_RELEASE_PACKAGE ("heron.release.package", Type.STRING), HERON_RELEASE_PACKAGE_ROLE ("heron.release.package.role", Type.STRING), HERON_RELEASE_PACKAGE_NAME ("heron.release.package.name", Type.STRING), HERON_RELEASE_PACKAGE_VERSION ("heron.release.package.version", Type.STRING), HERON_UPLOADER_VERSION ("heron.uploader.version", Type.STRING), //keys for config provided paths HERON_CLUSTER_HOME ("heron.directory.cluster.home", "./heron-core"), HERON_CLUSTER_CONF ("heron.directory.cluster.conf", "./heron-conf"), // TODO: rename below to heron.directory.cluster.java.home, coordinate change with twitter configs HERON_CLUSTER_JAVA_HOME("heron.directory.sandbox.java.home", "/usr/lib/jvm/default-java"), //keys for heron configuration files on the cluster OVERRIDE_YAML("heron.config.file.override.yaml", "${HERON_CONF}/override.yaml"), //keys for config provided user binaries EXECUTOR_BINARY ("heron.binaries.executor", "${HERON_BIN}/heron-executor"), STMGR_BINARY ("heron.binaries.stmgr", "${HERON_BIN}/heron-stmgr"), TMASTER_BINARY ("heron.binaries.tmaster", "${HERON_BIN}/heron-tmaster"), SHELL_BINARY ("heron.binaries.shell", "${HERON_BIN}/heron-shell"), PYTHON_INSTANCE_BINARY("heron.binaries.python.instance", "${HERON_BIN}/heron-python-instance"); private final String value; private final Object defaultValue; private final Type type; public enum Type { BOOLEAN, BYTE_AMOUNT, DOUBLE, DRY_RUN_FORMAT_TYPE, INTEGER, LONG, STRING, PACKAGE_TYPE, PROPERTIES, MAP, UNKNOWN } Key(String value, Type type) { this.value = value; this.type = type; this.defaultValue = null; } Key(String value, String defaultValue) { this.value = value; this.type = Type.STRING; this.defaultValue = defaultValue; } Key(String value, Double defaultValue) { this.value = value; this.type = Type.DOUBLE; this.defaultValue = defaultValue; } Key(String value, Boolean defaultValue) { this.value = value; this.type = Type.BOOLEAN; this.defaultValue = defaultValue; } Key(String value, ByteAmount defaultValue) { this.value = value; this.type = Type.BYTE_AMOUNT; this.defaultValue = defaultValue; } /** * Get the key value for this enum (i.e., heron.directory.home) * @return key value */ public String value() { return value; } public Type getType() { return type; } /** * Return the default value */ public Object getDefault() { return this.defaultValue; } public String getDefaultString() { if (type != Type.STRING) { throw new IllegalAccessError(String.format( "Config Key %s is type %s, getDefaultString() not supported", this.name(), this.type)); } return (String) this.defaultValue; } }