Change preInstall to prepare and add ARCHIVE_DIRECTORY_NAME_FORMAT config
Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/d50580be Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/d50580be Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/d50580be Branch: refs/heads/master Commit: d50580bea44bd48c0cba66190c9e545158e629f9 Parents: 48e8fd7 Author: Andrew Donald Kennedy <andrew.kenn...@cloudsoftcorp.com> Authored: Thu Mar 3 16:33:52 2016 +0000 Committer: Andrew Donald Kennedy <andrew.kenn...@cloudsoftcorp.com> Committed: Fri Mar 4 17:57:48 2016 +0000 ---------------------------------------------------------------------- .../brooklynnode/BrooklynNodeSshDriver.java | 7 +- .../base/AbstractSoftwareProcessDriver.java | 68 +++++++++----------- .../base/AbstractSoftwareProcessSshDriver.java | 62 ++++++++---------- .../AbstractSoftwareProcessWinRmDriver.java | 35 ++++++++-- .../entity/software/base/SoftwareProcess.java | 34 ++++------ 5 files changed, 101 insertions(+), 105 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d50580be/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java index 8058d0f..5e2caa2 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/brooklynnode/BrooklynNodeSshDriver.java @@ -88,8 +88,7 @@ public class BrooklynNodeSshDriver extends JavaSoftwareProcessSshDriver implemen } @Override - public void preInstall() { - resolver = Entities.newDownloader(this); + public String getArchiveNameFormat() { String subpath = entity.getConfig(BrooklynNode.SUBPATH_IN_ARCHIVE); if (subpath==null) { // assume the dir name is `basename-VERSION` where download link is `basename-VERSION-dist.tar.gz` @@ -112,8 +111,8 @@ public class BrooklynNodeSshDriver extends JavaSoftwareProcessSshDriver implemen } } } - if (subpath==null) subpath = format("brooklyn-dist-%s", getVersion()); - setExpandedInstallDir(Os.mergePaths(getInstallDir(), resolver.getUnpackedDirectoryName(subpath))); + if (subpath==null) subpath = "brooklyn-dist-%s"; + return subpath; } @Override http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d50580be/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessDriver.java index b48fab8..6e0f24f 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessDriver.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessDriver.java @@ -91,7 +91,7 @@ public abstract class AbstractSoftwareProcessDriver implements SoftwareProcessDr * skipped, {@link BrooklynConfigKeys#SKIP_ENTITY_START} can be set on the entity. * The {@link BrooklynConfigKeys#SKIP_ENTITY_INSTALLATION} key can also be used to * skip the {@link #setup()}, {@link #copyInstallResources()} and - * {@link #install()} methods if set on the entity or location. + * {@link #install()} methods if set on the entity or location. * * @see #stop() */ @@ -106,26 +106,31 @@ public abstract class AbstractSoftwareProcessDriver implements SoftwareProcessDr } else { skipStart = entityStarted.or(false); } + + DynamicTasks.queue("prepare", new Runnable() { public void run() { + prepare(); + }}); + if (!skipStart) { DynamicTasks.queue("install", new Runnable() { public void run() { Optional<Boolean> locationInstalled = Optional.fromNullable(getLocation().getConfig(BrooklynConfigKeys.SKIP_ENTITY_INSTALLATION)); Optional<Boolean> entityInstalled = Optional.fromNullable(entity.getConfig(BrooklynConfigKeys.SKIP_ENTITY_INSTALLATION)); - DynamicTasks.queue("copy-pre-install-resources", new Runnable() { public void run() { - waitForConfigKey(BrooklynConfigKeys.PRE_INSTALL_RESOURCES_LATCH); - copyPreInstallResources(); - }}); + boolean skipInstall = locationInstalled.or(entityInstalled).or(false); + if (!skipInstall) { + DynamicTasks.queue("copy-pre-install-resources", new Runnable() { public void run() { + waitForConfigKey(BrooklynConfigKeys.PRE_INSTALL_RESOURCES_LATCH); + copyPreInstallResources(); + }}); - DynamicTasks.queue("pre-install", new Runnable() { public void run() { - preInstall(); - }}); + DynamicTasks.queue("pre-install", new Runnable() { public void run() { + preInstall(); + }}); - DynamicTasks.queue("pre-install-command", new Runnable() { public void run() { - runPreInstallCommand(); - }}); + DynamicTasks.queue("pre-install-command", new Runnable() { public void run() { + runPreInstallCommand(); + }}); - boolean skipInstall = locationInstalled.or(entityInstalled).or(false); - if (!skipInstall) { DynamicTasks.queue("setup", new Runnable() { public void run() { waitForConfigKey(BrooklynConfigKeys.SETUP_LATCH); setup(); @@ -192,6 +197,11 @@ public abstract class AbstractSoftwareProcessDriver implements SoftwareProcessDr public abstract void stop(); /** + * Prepare the entity instance before running any commands. Always executed during {@link #start()}. + */ + public void prepare() {} + + /** * Implement this method in child classes to add some pre-install behavior */ public void preInstall() {} @@ -313,10 +323,10 @@ public abstract class AbstractSoftwareProcessDriver implements SoftwareProcessDr boolean hasAnythingToCopy = ((files != null && files.size() > 0) || (templates != null && templates.size() > 0)); if (hasAnythingToCopy) { createDirectory(getInstallDir(), "create install directory"); - + // TODO see comment in copyResource, that should be queued as a task like the above // (better reporting in activities console) - + if (files != null && files.size() > 0) { for (String source : files.keySet()) { String target = files.get(source); @@ -324,7 +334,7 @@ public abstract class AbstractSoftwareProcessDriver implements SoftwareProcessDr copyResource(source, destination, true); } } - + if (templates != null && templates.size() > 0) { for (String source : templates.keySet()) { String target = templates.get(source); @@ -492,34 +502,16 @@ public abstract class AbstractSoftwareProcessDriver implements SoftwareProcessDr } protected void waitForConfigKey(ConfigKey<?> configKey) { - Object val = entity.getConfig(configKey); + Object val = entity.config().get(configKey); if (val != null) log.debug("{} finished waiting for {} (value {}); continuing...", new Object[] {this, configKey, val}); } - /** - * @deprecated since 0.5.0; instead rely on {@link org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager} to include local-repo, such as: - * - * <pre> - * {@code - * DownloadResolver resolver = Entities.newDownloader(this); - * List<String> urls = resolver.getTargets(); - * } - * </pre> - */ - protected String getEntityVersionLabel() { - return getEntityVersionLabel("_"); - } - - /** - * @deprecated since 0.5.0; instead rely on {@link org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager} to include local-repo - */ - protected String getEntityVersionLabel(String separator) { - return elvis(entity.getEntityType().getSimpleName(), - entity.getClass().getName())+(getVersion() != null ? separator+getVersion() : ""); + public String getArchiveNameFormat() { + return getEntity().config().get(SoftwareProcess.ARCHIVE_DIRECTORY_NAME_FORMAT); } public String getVersion() { - return getEntity().getConfig(SoftwareProcess.SUGGESTED_VERSION); + return getEntity().config().get(SoftwareProcess.SUGGESTED_VERSION); } public abstract String getRunDir(); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d50580be/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java index f9ca7ff..660f537 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessSshDriver.java @@ -27,6 +27,16 @@ import java.util.List; import java.util.Map; import java.util.Set; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.base.Predicates; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; + import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolver; import org.apache.brooklyn.core.BrooklynLogging; @@ -35,21 +45,10 @@ import org.apache.brooklyn.core.effector.ssh.SshEffectorTasks; import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.BrooklynConfigKeys; import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.entity.EntityInternal; import org.apache.brooklyn.core.feed.ConfigToAttributes; import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; import org.apache.brooklyn.entity.software.base.lifecycle.NaiveScriptRunner; import org.apache.brooklyn.entity.software.base.lifecycle.ScriptHelper; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.core.internal.ssh.SshTool; import org.apache.brooklyn.util.core.internal.ssh.sshj.SshjTool; @@ -57,7 +56,6 @@ import org.apache.brooklyn.util.core.task.DynamicTasks; import org.apache.brooklyn.util.core.task.Tasks; import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper; import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.os.Os; import org.apache.brooklyn.util.ssh.BashCommands; import org.apache.brooklyn.util.stream.KnownSizeInputStream; @@ -83,10 +81,26 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP private volatile String installDir; private volatile String runDir; private volatile String expandedInstallDir; + private final Object installDirSetupMutex = new Object(); protected volatile DownloadResolver resolver; + @Override + public void prepare() { + // Check if we should create a download resolver? + String downloadUrl = getEntity().config().get(SoftwareProcess.DOWNLOAD_URL); + if (Strings.isNonEmpty(downloadUrl)) { + resolver = Entities.newDownloader(this); + String formatString = getArchiveNameFormat(); + if (Strings.isNonEmpty(formatString)) { + setExpandedInstallDir(Os.mergePaths(getInstallDir(), resolver.getUnpackedDirectoryName(String.format(formatString, getVersion())))); + } else { + setExpandedInstallDir(getInstallDir()); + } + } + } + /** include this flag in newScript creation to prevent entity-level flags from being included; * any SSH-specific flags passed to newScript override flags from the entity, * and flags from the entity override flags on the location @@ -130,17 +144,6 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP // *before* we computed the install label, or that label may have changed since previous install; now force a recompute setInstallLabel(); - // deprecated in 0.7.0 - "brooklyn.dirs.install" is no longer supported - Maybe<Object> minstallDir = getEntity().getConfigRaw(SoftwareProcess.INSTALL_DIR, false); - if (!minstallDir.isPresent() || minstallDir.get()==null) { - String installBasedir = ((EntityInternal)entity).getManagementContext().getConfig().getFirst("brooklyn.dirs.install"); - if (installBasedir != null) { - log.warn("Using legacy 'brooklyn.dirs.install' setting for "+entity+"; may be removed in future versions."); - setInstallDir(Os.tidyPath(Os.mergePathsUnix(installBasedir, getEntityVersionLabel()+"_"+entity.getId()))); - return installDir; - } - } - // set it null first so that we force a recompute setInstallDir(null); setInstallDir(Os.tidyPath(ConfigToAttributes.apply(getEntity(), SoftwareProcess.INSTALL_DIR))); @@ -181,19 +184,6 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP return runDir; } - // deprecated in 0.7.0 - Maybe<Object> mRunDir = getEntity().getConfigRaw(SoftwareProcess.RUN_DIR, true); - if (!mRunDir.isPresent() || mRunDir.get()==null) { - String runBasedir = ((EntityInternal)entity).getManagementContext().getConfig().getFirst("brooklyn.dirs.run"); - if (runBasedir != null) { - log.warn("Using legacy 'brooklyn.dirs.run' setting for "+entity+"; may be removed in future versions."); - runDir = Os.mergePathsUnix(runBasedir, entity.getApplication().getId()+"/"+"entities"+"/"+getEntityVersionLabel()+"_"+entity.getId()); - runDir = Os.tidyPath(runDir); - getEntity().sensors().set(SoftwareProcess.RUN_DIR, runDir); - return runDir; - } - } - setRunDir(Os.tidyPath(ConfigToAttributes.apply(getEntity(), SoftwareProcess.RUN_DIR))); return runDir; } http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d50580be/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java index 897afab..979158f 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/AbstractSoftwareProcessWinRmDriver.java @@ -29,6 +29,13 @@ import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.TimeUnit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.common.collect.ImmutableList; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Maps; + import org.apache.brooklyn.api.entity.EntityLocal; import org.apache.brooklyn.api.mgmt.Task; import org.apache.brooklyn.api.sensor.AttributeSensor; @@ -48,12 +55,6 @@ import org.apache.brooklyn.util.repeat.Repeater; import org.apache.brooklyn.util.stream.Streams; import org.apache.brooklyn.util.text.Strings; import org.apache.brooklyn.util.time.Duration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; public abstract class AbstractSoftwareProcessWinRmDriver extends AbstractSoftwareProcessDriver implements NativeWindowsScriptRunner { private static final Logger LOG = LoggerFactory.getLogger(AbstractSoftwareProcessWinRmDriver.class); @@ -177,6 +178,28 @@ public abstract class AbstractSoftwareProcessWinRmDriver extends AbstractSoftwar public int executePsCommand(Map flags, String command, String phase) { return executeNativeOrPsCommand(flags, null, command, phase, true); } + + /** + * @deprecated since 0.5.0; instead rely on {@link org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager} to inc + * + * <pre> + * {@code + * DownloadResolver resolver = Entities.newDownloader(this); + * List<String> urls = resolver.getTargets(); + * } + * </pre> + */ + protected String getEntityVersionLabel() { + return getEntityVersionLabel("_"); + } + + /** + * @deprecated since 0.5.0; instead rely on {@link org.apache.brooklyn.api.entity.drivers.downloads.DownloadResolverManager} to inc + */ + protected String getEntityVersionLabel(String separator) { + return elvis(entity.getEntityType().getSimpleName(), + entity.getClass().getName())+(getVersion() != null ? separator+getVersion() : ""); + } @Override public String getRunDir() { http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d50580be/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java index 86f7059..7ee393a 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcess.java @@ -20,20 +20,18 @@ package org.apache.brooklyn.entity.software.base; import java.util.Collection; import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; -import com.google.common.collect.Sets; +import com.google.common.annotations.Beta; +import com.google.common.collect.ImmutableSet; +import com.google.common.reflect.TypeToken; + import org.apache.brooklyn.api.entity.Entity; import org.apache.brooklyn.api.location.MachineProvisioningLocation; -import org.apache.brooklyn.api.location.PortRange; import org.apache.brooklyn.api.sensor.AttributeSensor; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.annotation.Effector; import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.core.config.ConfigUtils; import org.apache.brooklyn.core.config.MapConfigKey; -import org.apache.brooklyn.core.entity.AbstractEntity; import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.BrooklynConfigKeys; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; @@ -42,16 +40,9 @@ import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.sensor.AttributeSensorAndConfigKey; import org.apache.brooklyn.core.sensor.Sensors; import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.collections.MutableSet; import org.apache.brooklyn.util.core.flags.SetFromFlag; -import org.apache.brooklyn.util.core.flags.TypeCoercions; -import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.time.Duration; -import com.google.common.annotations.Beta; -import com.google.common.collect.ImmutableSet; -import com.google.common.reflect.TypeToken; - public interface SoftwareProcess extends Entity, Startable { AttributeSensor<String> HOSTNAME = Attributes.HOSTNAME; @@ -136,6 +127,11 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("downloadAddonUrls") AttributeSensorAndConfigKey<Map<String,String>,Map<String,String>> DOWNLOAD_ADDON_URLS = Attributes.DOWNLOAD_ADDON_URLS; + @SetFromFlag("archiveNameFormat") + ConfigKey<String> ARCHIVE_DIRECTORY_NAME_FORMAT = ConfigKeys.newStringConfigKey("archive.nameFormat", + "The format for the directory created when the installation archive is extracted, if required. " + + "The version string will be passed in as the first argument, replacing the %s format specifier"); + @SetFromFlag("installLabel") ConfigKey<String> INSTALL_UNIQUE_LABEL = BrooklynConfigKeys.INSTALL_UNIQUE_LABEL; @@ -144,30 +140,26 @@ public interface SoftwareProcess extends Entity, Startable { @SetFromFlag("installDir") AttributeSensorAndConfigKey<String,String> INSTALL_DIR = BrooklynConfigKeys.INSTALL_DIR; - @Deprecated - ConfigKey<String> SUGGESTED_INSTALL_DIR = BrooklynConfigKeys.SUGGESTED_INSTALL_DIR; @SetFromFlag("runDir") AttributeSensorAndConfigKey<String,String> RUN_DIR = BrooklynConfigKeys.RUN_DIR; - @Deprecated - ConfigKey<String> SUGGESTED_RUN_DIR = BrooklynConfigKeys.SUGGESTED_RUN_DIR; - public static final ConfigKey<Boolean> OPEN_IPTABLES = ConfigKeys.newBooleanConfigKey("openIptables", + ConfigKey<Boolean> OPEN_IPTABLES = ConfigKeys.newBooleanConfigKey("openIptables", "Whether to open the INBOUND_PORTS via iptables rules; " + "if true then ssh in to run iptables commands, as part of machine provisioning", false); - public static final ConfigKey<Boolean> STOP_IPTABLES = ConfigKeys.newBooleanConfigKey("stopIptables", + ConfigKey<Boolean> STOP_IPTABLES = ConfigKeys.newBooleanConfigKey("stopIptables", "Whether to stop iptables entirely; " + "if true then ssh in to stop the iptables service, as part of machine provisioning", false); - public static final ConfigKey<Boolean> DONT_REQUIRE_TTY_FOR_SUDO = ConfigKeys.newBooleanConfigKey("dontRequireTtyForSudo", + ConfigKey<Boolean> DONT_REQUIRE_TTY_FOR_SUDO = ConfigKeys.newBooleanConfigKey("dontRequireTtyForSudo", "Whether to explicitly set /etc/sudoers, so don't need tty (will leave unchanged if 'false'); " + "some machines require a tty for sudo; brooklyn by default does not use a tty " + "(so that it can get separate error+stdout streams); you can enable a tty as an " + "option to every ssh command, or you can do it once and " + "modify the machine so that a tty is not subsequently required.", false); - + /** * Files to be copied to the server before pre-install. * <p>