/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.brooklyn.core.entity;
import static org.apache.brooklyn.core.config.ConfigKeys.newBooleanConfigKey;
import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKey;
import static org.apache.brooklyn.core.config.ConfigKeys.newConfigKeyWithPrefix;
import static org.apache.brooklyn.core.config.ConfigKeys.newStringConfigKey;
import org.apache.brooklyn.api.location.Location;
import org.apache.brooklyn.config.ConfigKey;
import org.apache.brooklyn.core.config.ConfigKeys;
import org.apache.brooklyn.core.config.MapConfigKey;
import org.apache.brooklyn.core.entity.trait.Startable;
import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey;
import org.apache.brooklyn.core.sensor.TemplatedStringAttributeSensorAndConfigKey;
import org.apache.brooklyn.core.server.BrooklynServerConfig;
import org.apache.brooklyn.location.ssh.SshMachineLocation;
import org.apache.brooklyn.util.core.flags.SetFromFlag;
import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
import org.apache.brooklyn.util.core.internal.ssh.SshTool;
import org.apache.brooklyn.util.time.Duration;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
/** Commonly used config keys, for use in entities. Similar to {@link Attributes}.
* See also {@link BrooklynServerConfig} for config keys for controlling the server. */
public class BrooklynConfigKeys {
@Deprecated /** @deprecated since 0.7.0 see BrooklynServerConfig#getPeristenceDir() and BrooklynServerConfigKeys#PERSISTENCE_DIR */
public static final ConfigKey<String> BROOKLYN_PERSISTENCE_DIR = BrooklynServerConfig.PERSISTENCE_DIR;
@Deprecated /** @deprecated since 0.7.0 use BrooklynServerConfig routines */
public static final ConfigKey<String> BROOKLYN_DATA_DIR = BrooklynServerConfig.BROOKLYN_DATA_DIR;
public static final ConfigKey<String> ONBOX_BASE_DIR = newStringConfigKey("onbox.base.dir",
"Default base directory on target machines where Brooklyn config data is stored; " +
"default depends on the location, either ~/brooklyn-managed-processes or /tmp/brooklyn-${username} on localhost");
public static final ConfigKey<Boolean> SKIP_ON_BOX_BASE_DIR_RESOLUTION = ConfigKeys.newBooleanConfigKey("onbox.base.dir.skipResolution",
"Whether to skip on-box directory resolution (which can require ssh'ing), and just assume the directory exists; can be set on machine or on entity",
false);
// TODO Rename to VERSION, instead of SUGGESTED_VERSION? And declare as BasicAttributeSensorAndConfigKey?
public static final ConfigKey<String> SUGGESTED_VERSION = newStringConfigKey("install.version", "Suggested version");
public static final ConfigKey<String> INSTALL_UNIQUE_LABEL = ConfigKeys.newStringConfigKey("install.unique_label",
"Provides a label which uniquely identifies an installation, used in the computation of the install dir; " +
"this should include something readable, and must include a hash of all data which differentiates an installation " +
"(e.g. version, plugins, etc), but should be the same where install dirs can be shared to allow for re-use");
/**
* Set this configuration value to true if the entity installation, customization and launch process is to be skipped entirely.
* <p>
* This is usually because the process or service the entity represents is already present and started, as part of the image
* being used. The {@link Startable#SERVICE_UP} attribute will be set in the usual manner.
* <p>
* If this key is set on a {@link Location} then all entities in that location will be treated in this way. This is useful
* when the location is configured with a particular image containing installed and running services.
*
* @see #ENTITY_RUNNING
*/
public static final ConfigKey<Boolean> SKIP_ENTITY_START = newBooleanConfigKey("entity.started", "Skip the startup process entirely, for running services");
/**
* Set this configuration value to true to skip the entity startup process as with {@link #ENTITY_STARTED} if the process or
* service represented by the entity is already running, otherwise proceed normally. This is determined using the driver's
* {@code isRunning()} method.
* <p>
* If this key is set on a {@link Location} then all entities in that location will be treated in this way, again as with {@link #ENTITY_STARTED}.
*
* @see #ENTITY_STARTED
*/
public static final ConfigKey<Boolean> SKIP_ENTITY_START_IF_RUNNING = newBooleanConfigKey("entity.running", "Skip the startup process entirely, if service already running");
/**
* Set this configuration value to true if the entity installation, customization and launch process is to be skipped entirely.
* <p>
* This will skip the installation phase of the lifecycle, and move directl;y to customization and launching of the entity.
*/
public static final ConfigKey<Boolean> SKIP_ENTITY_INSTALLATION = newBooleanConfigKey("install.skip", "Skip the driver install commands entirely, for pre-installed software");
// The implementation in AbstractSoftwareSshDriver runs this command as an SSH command
public static final ConfigKey<String> PRE_INSTALL_COMMAND = ConfigKeys.newStringConfigKey("pre.install.command",
"Command to be run prior to the install method being called on the driver");
public static final ConfigKey<String> POST_INSTALL_COMMAND = ConfigKeys.newStringConfigKey("post.install.command",
"Command to be run after the install method being called on the driver");
public static final ConfigKey<String> PRE_LAUNCH_COMMAND = ConfigKeys.newStringConfigKey("pre.launch.command",
"Command to be run prior to the launch method being called on the driver");
public static final ConfigKey<String> POST_LAUNCH_COMMAND = ConfigKeys.newStringConfigKey("post.launch.command",
"Command to be run after the launch method being called on the driver");
public static final MapConfigKey<Object> SHELL_ENVIRONMENT = new MapConfigKey<Object>(
Object.class,
"shell.env",
"Map of environment variables to pass to the runtime shell",
ImmutableMap.<String,Object>of());
public static final AttributeSensorAndConfigKey<String, String> INSTALL_DIR = new TemplatedStringAttributeSensorAndConfigKey("install.dir", "Directory for this software to be installed in",
"${" +
"config['"+ONBOX_BASE_DIR.getName()+"']!" +
"config['"+BROOKLYN_DATA_DIR.getName()+"']!" +
"'/<ERROR>-ONBOX_BASE_DIR-not-set'" +
"}" +
"/" +
"installs/" +
// the var?? tests if it exists, passing value to ?string(if_present,if_absent)
// the ! provides a default value afterwards, which is never used, but is required for parsing
// when the config key is not available;
// thus the below prefers the install.unique_label, but falls back to simple name
// plus a version identifier *if* the version is explicitly set
"${(config['install.unique_label']??)?string(config['install.unique_label']!'X'," +
"(entity.entityType.simpleName)+" +
"((config['install.version']??)?string('_'+(config['install.version']!'X'),''))" +
")}");
public static final AttributeSensorAndConfigKey<String, String> RUN_DIR = new TemplatedStringAttributeSensorAndConfigKey("run.dir", "Directory for this software to be run from",
"${" +
"config['"+ONBOX_BASE_DIR.getName()+"']!" +
"config['"+BROOKLYN_DATA_DIR.getName()+"']!" +
"'/<ERROR>-ONBOX_BASE_DIR-not-set'" +
"}" +
"/" +
"apps/${entity.applicationId}/" +
"entities/${entity.entityType.simpleName}_" +
"${entity.id}");
public static final AttributeSensorAndConfigKey<String, String> EXPANDED_INSTALL_DIR = new TemplatedStringAttributeSensorAndConfigKey(
"expandedinstall.dir",
"Directory for installed artifacts (e.g. expanded dir after unpacking .tgz)",
null);
/** @deprecated since 0.7.0; use {@link #INSTALL_DIR} */
public static final ConfigKey<String> SUGGESTED_INSTALL_DIR = INSTALL_DIR.getConfigKey();
/** @deprecated since 0.7.0; use {@link #RUN_DIR} */
public static final ConfigKey<String> SUGGESTED_RUN_DIR = RUN_DIR.getConfigKey();
/*
* Intention is to use these with DependentConfiguration.attributeWhenReady, to allow an entity's start
* to block until dependents are ready. This is particularly useful when we want to block until a dependent
* component is up, but this entity does not care about the dependent component's actual config values.
*/
public static final ConfigKey<Boolean> PROVISION_LATCH = newBooleanConfigKey("provision.latch", "Latch for blocking location provision until ready");
public static final ConfigKey<Boolean> START_LATCH = newBooleanConfigKey("start.latch", "Latch for blocking start until ready");
public static final ConfigKey<Boolean> SETUP_LATCH = newBooleanConfigKey("setup.latch", "Latch for blocking setup until ready");
public static final ConfigKey<Boolean> PRE_INSTALL_RESOURCES_LATCH = newBooleanConfigKey("resources.preInstall.latch", "Latch for blocking pre-install resources until ready");
public static final ConfigKey<Boolean> INSTALL_RESOURCES_LATCH = newBooleanConfigKey("resources.install.latch", "Latch for blocking install resources until ready");
public static final ConfigKey<Boolean> INSTALL_LATCH = newBooleanConfigKey("install.latch", "Latch for blocking install until ready");
public static final ConfigKey<Boolean> RUNTIME_RESOURCES_LATCH = newBooleanConfigKey("resources.runtime.latch", "Latch for blocking runtime resources until ready");
public static final ConfigKey<Boolean> CUSTOMIZE_LATCH = newBooleanConfigKey("customize.latch", "Latch for blocking customize until ready");
public static final ConfigKey<Boolean> LAUNCH_LATCH = newBooleanConfigKey("launch.latch", "Latch for blocking launch until ready");
public static final ConfigKey<Duration> START_TIMEOUT = newConfigKey(
"start.timeout", "Time to wait for process and for SERVICE_UP before failing (in seconds, default 2m)", Duration.seconds(120));
/* selected properties from SshTool for external public access (e.g. putting on entities) */
/** Public-facing global config keys for Brooklyn are defined in ConfigKeys,
* and have this prefix pre-prended to the config keys in this class. */
public static final String BROOKLYN_SSH_CONFIG_KEY_PREFIX = "brooklyn.ssh.config.";
/** Public-facing global config keys for Brooklyn are defined in ConfigKeys,
* and have this prefix pre-prended to the config keys in this class. */
public static final String BROOKLYN_WINRM_CONFIG_KEY_PREFIX = "brooklyn.winrm.config.";
// some checks (this line, and a few Preconditions below) that the remote values aren't null,
// because they have some funny circular references
static { assert BROOKLYN_SSH_CONFIG_KEY_PREFIX.equals(SshTool.BROOKLYN_CONFIG_KEY_PREFIX) : "static final initializer classload ordering problem"; }
public static final ConfigKey<String> SSH_TOOL_CLASS = newStringConfigKey(
BROOKLYN_SSH_CONFIG_KEY_PREFIX + "sshToolClass",
"SshTool implementation to use (or null for default)",
null);
public static final ConfigKey<String> WINRM_TOOL_CLASS = newStringConfigKey(
BROOKLYN_WINRM_CONFIG_KEY_PREFIX + "winrmToolClass",
"WinRmTool implementation to use (or null for default)",
null);
/**
* @deprecated since 0.9.0; use {@link #SSH_TOOL_CLASS}
*/
@Deprecated
public static final ConfigKey<String> LEGACY_SSH_TOOL_CLASS = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX,
Preconditions.checkNotNull(SshTool.PROP_TOOL_CLASS, "static final initializer classload ordering problem"));
public static final ConfigKey<String> SSH_CONFIG_HOST = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_HOST);
public static final ConfigKey<Integer> SSH_CONFIG_PORT = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_PORT);
public static final ConfigKey<String> SSH_CONFIG_USER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_USER);
public static final ConfigKey<String> SSH_CONFIG_PASSWORD = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, SshTool.PROP_PASSWORD);
public static final ConfigKey<String> SSH_CONFIG_SCRIPT_DIR = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX,
Preconditions.checkNotNull(ShellTool.PROP_SCRIPT_DIR, "static final initializer classload ordering problem"));
public static final ConfigKey<String> SSH_CONFIG_SCRIPT_HEADER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_SCRIPT_HEADER);
public static final ConfigKey<String> SSH_CONFIG_DIRECT_HEADER = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_DIRECT_HEADER);
public static final ConfigKey<Boolean> SSH_CONFIG_NO_DELETE_SCRIPT = newConfigKeyWithPrefix(BROOKLYN_SSH_CONFIG_KEY_PREFIX, ShellTool.PROP_NO_DELETE_SCRIPT);
}