You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@brooklyn.apache.org by he...@apache.org on 2015/08/19 13:09:50 UTC
[32/72] [abbrv] incubator-brooklyn git commit: BROOKLYN-162 - apply
org.apache package prefix to software-base, tidying package names,
and moving a few sensory things to core
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java b/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.java
deleted file mode 100644
index aa97d72..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloDriver.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.chef;
-
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.config.ConfigKeys;
-
-import brooklyn.entity.basic.AbstractSoftwareProcessSshDriver;
-
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-
-import com.google.common.annotations.Beta;
-import com.google.common.reflect.TypeToken;
-
-/** Driver class to facilitate use of Chef */
-@Beta
-@Deprecated /** @deprecated since 0.7.0 use ChefEntity or ChefLifecycleEffectorTasks */
-public class ChefSoloDriver extends AbstractSoftwareProcessSshDriver implements ChefConfig {
-
- @SuppressWarnings("serial")
- public static final ConfigKey<TaskFactory<? extends TaskAdaptable<Boolean>>> IS_RUNNING_TASK = ConfigKeys.newConfigKey(
- new TypeToken<TaskFactory<? extends TaskAdaptable<Boolean>>>() {},
- "brooklyn.chef.task.driver.isRunningTask");
-
- @SuppressWarnings("serial")
- public static final ConfigKey<TaskFactory<?>> STOP_TASK = ConfigKeys.newConfigKey(
- new TypeToken<TaskFactory<?>>() {},
- "brooklyn.chef.task.driver.stopTask");
-
- public ChefSoloDriver(EntityLocal entity, SshMachineLocation location) {
- super(entity, location);
- }
-
- @Override
- public void install() {
- // TODO flag to force reinstallation
- DynamicTasks.queue(
- ChefSoloTasks.installChef(getInstallDir(), false),
- ChefSoloTasks.installCookbooks(getInstallDir(), getRequiredConfig(CHEF_COOKBOOKS), false));
- }
-
- @Override
- public void customize() {
- DynamicTasks.queue(ChefSoloTasks.buildChefFile(getRunDir(), getInstallDir(), "launch", getRequiredConfig(CHEF_RUN_LIST),
- getEntity().getConfig(CHEF_LAUNCH_ATTRIBUTES)));
- }
-
- @Override
- public void launch() {
- DynamicTasks.queue(ChefSoloTasks.runChef(getRunDir(), "launch", getEntity().getConfig(CHEF_RUN_CONVERGE_TWICE)));
- }
-
- @Override
- public boolean isRunning() {
- return DynamicTasks.queue(getRequiredConfig(IS_RUNNING_TASK)).asTask().getUnchecked();
- }
-
- @Override
- public void stop() {
- DynamicTasks.queue(getRequiredConfig(STOP_TASK));
- }
-
- protected <T> T getRequiredConfig(ConfigKey<T> key) {
- return ChefConfigs.getRequiredConfig(getEntity(), key);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java b/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java
deleted file mode 100644
index 629d7a9..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/ChefSoloTasks.java
+++ /dev/null
@@ -1,71 +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.chef;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.util.ssh.BashCommands;
-
-import brooklyn.entity.software.SshEffectorTasks;
-
-import com.google.common.annotations.Beta;
-
-@Beta
-public class ChefSoloTasks {
-
- public static TaskFactory<?> installChef(String chefDirectory, boolean force) {
- // TODO check on entity whether it is chef _server_
- String installCmd = cdAndRun(chefDirectory, ChefBashCommands.INSTALL_FROM_OPSCODE);
- if (!force) installCmd = BashCommands.alternatives("which chef-solo", installCmd);
- return SshEffectorTasks.ssh(installCmd).summary("install chef");
- }
-
- public static TaskFactory<?> installCookbooks(final String chefDirectory, final Map<String,String> cookbooksAndUrls, final boolean force) {
- return ChefTasks.installCookbooks(chefDirectory, cookbooksAndUrls, force);
- }
-
- public static TaskFactory<?> installCookbook(String chefDirectory, String cookbookName, String cookbookArchiveUrl, boolean force) {
- return ChefTasks.installCookbook(chefDirectory, cookbookName, cookbookArchiveUrl, force);
- }
-
- protected static String cdAndRun(String targetDirectory, String command) {
- return BashCommands.chain("mkdir -p "+targetDirectory,
- "cd "+targetDirectory,
- command);
- }
-
- public static TaskFactory<?> buildChefFile(String runDirectory, String chefDirectory, String phase, Iterable<? extends String> runList,
- Map<String, Object> optionalAttributes) {
- return ChefTasks.buildChefFile(runDirectory, chefDirectory, phase, runList, optionalAttributes);
- }
-
- public static TaskFactory<?> runChef(String runDir, String phase) {
- return runChef(runDir, phase, false);
- }
- /** see {@link ChefConfig#CHEF_RUN_CONVERGE_TWICE} for background on why 'twice' is available */
- public static TaskFactory<?> runChef(String runDir, String phase, Boolean twice) {
- String cmd = "sudo chef-solo -c "+phase+".rb -j "+phase+".json -ldebug";
- if (twice!=null && twice) cmd = BashCommands.alternatives(cmd, cmd);
-
- return SshEffectorTasks.ssh(cdAndRun(runDir, cmd)).
- summary("run chef for "+phase).requiringExitCodeZero();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java b/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java
deleted file mode 100644
index 7d5e46f..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/ChefTasks.java
+++ /dev/null
@@ -1,154 +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.chef;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.mgmt.TaskAdaptable;
-import org.apache.brooklyn.api.mgmt.TaskFactory;
-import org.apache.brooklyn.effector.core.EffectorTasks;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.file.ArchiveTasks;
-import org.apache.brooklyn.util.core.file.ArchiveUtils.ArchiveType;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.TaskBuilder;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.net.Urls;
-import org.apache.brooklyn.util.ssh.BashCommands;
-import org.apache.brooklyn.util.text.Identifiers;
-import org.apache.brooklyn.util.text.Strings;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.software.SshEffectorTasks;
-
-import com.google.common.annotations.Beta;
-import com.google.common.collect.ImmutableList;
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
-
-@Beta
-public class ChefTasks {
-
- private static final Logger log = LoggerFactory.getLogger(ChefTasks.class);
-
- public static TaskFactory<?> installChef(String chefDirectory, boolean force) {
- // TODO check on entity whether it is chef _server_
- String installCmd = cdAndRun(chefDirectory, ChefBashCommands.INSTALL_FROM_OPSCODE);
- if (!force) installCmd = BashCommands.alternatives("which chef-solo", installCmd);
- return SshEffectorTasks.ssh(installCmd).summary("install chef");
- }
-
- public static TaskFactory<?> installCookbooks(final String chefDirectory, final Map<String,String> cookbooksAndUrls, final boolean force) {
- return Tasks.<Void>builder().name("install "+(cookbooksAndUrls==null ? "0" : cookbooksAndUrls.size())+" cookbook"+Strings.s(cookbooksAndUrls)).body(
- new Runnable() {
- public void run() {
- Entity e = EffectorTasks.findEntity();
- if (cookbooksAndUrls==null)
- throw new IllegalStateException("No cookbooks defined to install at "+e);
- for (String cookbook: cookbooksAndUrls.keySet())
- DynamicTasks.queue(installCookbook(chefDirectory, cookbook, cookbooksAndUrls.get(cookbook), force));
- }
- }).buildFactory();
- }
-
- public static TaskFactory<?> installCookbook(final String chefDirectory, final String cookbookName, final String cookbookArchiveUrl, final boolean force) {
- return new TaskFactory<TaskAdaptable<?>>() {
- @Override
- public TaskAdaptable<?> newTask() {
- TaskBuilder<Void> tb = Tasks.<Void>builder().name("install cookbook "+cookbookName);
-
- String cookbookDir = Urls.mergePaths(chefDirectory, cookbookName);
- String privateTmpDirContainingUnpackedCookbook =
- Urls.mergePaths(chefDirectory, "tmp-"+Strings.makeValidFilename(cookbookName)+"-"+Identifiers.makeRandomId(4));
-
- // TODO - skip the install earlier if it exists and isn't forced
-// if (!force) {
-// // in builder.body, check
-// // "ls "+cookbookDir
-// // and stop if it's zero
-// // remove reference to 'force' below
-// }
-
- String destName = null;
- if (ArchiveType.of(cookbookArchiveUrl)==ArchiveType.UNKNOWN) {
- destName = cookbookName + ".tgz";
- log.debug("Assuming TGZ type for chef cookbook url "+cookbookArchiveUrl+"; it will be downloaded as "+destName);
- }
- tb.add(ArchiveTasks.deploy(null, null, cookbookArchiveUrl, EffectorTasks.findSshMachine(), privateTmpDirContainingUnpackedCookbook,
- false, null, destName).newTask());
-
- String installCmd = BashCommands.chain(
- "cd "+privateTmpDirContainingUnpackedCookbook,
- "COOKBOOK_EXPANDED_DIR=`ls`",
- BashCommands.requireTest("`ls | wc -w` -eq 1",
- "The deployed archive "+cookbookArchiveUrl+" must contain exactly one directory"),
- "mv $COOKBOOK_EXPANDED_DIR '../"+cookbookName+"'",
- "cd ..",
- "rm -rf '"+privateTmpDirContainingUnpackedCookbook+"'");
-
- installCmd = force ? BashCommands.alternatives("rm -rf "+cookbookDir, installCmd) : BashCommands.alternatives("ls "+cookbookDir+" > /dev/null 2> /dev/null", installCmd);
- tb.add(SshEffectorTasks.ssh(installCmd).summary("renaming cookbook dir").requiringExitCodeZero().newTask());
-
- return tb.build();
- }
- };
- }
-
- protected static String cdAndRun(String targetDirectory, String command) {
- return BashCommands.chain("mkdir -p '"+targetDirectory+"'",
- "cd '"+targetDirectory+"'",
- command);
- }
-
- public static TaskFactory<?> buildChefFile(String runDirectory, String chefDirectory, String phase, Iterable<? extends String> runList,
- Map<String, Object> optionalAttributes) {
- // TODO if it's server, try knife first
- // TODO configure add'l properties
- String phaseRb =
- "root = "
- + "'"+runDirectory+"'"
- // recommended alternate to runDir is the following, but it is not available in some rubies
- //+ File.absolute_path(File.dirname(__FILE__))"+
- + "\n"+
- "file_cache_path root\n"+
-// "cookbook_path root + '/cookbooks'\n";
- "cookbook_path '"+chefDirectory+"'\n";
-
- Map<String,Object> phaseJsonMap = MutableMap.of();
- if (optionalAttributes!=null)
- phaseJsonMap.putAll(optionalAttributes);
- if (runList!=null)
- phaseJsonMap.put("run_list", ImmutableList.copyOf(runList));
- Gson json = new GsonBuilder().create();
- String phaseJson = json.toJson(phaseJsonMap);
-
- return Tasks.sequential("build chef files for "+phase,
- SshEffectorTasks.put(Urls.mergePaths(runDirectory)+"/"+phase+".rb").contents(phaseRb).createDirectory(),
- SshEffectorTasks.put(Urls.mergePaths(runDirectory)+"/"+phase+".json").contents(phaseJson));
- }
-
- public static TaskFactory<?> runChef(String runDir, String phase) {
- // TODO chef server
- return SshEffectorTasks.ssh(cdAndRun(runDir, "sudo chef-solo -c "+phase+".rb -j "+phase+".json -ldebug")).
- summary("run chef for "+phase).requiringExitCodeZero();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java b/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
deleted file mode 100644
index f193598..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/KnifeConvergeTaskFactory.java
+++ /dev/null
@@ -1,246 +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.chef;
-
-import static com.google.common.base.Preconditions.checkNotNull;
-import static org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes.wrapBash;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-
-import com.google.common.base.Strings;
-import com.google.common.net.HostAndPort;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.effector.core.EffectorTasks;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.collections.Jsonya;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.ssh.BashCommands;
-
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.gson.GsonBuilder;
-
-public class KnifeConvergeTaskFactory<RET> extends KnifeTaskFactory<RET> {
-
- private static final Logger log = LoggerFactory.getLogger(KnifeConvergeTaskFactory.class);
-
- protected Function<? super Entity,String> runList;
- protected Map<Object, Object> knifeAttributes = new MutableMap<Object, Object>();
- protected List<String> extraBootstrapParameters = MutableList.of();
- protected Boolean sudo;
- protected Boolean runTwice;
- protected String nodeName;
- protected Integer port;
- /** null means nothing specified, use user supplied or machine default;
- * false means use machine default (disallow user supplied);
- * true means use knife default (omit the argument and disallow user supplied)
- */
- protected Boolean portOmittedToUseKnifeDefault;
-
- public KnifeConvergeTaskFactory(String taskName) {
- super(taskName);
- }
-
- @Override
- protected KnifeConvergeTaskFactory<RET> self() {
- return this;
- }
-
- /** construct the knife command, based on the settings on other methods
- * (called when instantiating the script, after all parameters sent)
- */
- protected List<String> initialKnifeParameters() {
- // runs inside the task so can detect entity/machine at runtime
- MutableList<String> result = new MutableList<String>();
- SshMachineLocation machine = EffectorTasks.findSshMachine();
-
- result.add("bootstrap");
- result.addAll(extraBootstrapParameters);
-
- HostAndPort hostAndPort = machine.getSshHostAndPort();
- result.add(wrapBash(hostAndPort.getHostText()));
- Integer whichPort = knifeWhichPort(hostAndPort);
- if (whichPort!=null)
- result.add("-p "+whichPort);
-
- result.add("-x "+wrapBash(checkNotNull(machine.getUser(), "user")));
-
- File keyfile = ChefServerTasks.extractKeyFile(machine);
- if (keyfile!=null) result.add("-i "+keyfile.getPath());
- else result.add("-P "+checkNotNull(machine.findPassword(), "No password or private key data for "+machine));
-
- result.add("--no-host-key-verify");
-
- if (sudo != Boolean.FALSE) result.add("--sudo");
-
- if (!Strings.isNullOrEmpty(nodeName)) {
- result.add("--node-name");
- result.add(nodeName);
- }
-
- result.add("-r "+wrapBash(runList.apply(entity())));
-
- if (!knifeAttributes.isEmpty())
- result.add("-j "+wrapBash(new GsonBuilder().create()
- .toJson(knifeAttributes)));
-
- return result;
- }
-
- /** whether knife should attempt to run twice;
- * see {@link ChefConfig#CHEF_RUN_CONVERGE_TWICE} */
- public KnifeConvergeTaskFactory<RET> knifeRunTwice(boolean runTwice) {
- this.runTwice = runTwice;
- return self();
- }
-
- /** whether to pass --sudo to knife; default true */
- public KnifeConvergeTaskFactory<RET> knifeSudo(boolean sudo) {
- this.sudo = sudo;
- return self();
- }
-
- /** what node name to pass to knife; default = null, meaning chef-client will pick the node name */
- public KnifeConvergeTaskFactory<RET> knifeNodeName(String nodeName) {
- this.nodeName = nodeName;
- return self();
- }
-
- /** tell knife to use an explicit port */
- public KnifeConvergeTaskFactory<RET> knifePort(int port) {
- if (portOmittedToUseKnifeDefault!=null) {
- log.warn("Port "+port+" specified to "+this+" for when already explicitly told to use a default (overriding previous); see subsequent warning for more details");
- }
- this.port = port;
- return self();
- }
-
- /** omit the port parameter altogether (let knife use its default) */
- public KnifeConvergeTaskFactory<RET> knifePortUseKnifeDefault() {
- if (port!=null) {
- log.warn("knifePortUseKnifeDefault specified to "+this+" when already told to use "+port+" explicitly (overriding previous); see subsequent warning for more details");
- port = -1;
- }
- portOmittedToUseKnifeDefault = true;
- return self();
- }
-
- /** use the default port known to brooklyn for the target machine for ssh */
- public KnifeConvergeTaskFactory<RET> knifePortUseMachineSshPort() {
- if (port!=null) {
- log.warn("knifePortUseMachineSshPort specified to "+this+" when already told to use "+port+" explicitly (overriding previous); see subsequent warning for more details");
- port = -1;
- }
- portOmittedToUseKnifeDefault = false;
- return self();
- }
-
- protected Integer knifeWhichPort(HostAndPort hostAndPort) {
- if (port==null) {
- if (Boolean.TRUE.equals(portOmittedToUseKnifeDefault))
- // user has explicitly said to use knife default, omitting port here
- return null;
- // default is to use the machine port
- return hostAndPort.getPort();
- }
- if (port==-1) {
- // port was supplied by user, then portDefault (true or false)
- port = null;
- Integer whichPort = knifeWhichPort(hostAndPort);
- log.warn("knife port conflicting instructions for "+this+" at entity "+entity()+" on "+hostAndPort+"; using default ("+whichPort+")");
- return whichPort;
- }
- if (portOmittedToUseKnifeDefault!=null) {
- // portDefault was specified (true or false), then overridden with a port
- log.warn("knife port conflicting instructions for "+this+" at entity "+entity()+" on "+hostAndPort+"; using supplied port "+port);
- }
- // port was supplied by user, use that
- return port;
- }
-
- /** parameters to pass to knife after the bootstrap command */
- public KnifeConvergeTaskFactory<RET> knifeAddExtraBootstrapParameters(String extraBootstrapParameter1, String ...extraBootstrapParameters) {
- this.extraBootstrapParameters.add(extraBootstrapParameter1);
- for (String p: extraBootstrapParameters)
- this.extraBootstrapParameters.add(p);
- return self();
- }
-
- /** function supplying the run list to be passed to knife, evaluated at the last moment */
- public KnifeConvergeTaskFactory<RET> knifeRunList(Function<? super Entity, String> runList) {
- this.runList = runList;
- return self();
- }
- public KnifeConvergeTaskFactory<RET> knifeRunList(String runList) {
- this.runList = Functions.constant(runList);
- return self();
- }
-
- /** includes the given attributes in the attributes to be passed to chef;
- * when combining with other attributes, this uses {@link Jsonya} semantics to add
- * (a deep add, combining lists and maps) */
- public KnifeConvergeTaskFactory<RET> knifeAddAttributes(Map<? extends Object, ? extends Object> attributes) {
- if (attributes!=null && !attributes.isEmpty()) {
- Jsonya.of(knifeAttributes).add(attributes);
- }
- return self();
- }
-
- protected String buildKnifeCommand(int knifeCommandIndex) {
- String result = super.buildKnifeCommand(knifeCommandIndex);
- if (Boolean.TRUE.equals(runTwice))
- result = BashCommands.alternatives(result, result);
- return result;
- }
-
- @Override
- public <T2> KnifeConvergeTaskFactory<T2> returning(ScriptReturnType type) {
- return (KnifeConvergeTaskFactory<T2>) super.<T2>returning(type);
- }
-
- @Override
- public <RET2> KnifeConvergeTaskFactory<RET2> returning(Function<ProcessTaskWrapper<?>, RET2> resultTransformation) {
- return (KnifeConvergeTaskFactory<RET2>) super.returning(resultTransformation);
- }
-
- @Override
- public KnifeConvergeTaskFactory<Boolean> returningIsExitCodeZero() {
- return (KnifeConvergeTaskFactory<Boolean>) super.returningIsExitCodeZero();
- }
-
- @Override
- public KnifeConvergeTaskFactory<String> requiringZeroAndReturningStdout() {
- return (KnifeConvergeTaskFactory<String>) super.requiringZeroAndReturningStdout();
- }
-
- public KnifeConvergeTaskFactory<RET> knifeAddParameters(String word1, String ...words) {
- super.knifeAddParameters(word1, words);
- return self();
- }
-
- // TODO other methods from KnifeTaskFactory will return KTF class not KCTF;
- // should make it generic so it returns the right type...
-}
\ 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/chef/KnifeTaskFactory.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java b/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
deleted file mode 100644
index 80fad0e..0000000
--- a/software/base/src/main/java/brooklyn/entity/chef/KnifeTaskFactory.java
+++ /dev/null
@@ -1,240 +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.chef;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.apache.brooklyn.util.collections.MutableList;
-import org.apache.brooklyn.util.core.internal.ssh.process.ProcessTool;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.core.task.system.internal.SystemProcessTaskFactory;
-import org.apache.brooklyn.util.text.Strings;
-import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes;
-
-import com.google.common.base.Function;
-
-/** A factory which acts like {@link ProcessTaskFactory} with special options for knife.
- * Typical usage is to {@link #addKnifeParameters(String)}s for the knife command to be run.
- * You can also {@link #add(String...)} commands as needed; these will run *before* knife,
- * unless you addKnifeCommandHere().
- * <p>
- * This impl will use sensible defaults, including {@link ConfigKey}s on the context entity,
- * for general knife config but not specific commands etc. It supports:
- * <li> {@link ChefConfig#KNIFE_EXECUTABLE}
- * <li> {@link ChefConfig#KNIFE_CONFIG_FILE}
- * <p>
- * (Other fields will typically be used by methods calling to this factory.)
- * */
-// see e.g. http://docs.opscode.com/knife_bootstrap.html
-public class KnifeTaskFactory<RET> extends SystemProcessTaskFactory<KnifeTaskFactory<RET>, RET>{
-
- private static String KNIFE_PLACEHOLDER = "<knife command goes here 1234>";
- public final String taskName;
- protected String knifeExecutable;
- protected List<String> knifeParameters = new ArrayList<String>();
- protected String knifeConfigFile;
- protected String knifeSetupCommands;
- protected Boolean throwOnCommonKnifeErrors;
-
- public KnifeTaskFactory(String taskName) {
- this.taskName = taskName;
- summary(taskName);
- // knife setup usually requires a login shell
- config.put(ProcessTool.PROP_LOGIN_SHELL, true);
- }
-
- @Override
- public List<Function<ProcessTaskWrapper<?>, Void>> getCompletionListeners() {
- MutableList<Function<ProcessTaskWrapper<?>, Void>> result = MutableList.copyOf(super.getCompletionListeners());
- if (throwOnCommonKnifeErrors != Boolean.FALSE)
- insertKnifeCompletionListenerIntoCompletionListenersList(result);
- return result.asUnmodifiable();
- }
-
- public KnifeTaskFactory<RET> notThrowingOnCommonKnifeErrors() {
- throwOnCommonKnifeErrors = false;
- return self();
- }
-
- protected void insertKnifeCompletionListenerIntoCompletionListenersList(List<Function<ProcessTaskWrapper<?>, Void>> listeners) {
- // give a nice warning if chef/knife not set up correctly
- Function<ProcessTaskWrapper<?>, Void> propagateIfKnifeConfigFileMissing = new Function<ProcessTaskWrapper<?>, Void>() {
- public Void apply(@Nullable ProcessTaskWrapper<?> input) {
- if (input.getExitCode()!=0 && input.getStderr().indexOf("WARNING: No knife configuration file found")>=0) {
- String myConfig = knifeConfigFileOption();
- if (Strings.isEmpty(myConfig))
- throw new IllegalStateException("Config file for Chef knife must be specified in "+ChefConfig.KNIFE_CONFIG_FILE+" (or valid knife default set up)");
- else
- throw new IllegalStateException("Error reading config file for Chef knife ("+myConfig+") -- does it exist?");
- }
- return null;
- }
- };
- listeners.add(propagateIfKnifeConfigFileMissing);
- }
-
-
- @Override
- public ProcessTaskWrapper<RET> newTask() {
- return new SystemProcessTaskWrapper("Knife");
- }
-
- /** Inserts the knife command at the current place in the list.
- * Can be run multiple times. The knife command added at the end of the list
- * if this is not invoked (and it is the only command if nothing is {@link #add(String...)}ed.
- */
- public KnifeTaskFactory<RET> addKnifeCommandToScript() {
- add(KNIFE_PLACEHOLDER);
- return self();
- }
-
- @Override
- public List<String> getCommands() {
- MutableList<String> result = new MutableList<String>();
- String setupCommands = knifeSetupCommands();
- if (setupCommands != null && Strings.isNonBlank(setupCommands))
- result.add(setupCommands);
- int numKnifes = 0;
- for (String c: super.getCommands()) {
- if (c==KNIFE_PLACEHOLDER)
- result.add(buildKnifeCommand(numKnifes++));
- else
- result.add(c);
- }
- if (numKnifes==0)
- result.add(buildKnifeCommand(numKnifes++));
- return result.asUnmodifiable();
- }
-
- /** creates the command for running knife.
- * in some cases knife may be added multiple times,
- * and in that case the parameter here tells which time it is being added,
- * on a single run. */
- protected String buildKnifeCommand(int knifeCommandIndex) {
- MutableList<String> words = new MutableList<String>();
- words.add(knifeExecutable());
- words.addAll(initialKnifeParameters());
- words.addAll(knifeParameters());
- String x = knifeConfigFileOption();
- if (Strings.isNonBlank(x)) words.add(knifeConfigFileOption());
- return Strings.join(words, " ");
- }
-
- /** allows a way for subclasses to build up parameters at the start */
- protected List<String> initialKnifeParameters() {
- return new MutableList<String>();
- }
-
- @Nullable /** callers should allow this to be null so task can be used outside of an entity */
- protected Entity entity() {
- return BrooklynTaskTags.getTargetOrContextEntity(Tasks.current());
- }
- protected <T> T entityConfig(ConfigKey<T> key) {
- Entity entity = entity();
- if (entity!=null)
- return entity.getConfig(key);
- return null;
- }
-
- public KnifeTaskFactory<RET> knifeExecutable(String knifeExecutable) {
- this.knifeExecutable = knifeExecutable;
- return this;
- }
-
- protected String knifeExecutable() {
- if (knifeExecutable!=null) return knifeExecutable;
-
- String knifeExecFromConfig = entityConfig(ChefConfig.KNIFE_EXECUTABLE);
- if (knifeExecFromConfig!=null) return BashStringEscapes.wrapBash(knifeExecFromConfig);
-
- // assume on the path, if executable not set
- return "knife";
- }
-
- protected List<String> knifeParameters() {
- return knifeParameters;
- }
-
- public KnifeTaskFactory<RET> knifeAddParameters(String word1, String ...words) {
- knifeParameters.add(word1);
- for (String w: words)
- knifeParameters.add(w);
- return self();
- }
-
- public KnifeTaskFactory<RET> knifeConfigFile(String knifeConfigFile) {
- this.knifeConfigFile = knifeConfigFile;
- return self();
- }
-
- @Nullable
- protected String knifeConfigFileOption() {
- if (knifeConfigFile!=null) return "-c "+knifeConfigFile;
-
- String knifeConfigFileFromConfig = entityConfig(ChefConfig.KNIFE_CONFIG_FILE);
- if (knifeConfigFileFromConfig!=null) return "-c "+BashStringEscapes.wrapBash(knifeConfigFileFromConfig);
-
- // if not supplied will use global config
- return null;
- }
-
- public KnifeTaskFactory<RET> knifeSetupCommands(String knifeSetupCommands) {
- this.knifeSetupCommands = knifeSetupCommands;
- return self();
- }
-
- @Nullable
- protected String knifeSetupCommands() {
- if (knifeSetupCommands!=null) return knifeSetupCommands;
-
- String knifeSetupCommandsFromConfig = entityConfig(ChefConfig.KNIFE_SETUP_COMMANDS);
- if (knifeSetupCommandsFromConfig!=null) return knifeSetupCommandsFromConfig;
-
- // if not supplied will use global config
- return null;
- }
-
- @Override
- public <T2> KnifeTaskFactory<T2> returning(ScriptReturnType type) {
- return (KnifeTaskFactory<T2>) super.<T2>returning(type);
- }
-
- @Override
- public <RET2> KnifeTaskFactory<RET2> returning(Function<ProcessTaskWrapper<?>, RET2> resultTransformation) {
- return (KnifeTaskFactory<RET2>) super.returning(resultTransformation);
- }
-
- @Override
- public KnifeTaskFactory<Boolean> returningIsExitCodeZero() {
- return (KnifeTaskFactory<Boolean>) super.returningIsExitCodeZero();
- }
-
- @Override
- public KnifeTaskFactory<String> requiringZeroAndReturningStdout() {
- return (KnifeTaskFactory<String>) super.requiringZeroAndReturningStdout();
- }
-}
\ 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/JavaAppUtils.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java b/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java
deleted file mode 100644
index 42cffda..0000000
--- a/software/base/src/main/java/brooklyn/entity/java/JavaAppUtils.java
+++ /dev/null
@@ -1,264 +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 org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-
-import java.lang.management.ManagementFactory;
-import java.lang.management.MemoryUsage;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import javax.annotation.Nonnull;
-import javax.annotation.Nullable;
-import javax.management.openmbean.CompositeData;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.core.config.render.RendererHints;
-import org.apache.brooklyn.policy.enricher.RollingTimeWindowMeanEnricher;
-import org.apache.brooklyn.policy.enricher.TimeFractionDeltaEnricher;
-import org.apache.brooklyn.sensor.feed.http.HttpValueFunctions;
-import org.apache.brooklyn.util.math.MathFunctions;
-import org.apache.brooklyn.util.text.ByteSizeStrings;
-import org.apache.brooklyn.util.time.Duration;
-import org.apache.brooklyn.util.time.Time;
-
-import brooklyn.event.feed.jmx.JmxAttributePollConfig;
-import brooklyn.event.feed.jmx.JmxFeed;
-
-import com.google.common.base.Function;
-
-public class JavaAppUtils {
-
- public static boolean isEntityMxBeanStatsEnabled(Entity entity) {
- return groovyTruth(entity.getConfig(UsesJavaMXBeans.MXBEAN_STATS_ENABLED));
- }
-
- /**
- * @see #connectJavaAppServerPolicies(EntityLocal, Duration)
- * @see #getMxBeanSensorsBuilder(EntityLocal)
- */
- @Nullable
- public static JmxFeed connectMXBeanSensors(EntityLocal entity) {
- if (isEntityMxBeanStatsEnabled(entity)) {
- return getMxBeanSensorsBuilder(entity).build();
- } else {
- return null;
- }
- }
-
- /** @see #connectJavaAppServerPolicies(EntityLocal, Duration) */
- @Nullable
- public static JmxFeed connectMXBeanSensors(EntityLocal entity, long jmxPollPeriodMs) {
- if (isEntityMxBeanStatsEnabled(entity)) {
- return getMxBeanSensorsBuilder(entity, jmxPollPeriodMs).build();
- } else {
- return null;
- }
- }
-
- /**
- * @param entity The entity at which to poll
- * @param jmxPollPeriod How often to poll
- * @return A {@link JmxFeed} configured to poll the given entity at the given period,
- * or null if the entity is not configured for MXBEAN_STATS
- * @see brooklyn.entity.java.UsesJavaMXBeans#MXBEAN_STATS_ENABLED
- */
- @Nullable
- public static JmxFeed connectMXBeanSensors(EntityLocal entity, Duration jmxPollPeriod) {
- if (isEntityMxBeanStatsEnabled(entity)) {
- return getMxBeanSensorsBuilder(entity, jmxPollPeriod).build();
- } else {
- return null;
- }
- }
-
- public static void connectJavaAppServerPolicies(EntityLocal entity) {
- connectJavaAppServerPolicies(entity, Duration.TEN_SECONDS);
- }
-
- public static void connectJavaAppServerPolicies(EntityLocal entity, Duration windowPeriod) {
- entity.addEnricher(new TimeFractionDeltaEnricher<Double>(entity, UsesJavaMXBeans.PROCESS_CPU_TIME,
- UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, TimeUnit.MILLISECONDS));
-
- entity.addEnricher(new RollingTimeWindowMeanEnricher<Double>(entity,
- UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_IN_WINDOW,
- windowPeriod));
- }
-
- /**
- * @param entity The entity at which to poll
- * @return A {@link JmxFeed.Builder} configured to poll entity every ten seconds
- * @see #getMxBeanSensorsBuilder(EntityLocal, Duration)
- */
- @Nonnull
- public static JmxFeed.Builder getMxBeanSensorsBuilder(EntityLocal entity) {
- return getMxBeanSensorsBuilder(entity, Duration.TEN_SECONDS);
- }
-
- /** @see #getMxBeanSensorsBuilder(EntityLocal, Duration) */
- @Nonnull
- public static JmxFeed.Builder getMxBeanSensorsBuilder(EntityLocal entity, long jmxPollPeriod) {
- return getMxBeanSensorsBuilder(entity, Duration.millis(jmxPollPeriod));
- }
-
- /**
- * @param entity The entity at which to poll
- * @param jmxPollPeriod How often to poll
- * @return A {@link JmxFeed.Builder} configured to poll many interesting MXBeans
- * at the given entity and to repeat according to the given poll period.
- * <p/>
- * If an entity does not have MXBean stats enabled (i.e. {@link UsesJavaMXBeans#MXBEAN_STATS_ENABLED} is
- * configured to false) then returns a builder configured with entity and duration but no polls.
- * <p/>
- * Use {@link #connectMXBeanSensors(EntityLocal, Duration)} to create and build in one step.
- */
- @Nonnull
- @SuppressWarnings({"unchecked"})
- public static JmxFeed.Builder getMxBeanSensorsBuilder(EntityLocal entity, Duration jmxPollPeriod) {
- JmxFeed.Builder builder = JmxFeed.builder()
- .entity(entity)
- .period(jmxPollPeriod);
- if (isEntityMxBeanStatsEnabled(entity)) {
- // TODO Could we reuse the result of compositeDataToMemoryUsage?
- builder
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.USED_HEAP_MEMORY)
- .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
- .attributeName("HeapMemoryUsage")
- .onSuccess((Function) HttpValueFunctions.chain(compositeDataToMemoryUsage(), new Function<MemoryUsage, Long>() {
- @Override public Long apply(MemoryUsage input) {
- return (input == null) ? null : input.getUsed();
- }})))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.INIT_HEAP_MEMORY)
- .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
- .attributeName("HeapMemoryUsage")
- .onSuccess((Function) HttpValueFunctions.chain(compositeDataToMemoryUsage(), new Function<MemoryUsage, Long>() {
- @Override public Long apply(MemoryUsage input) {
- return (input == null) ? null : input.getInit();
- }})))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.COMMITTED_HEAP_MEMORY)
- .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
- .attributeName("HeapMemoryUsage")
- .onSuccess((Function) HttpValueFunctions.chain(compositeDataToMemoryUsage(), new Function<MemoryUsage, Long>() {
- @Override public Long apply(MemoryUsage input) {
- return (input == null) ? null : input.getCommitted();
- }})))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.MAX_HEAP_MEMORY)
- .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
- .attributeName("HeapMemoryUsage")
- .onSuccess((Function) HttpValueFunctions.chain(compositeDataToMemoryUsage(), new Function<MemoryUsage, Long>() {
- @Override public Long apply(MemoryUsage input) {
- return (input == null) ? null : input.getMax();
- }})))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.NON_HEAP_MEMORY_USAGE)
- .objectName(ManagementFactory.MEMORY_MXBEAN_NAME)
- .attributeName("NonHeapMemoryUsage")
- .onSuccess((Function) HttpValueFunctions.chain(compositeDataToMemoryUsage(), new Function<MemoryUsage, Long>() {
- @Override public Long apply(MemoryUsage input) {
- return (input == null) ? null : input.getUsed();
- }})))
-
- .pollAttribute(new JmxAttributePollConfig<Integer>(UsesJavaMXBeans.CURRENT_THREAD_COUNT)
- .objectName(ManagementFactory.THREAD_MXBEAN_NAME)
- .attributeName("ThreadCount"))
- .pollAttribute(new JmxAttributePollConfig<Integer>(UsesJavaMXBeans.PEAK_THREAD_COUNT)
- .objectName(ManagementFactory.THREAD_MXBEAN_NAME)
- .attributeName("PeakThreadCount"))
-
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.START_TIME)
- .objectName(ManagementFactory.RUNTIME_MXBEAN_NAME)
- .period(60, TimeUnit.SECONDS)
- .attributeName("StartTime"))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.UP_TIME)
- .objectName(ManagementFactory.RUNTIME_MXBEAN_NAME)
- .period(60, TimeUnit.SECONDS)
- .attributeName("Uptime"))
-
- .pollAttribute(new JmxAttributePollConfig<Double>(UsesJavaMXBeans.PROCESS_CPU_TIME)
- .objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
- .attributeName("ProcessCpuTime")
- .onSuccess((Function) MathFunctions.times(0.001*0.001))) // nanos to millis
- .pollAttribute(new JmxAttributePollConfig<Double>(UsesJavaMXBeans.SYSTEM_LOAD_AVERAGE)
- .objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
- .attributeName("SystemLoadAverage"))
- .pollAttribute(new JmxAttributePollConfig<Integer>(UsesJavaMXBeans.AVAILABLE_PROCESSORS)
- .objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
- .period(60, TimeUnit.SECONDS)
- .attributeName("AvailableProcessors"))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.TOTAL_PHYSICAL_MEMORY_SIZE)
- .objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
- .period(60, TimeUnit.SECONDS)
- .attributeName("TotalPhysicalMemorySize"))
- .pollAttribute(new JmxAttributePollConfig<Long>(UsesJavaMXBeans.FREE_PHYSICAL_MEMORY_SIZE)
- .objectName(ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME)
- .period(60, TimeUnit.SECONDS)
- .attributeName("FreePhysicalMemorySize"));
- //FIXME: need a new type of adapter that maps multiple objectNames to a mapping
- // jmxAdapter.objectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*").with {
- // attribute("SystemLoadAverage").subscribe(UsesJavaMXBeans.GARBAGE_COLLECTION_TIME, { def m -> log.info("XXXXXXX $m") });
- // }
- }
- return builder;
- }
-
- /** @deprecated Since 0.7.0. Use {@link org.apache.brooklyn.util.math.MathFunctions#times(double)} instead */
- @Deprecated
- public static Function<Number, Double> times(final double x) {
- return MathFunctions.times(x);
- }
-
- public static Function<CompositeData, MemoryUsage> compositeDataToMemoryUsage() {
- return new Function<CompositeData, MemoryUsage>() {
- @Override public MemoryUsage apply(CompositeData input) {
- return (input == null) ? null : MemoryUsage.from(input);
- }
- };
- }
-
- private static final AtomicBoolean initialized = new AtomicBoolean(false);
-
- /** Setup renderer hints for the MXBean attributes. */
- public static void init() {
- if (initialized.get()) return;
- synchronized (initialized) {
- if (initialized.get()) return;
-
- RendererHints.register(UsesJavaMXBeans.USED_HEAP_MEMORY, RendererHints.displayValue(ByteSizeStrings.metric()));
- RendererHints.register(UsesJavaMXBeans.INIT_HEAP_MEMORY, RendererHints.displayValue(ByteSizeStrings.metric()));
- RendererHints.register(UsesJavaMXBeans.MAX_HEAP_MEMORY, RendererHints.displayValue(ByteSizeStrings.metric()));
- RendererHints.register(UsesJavaMXBeans.COMMITTED_HEAP_MEMORY, RendererHints.displayValue(ByteSizeStrings.metric()));
- RendererHints.register(UsesJavaMXBeans.NON_HEAP_MEMORY_USAGE, RendererHints.displayValue(ByteSizeStrings.metric()));
- RendererHints.register(UsesJavaMXBeans.TOTAL_PHYSICAL_MEMORY_SIZE, RendererHints.displayValue(ByteSizeStrings.metric()));
- RendererHints.register(UsesJavaMXBeans.FREE_PHYSICAL_MEMORY_SIZE, RendererHints.displayValue(ByteSizeStrings.metric()));
-
- RendererHints.register(UsesJavaMXBeans.START_TIME, RendererHints.displayValue(Time.toDateString()));
- RendererHints.register(UsesJavaMXBeans.UP_TIME, RendererHints.displayValue(Duration.millisToStringRounded()));
- RendererHints.register(UsesJavaMXBeans.PROCESS_CPU_TIME, RendererHints.displayValue(Duration.millisToStringRounded()));
- RendererHints.register(UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_LAST, RendererHints.displayValue(MathFunctions.percent(4)));
- RendererHints.register(UsesJavaMXBeans.PROCESS_CPU_TIME_FRACTION_IN_WINDOW, RendererHints.displayValue(MathFunctions.percent(4)));
-
- initialized.set(true);
- }
- }
-
- static {
- init();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java b/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java
deleted file mode 100644
index a9fad73..0000000
--- a/software/base/src/main/java/brooklyn/entity/java/JavaEntityMethods.java
+++ /dev/null
@@ -1,30 +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;
-
-/** DSL conveniences for Java entities. Also see {@link JavaAppUtils} for methods useful within Java classes. */
-public class JavaEntityMethods {
-
- public static ConfigKey<String> javaSysProp(String propertyName) { return UsesJava.JAVA_SYSPROPS.subKey(propertyName); }
-
- // TODO javaMaxHeap javaInitialHeap javaMaxPermGen should all be supplied as ListConfigs on JAVA_OPTIONS
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java b/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
deleted file mode 100644
index 890403f..0000000
--- a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessDriver.java
+++ /dev/null
@@ -1,30 +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 brooklyn.entity.basic.SoftwareProcessDriver;
-
-/**
- * A {@link SoftwareProcessDriver} for Java processes.
- */
-public interface JavaSoftwareProcessDriver extends SoftwareProcessDriver {
-
- public boolean isJmxEnabled();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/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
deleted file mode 100644
index 178d48f..0000000
--- a/software/base/src/main/java/brooklyn/entity/java/JavaSoftwareProcessSshDriver.java
+++ /dev/null
@@ -1,444 +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 org.apache.brooklyn.util.JavaGroovyEquivalents.groovyTruth;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.brooklyn.api.internal.EntityLocal;
-import org.apache.brooklyn.effector.core.EffectorTasks;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.entity.core.EntityInternal;
-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.software.SshEffectorTasks;
-
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.collections.MutableSet;
-import org.apache.brooklyn.util.core.flags.TypeCoercions;
-import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.core.task.ssh.SshTasks;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskFactory;
-import org.apache.brooklyn.util.core.task.system.ProcessTaskWrapper;
-import org.apache.brooklyn.util.exceptions.Exceptions;
-import org.apache.brooklyn.util.ssh.BashCommands;
-import org.apache.brooklyn.util.text.Strings;
-import org.apache.brooklyn.util.text.StringEscapes.BashStringEscapes;
-
-/**
- * The SSH implementation of the {@link brooklyn.entity.java.JavaSoftwareProcessDriver}.
- */
-public abstract class JavaSoftwareProcessSshDriver extends AbstractSoftwareProcessSshDriver implements JavaSoftwareProcessDriver {
-
- public static final Logger log = LoggerFactory.getLogger(JavaSoftwareProcessSshDriver.class);
-
- public static final List<List<String>> MUTUALLY_EXCLUSIVE_OPTS = ImmutableList.<List<String>> of(ImmutableList.of("-client",
- "-server"));
-
- public static final List<String> KEY_VAL_OPT_PREFIXES = ImmutableList.of("-Xmx", "-Xms", "-Xss");
-
- public JavaSoftwareProcessSshDriver(EntityLocal entity, SshMachineLocation machine) {
- super(entity, machine);
-
- entity.setAttribute(Attributes.LOG_FILE_LOCATION, getLogFileLocation());
- }
-
- protected abstract String getLogFileLocation();
-
- public boolean isJmxEnabled() {
- return (entity instanceof UsesJmx) && (entity.getConfig(UsesJmx.USE_JMX));
- }
-
- public boolean isJmxSslEnabled() {
- return isJmxEnabled() && groovyTruth(entity.getConfig(UsesJmx.JMX_SSL_ENABLED));
- }
-
- /**
- * Sets all JVM options (-X.. -D..) in an environment var JAVA_OPTS.
- * <p>
- * That variable is constructed from {@link #getJavaOpts()}, then wrapped _unescaped_ in double quotes. An
- * error is thrown if there is an unescaped double quote in the string. All other unescaped
- * characters are permitted, but unless $var expansion or `command` execution is desired (although
- * this is not confirmed as supported) the generally caller should escape any such characters, for
- * example using {@link BashStringEscapes#escapeLiteralForDoubleQuotedBash(String)}.
- */
- @Override
- public Map<String, String> getShellEnvironment() {
- List<String> javaOpts = getJavaOpts();
-
- for (String it : javaOpts) {
- BashStringEscapes.assertValidForDoubleQuotingInBash(it);
- }
- // do not double quote here; the env var is double quoted subsequently;
- // spaces should be preceded by double-quote
- // (if dbl quotes are needed we could pass on the command-line instead of in an env var)
- String sJavaOpts = Joiner.on(' ').join(javaOpts);
- return MutableMap.<String, String>builder().putAll(super.getShellEnvironment()).put("JAVA_OPTS", sJavaOpts).build();
- }
-
- /**
- * arguments to pass to the JVM; this is the config options (e.g. -Xmx1024; only the contents of
- * {@link #getCustomJavaConfigOptions()} by default) and java system properties (-Dk=v; add custom
- * properties in {@link #getCustomJavaSystemProperties()})
- * <p>
- * See {@link #getShellEnvironment()} for discussion of quoting/escaping strategy.
- **/
- public List<String> getJavaOpts() {
- Iterable<String> sysprops = Iterables.transform(getJavaSystemProperties().entrySet(),
- new Function<Map.Entry<String, ?>, String>() {
- public String apply(Map.Entry<String, ?> entry) {
- String k = entry.getKey();
- Object v = entry.getValue();
- try {
- if (v != null && Primitives.isWrapperType(v.getClass())) {
- v = "" + v;
- } else {
- v = Tasks.resolveValue(v, Object.class, ((EntityInternal)entity).getExecutionContext());
- if (v == null) {
- } else if (v instanceof CharSequence) {
- } else if (TypeCoercions.isPrimitiveOrBoxer(v.getClass())) {
- v = "" + v;
- } else {
- // could do toString, but that's likely not what is desired;
- // probably a type mismatch,
- // post-processing should be specified (common types are accepted
- // above)
- throw new IllegalArgumentException("cannot convert value " + v + " of type " + v.getClass()
- + " to string to pass as JVM property; use a post-processor");
- }
- }
- return "-D" + k + (v != null ? "=" + v : "");
- } catch (Exception e) {
- log.warn("Error resolving java option key {}, propagating: {}", k, e);
- throw Throwables.propagate(e);
- }
- }
- });
-
- Set<String> result = MutableSet.<String> builder().
- addAll(getJmxJavaConfigOptions()).
- addAll(getCustomJavaConfigOptions()).
- addAll(sysprops).
- build();
-
- for (String customOpt : entity.getConfig(UsesJava.JAVA_OPTS)) {
- for (List<String> mutuallyExclusiveOpt : MUTUALLY_EXCLUSIVE_OPTS) {
- if (mutuallyExclusiveOpt.contains(customOpt)) {
- result.removeAll(mutuallyExclusiveOpt);
- }
- }
- for (String keyValOptPrefix : KEY_VAL_OPT_PREFIXES) {
- if (customOpt.startsWith(keyValOptPrefix)) {
- for (Iterator<String> iter = result.iterator(); iter.hasNext();) {
- String existingOpt = iter.next();
- if (existingOpt.startsWith(keyValOptPrefix)) {
- iter.remove();
- }
- }
- }
- }
- if (customOpt.contains("=")) {
- String customOptPrefix = customOpt.substring(0, customOpt.indexOf("="));
-
- for (Iterator<String> iter = result.iterator(); iter.hasNext();) {
- String existingOpt = iter.next();
- if (existingOpt.startsWith(customOptPrefix)) {
- iter.remove();
- }
- }
- }
- result.add(customOpt);
- }
-
- return ImmutableList.copyOf(result);
- }
-
- /**
- * Returns the complete set of Java system properties (-D defines) to set for the application.
- * <p>
- * This is exposed to the JVM as the contents of the {@code JAVA_OPTS} environment variable. Default
- * set contains config key, custom system properties, and JMX defines.
- * <p>
- * Null value means to set -Dkey otherwise it is -Dkey=value.
- * <p>
- * See {@link #getShellEnvironment()} for discussion of quoting/escaping strategy.
- */
- protected Map<String,?> getJavaSystemProperties() {
- return MutableMap.<String,Object>builder()
- .putAll(getCustomJavaSystemProperties())
- .putAll(isJmxEnabled() ? getJmxJavaSystemProperties() : Collections.<String,Object>emptyMap())
- .putAll(entity.getConfig(UsesJava.JAVA_SYSPROPS))
- .build();
- }
-
- /**
- * Return extra Java system properties (-D defines) used by the application.
- *
- * Override as needed; default is an empty map.
- */
- protected Map getCustomJavaSystemProperties() {
- return Maps.newLinkedHashMap();
- }
-
- /**
- * Return extra Java config options, ie arguments starting with - which are passed to the JVM prior
- * to the class name.
- * <p>
- * Note defines are handled separately, in {@link #getCustomJavaSystemProperties()}.
- * <p>
- * Override as needed; default is an empty list.
- */
- protected List<String> getCustomJavaConfigOptions() {
- return Lists.newArrayList();
- }
-
- /** @deprecated since 0.6.0, the config key is always used instead of this */ @Deprecated
- public Integer getJmxPort() {
- return !isJmxEnabled() ? Integer.valueOf(-1) : entity.getAttribute(UsesJmx.JMX_PORT);
- }
-
- /** @deprecated since 0.6.0, the config key is always used instead of this */ @Deprecated
- public Integer getRmiRegistryPort() {
- return !isJmxEnabled() ? -1 : entity.getAttribute(UsesJmx.RMI_REGISTRY_PORT);
- }
-
- /** @deprecated since 0.6.0, the config key is always used instead of this */ @Deprecated
- public String getJmxContext() {
- return !isJmxEnabled() ? null : entity.getAttribute(UsesJmx.JMX_CONTEXT);
- }
-
- /**
- * 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();
- }
-
- /**
- * Return any JVM arguments required, other than the -D defines returned by {@link #getJmxJavaSystemProperties()}
- */
- protected List<String> getJmxJavaConfigOptions() {
- List<String> result = new ArrayList<String>();
- if (isJmxEnabled()) {
- result.addAll(new JmxSupport(getEntity(), getRunDir()).getJmxJavaConfigOptions());
- }
- return result;
- }
-
- /**
- * 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 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 {
- log.error("java version required {} is not supported", requiredVersion);
- throw new IllegalArgumentException("Required java version " + requiredVersion + " not supported");
- }
- 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(requiredVersion, BashCommands.installJava(requiredJavaMinor)) == 0;
- }
-
- protected int tryJavaInstall(String version, String command) {
- getLocation().acquireMutex("installing", "installing Java at " + getLocation());
- try {
- log.debug("Installing Java {} at {}@{}", new Object[]{version, getEntity(), getLocation()});
- ProcessTaskFactory<Integer> taskFactory = SshTasks.newSshExecTaskFactory(getLocation(), command)
- .summary("install java ("+version+")")
- .configure(ShellTool.PROP_EXEC_ASYNC, true);
- ProcessTaskWrapper<Integer> installCommand = Entities.submit(getEntity(), taskFactory);
- int result = installCommand.get();
- if (result != 0) {
- log.warn("Installation of Java {} failed at {}@{}: {}",
- new Object[]{version, getEntity(), getLocation(), installCommand.getStderr()});
- }
- 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> 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(
- getLocation(), "java -version 2>&1 | grep \" version\" | sed 's/.*\"\\(.*\\).*\"/\\1/'"));
- versionCommand.get();
- String stdOut = versionCommand.getStdout().trim();
- if (!Strings.isBlank(stdOut)) {
- log.debug("Found Java version at {}@{}: {}", new Object[] {getEntity(), getLocation(), stdOut});
- return Optional.of(stdOut);
- } else {
- log.debug("Found no Java installed at {}@{}", getEntity(), getLocation());
- return Optional.absent();
- }
- }
-
- /**
- * Answers one of "OpenJDK", "Oracle", or other vendor info.
- */
- protected Optional<String> getCurrentJavaVendor() {
- // TODO Also handle IBM jvm
- log.debug("Checking Java vendor at {}@{}", getEntity(), getLocation());
- ProcessTaskWrapper<Integer> versionCommand = Entities.submit(getEntity(), SshTasks.newSshExecTaskFactory(
- getLocation(), "java -version 2>&1 | awk 'NR==2 {print $1}'"));
- versionCommand.get();
- String stdOut = versionCommand.getStdout().trim();
- if (Strings.isBlank(stdOut)) {
- log.debug("Found no Java installed at {}@{}", getEntity(), getLocation());
- return Optional.absent();
- } else if ("Java(TM)".equals(stdOut)) {
- log.debug("Found Java version at {}@{}: {}", new Object[] {getEntity(), getLocation(), stdOut});
- return Optional.of("Oracle");
- } else {
- return Optional.of(stdOut);
- }
- }
-
- /**
- * 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 #checkForAndInstallJava(String)
- */
- public boolean installJava() {
- 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() {
- if (isJmxEnabled()) {
- newScript("JMX_SETUP_PREINSTALL").body.append("mkdir -p "+getRunDir()).execute();
- 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");
- if (hostnameTask.getExitCode() == 0 && Strings.isNonBlank(stdout)) {
- String hostname = stdout.trim();
- Integer len = hostname.length();
- if (len > 63) {
- // likely to cause a java crash due to java bug 7089443 -- set a new short hostname
- // http://mail.openjdk.java.net/pipermail/net-dev/2012-July/004603.html
- String newHostname = "br-"+getEntity().getId().toLowerCase();
- log.info("Detected likelihood of Java hostname bug with hostname length "+len+" for "+getEntity()+"; renaming "+getMachine()+" to hostname "+newHostname);
- DynamicTasks.queue(SshEffectorTasks.ssh(BashCommands.setHostname(newHostname, null))).block();
- }
- } else {
- log.debug("Hostname length could not be determined for location "+EffectorTasks.findSshMachine()+"; not doing Java hostname bug check");
- }
- } catch (Exception e) {
- Exceptions.propagateIfFatal(e);
- log.warn("Error checking/fixing Java hostname bug (continuing): "+e, e);
- }
- }
-
- @Override
- public void setup() {
- DynamicTasks.queue("install java", new Runnable() { public void run() {
- installJava();
- }});
-
- // TODO check java version
-
- if (getEntity().getConfig(UsesJava.CHECK_JAVA_HOSTNAME_BUG)) {
- DynamicTasks.queue("check java hostname bug", new Runnable() { public void run() {
- checkJavaHostnameBug(); }});
- }
- }
-
- @Override
- public void copyRuntimeResources() {
- super.copyRuntimeResources();
-
- if (isJmxEnabled()) {
- DynamicTasks.queue("install jmx", new Runnable() { public void run() {
- installJmxSupport(); }});
- }
- }
-
-}