http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JmxSupport.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/JmxSupport.java b/software/base/src/main/java/brooklyn/entity/java/JmxSupport.java deleted file mode 100644 index f21697d..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/JmxSupport.java +++ /dev/null @@ -1,359 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import java.util.EnumSet; -import java.util.List; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.internal.EntityLocal; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.config.ConfigKey.HasConfigKey; -import org.apache.brooklyn.entity.core.EntityInternal; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.event.feed.jmx.JmxHelper; - -import org.apache.brooklyn.location.access.BrooklynAccessUtils; -import org.apache.brooklyn.location.basic.Locations; -import org.apache.brooklyn.location.basic.SshMachineLocation; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.BrooklynMavenArtifacts; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.core.task.Tasks; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.jmx.jmxmp.JmxmpAgent; -import org.apache.brooklyn.util.jmx.jmxrmi.JmxRmiAgent; -import org.apache.brooklyn.util.maven.MavenArtifact; -import org.apache.brooklyn.util.maven.MavenRetriever; -import org.apache.brooklyn.util.net.Urls; -import org.apache.brooklyn.util.text.Strings; - -import com.google.common.base.Preconditions; -import com.google.common.net.HostAndPort; - -public class JmxSupport implements UsesJmx { - - private static final Logger log = LoggerFactory.getLogger(JmxSupport.class); - - private final Entity entity; - private final String runDir; - - private Boolean isJmx; - private Boolean isSecure; - private JmxAgentModes jmxAgentMode; - - private static boolean warnedAboutNotOnClasspath = false; - - /** run dir may be null if it is not accessed */ - public JmxSupport(Entity entity, @Nullable String runDir) { - this.entity = Preconditions.checkNotNull(entity, "entity must be supplied"); - this.runDir = runDir; - } - - @Nonnull - public String getRunDir() { - return Preconditions.checkNotNull(runDir, "runDir must have been supplied to perform this operation"); - } - - public Entity getEntity() { - return entity; - } - - <T> T getConfig(ConfigKey<T> key) { - return getEntity().getConfig(key); - } - - <T> T getConfig(HasConfigKey<T> key) { - return getEntity().getConfig(key); - } - - <T> void setConfig(ConfigKey<T> key, T value) { - ((EntityLocal)getEntity()).setConfig(key, value); - } - - public Maybe<SshMachineLocation> getMachine() { - return Locations.findUniqueSshMachineLocation(entity.getLocations()); - } - - public boolean isJmx() { - init(); - return isJmx; - } - - public JmxAgentModes getJmxAgentMode() { - init(); - if (jmxAgentMode==null) return JmxAgentModes.NONE; - return jmxAgentMode; - } - - public boolean isSecure() { - init(); - if (isSecure==null) return false; - return isSecure; - } - - protected synchronized void init() { - if (isJmx!=null) - return; - - if (Boolean.FALSE.equals(entity.getConfig(USE_JMX))) { - isJmx = false; - return; - } - isJmx = true; - jmxAgentMode = entity.getConfig(JMX_AGENT_MODE); - if (jmxAgentMode==null) jmxAgentMode = JmxAgentModes.AUTODETECT; - - isSecure = entity.getConfig(JMX_SSL_ENABLED); - if (isSecure==null) isSecure = false; - - if (jmxAgentMode==JmxAgentModes.AUTODETECT) { - if (isSecure()) { - jmxAgentMode = JmxAgentModes.JMXMP; - } else { - jmxAgentMode = JmxAgentModes.JMXMP_AND_RMI; - if (!ResourceUtils.create(this).doesUrlExist(getJmxAgentJarUrl())) { - // can happen e.g. if eclipse build - log.warn("JMX agent JAR not found ("+getJmxAgentJarUrl()+") when auto-detecting JMX settings for "+entity+"; " + - "likely cause is an incomplete build (e.g. from Eclipse; run a maven build then retry in the IDE); "+ - "reverting to NONE (use built-in Java JMX support, which will not go through firewalls)"); - jmxAgentMode = JmxAgentModes.NONE; - } - } - - ((EntityLocal)entity).setConfig(JMX_AGENT_MODE, jmxAgentMode); - } - - if (isSecure && jmxAgentMode!=JmxAgentModes.JMXMP) { - String msg = "JMX SSL is specified, but it requires JMXMP which is disabled, when configuring "+entity; - log.warn(msg); - throw new IllegalStateException(msg); - } - } - - public void setJmxUrl() { - ((EntityInternal)entity).setAttribute(JMX_URL, getJmxUrl()); - } - - public String getJmxUrl() { - init(); - - HostAndPort jmx = BrooklynAccessUtils.getBrooklynAccessibleAddress(entity, entity.getAttribute(JMX_PORT)); - - if (EnumSet.of(JmxAgentModes.JMXMP, JmxAgentModes.JMXMP_AND_RMI).contains(getJmxAgentMode())) { - return JmxHelper.toJmxmpUrl(jmx.getHostText(), jmx.getPort()); - } else { - if (getJmxAgentMode() == JmxAgentModes.NONE) { - fixPortsForModeNone(); - } - // this will work for agent or agentless - HostAndPort rmi = BrooklynAccessUtils.getBrooklynAccessibleAddress(entity, entity.getAttribute(RMI_REGISTRY_PORT)); - return JmxHelper.toRmiJmxUrl(jmx.getHostText(), jmx.getPort(), rmi.getPort(), - entity.getAttribute(JMX_CONTEXT)); - } - } - - /** mode NONE cannot set a JMX (RMI server) port; it needs an RMI registry port, - * then gets redirected to an anonymous RMI server port; - * both the hostname and the anonymous port must be accessible to use this mode - * (hence the use of the other agents in most cases) */ - protected int fixPortsForModeNone() { - assert getJmxAgentMode()==JmxAgentModes.NONE; - Integer jmxRemotePort = getEntity().getAttribute(JMX_PORT); - Integer rmiRegistryPort = getEntity().getAttribute(RMI_REGISTRY_PORT); - if (rmiRegistryPort!=null && rmiRegistryPort>0) { - if (jmxRemotePort==null || jmxRemotePort!=rmiRegistryPort) { - if (jmxRemotePort!=null && jmxRemotePort>0) { - // ignore RMI registry port when mode 'none' is set -- set same as JMX port here - // (bit irritating, but JMX_PORT will be ignored in this mode) - log.warn("Ignoring JMX_PORT "+jmxRemotePort+" when configuring agentless JMX on "+getEntity()+"; will use RMI_REGISTRY_PORT "+rmiRegistryPort); - } - jmxRemotePort = rmiRegistryPort; - ((EntityLocal)getEntity()).setAttribute(JMX_PORT, jmxRemotePort); - } - } else { - if (jmxRemotePort==null || jmxRemotePort<=0) { - throw new IllegalStateException("Invalid JMX_PORT "+jmxRemotePort+" and RMI_REGISTRY_PORT "+rmiRegistryPort+" when configuring JMX "+getJmxAgentMode()+" on "+getEntity()); - } - ((EntityLocal)getEntity()).setAttribute(RMI_REGISTRY_PORT, jmxRemotePort); - } - return jmxRemotePort; - } - - public List<String> getJmxJavaConfigOptions() { - if (EnumSet.<JmxAgentModes>of(JmxAgentModes.NONE, JmxAgentModes.JMX_RMI).contains(getJmxAgentMode())) { - return MutableList.of(); - } else { - return MutableList.of(String.format("-javaagent:%s", getJmxAgentJarDestinationFilePath())); - } - } - - public String getJmxAgentJarDestinationFilePath() { - // cache the local path so we continue to work post-rebind to a different version - String result = getEntity().getAttribute(JMX_AGENT_LOCAL_PATH); - if (Strings.isNonBlank(result)) return result; - result = getJmxAgentJarDestinationFilePathDefault(); - ((EntityInternal)getEntity()).setAttribute(JMX_AGENT_LOCAL_PATH, result); - return result; - } - - public String getJmxAgentJarDestinationFilePathDefault() { - return Urls.mergePaths(getRunDir(), getJmxAgentJarBasename()); - } - - @Nullable public MavenArtifact getJmxAgentJarMavenArtifact() { - switch (getJmxAgentMode()) { - case JMXMP: - case JMXMP_AND_RMI: - MavenArtifact result = BrooklynMavenArtifacts.artifact(null, "brooklyn-jmxmp-agent", "jar", "with-dependencies"); - // the "with-dependencies" variant is needed; however the filename then has the classifier segment _replaced_ by "shaded" when this filename is created - result.setCustomFileNameAfterArtifactMarker("shaded"); - result.setClassifierFileNameMarker(""); - return result; - case JMX_RMI_CUSTOM_AGENT: - return BrooklynMavenArtifacts.jar("brooklyn-jmxrmi-agent"); - default: - return null; - } - } - - /** @deprecated since 0.6.0; use {@link #getJmxAgentJarMavenArtifact()} */ - @Deprecated - public String getJmxAgentJarBasename() { - MavenArtifact artifact = getJmxAgentJarMavenArtifact(); - if (artifact==null) - throw new IllegalStateException("Either JMX is not enabled or there is an error in the configuration (JMX mode "+getJmxAgentMode()+" does not support agent JAR)"); - return artifact.getFilename(); - } - - /** returns URL for accessing the java agent, throwing if not applicable; - * prefers on classpath where it should be, but will fall back to taking from maven hosted - * (known problem in Eclipse where JARs are not always copied) - */ - public String getJmxAgentJarUrl() { - MavenArtifact artifact = getJmxAgentJarMavenArtifact(); - if (artifact==null) - throw new IllegalStateException("Either JMX is not enabled or there is an error in the configuration (JMX mode "+getJmxAgentMode()+" does not support agent JAR)"); - String jar = "classpath://" + artifact.getFilename(); - if (ResourceUtils.create(this).doesUrlExist(jar)) - return jar; - - String result = MavenRetriever.localUrl(artifact); - if (warnedAboutNotOnClasspath) { - log.debug("JMX JAR for "+artifact+" is not on the classpath; taking from "+result); - } else { - log.warn("JMX JAR for "+artifact+" is not on the classpath; taking from "+result+" (subsequent similar messages will be logged at debug)"); - warnedAboutNotOnClasspath = true; - } - return result; - } - - /** applies _some_ of the common settings needed to connect via JMX */ - public void applyJmxJavaSystemProperties(MutableMap.Builder<String,Object> result) { - if (!isJmx()) return ; - - Integer jmxPort = Preconditions.checkNotNull(entity.getAttribute(JMX_PORT), "jmx port must not be null for %s", entity); - HostAndPort jmx = BrooklynAccessUtils.getBrooklynAccessibleAddress(entity, jmxPort); - Integer jmxRemotePort = getEntity().getAttribute(JMX_PORT); - String hostName = jmx.getHostText(); - - result.put("com.sun.management.jmxremote", null); - result.put("java.rmi.server.hostname", hostName); - - switch (getJmxAgentMode()) { - case JMXMP_AND_RMI: - Integer rmiRegistryPort = Preconditions.checkNotNull(entity.getAttribute(UsesJmx.RMI_REGISTRY_PORT), "registry port (config val %s)", entity.getConfig(UsesJmx.RMI_REGISTRY_PORT)); - result.put(JmxmpAgent.RMI_REGISTRY_PORT_PROPERTY, rmiRegistryPort); - case JMXMP: - if (jmxRemotePort==null || jmxRemotePort<=0) - throw new IllegalStateException("Unsupported JMX port "+jmxRemotePort+" - when applying system properties ("+getJmxAgentMode()+" / "+getEntity()+")"); - result.put(JmxmpAgent.JMXMP_PORT_PROPERTY, jmxRemotePort); - // with JMXMP don't try to tell it the hostname -- it isn't needed for JMXMP, and if specified - // it will break if the hostname we see is not known at the server, e.g. a forwarding public IP - result.remove("java.rmi.server.hostname"); - break; - case JMX_RMI_CUSTOM_AGENT: - if (jmxRemotePort==null || jmxRemotePort<=0) - throw new IllegalStateException("Unsupported JMX port "+jmxRemotePort+" - when applying system properties ("+getJmxAgentMode()+" / "+getEntity()+")"); - result.put(JmxRmiAgent.RMI_REGISTRY_PORT_PROPERTY, Preconditions.checkNotNull(entity.getAttribute(UsesJmx.RMI_REGISTRY_PORT), "registry port")); - result.put(JmxRmiAgent.JMX_SERVER_PORT_PROPERTY, jmxRemotePort); - break; - case NONE: - jmxRemotePort = fixPortsForModeNone(); - case JMX_RMI: - result.put("com.sun.management.jmxremote.port", jmxRemotePort); - result.put("java.rmi.server.useLocalHostname", "true"); - break; - default: - throw new IllegalStateException("Unsupported JMX mode - when applying system properties ("+getJmxAgentMode()+" / "+getEntity()+")"); - } - - if (isSecure()) { - // set values true, and apply keys pointing to keystore / truststore - getJmxSslSupport().applyAgentJmxJavaSystemProperties(result); - } else { - result. - put("com.sun.management.jmxremote.ssl", false). - put("com.sun.management.jmxremote.authenticate", false); - } - } - - /** installs files needed for JMX, to the runDir given in constructor, assuming the runDir has been created */ - public void install() { - if (EnumSet.of(JmxAgentModes.JMXMP_AND_RMI, JmxAgentModes.JMXMP, JmxAgentModes.JMX_RMI_CUSTOM_AGENT).contains(getJmxAgentMode())) { - Tasks.setBlockingDetails("Copying JMX agent jar to server."); - try { - getMachine().get().copyTo(ResourceUtils.create(this).getResourceFromUrl( - getJmxAgentJarUrl()), getJmxAgentJarDestinationFilePath()); - } finally { - Tasks.resetBlockingDetails(); - } - } - if (isSecure()) { - getJmxSslSupport().install(); - } - } - - protected JmxmpSslSupport getJmxSslSupport() { - return new JmxmpSslSupport(this); - } - - /** sets JMR_RMI_CUSTOM_AGENT as the connection mode for the indicated apps. - * <p> - * TODO callers of this method have RMI dependencies in the actual app; - * we should look at removing them, so that those pieces of software can run behind - * forwarding public IP's and over SSL (both reasons JMXMP is preferred by us!) - */ - public void recommendJmxRmiCustomAgent() { - // set JMX_RMI because the registry is needed (i think) - Maybe<Object> jmx = entity.getConfigRaw(UsesJmx.JMX_AGENT_MODE, true); - if (!jmx.isPresentAndNonNull()) { - setConfig(UsesJmx.JMX_AGENT_MODE, JmxAgentModes.JMX_RMI_CUSTOM_AGENT); - } else if (jmx.get()!=JmxAgentModes.JMX_RMI_CUSTOM_AGENT) { - log.warn("Entity "+entity+" may not function unless running JMX_RMI_CUSTOM_AGENT mode (asked to use "+jmx.get()+")"); - } - } - -}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java b/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java deleted file mode 100644 index c1595b1..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/JmxmpSslSupport.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.security.KeyPair; -import java.security.KeyStore; -import java.security.PrivateKey; -import java.security.cert.Certificate; -import java.security.cert.X509Certificate; - -import org.apache.brooklyn.util.collections.MutableMap.Builder; -import org.apache.brooklyn.util.core.crypto.FluentKeySigner; -import org.apache.brooklyn.util.core.crypto.SecureKeys; -import org.apache.brooklyn.util.core.task.Tasks; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.jmx.jmxmp.JmxmpAgent; -import org.apache.brooklyn.util.net.Urls; - -import com.google.common.base.Preconditions; - -public class JmxmpSslSupport { - - final static String BROOKLYN_VERSION = "0.8.0-SNAPSHOT"; // BROOKLYN_VERSION (updated by script) - - private final JmxSupport jmxSupport; - - private KeyStore agentTrustStore; - private KeyStore agentKeyStore; - - public JmxmpSslSupport(JmxSupport jmxSupport) { - this.jmxSupport = Preconditions.checkNotNull(jmxSupport); - } - - public String getJmxSslKeyStoreFilePath() { - return Urls.mergePaths(jmxSupport.getRunDir(), "jmx-keystore"); - } - - public String getJmxSslTrustStoreFilePath() { - return Urls.mergePaths(jmxSupport.getRunDir(), "jmx-truststore"); - } - - public void applyAgentJmxJavaSystemProperties(Builder<String, Object> result) { - result. - put(JmxmpAgent.USE_SSL_PROPERTY, true). - put(JmxmpAgent.AUTHENTICATE_CLIENTS_PROPERTY, true). - // the option below wants a jmxremote.password file; we use certs (above) to authenticate - put("com.sun.management.jmxremote.authenticate", false); - - result. - put(JmxmpAgent.JMXMP_KEYSTORE_FILE_PROPERTY, getJmxSslKeyStoreFilePath()). - put(JmxmpAgent.JMXMP_TRUSTSTORE_FILE_PROPERTY, getJmxSslTrustStoreFilePath()); - } - - public FluentKeySigner getBrooklynRootSigner() { - // TODO use brooklyn root CA keys etc - return new FluentKeySigner("brooklyn-root"); - } - - /** builds remote keystores, stores config keys/certs, and copies necessary files across */ - public void install() { - try { - // build truststore and keystore - FluentKeySigner signer = getBrooklynRootSigner(); - KeyPair jmxAgentKey = SecureKeys.newKeyPair(); - X509Certificate jmxAgentCert = signer.newCertificateFor("jmxmp-agent", jmxAgentKey); - - agentKeyStore = SecureKeys.newKeyStore(); - agentKeyStore.setKeyEntry("jmxmp-agent", jmxAgentKey.getPrivate(), - // TODO jmx.ssl.agent.keyPassword - "".toCharArray(), - new Certificate[] { jmxAgentCert }); - ByteArrayOutputStream agentKeyStoreBytes = new ByteArrayOutputStream(); - agentKeyStore.store(agentKeyStoreBytes, - // TODO jmx.ssl.agent.keyStorePassword - "".toCharArray()); - - agentTrustStore = SecureKeys.newKeyStore(); - agentTrustStore.setCertificateEntry("brooklyn", getJmxAccessCert()); - ByteArrayOutputStream agentTrustStoreBytes = new ByteArrayOutputStream(); - agentTrustStore.store(agentTrustStoreBytes, "".toCharArray()); - - // install the truststore and keystore and rely on JmxSupport to install the agent - Tasks.setBlockingDetails("Copying keystore and truststore to the server."); - try { - jmxSupport.getMachine().get().copyTo(new ByteArrayInputStream(agentKeyStoreBytes.toByteArray()), getJmxSslKeyStoreFilePath()); - jmxSupport.getMachine().get().copyTo(new ByteArrayInputStream(agentTrustStoreBytes.toByteArray()), getJmxSslTrustStoreFilePath()); - } finally { - Tasks.resetBlockingDetails(); - } - - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - - public synchronized Certificate getJmxAccessCert() { - Certificate cert = jmxSupport.getConfig(UsesJmx.JMX_SSL_ACCESS_CERT); - if (cert!=null) return cert; - // TODO load from keyStoreUrl - KeyPair jmxAccessKey = SecureKeys.newKeyPair(); - X509Certificate jmxAccessCert = getBrooklynRootSigner().newCertificateFor("brooklyn-jmx-access", jmxAccessKey); - - jmxSupport.setConfig(UsesJmx.JMX_SSL_ACCESS_CERT, jmxAccessCert); - jmxSupport.setConfig(UsesJmx.JMX_SSL_ACCESS_KEY, jmxAccessKey.getPrivate()); - - return jmxAccessCert; - } - - public synchronized PrivateKey getJmxAccessKey() { - PrivateKey key = jmxSupport.getConfig(UsesJmx.JMX_SSL_ACCESS_KEY); - if (key!=null) return key; - getJmxAccessCert(); - return jmxSupport.getConfig(UsesJmx.JMX_SSL_ACCESS_KEY); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/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 deleted file mode 100644 index 5e0ef59..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/UsesJava.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -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.config.SetConfigKey; -import org.apache.brooklyn.util.core.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)} */ - @SetFromFlag("javaSysProps") - public static final MapConfigKey<String> JAVA_SYSPROPS = new MapConfigKey<String>(String.class, - "java.sysprops", "Java command line system properties", Maps.<String,String>newLinkedHashMap()); - - /** - * Used to set java options. These options are prepended to the defaults. - * They can also be used to override defaults. The rules for overrides are: - * <ul> - * <li>If contains a mutually exclusive setting, then the others are removed. Those supported are: - * <ul> - * <li>"-client" and "-server" - * </ul> - * <li>If value has a well-known prefix indicating it's a key-value pair. Those supported are: - * <ul> - * <li>"-Xmx" - * <li>"-Xms" - * <li>"-Xss" - * </ul> - * <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> - */ - @SetFromFlag("javaOpts") - 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( - "java.check.hostname.bug", "Check whether hostname is too long and will likely crash Java" + - "due to bug 7089443", true); - - @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/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/UsesJavaMXBeans.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/UsesJavaMXBeans.java b/software/base/src/main/java/brooklyn/entity/java/UsesJavaMXBeans.java deleted file mode 100644 index f122cf5..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/UsesJavaMXBeans.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import java.util.Map; - -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.sensor.core.BasicAttributeSensor; -import org.apache.brooklyn.sensor.core.Sensors; -import org.apache.brooklyn.util.core.flags.SetFromFlag; - -public interface UsesJavaMXBeans { - - @SetFromFlag("mxbeanStatsEnabled") - ConfigKey<Boolean> MXBEAN_STATS_ENABLED = - ConfigKeys.newBooleanConfigKey("java.metrics.mxbeanStatsEnabled", "Enables collection of JVM stats from the MXBeans, such as memory and thread usage (default is true)", true); - - AttributeSensor<Long> USED_HEAP_MEMORY = - Sensors.newLongSensor("java.metrics.heap.used", "Current heap size (bytes)"); - AttributeSensor<Long> INIT_HEAP_MEMORY = - Sensors.newLongSensor("java.metrics.heap.init", "Initial heap size (bytes)"); - AttributeSensor<Long> COMMITTED_HEAP_MEMORY = - Sensors.newLongSensor("java.metrics.heap.committed", "Commited heap size (bytes)"); - AttributeSensor<Long> MAX_HEAP_MEMORY = - Sensors.newLongSensor("java.metrics.heap.max", "Max heap size (bytes)"); - AttributeSensor<Long> NON_HEAP_MEMORY_USAGE = - Sensors.newLongSensor("java.metrics.nonheap.used", "Current non-heap size (bytes)"); - AttributeSensor<Integer> CURRENT_THREAD_COUNT = - Sensors.newIntegerSensor( "java.metrics.threads.current", "Current number of threads"); - AttributeSensor<Integer> PEAK_THREAD_COUNT = - Sensors.newIntegerSensor("java.metrics.threads.max", "Peak number of threads"); - - // runtime system attributes - AttributeSensor<Long> START_TIME = - Sensors.newLongSensor("java.metrics.starttime", "Start time of Java process (UTC)"); - AttributeSensor<Long> UP_TIME = - Sensors.newLongSensor("java.metrics.uptime", "Uptime of Java process (millis, elapsed since start)"); - - //operating system attributes - AttributeSensor<Double> PROCESS_CPU_TIME = Sensors.newDoubleSensor( - "java.metrics.processCpuTime.total", "Process CPU time (total millis since start)"); - AttributeSensor<Double> PROCESS_CPU_TIME_FRACTION_LAST = Sensors.newDoubleSensor( - "java.metrics.processCpuTime.fraction.last", "Fraction of CPU time used, reported by JVM (percentage, last datapoint)"); - AttributeSensor<Double> PROCESS_CPU_TIME_FRACTION_IN_WINDOW = Sensors.newDoubleSensor( - "java.metrics.processCpuTime.fraction.windowed", "Fraction of CPU time used, reported by JVM (percentage, over time window)"); - - AttributeSensor<Integer> AVAILABLE_PROCESSORS = - Sensors.newIntegerSensor("java.metrics.processors.available", "number of processors available to the Java virtual machine"); - AttributeSensor<Double> SYSTEM_LOAD_AVERAGE - = Sensors.newDoubleSensor("java.metrics.systemload.average", "average system load"); - AttributeSensor<Long> TOTAL_PHYSICAL_MEMORY_SIZE = - Sensors.newLongSensor("java.metrics.physicalmemory.total", "The physical memory available to the operating system"); - AttributeSensor<Long> FREE_PHYSICAL_MEMORY_SIZE = - Sensors.newLongSensor("java.metrics.physicalmemory.free", "The free memory available to the operating system"); - - // GC attributes - AttributeSensor<Map> GARBAGE_COLLECTION_TIME = new BasicAttributeSensor<Map>(Map.class, "java.metrics.gc.time", "garbage collection time"); - -} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/UsesJmx.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/UsesJmx.java b/software/base/src/main/java/brooklyn/entity/java/UsesJmx.java deleted file mode 100644 index ee8c376..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/UsesJmx.java +++ /dev/null @@ -1,190 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import java.security.PrivateKey; -import java.security.cert.Certificate; - -import org.apache.brooklyn.api.entity.Entity; -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.config.BasicConfigKey; -import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.location.basic.PortRanges; -import org.apache.brooklyn.sensor.core.AttributeSensorAndConfigKey; -import org.apache.brooklyn.sensor.core.BasicAttributeSensorAndConfigKey; -import org.apache.brooklyn.sensor.core.PortAttributeSensorAndConfigKey; -import org.apache.brooklyn.util.core.flags.SetFromFlag; - -public interface UsesJmx extends UsesJava { - - public static final int DEFAULT_JMX_PORT = 1099; // RMI port? - - @SetFromFlag("useJmx") - ConfigKey<Boolean> USE_JMX = ConfigKeys.newConfigKey("jmx.enabled", "JMX enabled", Boolean.TRUE); - - /** Chosen by Java itself by default, setting this will only have any effect if using an agent. */ - @SetFromFlag("jmxPort") - PortAttributeSensorAndConfigKey JMX_PORT = new PortAttributeSensorAndConfigKey( - "jmx.direct.port", "JMX direct/private port (e.g. JMX RMI server port, or JMXMP port, but not RMI registry port)", PortRanges.fromString("31001+")); - - // Default is deliberately null for this unused config; if we used "31001+" then we'd potentially give this sensor - // the value 31001 and jmx.direct.port the value 31002. See https://issues.apache.org/jira/browse/BROOKLYN-98 - /** @deprecated since 0.7.0, kept for rebinding with the anonymous class; code should only ever use {@link #JMX_PORT} */ @Deprecated - PortAttributeSensorAndConfigKey JMX_PORT_LEGACY = new PortAttributeSensorAndConfigKey( - "jmx.direct.port.legacy.NOT_USED", "Legacy definition JMX direct/private port (e.g. JMX RMI server port, or JMXMP port, but not RMI registry port)", null) { - private static final long serialVersionUID = 3846846080809179437L; - @Override protected Integer convertConfigToSensor(PortRange value, Entity entity) { - // TODO when using JmxAgentModes.NONE we should *not* convert, but leave it null - // (e.g. to prevent a warning in e.g. ActiveMQIntegrationTest) - // [there was - previously - a note about needing to move these keys to UsesJmx, - // that has been done, so not sure if there is anything more needed or if we can just - // check here entity.getConfig(JMX_AGENT_MODE) ... needs testing of course] - return super.convertConfigToSensor(value, entity); - } - }; - - /** Well-known port used by Java itself to start the RMI registry where JMX private port can be discovered, ignored if using JMXMP agent. */ - @SetFromFlag("rmiRegistryPort") - PortAttributeSensorAndConfigKey RMI_REGISTRY_PORT = ConfigKeys.newPortSensorAndConfigKey( - "rmi.registry.port", "RMI registry port, used for discovering JMX (private) port", PortRanges.fromString("1099,19099+")); - - @SetFromFlag("jmxContext") - AttributeSensorAndConfigKey<String, String> JMX_CONTEXT = ConfigKeys.newStringSensorAndConfigKey("jmx.context", "JMX context path", "jmxrmi"); - - AttributeSensor<String> JMX_URL = new BasicAttributeSensorAndConfigKey<String>( - String.class, "jmx.service.url", "The URL for connecting to the MBean Server"); - - /** Forces JMX to be secured, using JMXMP so it gets through firewalls <em>and</em> SSL/TLS. */ - @SetFromFlag("jmxSecure") - ConfigKey<Boolean> JMX_SSL_ENABLED = ConfigKeys.newBooleanConfigKey("jmx.ssl.enabled", "JMX over JMXMP enabled with SSL/TLS", Boolean.FALSE); - - enum JmxAgentModes { - /** Auto-detect the agent to use based on location. Prefer {@link #JMXMP} except at localhost which uses {@link #JMX_RMI_CUSTOM_AGENT}. */ - AUTODETECT, - - /** JMXMP which permits firewall access through a single port {@link UsesJmx#JMX_PORT}. */ - JMXMP, - - /** Start {@link #JMXMP} along with an RMI Registry on {@link UsesJmx#RMI_REGISTRY_PORT}, redirecting to an anonymous high-numbered port as the RMI server. */ - JMXMP_AND_RMI, - - /** JMX over RMI custom agent which permits access through a known {@link UsesJmx#RMI_REGISTRY_PORT}, redirected to a known {@link UsesJmx#JMX_PORT}. - * Both ports must be opened on the firewall, and the same hostname resolvable on the target machine and by the client */ - JMX_RMI_CUSTOM_AGENT, - - /** As with {@link UsesJmx#JMX_RMI_CUSTOM_AGENT} but no custom agent requred, entity must handle pots correctly. */ - JMX_RMI, - - /** Do not install a JMX agent. Use the default {@link UsesJmx#RMI_REGISTRY_PORT}, redirected to an unknown port for JMX. */ - NONE - } - - @SetFromFlag("jmxAgentMode") - ConfigKey<JmxAgentModes> JMX_AGENT_MODE = ConfigKeys.newConfigKey("jmx.agent.mode", - "What type of JMX agent to use; defaults to null (autodetect) which means " + - "JMXMP_AND_RMI allowing firewall access through a single port as well as local access supporting jconsole " + - "(unless JMX_SSL_ENABLED is set, in which case it is JMXMP only)", - JmxAgentModes.AUTODETECT); - - /* Currently these are only used to connect, so only applies where systems set this up themselves. */ - AttributeSensorAndConfigKey<String, String> JMX_USER = ConfigKeys.newStringSensorAndConfigKey("jmx.user", "JMX username"); - AttributeSensorAndConfigKey<String, String> JMX_PASSWORD = ConfigKeys.newStringSensorAndConfigKey("jmx.password", "JMX password"); - - AttributeSensorAndConfigKey<String, String> JMX_AGENT_LOCAL_PATH = ConfigKeys.newStringSensorAndConfigKey("jmx.agent.local.path", "Path to JMX driver on the local machine"); - - /* - * Synopsis of how the keys work for JMX_SSL: - * - * BROOKLYN - * * brooklyn ROOT key + cert -> - * used to identify things brooklyn has signed, ie to confirm their identity - * signs all certs created by brooklyn - * (created per entity if not specified as input) - * * brooklyn JMX ACCESS key + cert -> - * used to authenticate brooklyn to remote JMX agent - * typically, but not necessarily, signed by ROOT cert - * (typically created per entity, unless specified; - * global would probably be fine but more work; - * however it is important that this _not_ sign agents keys, - * to prevent agents from accessing other agents) - * - * AGENT (e.g. JMX server in each managed java process) - * * gets AGENT key + cert -> - * signed by brooklyn ROOT, used to authenticate itself to brooklyn - * (brooklyn trusts this; does not need to remember this) - * * trusts only the relevant brooklyn JMX ACCESS key (its truststore contains that cert) - */ - - /* TODO brooklyn ROOT key - * - public static final ConfigKey<String> BROOKLYN_SSL_ROOT_KEYSTORE_URL = new BasicConfigKey<String>( - String.class, "brooklyn.ssl.root.keyStoreUrl", "URL to keystore Brooklyn should use as root private key and certificate-signing authority", null); - - public static final ConfigKey<String> BROOKLYN_SSL_ROOT_KEY_DATA = new BasicConfigKey<String>( - String.class, "brooklyn.ssl.root.key", "root private key (RSA string format), used to sign managed servers", null); - public static final ConfigKey<String> BROOKLYN_SSL_ROOT_CERT_DATA = new BasicConfigKey<String>( - String.class, "brooklyn.ssl.root.cert", "certificate for root private key (RSA string format)", null); - - * brooklyn.ssl.root.keyStorePassword - * brooklyn.ssl.root.keyAlias (if null, looks for one called 'brooklyn', otherwise takes the first key) - * brooklyn.ssl.root.keyPassword - */ - - public static final ConfigKey<PrivateKey> JMX_SSL_ACCESS_KEY = new BasicConfigKey<PrivateKey>( - PrivateKey.class, "jmx.ssl.access.key", "key used to access a JMX agent (typically per entity, embedded in the managed JVM)", null); - public static final ConfigKey<Certificate> JMX_SSL_ACCESS_CERT = new BasicConfigKey<Certificate>( - Certificate.class, "jmx.ssl.access.cert", "certificate of key used to access a JMX agent", null); - - /* TODO specify a keystore from which to get the access key - * (above keys are set programmatically, typically _not_ by the user ... keystore would be the way to do that) - * - * jmx.ssl.access.keyStoreUrl (optional) - * jmx.ssl.access.keyStorePassword (optional) - * jmx.ssl.access.keyAlias (optional) - */ - - /* could allow user to specify additional certs for JMX agents which should be trusted - * - * jmx.ssl.access.trustStoreUrl - */ - - /* optionally: could allow JMX agent to trust additional accessers, - * and/or use known keys in the case that other accessers might want to authenticate the JMX server - * - * NB currently agent keys are not stored in brooklyn... no reason to as - * (a) currently we trust jmx agents; and (b) for agent-auth we should simply sign keys; - * either way, seems fine for brooklyn to throw them away once they are installed on the remote machine) - * - * jmx.ssl.agent.keyStoreUrl - * jmx.ssl.agent.keyStorePassword - * jmx.ssl.agent.keyAlias - * jmx.ssl.agent.keyPassword - * - * jmx.ssl.agent.trustStoreUrl - */ - - /* optionally: this could be set to disallow attaching to JMX through the attach mechanism - * (but this option is generally not considered needed, as JVM attachment is - * already restricted to localhost and to the the user running the process) - * - * -XX:+DisableAttachMechanism - */ -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/VanillaJavaApp.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaApp.java b/software/base/src/main/java/brooklyn/entity/java/VanillaJavaApp.java deleted file mode 100644 index eb62d62..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaApp.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.sensor.core.Sensors; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.core.flags.SetFromFlag; - -import brooklyn.entity.basic.SoftwareProcess; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -@ImplementedBy(VanillaJavaAppImpl.class) -public interface VanillaJavaApp extends SoftwareProcess, UsesJava, UsesJmx, UsesJavaMXBeans { - - // TODO Make jmxPollPeriod @SetFromFlag easier to use: currently a confusion over long and TimeDuration, and - // no ability to set default value (can't just set field because config vals read/set in super-constructor :-( - - @SetFromFlag("args") - ConfigKey<List> ARGS = ConfigKeys.newConfigKey(List.class, - "vanillaJavaApp.args", "Arguments for launching the java app", Lists.newArrayList()); - - @SetFromFlag(value="main", nullable=false) - ConfigKey<String> MAIN_CLASS = ConfigKeys.newStringConfigKey("vanillaJavaApp.mainClass", "class to launch"); - - @SetFromFlag("classpath") - ConfigKey<List> CLASSPATH = ConfigKeys.newConfigKey(List.class, - "vanillaJavaApp.classpath", "classpath to use, as list of URL entries; " + - "these URLs are copied to lib/ and expanded in the case of tar/tgz/zip", - Lists.newArrayList()); - - AttributeSensor<List> CLASSPATH_FILES = Sensors.newSensor(List.class, - "vanillaJavaApp.classpathFiles", "classpath used, list of files"); - - @SetFromFlag("jvmXArgs") - ConfigKey<List> JVM_XARGS = ConfigKeys.newConfigKey(List.class, - "vanillaJavaApp.jvmXArgs", "JVM -X args for the java app (e.g. memory)", - MutableList.of("-Xms128m", "-Xmx512m", "-XX:MaxPermSize=512m")); - - @SetFromFlag("jvmDefines") - ConfigKey<Map> JVM_DEFINES = ConfigKeys.newConfigKey(Map.class, - "vanillaJavaApp.jvmDefines", "JVM system property definitions for the app", - Maps.newLinkedHashMap()); - - public String getMainClass(); - public List<String> getClasspath(); - public List<String> getClasspathFiles(); - public Map getJvmDefines(); - public List getJvmXArgs(); - public String getRunDir(); - - public void kill(); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppDriver.java b/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppDriver.java deleted file mode 100644 index b538d48..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppDriver.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -/** - * The {@link JavaSoftwareProcessDriver} for a {@link VanillaJavaApp}. - */ -public interface VanillaJavaAppDriver extends JavaSoftwareProcessDriver { - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppImpl.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppImpl.java b/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppImpl.java deleted file mode 100644 index 856dcd1..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppImpl.java +++ /dev/null @@ -1,113 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.util.core.flags.SetFromFlag; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.SoftwareProcessImpl; -import brooklyn.event.feed.jmx.JmxFeed; - -import com.google.common.annotations.VisibleForTesting; - -public class VanillaJavaAppImpl extends SoftwareProcessImpl implements VanillaJavaApp { - - static { - JavaAppUtils.init(); - } - - private static final Logger log = LoggerFactory.getLogger(VanillaJavaApp.class); - - @SetFromFlag - protected long jmxPollPeriod; - - protected JmxFeed jmxFeed; - - public VanillaJavaAppImpl() {} - - @VisibleForTesting - public VanillaJavaAppImpl(Map<?,?> properties, Entity parent) { - super(properties, parent); - } - - public String getMainClass() { return getConfig(MAIN_CLASS); } - public List<String> getClasspath() { return getConfig(CLASSPATH); } - public List<String> getClasspathFiles() { return getAttribute(CLASSPATH_FILES); } - public Map getJvmDefines() { return getConfig(JVM_DEFINES); } - public List getJvmXArgs() { return getConfig(JVM_XARGS); } - - public void addToClasspath(String url) { - List<String> cp = getConfig(CLASSPATH); - List<String> newCP = new ArrayList<String>(); - if (cp!=null) newCP.addAll(cp); - newCP.add(url); - setConfig(CLASSPATH, newCP); - } - - public void addToClasspath(Collection<String> urls) { - List<String> cp = getConfig(CLASSPATH); - List<String> newCP = new ArrayList<String>(); - if (cp!=null) newCP.addAll(cp); - newCP.addAll(urls); - setConfig(CLASSPATH, newCP); - } - - @Override - protected void connectSensors() { - super.connectSensors(); - - if (((VanillaJavaAppDriver) getDriver()).isJmxEnabled()) { - jmxPollPeriod = (jmxPollPeriod > 0) ? jmxPollPeriod : 3000; - jmxFeed = JavaAppUtils.connectMXBeanSensors(this, jmxPollPeriod); - } - - connectServiceUpIsRunning(); - } - - @Override - public void disconnectSensors() { - super.disconnectSensors(); - disconnectServiceUpIsRunning(); - if (jmxFeed != null) jmxFeed.stop(); - } - - @Override - public Class<? extends VanillaJavaAppDriver> getDriverInterface() { - return VanillaJavaAppDriver.class; - } - - public String getRunDir() { - // FIXME Make this an attribute; don't assume it hsa to be ssh? What uses this? - VanillaJavaAppSshDriver driver = (VanillaJavaAppSshDriver) getDriver(); - return (driver != null) ? driver.getRunDir() : null; - } - - @Override - public void kill() { - getDriver().kill(); - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppSshDriver.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppSshDriver.java b/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppSshDriver.java deleted file mode 100644 index 757bbb4..0000000 --- a/software/base/src/main/java/brooklyn/entity/java/VanillaJavaAppSshDriver.java +++ /dev/null @@ -1,212 +0,0 @@ -/* - * 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 brooklyn.entity.java; - -import static java.lang.String.format; - -import java.io.File; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import javax.annotation.Nullable; - -import brooklyn.entity.basic.lifecycle.ScriptHelper; - -import org.apache.brooklyn.location.basic.SshMachineLocation; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.file.ArchiveBuilder; -import org.apache.brooklyn.util.core.file.ArchiveUtils; -import org.apache.brooklyn.util.core.internal.ssh.SshTool; -import org.apache.brooklyn.util.core.task.Tasks; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.net.Urls; -import org.apache.brooklyn.util.os.Os; -import org.apache.brooklyn.util.text.Strings; -import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes; - -import com.google.common.base.CharMatcher; -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Iterables; - -/** - * The SSH implementation of the {@link VanillaJavaAppDriver}. - */ -public class VanillaJavaAppSshDriver extends JavaSoftwareProcessSshDriver implements VanillaJavaAppDriver { - - // FIXME this should be a config, either on the entity or -- probably better -- - // an alternative / override timeout on the SshTool for file copy commands - final static int NUM_RETRIES_FOR_COPYING = 4; - - public VanillaJavaAppSshDriver(VanillaJavaAppImpl entity, SshMachineLocation machine) { - super(entity, machine); - } - - @Override - public VanillaJavaAppImpl getEntity() { - return (VanillaJavaAppImpl) super.getEntity(); - } - - @Override - protected String getLogFileLocation() { - return Os.mergePathsUnix(getRunDir(), "console"); - } - - @Override - public void install() { - newScript(INSTALLING).execute(); - } - - @Override - public void customize() { - newScript(CUSTOMIZING) - .body.append(format("mkdir -p %s/lib", getRunDir())) - .failOnNonZeroResultCode() - .execute(); - - SshMachineLocation machine = getMachine(); - VanillaJavaApp entity = getEntity(); - for (String entry : entity.getClasspath()) { - // If a local folder, then create archive from contents first - if (Urls.isDirectory(entry)) { - File jarFile = ArchiveBuilder.jar().addDirContentsAt(new File(entry), "").create(); - entry = jarFile.getAbsolutePath(); - } - - // Determine filename - String destFile = entry.contains("?") ? entry.substring(0, entry.indexOf('?')) : entry; - destFile = destFile.substring(destFile.lastIndexOf('/') + 1); - - ArchiveUtils.deploy(MutableMap.<String, Object>of(), entry, machine, getRunDir(), Os.mergePaths(getRunDir(), "lib"), destFile); - } - - ScriptHelper helper = newScript(CUSTOMIZING+"-classpath") - .body.append(String.format("ls -1 \"%s\"", Os.mergePaths(getRunDir(), "lib"))) - .gatherOutput(); - helper.setFlag(SshTool.PROP_NO_EXTRA_OUTPUT, true); - int result = helper.execute(); - if (result != 0) { - throw new IllegalStateException("Error listing classpath files: " + helper.getResultStderr()); - } - String stdout = helper.getResultStdout(); - - // Transform stdout into list of files in classpath - if (Strings.isBlank(stdout)) { - getEntity().setAttribute(VanillaJavaApp.CLASSPATH_FILES, ImmutableList.of(Os.mergePaths(getRunDir(), "lib"))); - } else { - // FIXME Cannot handle spaces in paths properly - Iterable<String> lines = Splitter.on(CharMatcher.BREAKING_WHITESPACE).omitEmptyStrings().trimResults().split(stdout); - Iterable<String> files = Iterables.transform(lines, new Function<String, String>() { - @Override - public String apply(@Nullable String input) { - return Os.mergePathsUnix(getRunDir(), "lib", input); - } - }); - getEntity().setAttribute(VanillaJavaApp.CLASSPATH_FILES, ImmutableList.copyOf(files)); - } - } - - public String getClasspath() { - @SuppressWarnings("unchecked") - List<String> files = getEntity().getAttribute(VanillaJavaApp.CLASSPATH_FILES); - if (files == null || files.isEmpty()) { - return null; - } else { - return Joiner.on(":").join(files); - } - } - - @Override - public void launch() { - String clazz = getEntity().getMainClass(); - String args = getArgs(); - - newScript(MutableMap.of(USE_PID_FILE, true), LAUNCHING) - .body.append( - format("echo \"launching: java $JAVA_OPTS %s %s\"", clazz, args), - format("java $JAVA_OPTS -cp \"%s\" %s %s >> %s/console 2>&1 </dev/null &", getClasspath(), clazz, args, getRunDir()) - ) - .execute(); - } - - public String getArgs(){ - List<Object> args = getEntity().getConfig(VanillaJavaApp.ARGS); - StringBuilder sb = new StringBuilder(); - Iterator<Object> it = args.iterator(); - while (it.hasNext()) { - Object argO = it.next(); - try { - String arg = Tasks.resolveValue(argO, String.class, getEntity().getExecutionContext()); - BashStringEscapes.assertValidForDoubleQuotingInBash(arg); - sb.append(format("\"%s\"",arg)); - } catch (Exception e) { - throw Exceptions.propagate(e); - } - if (it.hasNext()) { - sb.append(" "); - } - } - - return sb.toString(); - } - - @Override - public boolean isRunning() { - int result = newScript(MutableMap.of(USE_PID_FILE, true), CHECK_RUNNING).execute(); - return result == 0; - } - - @Override - public void stop() { - newScript(MutableMap.of(USE_PID_FILE, true), STOPPING).execute(); - } - - @Override - public void kill() { - newScript(MutableMap.of(USE_PID_FILE, true), KILLING).execute(); - } - - @Override - protected Map getCustomJavaSystemProperties() { - return MutableMap.builder() - .putAll(super.getCustomJavaSystemProperties()) - .putAll(getEntity().getJvmDefines()) - .build(); - } - - @Override - protected List<String> getCustomJavaConfigOptions() { - return MutableList.<String>builder() - .addAll(super.getCustomJavaConfigOptions()) - .addAll(getEntity().getJvmXArgs()) - .build(); - } - - @Override - public Map<String,String> getShellEnvironment() { - return MutableMap.<String,String>builder() - .putAll(super.getShellEnvironment()) - .putIfNotNull("CLASSPATH", getClasspath()) - .build(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/machine/MachineAttributes.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/machine/MachineAttributes.java b/software/base/src/main/java/brooklyn/entity/machine/MachineAttributes.java deleted file mode 100644 index f1e780e..0000000 --- a/software/base/src/main/java/brooklyn/entity/machine/MachineAttributes.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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 brooklyn.entity.machine; - -import java.util.concurrent.atomic.AtomicBoolean; - -import javax.annotation.Nullable; - -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.core.config.render.RendererHints; -import org.apache.brooklyn.sensor.core.Sensors; -import org.apache.brooklyn.util.guava.Functionals; -import org.apache.brooklyn.util.math.MathFunctions; -import org.apache.brooklyn.util.text.ByteSizeStrings; -import org.apache.brooklyn.util.time.Duration; - -import com.google.common.base.Function; - -public class MachineAttributes { - - /** - * Do not instantiate. - */ - private MachineAttributes() {} - - /* - * Sensor attributes for machines. - */ - - public static final AttributeSensor<Duration> UPTIME = Sensors.newSensor(Duration.class, "machine.uptime", "Current uptime"); - public static final AttributeSensor<Double> LOAD_AVERAGE = Sensors.newDoubleSensor("machine.loadAverage", "Current load average"); - - public static final AttributeSensor<Double> CPU_USAGE = Sensors.newDoubleSensor("machine.cpu", "Current CPU usage"); - public static final AttributeSensor<Double> AVERAGE_CPU_USAGE = Sensors.newDoubleSensor("cpu.average", "Average CPU usage across the cluster"); - - public static final AttributeSensor<Long> FREE_MEMORY = Sensors.newLongSensor("machine.memory.free", "Current free memory"); - public static final AttributeSensor<Long> TOTAL_MEMORY = Sensors.newLongSensor("machine.memory.total", "Total memory"); - public static final AttributeSensor<Long> USED_MEMORY = Sensors.newLongSensor("machine.memory.used", "Current memory usage"); - public static final AttributeSensor<Double> USED_MEMORY_DELTA_PER_SECOND_LAST = Sensors.newDoubleSensor("memory.used.delta", "Change in memory usage per second"); - public static final AttributeSensor<Double> USED_MEMORY_DELTA_PER_SECOND_IN_WINDOW = Sensors.newDoubleSensor("memory.used.windowed", "Average change in memory usage over 30s"); - - private static AtomicBoolean initialized = new AtomicBoolean(false); - - /** - * Setup renderer hints. - */ - public static void init() { - if (initialized.getAndSet(true)) return; - - final Function<Double, Long> longValue = new Function<Double, Long>() { - @Override - public Long apply(@Nullable Double input) { - if (input == null) return null; - return input.longValue(); - } - }; - - RendererHints.register(CPU_USAGE, RendererHints.displayValue(MathFunctions.percent(2))); - RendererHints.register(AVERAGE_CPU_USAGE, RendererHints.displayValue(MathFunctions.percent(2))); - - RendererHints.register(FREE_MEMORY, RendererHints.displayValue(Functionals.chain(MathFunctions.times(1000L), ByteSizeStrings.metric()))); - RendererHints.register(TOTAL_MEMORY, RendererHints.displayValue(Functionals.chain(MathFunctions.times(1000L), ByteSizeStrings.metric()))); - RendererHints.register(USED_MEMORY, RendererHints.displayValue(Functionals.chain(MathFunctions.times(1000L), ByteSizeStrings.metric()))); - RendererHints.register(USED_MEMORY_DELTA_PER_SECOND_LAST, RendererHints.displayValue(Functionals.chain(longValue, ByteSizeStrings.metric()))); - RendererHints.register(USED_MEMORY_DELTA_PER_SECOND_IN_WINDOW, RendererHints.displayValue(Functionals.chain(longValue, ByteSizeStrings.metric()))); - } - - static { - init(); - } -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/machine/MachineEntity.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/machine/MachineEntity.java b/software/base/src/main/java/brooklyn/entity/machine/MachineEntity.java deleted file mode 100644 index 46c4515..0000000 --- a/software/base/src/main/java/brooklyn/entity/machine/MachineEntity.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * 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 brooklyn.entity.machine; - -import org.apache.brooklyn.api.catalog.Catalog; -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.effector.core.MethodEffector; -import org.apache.brooklyn.entity.annotation.Effector; -import org.apache.brooklyn.entity.annotation.EffectorParam; -import org.apache.brooklyn.util.time.Duration; - -import brooklyn.entity.basic.EmptySoftwareProcess; - -@Catalog(name="Machine Entity", description="Represents a machine, providing metrics about it (e.g. obtained from ssh)") -@ImplementedBy(MachineEntityImpl.class) -public interface MachineEntity extends EmptySoftwareProcess { - - AttributeSensor<Duration> UPTIME = MachineAttributes.UPTIME; - AttributeSensor<Double> LOAD_AVERAGE = MachineAttributes.LOAD_AVERAGE; - AttributeSensor<Double> CPU_USAGE = MachineAttributes.CPU_USAGE; - AttributeSensor<Long> FREE_MEMORY = MachineAttributes.FREE_MEMORY; - AttributeSensor<Long> TOTAL_MEMORY = MachineAttributes.TOTAL_MEMORY; - AttributeSensor<Long> USED_MEMORY = MachineAttributes.USED_MEMORY; - - MethodEffector<String> EXEC_COMMAND = new MethodEffector<String>(MachineEntity.class, "execCommand"); - MethodEffector<String> EXEC_COMMAND_TIMEOUT = new MethodEffector<String>(MachineEntity.class, "execCommandTimeout"); - - /** - * Execute a command and return the output. - */ - @Effector(description = "Execute a command and return the output") - String execCommand( - @EffectorParam(name = "command", description = "Command") String command); - - /** - * Execute a command and return the output, or throw an exception after a timeout. - */ - @Effector(description = "Execute a command and return the output") - String execCommandTimeout( - @EffectorParam(name = "command", description = "Command") String command, - @EffectorParam(name = "timeout", description = "Timeout") Duration timeout); - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/machine/MachineEntityImpl.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/machine/MachineEntityImpl.java b/software/base/src/main/java/brooklyn/entity/machine/MachineEntityImpl.java deleted file mode 100644 index 7b86248..0000000 --- a/software/base/src/main/java/brooklyn/entity/machine/MachineEntityImpl.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * 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 brooklyn.entity.machine; - -import java.util.List; -import java.util.concurrent.TimeoutException; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver; -import brooklyn.entity.basic.EmptySoftwareProcessDriver; -import brooklyn.entity.basic.EmptySoftwareProcessImpl; -import brooklyn.entity.software.SshEffectorTasks; - -import org.apache.brooklyn.location.basic.Machines; -import org.apache.brooklyn.location.basic.SshMachineLocation; -import org.apache.brooklyn.sensor.feed.ssh.SshFeed; -import org.apache.brooklyn.sensor.feed.ssh.SshPollConfig; -import org.apache.brooklyn.sensor.feed.ssh.SshPollValue; -import org.apache.brooklyn.util.core.task.DynamicTasks; -import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.text.Strings; -import org.apache.brooklyn.util.time.Duration; - -import com.google.common.base.Function; -import com.google.common.base.Functions; -import com.google.common.base.Splitter; - -public class MachineEntityImpl extends EmptySoftwareProcessImpl implements MachineEntity { - - private static final Logger LOG = LoggerFactory.getLogger(MachineEntityImpl.class); - - static { - MachineAttributes.init(); - } - - private transient SshFeed sensorFeed; - - @Override - public void init() { - LOG.info("Starting server pool machine with id {}", getId()); - super.init(); - } - - @Override - protected void connectSensors() { - super.connectSensors(); - - // Sensors linux-specific - if (!getMachine().getMachineDetails().getOsDetails().isLinux()) return; - - sensorFeed = SshFeed.builder() - .entity(this) - .period(Duration.THIRTY_SECONDS) - .poll(new SshPollConfig<Duration>(UPTIME) - .command("cat /proc/uptime") - .onFailureOrException(Functions.<Duration>constant(null)) - .onSuccess(new Function<SshPollValue, Duration>() { - @Override - public Duration apply(SshPollValue input) { - return Duration.seconds( Double.valueOf( Strings.getFirstWord(input.getStdout()) ) ); - } - })) - .poll(new SshPollConfig<Double>(LOAD_AVERAGE) - .command("uptime") - .onFailureOrException(Functions.constant(-1d)) - .onSuccess(new Function<SshPollValue, Double>() { - @Override - public Double apply(SshPollValue input) { - String loadAverage = Strings.getFirstWordAfter(input.getStdout(), "load average:").replace(",", ""); - return Double.valueOf(loadAverage); - } - })) - .poll(new SshPollConfig<Double>(CPU_USAGE) - .command("cat /proc/stat") - .onFailureOrException(Functions.constant(-1d)) - .onSuccess(new Function<SshPollValue, Double>() { - @Override - public Double apply(SshPollValue input) { - List<String> cpuData = Splitter.on(" ").omitEmptyStrings().splitToList(Strings.getFirstLine(input.getStdout())); - Integer system = Integer.parseInt(cpuData.get(1)); - Integer user = Integer.parseInt(cpuData.get(3)); - Integer idle = Integer.parseInt(cpuData.get(4)); - return (double) (system + user) / (double) (system + user + idle); - } - })) - .poll(new SshPollConfig<Long>(USED_MEMORY) - .command("free | grep Mem:") - .onFailureOrException(Functions.constant(-1L)) - .onSuccess(new Function<SshPollValue, Long>() { - @Override - public Long apply(SshPollValue input) { - List<String> memoryData = Splitter.on(" ").omitEmptyStrings().splitToList(Strings.getFirstLine(input.getStdout())); - return Long.parseLong(memoryData.get(2)); - } - })) - .poll(new SshPollConfig<Long>(FREE_MEMORY) - .command("free | grep Mem:") - .onFailureOrException(Functions.constant(-1L)) - .onSuccess(new Function<SshPollValue, Long>() { - @Override - public Long apply(SshPollValue input) { - List<String> memoryData = Splitter.on(" ").omitEmptyStrings().splitToList(Strings.getFirstLine(input.getStdout())); - return Long.parseLong(memoryData.get(3)); - } - })) - .poll(new SshPollConfig<Long>(TOTAL_MEMORY) - .command("free | grep Mem:") - .onFailureOrException(Functions.constant(-1L)) - .onSuccess(new Function<SshPollValue, Long>() { - @Override - public Long apply(SshPollValue input) { - List<String> memoryData = Splitter.on(" ").omitEmptyStrings().splitToList(Strings.getFirstLine(input.getStdout())); - return Long.parseLong(memoryData.get(1)); - } - })) - .build(); - - } - - @Override - public void disconnectSensors() { - if (sensorFeed != null) sensorFeed.stop(); - super.disconnectSensors(); - } - - @Override - public Class<?> getDriverInterface() { - return EmptySoftwareProcessDriver.class; - } - - public SshMachineLocation getMachine() { - return Machines.findUniqueSshMachineLocation(getLocations()).get(); - } - - @Override - public String execCommand(String command) { - return execCommandTimeout(command, Duration.ONE_MINUTE); - } - - @Override - public String execCommandTimeout(String command, Duration timeout) { - ProcessTaskWrapper<String> task = SshEffectorTasks.ssh(command) - .environmentVariables(((AbstractSoftwareProcessSshDriver) getDriver()).getShellEnvironment()) - .requiringZeroAndReturningStdout() - .machine(getMachine()) - .summary(command) - .newTask(); - - try { - String result = DynamicTasks.queueIfPossible(task) - .executionContext(this) - .orSubmitAsync() - .asTask() - .get(timeout); - return result; - } catch (TimeoutException te) { - throw new IllegalStateException("Timed out running command: " + command); - } catch (Exception e) { - Integer exitCode = task.getExitCode(); - LOG.warn("Command failed, return code {}: {}", exitCode == null ? -1 : exitCode, task.getStderr()); - throw Exceptions.propagate(e); - } - } - -} http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/pool/ServerPool.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/brooklyn/entity/pool/ServerPool.java b/software/base/src/main/java/brooklyn/entity/pool/ServerPool.java deleted file mode 100644 index 7ee1f67..0000000 --- a/software/base/src/main/java/brooklyn/entity/pool/ServerPool.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * 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 brooklyn.entity.pool; - -import java.util.Collection; -import java.util.Map; - -import com.google.common.annotations.Beta; - -import org.apache.brooklyn.api.catalog.Catalog; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.entity.ImplementedBy; -import org.apache.brooklyn.api.location.MachineLocation; -import org.apache.brooklyn.api.location.NoMachinesAvailableException; -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.ConfigKeys; -import org.apache.brooklyn.effector.core.MethodEffector; -import org.apache.brooklyn.entity.annotation.Effector; -import org.apache.brooklyn.entity.annotation.EffectorParam; -import org.apache.brooklyn.entity.group.DynamicCluster; - -import brooklyn.entity.machine.MachineEntity; - -import org.apache.brooklyn.location.cloud.CloudLocationConfig; -import org.apache.brooklyn.location.dynamic.LocationOwner; -import org.apache.brooklyn.sensor.core.Sensors; - -/** - * A preallocated server pool is an entity that other applications can deploy to. - * Behaving as a cluster, the machines it creates for its members are reused. - * <p/> - * Notes: - * <ul> - * <li> - * The pool does not configure ports appropriately for applications subsequently - * deployed. If an entity that is to be run in the pool requires any ports open - * other than port 22 then thoses port should be configured with the - * {@link CloudLocationConfig#INBOUND_PORTS INBOUND_PORTS} - * config key as part of the pool's - * {@link brooklyn.entity.basic.SoftwareProcess#PROVISIONING_PROPERTIES PROVISIONING_PROPERTIES}. - * For example, in YAML: - * <pre> - * - type: brooklyn.entity.pool.ServerPool - * brooklyn.config: - * # Suitable for TomcatServers - * provisioning.properties: - * inboundPorts: [22, 31880, 8443, 8080, 31001, 1099] - * </pre> - * This is a limitation of Brooklyn that will be addressed in a future release. - * </li> - * </ul> - */ -@Catalog(name="Server Pool", description="Creates a pre-allocated server pool, which other applications can deploy to") -@ImplementedBy(ServerPoolImpl.class) -@Beta -public interface ServerPool extends DynamicCluster, LocationOwner<ServerPoolLocation, ServerPool> { - - ConfigKey<Integer> INITIAL_SIZE = ConfigKeys.newConfigKeyWithDefault(DynamicCluster.INITIAL_SIZE, 2); - - AttributeSensor<Integer> AVAILABLE_COUNT = Sensors.newIntegerSensor( - "pool.available", "The number of locations in the pool that are unused"); - - AttributeSensor<Integer> CLAIMED_COUNT = Sensors.newIntegerSensor( - "pool.claimed", "The number of locations in the pool that are in use"); - - ConfigKey<EntitySpec<?>> MEMBER_SPEC = ConfigKeys.newConfigKeyWithDefault(DynamicCluster.MEMBER_SPEC, - EntitySpec.create(MachineEntity.class)); - - MethodEffector<Collection<Entity>> ADD_MACHINES_FROM_SPEC = new MethodEffector<Collection<Entity>>(ServerPool.class, "addExistingMachinesFromSpec"); - - public MachineLocation claimMachine(Map<?, ?> flags) throws NoMachinesAvailableException; - - public void releaseMachine(MachineLocation machine); - - /** - * Sets the pool to use an existing {@link MachineLocation} as a member. Existing locations - * will count towards the capacity of the pool but will not be terminated when the pool is - * stopped. - * @param machine An existing machine. - * @return the new member of the pool, created with the configured {@link #MEMBER_SPEC}. - */ - public Entity addExistingMachine(MachineLocation machine); - - /** - * Adds additional machines to the pool by resolving the given spec. - * @param spec - * A location spec, e.g. <code>byon:(hosts="[email protected],[email protected],[email protected]")</code> - * @return the new members of the pool, created with the configured {@link #MEMBER_SPEC}. - */ - @Effector(description = "Adds additional machines to the pool by resolving the given spec.") - public Collection<Entity> addExistingMachinesFromSpec( - @EffectorParam(name = "spec", description = "Spec") String spec); -}
