Repository: incubator-brooklyn Updated Branches: refs/heads/master 7066d94e8 -> 1a2819384
add support to control java version installed Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/42f4929a Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/42f4929a Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/42f4929a Branch: refs/heads/master Commit: 42f4929aa012c02863d2add81b99b5c1575ccaf1 Parents: 9595ddc Author: Andrea Turli <[email protected]> Authored: Thu Apr 30 15:36:58 2015 +0200 Committer: Andrea Turli <[email protected]> Committed: Mon Jun 1 11:56:39 2015 +0200 ---------------------------------------------------------------------- .../basic/AbstractSoftwareProcessSshDriver.java | 84 +++++------ .../java/JavaSoftwareProcessSshDriver.java | 139 ++++++++----------- .../java/brooklyn/entity/java/UsesJava.java | 18 ++- ...SoftwareProcessSshDriverIntegrationTest.java | 32 ++--- .../nosql/cassandra/CassandraNodeSshDriver.java | 32 ++--- .../nosql/riak/RiakNodeIntegrationTest.java | 7 +- .../nosql/riak/RiakNodeSoftlayerLiveTest.java | 9 +- 7 files changed, 143 insertions(+), 178 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java index 597a967..3ebad57 100644 --- a/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java +++ b/software/base/src/main/java/brooklyn/entity/basic/AbstractSoftwareProcessSshDriver.java @@ -30,11 +30,17 @@ 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 brooklyn.config.BrooklynLogging; import brooklyn.entity.basic.lifecycle.NaiveScriptRunner; import brooklyn.entity.basic.lifecycle.ScriptHelper; import brooklyn.entity.drivers.downloads.DownloadResolver; -import brooklyn.entity.drivers.downloads.DownloadResolverManager; import brooklyn.entity.effector.EffectorTasks; import brooklyn.entity.software.SshEffectorTasks; import brooklyn.event.feed.ConfigToAttributes; @@ -54,20 +60,13 @@ import brooklyn.util.text.StringPredicates; import brooklyn.util.text.Strings; import brooklyn.util.time.Duration; -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; - /** * An abstract SSH implementation of the {@link AbstractSoftwareProcessDriver}. - * + * * This provides conveniences for clients implementing the install/customize/launch/isRunning/stop lifecycle * over SSH. These conveniences include checking whether software is already installed, * creating/using a PID file for some operations, and reading ssh-specific config from the entity - * to override/augment ssh flags on the session. + * to override/augment ssh flags on the session. */ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareProcessDriver implements NaiveScriptRunner { @@ -81,51 +80,36 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP private final Object installDirSetupMutex = new Object(); protected volatile DownloadResolver resolver; - + /** 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 * (where there aren't conflicts, flags from all three are used however) */ - public static final String IGNORE_ENTITY_SSH_FLAGS = SshEffectorTasks.IGNORE_ENTITY_SSH_FLAGS.getName(); + public static final String IGNORE_ENTITY_SSH_FLAGS = SshEffectorTasks.IGNORE_ENTITY_SSH_FLAGS.getName(); public AbstractSoftwareProcessSshDriver(EntityLocal entity, SshMachineLocation machine) { super(entity, machine); - + // FIXME this assumes we own the location, and causes warnings about configuring location after deployment; // better would be to wrap the ssh-execution-provider to supply these flags if (getSshFlags()!=null && !getSshFlags().isEmpty()) machine.configure(getSshFlags()); - - // ensure these are set using the routines below, not a global ConfigToAttributes.apply() + + // ensure these are set using the routines below, not a global ConfigToAttributes.apply() getInstallDir(); getRunDir(); } - /** returns location (tighten type, since we know it is an ssh machine location here) */ + /** returns location (tighten type, since we know it is an ssh machine location here) */ public SshMachineLocation getLocation() { return (SshMachineLocation) super.getLocation(); } - /** - * Name to be used in the local repo, when looking for the download file. - */ - public String getDownloadFilename() { - return getEntity().getEntityType().getSimpleName().toLowerCase() + "-"+getVersion() + ".tar.gz"; - } - - /** - * Suffix to use when looking up the file in the local repo. - * Ignored if {@link getDownloadFilename()} returns non-null. - */ - public String getDownloadFileSuffix() { - return "tar.gz"; - } - protected void setInstallDir(String installDir) { this.installDir = installDir; entity.setAttribute(SoftwareProcess.INSTALL_DIR, installDir); } - + public String getInstallDir() { if (installDir != null) return installDir; @@ -157,16 +141,16 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP return installDir; } } - + protected void setInstallLabel() { - if (getEntity().getConfigRaw(SoftwareProcess.INSTALL_UNIQUE_LABEL, false).isPresentAndNonNull()) return; - getEntity().setConfig(SoftwareProcess.INSTALL_UNIQUE_LABEL, + if (getEntity().getConfigRaw(SoftwareProcess.INSTALL_UNIQUE_LABEL, false).isPresentAndNonNull()) return; + getEntity().setConfig(SoftwareProcess.INSTALL_UNIQUE_LABEL, getEntity().getEntityType().getSimpleName()+ (Strings.isNonBlank(getVersion()) ? "_"+getVersion() : "")+ (Strings.isNonBlank(getInstallLabelExtraSalt()) ? "_"+getInstallLabelExtraSalt() : "") ); } - /** allows subclasses to return extra salt (ie unique hash) + /** allows subclasses to return extra salt (ie unique hash) * for cases where install dirs need to be distinct e.g. based on extra plugins being placed in the install dir; * {@link #setInstallLabel()} uses entity-type simple name and version already * <p> @@ -181,10 +165,10 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP this.runDir = runDir; entity.setAttribute(SoftwareProcess.RUN_DIR, runDir); } - + public String getRunDir() { if (runDir != null) return runDir; - + String existingVal = getEntity().getAttribute(SoftwareProcess.RUN_DIR); if (Strings.isNonBlank(existingVal)) { // e.g. on rebind runDir = existingVal; @@ -213,14 +197,14 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP if (Strings.isNonBlank(oldVal) && !oldVal.equals(val)) { log.info("Resetting expandedInstallDir (to "+val+" from "+oldVal+") for "+getEntity()); } - + expandedInstallDir = val; getEntity().setAttribute(SoftwareProcess.EXPANDED_INSTALL_DIR, val); } - + public String getExpandedInstallDir() { if (expandedInstallDir != null) return expandedInstallDir; - + String existingVal = getEntity().getAttribute(SoftwareProcess.EXPANDED_INSTALL_DIR); if (Strings.isNonBlank(existingVal)) { // e.g. on rebind expandedInstallDir = existingVal; @@ -258,7 +242,7 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP @Override public int execute(Map flags2, List<String> script, String summaryForLogging) { // TODO replace with SshEffectorTasks.ssh ?; remove the use of flags - + Map flags = Maps.newLinkedHashMap(); if (!flags2.containsKey(IGNORE_ENTITY_SSH_FLAGS)) { flags.putAll(getSshFlags()); @@ -276,7 +260,7 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP Tasks.addTagDynamically(BrooklynTaskTags.tagForEnvStream(BrooklynTaskTags.STREAM_ENV, environment)); } if (BrooklynTaskTags.stream(Tasks.current(), BrooklynTaskTags.STREAM_STDIN)==null) { - Tasks.addTagDynamically(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDIN, + Tasks.addTagDynamically(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDIN, Streams.byteArrayOfString(Strings.join(script, "\n")))); } if (BrooklynTaskTags.stream(Tasks.current(), BrooklynTaskTags.STREAM_STDOUT)==null) { @@ -334,7 +318,6 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP } - /** * @param sshFlags Extra flags to be used when making an SSH connection to the entity's machine. * If the map contains the key {@link #IGNORE_ENTITY_SSH_FLAGS} then only the @@ -374,13 +357,12 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP return result; } - /** * Input stream will be closed automatically. * <p> * If using {@link SshjTool} usage, consider using {@link KnownSizeInputStream} to avoid having - * to write out stream once to find its size! - * + * to write out stream once to find its size! + * * @see #copyResource(Map, String, String) for parameter descriptions. */ @SuppressWarnings({ "rawtypes", "unchecked" }) @@ -519,7 +501,7 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP protected ScriptHelper newScript(Map<String, ?> flags, String phase) { if (!Entities.isManaged(getEntity())) throw new IllegalStateException(getEntity()+" is no longer managed; cannot create script to run here ("+phase+")"); - + if (!Iterables.all(flags.keySet(), StringPredicates.equalToAny(VALID_FLAGS))) { throw new IllegalArgumentException("Invalid flags passed: " + flags); } @@ -530,7 +512,7 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP s.header.prepend("set -x"); } if (INSTALLING.equals(phase)) { - // mutexId should be global because otherwise package managers will contend with each other + // mutexId should be global because otherwise package managers will contend with each other s.useMutex(getLocation(), "installation lock at host", "installing "+elvis(entity,this)); s.header.append( "export INSTALL_DIR=\""+getInstallDir()+"\"", @@ -639,8 +621,8 @@ public abstract class AbstractSoftwareProcessSshDriver extends AbstractSoftwareP ); } else { s.footer.prepend( - "test -f "+pidFile+" || exit 1", - "ps -p $(cat "+pidFile+") || exit 1" + "test -f "+pidFile+" || exit 1", + "ps -p $(cat "+pidFile+") || exit 1" ); } // no pid, not running; no process; can't restart, 1 is not running http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java b/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java index d2a11c9..08ccfcb 100644 --- a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java +++ b/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java @@ -30,6 +30,17 @@ import java.util.Set; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import com.google.common.base.Function; +import com.google.common.base.Joiner; +import com.google.common.base.Optional; +import com.google.common.base.Splitter; +import com.google.common.base.Throwables; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import com.google.gson.internal.Primitives; + import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; import brooklyn.entity.basic.Attributes; import brooklyn.entity.basic.Entities; @@ -52,16 +63,6 @@ import brooklyn.util.task.system.ProcessTaskWrapper; import brooklyn.util.text.StringEscapes.BashStringEscapes; import brooklyn.util.text.Strings; -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.base.Optional; -import com.google.common.base.Throwables; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.gson.internal.Primitives; - /** * The SSH implementation of the {@link brooklyn.entity.java.JavaSoftwareProcessDriver}. */ @@ -102,7 +103,7 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce @Override public Map<String, String> getShellEnvironment() { List<String> javaOpts = getJavaOpts(); - + for (String it : javaOpts) { BashStringEscapes.assertValidForDoubleQuotingInBash(it); } @@ -210,7 +211,7 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce /** * Return extra Java system properties (-D defines) used by the application. - * + * * Override as needed; default is an empty map. */ protected Map getCustomJavaSystemProperties() { @@ -246,17 +247,17 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce /** * Return the configuration properties required to enable JMX for a Java application. - * + * * These should be set as properties in the {@code JAVA_OPTS} environment variable when calling the * run script for the application. */ protected Map<String, ?> getJmxJavaSystemProperties() { MutableMap.Builder<String, Object> result = MutableMap.<String, Object> builder(); - + if (isJmxEnabled()) { new JmxSupport(getEntity(), getRunDir()).applyJmxJavaSystemProperties(result); } - + return result.build(); } @@ -272,69 +273,32 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce } /** - * Checks for the presence of Java 6 or 7 on the entity's location, installing if necessary. - * @return true if Java 6 or 7 was found on the machine or if it was installed correctly, otherwise false. + * Checks for the presence of Java on the entity's location, installing if necessary. + * @return true if the required version of Java was found on the machine or if it was installed correctly, + * otherwise false. */ - protected boolean checkForAndInstallJava6or7() { - Optional<String> version = getCurrentJavaVersion(); - if (version.isPresent() && (version.get().startsWith("1.8") || version.get().startsWith("1.7") || version.get().startsWith("1.6"))) { - log.debug("Java version {} already installed at {}@{}", new Object[]{version.get(), getEntity(), getLocation()}); - return true; + protected boolean checkForAndInstallJava(String requiredVersion) { + int requiredJavaMinor; + if (requiredVersion.contains(".")) { + List<String> requiredVersionParts = Splitter.on(".").splitToList(requiredVersion); + requiredJavaMinor = Integer.valueOf(requiredVersionParts.get(1)); + } else if (requiredVersion.length() == 1) { + requiredJavaMinor = Integer.valueOf(requiredVersion); } else { - // Let's hope not! - if (version.isPresent()) { - log.debug("Found old Java version {} on {}@{}. Going to install latest Java version.", - new Object[]{version.get(), getEntity(), getLocation()}); - } - return tryJavaInstall("latest", BashCommands.installJava7Or6OrFail()) == 0; + log.error("java version required {} is not supported", requiredVersion); + throw new IllegalArgumentException("Required java version " + requiredVersion + " not supported"); } - } - - /** - * Checks for the presence of Java 7 or 8 on the entity's location, installing if necessary. - * @return true if Java 7 or 8 was found on the machine or if it was installed correctly, otherwise false. - */ - protected boolean checkForAndInstallJava7or8() { - Optional<String> version = getCurrentJavaVersion(); - if (version.isPresent() && (version.get().startsWith("1.8") || version.get().startsWith("1.7"))) { - log.debug("Java version {} already installed at {}@{}", new Object[]{version.get(), getEntity(), getLocation()}); - return true; - } else { - // Let's hope not! - if (version.isPresent()) { - log.debug("Found old Java version {} on {}@{}. Going to install latest Java version.", - new Object[]{version.get(), getEntity(), getLocation()}); + Optional<String> installedJavaVersion = getInstalledJavaVersion(); + if (installedJavaVersion.isPresent()) { + List<String> installedVersionParts = Splitter.on(".").splitToList(installedJavaVersion.get()); + int javaMajor = Integer.valueOf(installedVersionParts.get(0)); + int javaMinor = Integer.valueOf(installedVersionParts.get(1)); + if (javaMajor == 1 && javaMinor >= requiredJavaMinor) { + log.debug("Java {} already installed at {}@{}", new Object[]{installedJavaVersion.get(), getEntity(), getLocation()}); + return true; } - return tryJavaInstall("latest", BashCommands.installJava7OrFail()) == 0; - } - } - - /** - * Checks for the presence of Java 6 on the entity's location, installing if necessary. - * @return true if Java 6 was found on the machine or if it was installed correctly, otherwise false. - */ - protected boolean checkForAndInstallJava6() { - Optional<String> version = getCurrentJavaVersion(); - if (version.isPresent() && version.get().startsWith("1.6")) { - log.debug("Java 6 already installed at {}@{}", getEntity(), getLocation()); - return true; - } else { - return tryJavaInstall("6", BashCommands.installJava6OrFail()) == 0; - } - } - - /** - * Checks for the presence of Java 7 on the entity's location, installing if necessary. - * @return true if Java 7 was found on the machine or if it was installed correctly, otherwise false. - */ - protected boolean checkForAndInstallJava7() { - Optional<String> version = getCurrentJavaVersion(); - if (version.isPresent() && version.get().startsWith("1.7")) { - log.debug("Java 7 already installed at {}@{}", getEntity(), getLocation()); - return true; - } else { - return tryJavaInstall("7", BashCommands.installJava7OrFail()) == 0; } + return tryJavaInstall(requiredVersion, BashCommands.installJava(requiredJavaMinor)) == 0; } protected int tryJavaInstall(String version, String command) { @@ -350,17 +314,25 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce log.warn("Installation of Java {} failed at {}@{}: {}", new Object[]{version, getEntity(), getLocation(), installCommand.getStderr()}); } - return result; + return result; } finally { getLocation().releaseMutex("installing"); } } /** + * @deprecated since 0.7.0; instead use {@link #getInstalledJavaVersion()} + */ + @Deprecated + protected Optional<String> getCurrentJavaVersion() { + return getInstalledJavaVersion(); + } + + /** * Checks for the version of Java installed on the entity's location over SSH. * @return An Optional containing the version portion of `java -version`, or absent if no Java found. */ - protected Optional<String> getCurrentJavaVersion() { + protected Optional<String> getInstalledJavaVersion() { log.debug("Checking Java version at {}@{}", getEntity(), getLocation()); // sed gets stdin like 'java version "1.7.0_45"' ProcessTaskWrapper<Integer> versionCommand = Entities.submit(getEntity(), SshTasks.newSshExecTaskFactory( @@ -400,13 +372,16 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce /** * Checks for Java 6 or 7, installing Java 7 if neither are found. Override this method to * check for and install specific versions of Java. - * - * @see #checkForAndInstallJava6() - * @see #checkForAndInstallJava7() - * @see #checkForAndInstallJava6or7() + * + * @see #checkForAndInstallJava(String) */ public boolean installJava() { - return checkForAndInstallJava6or7(); + if (entity instanceof UsesJava) { + String version = entity.getConfig(UsesJava.JAVA_VERSION_REQUIRED); + return checkForAndInstallJava(version); + } + // by default it installs jdk7 + return checkForAndInstallJava("1.7"); } public void installJmxSupport() { @@ -415,10 +390,10 @@ public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProce new JmxSupport(getEntity(), getRunDir()).install(); } } - + public void checkJavaHostnameBug() { checkNoHostnameBug(); - + try { ProcessTaskWrapper<Integer> hostnameTask = DynamicTasks.queue(SshEffectorTasks.ssh("echo FOREMARKER; hostname -f; echo AFTMARKER")).block(); String stdout = Strings.getFragmentBetween(hostnameTask.getStdout(), "FOREMARKER", "AFTMARKER"); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/base/src/main/java/brooklyn/entity/java/UsesJava.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/UsesJava.java b/software/base/src/main/java/brooklyn/entity/java/UsesJava.java index a0d97f8..1f824a1 100644 --- a/software/base/src/main/java/brooklyn/entity/java/UsesJava.java +++ b/software/base/src/main/java/brooklyn/entity/java/UsesJava.java @@ -18,15 +18,15 @@ */ package brooklyn.entity.java; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Maps; + import brooklyn.config.ConfigKey; import brooklyn.entity.basic.ConfigKeys; import brooklyn.event.basic.MapConfigKey; import brooklyn.event.basic.SetConfigKey; import brooklyn.util.flags.SetFromFlag; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Maps; - public interface UsesJava { /** system properties (-D) to append to JAVA_OPTS; normally accessed through {@link JavaEntityMethods#javaSysProp(String)} */ @@ -51,14 +51,18 @@ public interface UsesJava { * <li>If value contains "=" then see if there's a default that matches the section up to the "=". * If there is, then remove the original and just include this. * e.g. "-XX:MaxPermSize=512m" could be overridden in this way. - * </ul> + * </ul> */ @SetFromFlag("javaOpts") - public static final SetConfigKey<String> JAVA_OPTS = new SetConfigKey<String>(String.class, + public static final SetConfigKey<String> JAVA_OPTS = new SetConfigKey<String>(String.class, "java.opts", "Java command line options", ImmutableSet.<String>of()); - public static final ConfigKey<Boolean> CHECK_JAVA_HOSTNAME_BUG = ConfigKeys.newBooleanConfigKey( + public static final ConfigKey<Boolean> CHECK_JAVA_HOSTNAME_BUG = ConfigKeys.newBooleanConfigKey( "java.check.hostname.bug", "Check whether hostname is too long and will likely crash Java" + "due to bug 7089443", true); -} \ No newline at end of file + @SetFromFlag("javaVersionRequired") + ConfigKey<String> JAVA_VERSION_REQUIRED = ConfigKeys.newStringConfigKey("java.version.required", "Java version required", "1.7"); + + +} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/base/src/test/java/brooklyn/entity/java/JavaSoftwareProcessSshDriverIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/brooklyn/entity/java/JavaSoftwareProcessSshDriverIntegrationTest.java b/software/base/src/test/java/brooklyn/entity/java/JavaSoftwareProcessSshDriverIntegrationTest.java index 291ae6c..021e2ac 100644 --- a/software/base/src/test/java/brooklyn/entity/java/JavaSoftwareProcessSshDriverIntegrationTest.java +++ b/software/base/src/test/java/brooklyn/entity/java/JavaSoftwareProcessSshDriverIntegrationTest.java @@ -29,6 +29,9 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import com.google.common.base.Optional; +import com.google.common.collect.ImmutableList; + import brooklyn.entity.basic.ApplicationBuilder; import brooklyn.entity.basic.BrooklynConfigKeys; import brooklyn.entity.basic.Entities; @@ -48,9 +51,6 @@ import brooklyn.util.collections.MutableMap; import brooklyn.util.os.Os; import brooklyn.util.text.Strings; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableList; - public class JavaSoftwareProcessSshDriverIntegrationTest { private static final long TIMEOUT_MS = 10 * 1000; @@ -76,7 +76,7 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { public void setup() { setup(new LocalManagementContext()); } - + protected void setup(ManagementContext mgmt) { app = ApplicationBuilder.newManagedApp(TestApplication.class, mgmt); localhost = mgmt.getLocationManager().createLocation( @@ -96,7 +96,7 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { public void run() { assertTrue(entity.getAttribute(SoftwareProcess.SERVICE_UP)); }}); - + entity.stop(); assertFalse(entity.getAttribute(SoftwareProcess.SERVICE_UP)); } @@ -106,7 +106,7 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { SshMachineLocation sshLocation = app.getManagementContext().getLocationManager().createLocation( LocationSpec.create(SshMachineLocation.class).configure("address", "localhost")); JavaSoftwareProcessSshDriver driver = new ConcreteJavaSoftwareProcessSshDriver(app, sshLocation); - Optional<String> version = driver.getCurrentJavaVersion(); + Optional<String> version = driver.getInstalledJavaVersion(); assertNotNull(version); assertTrue(version.isPresent()); LOG.info("{}.testGetJavaVersion found: {} on localhost", getClass(), version.get()); @@ -119,11 +119,11 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { LocalManagementContext mgmt = new LocalManagementContext(); mgmt.getBrooklynProperties().put(BrooklynConfigKeys.ONBOX_BASE_DIR, dir); setup(mgmt); - + doTestSpecifiedDirectory(dir, dir); Os.deleteRecursively(dir); } - + @Test(groups = "Integration") public void testStartsInAppSpecifiedDirectoryUnderHome() { String dir = Os.mergePathsUnix("~/.brooklyn-test-"+Strings.makeRandomId(4)); @@ -134,7 +134,7 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { Os.deleteRecursively(dir); } } - + @Test(groups = "Integration") public void testStartsInDifferentRunAndInstallSpecifiedDirectories() { String dir1 = Os.mergePathsUnix(Os.tmp(), "/brooklyn-test-"+Strings.makeRandomId(4)); @@ -145,7 +145,7 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { Os.deleteRecursively(dir1); Os.deleteRecursively(dir2); } - + @Test(groups = "Integration") public void testStartsInLegacySpecifiedDirectory() { String dir1 = Os.mergePathsUnix(Os.tmp(), "/brooklyn-test-"+Strings.makeRandomId(4)); @@ -155,33 +155,33 @@ public class JavaSoftwareProcessSshDriverIntegrationTest { mgmt.getBrooklynProperties().put("brooklyn.dirs.install", dir1); mgmt.getBrooklynProperties().put("brooklyn.dirs.run", dir2); setup(mgmt); - + app.setConfig(BrooklynConfigKeys.RUN_DIR, dir2); doTestSpecifiedDirectory(dir1, dir2); Os.deleteRecursively(dir1); Os.deleteRecursively(dir2); } - + protected void doTestSpecifiedDirectory(final String installDirPrefix, final String runDirPrefix) { final MyEntity entity = app.createAndManageChild(EntitySpec.create(MyEntity.class)); app.start(ImmutableList.of(localhost)); Asserts.succeedsEventually(MutableMap.of("timeout", TIMEOUT_MS), new Runnable() { public void run() { assertTrue(entity.getAttribute(SoftwareProcess.SERVICE_UP)); - + String installDir = entity.getAttribute(SoftwareProcess.INSTALL_DIR); Assert.assertNotNull(installDir); - + String runDir = entity.getAttribute(SoftwareProcess.RUN_DIR); Assert.assertNotNull(runDir); }}); - + String installDir = entity.getAttribute(SoftwareProcess.INSTALL_DIR); String runDir = entity.getAttribute(SoftwareProcess.RUN_DIR); LOG.info("dirs for " + app + " are: install=" + installDir + ", run=" + runDir); assertTrue(installDir.startsWith(Os.tidyPath(installDirPrefix)), "INSTALL_DIR is "+installDir+", does not start with expected prefix "+installDirPrefix); assertTrue(runDir.startsWith(Os.tidyPath(runDirPrefix)), "RUN_DIR is "+runDir+", does not start with expected prefix "+runDirPrefix); - + entity.stop(); assertFalse(entity.getAttribute(SoftwareProcess.SERVICE_UP)); } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java b/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java index 9a54c8a..44651ba 100644 --- a/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java +++ b/software/nosql/src/main/java/brooklyn/entity/nosql/cassandra/CassandraNodeSshDriver.java @@ -30,6 +30,10 @@ import java.util.Set; 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.ImmutableSet; + import brooklyn.entity.Entity; import brooklyn.entity.basic.Attributes; import brooklyn.entity.basic.Entities; @@ -61,10 +65,6 @@ import brooklyn.util.text.TemplateProcessor; import brooklyn.util.time.Duration; import brooklyn.util.time.Time; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; - /** * Start a {@link CassandraNode} in a {@link Location} accessible over ssh. */ @@ -112,20 +112,20 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme public String getCassandraRackdcConfigFileName() { return entity.getConfig(CassandraNode.CASSANDRA_RACKDC_CONFIG_FILE_NAME); } public String getMirrorUrl() { return entity.getConfig(CassandraNode.MIRROR_URL); } - + protected String getDefaultUnpackedDirectoryName() { return "apache-cassandra-"+getVersion(); } - + protected boolean isV2() { String version = getVersion(); return version.startsWith("2."); } - + @Override public boolean installJava() { if (isV2()) { - return checkForAndInstallJava7or8(); + return checkForAndInstallJava("1.8"); } else { return super.installJava(); } @@ -186,8 +186,8 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme .add("mkdir -p brooklyn_commands") .add(String.format("sed -i.bk 's/log4j.appender.R.File=.*/log4j.appender.R.File=%s/g' %s/conf/log4j-server.properties", logFileEscaped, getRunDir())) .add(String.format("sed -i.bk '/JMX_PORT/d' %s/conf/cassandra-env.sh", getRunDir())) - // Script sets 180k on Linux which gives Java error: The stack size specified is too small, Specify at least 228k - .add(String.format("sed -i.bk 's/-Xss180k/-Xss280k/g' %s/conf/cassandra-env.sh", getRunDir())); + // Script sets 180k on Linux which gives Java error: The stack size specified is too small, Specify at least 228k + .add(String.format("sed -i.bk 's/-Xss180k/-Xss280k/g' %s/conf/cassandra-env.sh", getRunDir())); newScript(CUSTOMIZING) .body.append(commands.build()) @@ -224,7 +224,7 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme protected void customizeInitialSeeds() { if (entity.getConfig(CassandraNode.INITIAL_SEEDS)==null) { if (isClustered()) { - entity.setConfig(CassandraNode.INITIAL_SEEDS, + entity.setConfig(CassandraNode.INITIAL_SEEDS, DependentConfiguration.attributeWhenReady(entity.getParent(), CassandraDatacenter.CURRENT_SEEDS)); } else { entity.setConfig(CassandraNode.INITIAL_SEEDS, MutableSet.<Entity>of(entity)); @@ -290,7 +290,7 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme } } } while (true); - + // TODO should look at last start time... but instead we always wait CassandraDatacenter.DELAY_BETWEEN_STARTS.countdownTimer().waitForExpiryUnchecked(); } @@ -307,7 +307,7 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme .execute(); if (!isClustered()) { InputStream creationScript = DatastoreMixins.getDatabaseCreationScript(entity); - if (creationScript!=null) { + if (creationScript!=null) { Tasks.setBlockingDetails("Pausing to ensure Cassandra (singleton) has started before running creation script"); Time.sleep(Duration.seconds(20)); Tasks.resetBlockingDetails(); @@ -341,7 +341,7 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme } return result; } - + protected String launchEssentialCommand() { if (isV2()) { return String.format("./bin/cassandra -p %s > ./cassandra-console.log 2>&1", getPidFile()); @@ -372,7 +372,7 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme .put("cassandra.config", getCassandraConfigFileName()) .build(); } - + @Override public Map<String, String> getShellEnvironment() { return MutableMap.<String, String>builder() @@ -416,5 +416,5 @@ public class CassandraNodeSshDriver extends JavaSoftwareProcessSshDriver impleme public String getResolvedAddress(String hostname) { return resolvedAddressCache.or(BrooklynAccessUtils.resolvedAddressSupplier(getEntity(), getMachine(), hostname)); } - + } http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeIntegrationTest.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeIntegrationTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeIntegrationTest.java index 1b92e25..002739c 100644 --- a/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeIntegrationTest.java +++ b/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeIntegrationTest.java @@ -24,6 +24,8 @@ import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; +import com.google.common.collect.ImmutableList; + import brooklyn.entity.basic.Entities; import brooklyn.entity.proxying.EntitySpec; import brooklyn.entity.trait.Startable; @@ -31,8 +33,6 @@ import brooklyn.location.basic.LocalhostMachineProvisioningLocation; import brooklyn.test.EntityTestUtils; import brooklyn.test.entity.TestApplication; -import com.google.common.collect.ImmutableList; - public class RiakNodeIntegrationTest { private TestApplication app; @@ -52,7 +52,8 @@ public class RiakNodeIntegrationTest { @Test(groups = "Integration") public void testCanStartAndStop() throws Exception { - RiakNode entity = app.createAndManageChild(EntitySpec.create(RiakNode.class)); + RiakNode entity = app.createAndManageChild(EntitySpec.create(RiakNode.class) + .configure(RiakNode.SUGGESTED_VERSION, "2.1.1")); app.start(ImmutableList.of(localhostProvisioningLocation)); EntityTestUtils.assertAttributeEqualsEventually(entity, Startable.SERVICE_UP, true); http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/42f4929a/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeSoftlayerLiveTest.java ---------------------------------------------------------------------- diff --git a/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeSoftlayerLiveTest.java b/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeSoftlayerLiveTest.java index 3ddd4b8..123ef7f 100644 --- a/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeSoftlayerLiveTest.java +++ b/software/nosql/src/test/java/brooklyn/entity/nosql/riak/RiakNodeSoftlayerLiveTest.java @@ -18,12 +18,14 @@ */ package brooklyn.entity.nosql.riak; +import org.testng.annotations.BeforeMethod; + +import com.google.common.collect.ImmutableList; + import brooklyn.entity.AbstractSoftlayerLiveTest; import brooklyn.entity.proxying.EntitySpec; import brooklyn.location.Location; import brooklyn.test.EntityTestUtils; -import com.google.common.collect.ImmutableList; -import org.testng.annotations.BeforeMethod; public class RiakNodeSoftlayerLiveTest extends AbstractSoftlayerLiveTest { @@ -34,7 +36,8 @@ public class RiakNodeSoftlayerLiveTest extends AbstractSoftlayerLiveTest { @Override protected void doTest(Location loc) throws Exception { - RiakNode entity = app.createAndManageChild(EntitySpec.create(RiakNode.class)); + RiakNode entity = app.createAndManageChild(EntitySpec.create(RiakNode.class) + .configure(RiakNode.SUGGESTED_VERSION, "2.1.1")); app.start(ImmutableList.of(loc)); EntityTestUtils.assertAttributeEqualsEventually(entity, RiakNode.SERVICE_UP, true);
