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:53 UTC
[35/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/basic/lifecycle/ScriptHelper.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java b/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java
deleted file mode 100644
index b722b1f..0000000
--- a/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptHelper.java
+++ /dev/null
@@ -1,436 +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.basic.lifecycle;
-
-import static java.lang.String.format;
-import groovy.lang.Closure;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.mgmt.ExecutionContext;
-import org.apache.brooklyn.api.mgmt.Task;
-import org.apache.brooklyn.api.mgmt.TaskQueueingContext;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.mgmt.BrooklynTaskTags;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.apache.brooklyn.location.basic.SshMachineLocation;
-import org.apache.brooklyn.util.GroovyJavaMethods;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.internal.ssh.ShellTool;
-import org.apache.brooklyn.util.core.mutex.WithMutexes;
-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.exceptions.RuntimeInterruptedException;
-import org.apache.brooklyn.util.stream.Streams;
-import org.apache.brooklyn.util.text.Identifiers;
-import org.apache.brooklyn.util.text.Strings;
-
-import com.google.common.annotations.Beta;
-import com.google.common.base.Predicate;
-import com.google.common.base.Predicates;
-
-public class ScriptHelper {
-
- public static final Logger log = LoggerFactory.getLogger(ScriptHelper.class);
-
- protected final NaiveScriptRunner runner;
- public final String summary;
-
- public final ScriptPart header = new ScriptPart(this);
- public final ScriptPart body = new ScriptPart(this);
- public final ScriptPart footer = new ScriptPart(this);
-
- @SuppressWarnings("rawtypes")
- protected final Map flags = new LinkedHashMap();
- protected Predicate<? super Integer> resultCodeCheck = Predicates.alwaysTrue();
- protected Predicate<? super ScriptHelper> executionCheck = Predicates.alwaysTrue();
-
- protected boolean isTransient = false;
- protected boolean isInessential = false;
- protected boolean closeSshConnection = false;
- protected boolean gatherOutput = false;
- protected boolean noExtraOutput = false;
- protected ByteArrayOutputStream stdout, stderr;
- protected Task<Integer> task;
-
- public ScriptHelper(NaiveScriptRunner runner, String summary) {
- this.runner = runner;
- this.summary = summary;
- }
-
- /**
- * Takes a closure which accepts this ScriptHelper and returns true or false
- * as to whether the script needs to run (or can throw error if desired)
- */
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public ScriptHelper executeIf(Closure c) {
- Predicate<ScriptHelper> predicate = GroovyJavaMethods.predicateFromClosure(c);
- return executeIf(predicate);
- }
-
- public ScriptHelper executeIf(Predicate<? super ScriptHelper> c) {
- executionCheck = c;
- return this;
- }
-
- public ScriptHelper skipIfBodyEmpty() {
- Predicate<ScriptHelper> p = new Predicate<ScriptHelper>() {
- @Override
- public boolean apply(ScriptHelper input) {
- return !input.body.isEmpty();
- }
- };
-
- return executeIf(p);
- }
-
- public ScriptHelper failIfBodyEmpty() {
- Predicate<ScriptHelper> p = new Predicate<ScriptHelper>() {
- @Override
- public boolean apply(ScriptHelper input) {
- if (input.body.isEmpty()) {
- throw new IllegalStateException("body empty for " + summary);
- }
- return true;
- }
- };
-
- return executeIf(p);
- }
-
- public ScriptHelper failOnNonZeroResultCode(boolean val) {
- if (val) {
- failOnNonZeroResultCode();
- } else {
- requireResultCode(Predicates.alwaysTrue());
- }
- return this;
- }
-
- public ScriptHelper failOnNonZeroResultCode() {
- return updateTaskAndFailOnNonZeroResultCode();
- }
-
- public ScriptHelper failOnNonZeroResultCodeWithoutUpdatingTask() {
- requireResultCode(Predicates.equalTo(0));
- return this;
- }
-
- public ScriptHelper updateTaskAndFailOnNonZeroResultCode() {
- gatherOutput();
- // a failure listener would be a cleaner way
-
- resultCodeCheck = new Predicate<Integer>() {
- @Override
- public boolean apply(@Nullable Integer input) {
- if (input==0) return true;
-
- try {
- String notes = "";
- if (!getResultStderr().isEmpty())
- notes += "STDERR\n" + getResultStderr()+"\n";
- if (!getResultStdout().isEmpty())
- notes += "\n" + "STDOUT\n" + getResultStdout()+"\n";
- Tasks.setExtraStatusDetails(notes.trim());
- } catch (Exception e) {
- log.warn("Unable to collect additional metadata on failure of "+summary+": "+e);
- }
-
- return false;
- }
- };
-
- return this;
- }
-
- /**
- * Convenience for error-checking the result.
- * <p/>
- * Takes closure which accepts bash exit code (integer),
- * and returns false if it is invalid. Default is that this resultCodeCheck
- * closure always returns true (and the exit code is made available to the
- * caller if they care)
- */
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public ScriptHelper requireResultCode(Closure integerFilter) {
- Predicate<Integer> objectPredicate = GroovyJavaMethods.predicateFromClosure(integerFilter);
- return requireResultCode(objectPredicate);
- }
-
- public ScriptHelper requireResultCode(Predicate<? super Integer> integerFilter) {
- resultCodeCheck = integerFilter;
- return this;
- }
-
- protected Runnable mutexAcquire = new Runnable() {
- public void run() {
- }
- };
-
- protected Runnable mutexRelease = new Runnable() {
- public void run() {
- }
- };
-
- /**
- * indicates that the script should acquire the given mutexId on the given mutexSupport
- * and maintain it for the duration of script execution;
- * typically used to prevent parallel scripts from conflicting in access to a resource
- * (e.g. a folder, or a config file used by a process)
- */
- public ScriptHelper useMutex(final WithMutexes mutexSupport, final String mutexId, final String description) {
- mutexAcquire = new Runnable() {
- public void run() {
- try {
- mutexSupport.acquireMutex(mutexId, description);
- } catch (InterruptedException e) {
- throw new RuntimeInterruptedException(e);
- }
- }
- };
-
- mutexRelease = new Runnable() {
- public void run() {
- mutexSupport.releaseMutex(mutexId);
- }
- };
-
- return this;
- }
-
- public ScriptHelper gatherOutput() {
- return gatherOutput(true);
- }
- public ScriptHelper gatherOutput(boolean gather) {
- gatherOutput = gather;
- return this;
- }
-
- /**
- * Indicate that no extra output should be appended to stdout.
- * <p>
- * By default Brooklyn appends a message like
- * "<tt>Executed /tmp/brooklyn-20141010-164855950...sh, result 0</tt>"
- * to script output.
- */
- public ScriptHelper noExtraOutput() {
- return noExtraOutput(true);
- }
-
- /**
- * @see #noExtraOutput()
- */
- private ScriptHelper noExtraOutput(boolean output) {
- this.noExtraOutput = output;
- return this;
- }
-
- /** The connection should be closed and disconnected once the commands have executed. */
- public ScriptHelper closeSshConnection() {
- closeSshConnection = true;
- return this;
- }
-
- /** Unique ID for the command execution; ensures new SSH connection from the pool. */
- public ScriptHelper uniqueSshConnection() {
- setFlag(SshMachineLocation.UNIQUE_ID, Identifiers.makeRandomBase64Id(32));
- return this;
- }
-
- /** indicates explicitly that the task can be safely forgotten about after it runs; useful for things like
- * check_running which run repeatedly */
- public void setTransient() {
- isTransient = true;
- }
-
- public void setInessential() {
- isInessential = true;
- }
-
- public ScriptHelper inessential() {
- isInessential = true;
- return this;
- }
-
- /** creates a task which will execute this script; note this can only be run once per instance of this class */
- public synchronized Task<Integer> newTask() {
- if (task!=null) throw new IllegalStateException("task can only be generated once");
- TaskBuilder<Integer> tb = Tasks.<Integer>builder().name("ssh: "+summary).body(
- new Callable<Integer>() {
- public Integer call() throws Exception {
- return executeInternal();
- }
- });
-
- try {
- ByteArrayOutputStream stdin = new ByteArrayOutputStream();
- for (String line: getLines()) {
- stdin.write(line.getBytes());
- stdin.write("\n".getBytes());
- }
- tb.tag(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDIN, stdin));
- } catch (IOException e) {
- log.warn("Error registering stream "+BrooklynTaskTags.STREAM_STDIN+" on "+tb+": "+e, e);
- }
-
- Map<?,?> env = (Map<?,?>) flags.get("env");
- if (env!=null) {
- // if not explicitly set, env will come from getShellEnv in AbstractSoftwareProcessSshDriver.execute,
- // which will also update this tag appropriately
- tb.tag(BrooklynTaskTags.tagForEnvStream(BrooklynTaskTags.STREAM_ENV, env));
- }
-
- if (gatherOutput) {
- stdout = new ByteArrayOutputStream();
- tb.tag(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDOUT, stdout));
- stderr = new ByteArrayOutputStream();
- tb.tag(BrooklynTaskTags.tagForStreamSoft(BrooklynTaskTags.STREAM_STDERR, stderr));
- }
- task = tb.build();
- if (isTransient) BrooklynTaskTags.setTransient(task);
- if (isInessential) BrooklynTaskTags.setInessential(task);
- return task;
- }
-
- /** returns the task, if it has been constructed, or null; use {@link #newTask()} to build
- * (if it is null and you need a task) */
- public Task<Integer> peekTask() {
- return task;
- }
-
- /** queues the task for execution if we are in a {@link TaskQueueingContext} (e.g. EffectorTaskFactory);
- * or if we aren't in a queueing context, it will submit the task (assuming there is an {@link ExecutionContext}
- * _and_ block until completion, throwing on error */
- @Beta
- public Task<Integer> queue() {
- return DynamicTasks.queueIfPossible(newTask()).orSubmitAndBlock().getTask();
- }
-
- public int execute() {
- if (DynamicTasks.getTaskQueuingContext()!=null) {
- return queue().getUnchecked();
- } else {
- return executeInternal();
- }
- }
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- public int executeInternal() {
- if (!executionCheck.apply(this)) {
- return 0;
- }
-
- List<String> lines = getLines();
- if (log.isTraceEnabled()) log.trace("executing: {} - {}", summary, lines);
-
- int result;
- try {
- mutexAcquire.run();
- Map flags = getFlags();
- if (closeSshConnection) {
- flags.put("close", true);
- }
- if (gatherOutput) {
- if (stdout==null) stdout = new ByteArrayOutputStream();
- if (stderr==null) stderr = new ByteArrayOutputStream();
- flags.put("out", stdout);
- flags.put("err", stderr);
- }
- flags.put(ShellTool.PROP_NO_EXTRA_OUTPUT.getName(), noExtraOutput);
- result = runner.execute(flags, lines, summary);
- } catch (RuntimeInterruptedException e) {
- throw logWithDetailsAndThrow(format("Execution failed, invocation error for %s: %s", summary, e.getMessage()), e);
- } catch (Exception e) {
- throw logWithDetailsAndThrow(format("Execution failed, invocation error for %s: %s", summary, e.getMessage()), e);
- } finally {
- mutexRelease.run();
- }
- if (log.isTraceEnabled()) log.trace("finished executing: {} - result code {}", summary, result);
-
- if (!resultCodeCheck.apply(result)) {
- throw logWithDetailsAndThrow(format("Execution failed, invalid result %s for %s", result, summary), null);
- }
- return result;
- }
-
- protected RuntimeException logWithDetailsAndThrow(String message, Throwable optionalCause) {
- log.warn(message+" (throwing)");
- Streams.logStreamTail(log, "STDERR of problem in "+Tasks.current(), stderr, 1024);
- Streams.logStreamTail(log, "STDOUT of problem in "+Tasks.current(), stdout, 1024);
- Streams.logStreamTail(log, "STDIN of problem in "+Tasks.current(), Streams.byteArrayOfString(Strings.join(getLines(),"\n")), 4096);
- if (optionalCause!=null) throw new IllegalStateException(message, optionalCause);
- throw new IllegalStateException(message);
- }
-
- @SuppressWarnings("rawtypes")
- public Map getFlags() {
- return flags;
- }
-
- @SuppressWarnings("unchecked")
- public ScriptHelper setFlag(String flag, Object value) {
- flags.put(flag, value);
- return this;
- }
-
- public <T> ScriptHelper setFlag(ConfigKey<T> flag, T value) {
- return setFlag(flag.getName(), value);
- }
-
- /** ensures the script runs with no environment variables; by default they will be inherited */
- public ScriptHelper environmentVariablesReset() {
- return environmentVariablesReset(MutableMap.of());
- }
-
- /** overrides the default environment variables to use the given set; by default they will be inherited.
- * TODO would be nice to have a way to add just a few, but there is no way currently to access the
- * getShellEnvironment() from the driver which is what gets inherited (at execution time) */
- public ScriptHelper environmentVariablesReset(Map<?,?> envVarsToSet) {
- setFlag("env", envVarsToSet);
- return this;
- }
-
- public List<String> getLines() {
- List<String> result = new LinkedList<String>();
- result.addAll(header.lines);
- result.addAll(body.lines);
- result.addAll(footer.lines);
- return result;
- }
-
- public String getResultStdout() {
- if (stdout==null) throw new IllegalStateException("output not available on "+this+"; ensure gatherOutput(true) is set");
- return stdout.toString();
- }
- public String getResultStderr() {
- if (stderr==null) throw new IllegalStateException("output not available on "+this+"; ensure gatherOutput(true) is set");
- return stderr.toString();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptPart.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptPart.java b/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptPart.java
deleted file mode 100644
index e14c526..0000000
--- a/software/base/src/main/java/brooklyn/entity/basic/lifecycle/ScriptPart.java
+++ /dev/null
@@ -1,82 +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.basic.lifecycle;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.LinkedList;
-import java.util.List;
-
-public class ScriptPart {
- protected ScriptHelper helper;
- protected List<String> lines = new LinkedList<String>();
-
- public ScriptPart(ScriptHelper helper) {
- this.helper = helper;
- }
-
- public ScriptHelper append(CharSequence line) {
- lines.add(line.toString());
- return helper;
- }
-
- public ScriptHelper append(Collection<? extends CharSequence> lines) {
- for (CharSequence line : lines) {
- append(line);
- }
- return helper;
- }
-
- public ScriptHelper append(CharSequence... lines) {
- return append(Arrays.asList(lines));
- }
-
- public ScriptHelper prepend(CharSequence line) {
- lines.add(0, line.toString());
- return helper;
- }
-
- public ScriptHelper prepend(Collection<? extends CharSequence> lines) {
- List<CharSequence> reversedLines = new ArrayList<CharSequence>(lines);
- Collections.reverse(reversedLines);
- for (CharSequence line : reversedLines) {
- prepend(line);
- }
- return helper;
- }
-
- public ScriptHelper prepend(CharSequence... lines) {
- return prepend(Arrays.asList(lines));
- }
-
- public ScriptHelper reset(CharSequence line) {
- return reset(Arrays.asList(line));
- }
-
- public ScriptHelper reset(List<? extends CharSequence> ll) {
- lines.clear();
- return append(ll);
- }
-
- public boolean isEmpty() {
- return lines.isEmpty();
- }
-}
\ 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/brooklynnode/BrooklynCluster.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynCluster.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynCluster.java
deleted file mode 100644
index 0123231..0000000
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynCluster.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.brooklynnode;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.EntitySpec;
-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.effector.core.Effectors;
-import org.apache.brooklyn.entity.group.DynamicCluster;
-import org.apache.brooklyn.sensor.core.Sensors;
-
-import brooklyn.entity.brooklynnode.effector.BrooklynNodeUpgradeEffectorBody;
-
-@ImplementedBy(BrooklynClusterImpl.class)
-public interface BrooklynCluster extends DynamicCluster {
-
- ConfigKey<EntitySpec<?>> MEMBER_SPEC = ConfigKeys.newConfigKeyWithDefault(DynamicCluster.MEMBER_SPEC,
- EntitySpec.create(BrooklynNode.class));
-
- AttributeSensor<BrooklynNode> MASTER_NODE = Sensors.newSensor(
- BrooklynNode.class, "brooklyncluster.master", "Pointer to the child node with MASTER state in the cluster");
-
- interface SelectMasterEffector {
- ConfigKey<String> NEW_MASTER_ID = ConfigKeys.newStringConfigKey(
- "brooklyncluster.new_master_id", "The ID of the node to become master", null);
- Effector<Void> SELECT_MASTER = Effectors.effector(Void.class, "selectMaster")
- .description("Select a new master in the cluster")
- .parameter(NEW_MASTER_ID)
- .buildAbstract();
- }
-
- Effector<Void> SELECT_MASTER = SelectMasterEffector.SELECT_MASTER;
-
- interface UpgradeClusterEffector {
- ConfigKey<String> DOWNLOAD_URL = BrooklynNode.DOWNLOAD_URL.getConfigKey();
- ConfigKey<Map<String,Object>> EXTRA_CONFIG = BrooklynNodeUpgradeEffectorBody.EXTRA_CONFIG;
-
- Effector<Void> UPGRADE_CLUSTER = Effectors.effector(Void.class, "upgradeCluster")
- .description("Upgrade the cluster with new distribution version, "
- + "by provisioning new nodes with the new version, failing over, "
- + "and then deprovisioning the original nodes")
- .parameter(BrooklynNode.SUGGESTED_VERSION)
- .parameter(DOWNLOAD_URL)
- .parameter(EXTRA_CONFIG)
- .buildAbstract();
- }
-
- Effector<Void> UPGRADE_CLUSTER = UpgradeClusterEffector.UPGRADE_CLUSTER;
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynClusterImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynClusterImpl.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynClusterImpl.java
deleted file mode 100644
index 5209192..0000000
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynClusterImpl.java
+++ /dev/null
@@ -1,116 +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.brooklynnode;
-
-import java.util.Collection;
-import java.util.concurrent.Callable;
-
-import org.apache.brooklyn.api.entity.Entity;
-import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState;
-import org.apache.brooklyn.entity.core.EntityFunctions;
-import org.apache.brooklyn.entity.core.EntityPredicates;
-import org.apache.brooklyn.entity.group.DynamicClusterImpl;
-import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic;
-import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic.ServiceProblemsLogic;
-import org.apache.brooklyn.sensor.enricher.Enrichers;
-import org.apache.brooklyn.sensor.feed.function.FunctionFeed;
-import org.apache.brooklyn.sensor.feed.function.FunctionPollConfig;
-import org.apache.brooklyn.util.time.Duration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import brooklyn.entity.brooklynnode.effector.BrooklynClusterUpgradeEffectorBody;
-import brooklyn.entity.brooklynnode.effector.SelectMasterEffectorBody;
-
-import com.google.common.collect.FluentIterable;
-import com.google.common.collect.Iterables;
-
-public class BrooklynClusterImpl extends DynamicClusterImpl implements BrooklynCluster {
-
- private static final String MSG_NO_MASTER = "No master node in cluster";
- private static final String MSG_TOO_MANY_MASTERS = "Too many master nodes in cluster";
-
- private static final Logger LOG = LoggerFactory.getLogger(BrooklynClusterImpl.class);
-
- // TODO should we set a default MEMBER_SPEC ? difficult though because we'd need to set a password
-
- @Override
- public void init() {
- super.init();
- getMutableEntityType().addEffector(SelectMasterEffectorBody.SELECT_MASTER);
- getMutableEntityType().addEffector(BrooklynClusterUpgradeEffectorBody.UPGRADE_CLUSTER);
-
- ServiceProblemsLogic.updateProblemsIndicator(this, MASTER_NODE, MSG_NO_MASTER);
- addFeed(FunctionFeed.builder()
- .entity(this)
- .poll(new FunctionPollConfig<Object, BrooklynNode>(MASTER_NODE)
- .period(Duration.ONE_SECOND)
- .callable(new MasterChildFinder()))
- .build());
-
- addEnricher( Enrichers.builder().transforming(MASTER_NODE)
- .uniqueTag("master-node-web-uri")
- .publishing(BrooklynNode.WEB_CONSOLE_URI)
- .computing(EntityFunctions.attribute(BrooklynNode.WEB_CONSOLE_URI))
- .build() );
- }
-
- private final class MasterChildFinder implements Callable<BrooklynNode> {
- @Override
- public BrooklynNode call() throws Exception {
- return findMasterChild();
- }
- }
-
- BrooklynNode findMasterChild() {
- Collection<Entity> masters = FluentIterable.from(getMembers())
- .filter(EntityPredicates.attributeEqualTo(BrooklynNode.MANAGEMENT_NODE_STATE, ManagementNodeState.MASTER))
- .toList();
-
- if (masters.size() == 0) {
- ServiceProblemsLogic.updateProblemsIndicator(this, MASTER_NODE, MSG_NO_MASTER);
- return null;
-
- } else if (masters.size() == 1) {
- ServiceStateLogic.ServiceProblemsLogic.clearProblemsIndicator(this, MASTER_NODE);
- return (BrooklynNode)Iterables.getOnlyElement(masters);
-
- } else if (masters.size() == 2) {
- LOG.warn("Two masters detected, probably a handover just occured: " + masters);
-
- //Don't clearProblemsIndicator - if there were no masters previously why have two now.
- //But also don't set it. Probably hit a window where we have a new master
- //its BrooklynNode picked it up, but the BrooklynNode
- //for the old master hasn't refreshed its state yet.
- //Just pick one of them, should sort itself out in next update.
-
- //TODO Do set such indicator if this continues for an extended period of time
-
- return (BrooklynNode)masters.iterator().next();
-
- } else {
- ServiceProblemsLogic.updateProblemsIndicator(this, MASTER_NODE, MSG_TOO_MANY_MASTERS);
- String msg = "Multiple (>=3) master nodes in cluster: " + masters;
- LOG.error(msg);
- throw new IllegalStateException(msg);
-
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirror.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirror.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirror.java
deleted file mode 100644
index c8b665f..0000000
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirror.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.brooklynnode;
-
-import java.util.Map;
-
-import org.apache.brooklyn.api.catalog.Catalog;
-import org.apache.brooklyn.api.entity.Entity;
-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.time.Duration;
-
-import brooklyn.entity.brooklynnode.BrooklynNode;
-
-/** Provides an entity which can sit in one brooklyn domain and reflect the status of an entity
- * via the REST API of another domain.
- * <p>
- * Note tests for this depend on a REST server so are in other projects; search for *Mirror*Test,
- * as well as *BrooklynNode*Test. */
-@Catalog(name="Brooklyn Entity Mirror", description="Provides an entity which can sit in one brooklyn "
- + "domain and reflect the status of an entity via the REST API of another domain.")
-@ImplementedBy(BrooklynEntityMirrorImpl.class)
-public interface BrooklynEntityMirror extends Entity {
-
- // caller must specify this:
- public static final ConfigKey<String> MIRRORED_ENTITY_URL = ConfigKeys.newStringConfigKey("brooklyn.mirror.entity_url",
- "URL for the entity in the remote Brooklyn mgmt endpoint");
-
- // caller may specify this for reference:
- public static final ConfigKey<String> MIRRORED_ENTITY_ID = ConfigKeys.newStringConfigKey("brooklyn.mirror.entity_id",
- "Brooklyn ID of the entity being mirrored");
-
- // must be specified if required (could be inherited if parent/config is available at init time, but it's not currently)
- public static final ConfigKey<String> MANAGEMENT_USER = BrooklynNode.MANAGEMENT_USER;
- public static final ConfigKey<String> MANAGEMENT_PASSWORD = BrooklynNode.MANAGEMENT_PASSWORD;
-
- public static final ConfigKey<Duration> POLL_PERIOD = ConfigKeys.newConfigKey(Duration.class, "brooklyn.mirror.poll_period",
- "Frequency to poll for client sensors", Duration.FIVE_SECONDS);
-
- public static final AttributeSensor<String> MIRROR_STATUS = Sensors.newStringSensor("brooklyn.mirror.monitoring_status");
- @SuppressWarnings("rawtypes")
- public static final AttributeSensor<Map> MIRROR_SUMMARY = Sensors.newSensor(Map.class, "brooklyn.mirror.summary",
- "The json map returned by the entity rest endpoint (ie the EntitySummary model)");
- public static final AttributeSensor<String> MIRROR_CATALOG_ITEM_ID = Sensors.newStringSensor("brooklyn.mirror.catalog_item_id",
- "The catalog item id of the mirrored entity in the remote brooklyn");
-
- public EntityHttpClient http();
-
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirrorImpl.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirrorImpl.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirrorImpl.java
deleted file mode 100644
index 72b9d01..0000000
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynEntityMirrorImpl.java
+++ /dev/null
@@ -1,194 +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.brooklynnode;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import javax.annotation.Nullable;
-
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.effector.core.EffectorBody;
-import org.apache.brooklyn.entity.core.AbstractEntity;
-import org.apache.brooklyn.entity.core.Attributes;
-import org.apache.brooklyn.entity.core.Entities;
-import org.apache.brooklyn.entity.core.EntityDynamicType;
-import org.apache.brooklyn.entity.lifecycle.Lifecycle;
-import org.apache.brooklyn.entity.lifecycle.ServiceStateLogic;
-import org.apache.brooklyn.sensor.core.Sensors;
-import org.apache.brooklyn.sensor.feed.http.HttpFeed;
-import org.apache.brooklyn.sensor.feed.http.HttpPollConfig;
-import org.apache.brooklyn.util.collections.Jsonya;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.config.ConfigBag;
-import org.apache.brooklyn.util.core.http.HttpToolResponse;
-import org.apache.brooklyn.util.core.task.DynamicTasks;
-import org.apache.brooklyn.util.core.task.Tasks;
-import org.apache.brooklyn.util.net.Urls;
-import org.apache.http.HttpStatus;
-
-import com.google.common.base.Function;
-import com.google.common.base.Preconditions;
-import com.google.common.net.MediaType;
-import com.google.gson.Gson;
-
-public class BrooklynEntityMirrorImpl extends AbstractEntity implements BrooklynEntityMirror {
- @SuppressWarnings("rawtypes")
- private class MirrorSummary implements Function<HttpToolResponse, Map> {
- @Override
- public Map apply(HttpToolResponse input) {
- Map<?, ?> entitySummary = new Gson().fromJson(input.getContentAsString(), Map.class);
- String catalogItemId = (String)entitySummary.get("catalogItemId");
- setAttribute(MIRROR_CATALOG_ITEM_ID, catalogItemId);
- return entitySummary;
- }
- }
-
- private HttpFeed mirror;
-
-
- //Passively mirror entity's state
- @Override
- protected void initEnrichers() {}
-
- @Override
- public void init() {
- super.init();
- connectSensorsAsync();
-
- //start spinning, could take some time before MIRRORED_ENTITY_URL is available for first time mirroring
- setAttribute(Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STARTING);
- }
-
- @Override
- public void rebind() {
- super.rebind();
- connectSensorsAsync();
- }
-
- protected void connectSensorsAsync() {
- Callable<Void> asyncTask = new Callable<Void>() {
- @Override
- public Void call() throws Exception {
- //blocks until available (could be a task)
- String mirroredEntityUrl = getConfig(MIRRORED_ENTITY_URL);
- Preconditions.checkNotNull(mirroredEntityUrl, "Required config: "+MIRRORED_ENTITY_URL);
-
- connectSensors(mirroredEntityUrl);
- return null;
- }
- };
-
- DynamicTasks.queueIfPossible(
- Tasks.<Void>builder()
- .name("Start entity mirror feed")
- .body(asyncTask)
- .build())
- .orSubmitAsync(this);
- }
-
- protected void connectSensors(String mirroredEntityUrl) {
- Function<HttpToolResponse, Void> mirrorSensors = new Function<HttpToolResponse,Void>() {
- @SuppressWarnings("rawtypes")
- @Override
- public Void apply(HttpToolResponse input) {
- Map sensors = new Gson().fromJson(input.getContentAsString(), Map.class);
- for (Object kv: sensors.entrySet())
- setAttribute(Sensors.newSensor(Object.class, ""+((Map.Entry)kv).getKey()), ((Map.Entry)kv).getValue());
- setAttribute(MIRROR_STATUS, "normal");
- return null;
- }
- };
-
- final BrooklynEntityMirrorImpl self = this;
- mirror = HttpFeed.builder().entity(this)
- .baseUri(mirroredEntityUrl)
- .credentialsIfNotNull(getConfig(BrooklynNode.MANAGEMENT_USER), getConfig(BrooklynNode.MANAGEMENT_PASSWORD))
- .period(getConfig(POLL_PERIOD))
- .poll(HttpPollConfig.forMultiple()
- .suburl("/sensors/current-state")
- .onSuccess(mirrorSensors)
- .onFailureOrException(new Function<Object, Void>() {
- @Override
- public Void apply(Object input) {
- ServiceStateLogic.updateMapSensorEntry(self, Attributes.SERVICE_PROBLEMS, "mirror-feed", "error contacting service");
- if (input instanceof HttpToolResponse) {
- int responseCode = ((HttpToolResponse)input).getResponseCode();
- if (responseCode == HttpStatus.SC_NOT_FOUND) {
- //the remote entity no longer exists
- Entities.unmanage(self);
- }
- }
- return null;
- }
- }))
- .poll(HttpPollConfig.forSensor(MIRROR_SUMMARY).onSuccess(new MirrorSummary())).build();
-
- populateEffectors();
- }
-
- private void populateEffectors() {
- HttpToolResponse result = http().get("/effectors");
- Collection<?> cfgEffectors = new Gson().fromJson(result.getContentAsString(), Collection.class);
- Collection<Effector<String>> remoteEntityEffectors = RemoteEffectorBuilder.of(cfgEffectors);
- EntityDynamicType mutableEntityType = getMutableEntityType();
- for (Effector<String> eff : remoteEntityEffectors) {
- //remote already started
- if ("start".equals(eff.getName())) continue;
- mutableEntityType.addEffector(eff);
- }
- }
-
- protected void disconnectSensors() {
- if (mirror != null) mirror.stop();
- }
-
- @Override
- public void destroy() {
- disconnectSensors();
- }
-
- @Override
- public EntityHttpClient http() {
- return new EntityHttpClientImpl(this, MIRRORED_ENTITY_URL);
- }
-
- public static class RemoteEffector<T> extends EffectorBody<T> {
- public final String remoteEffectorName;
- public final Function<HttpToolResponse, T> resultParser;
-
- /** creates an effector implementation which POSTs to a remote effector endpoint, optionally converting
- * the byte[] response (if resultParser is null then null is returned) */
- public RemoteEffector(String remoteEffectorName, @Nullable Function<HttpToolResponse,T> resultParser) {
- this.remoteEffectorName = remoteEffectorName;
- this.resultParser = resultParser;
- }
-
- @Override
- public T call(ConfigBag parameters) {
- MutableMap<String, String> headers = MutableMap.of(com.google.common.net.HttpHeaders.CONTENT_TYPE, MediaType.JSON_UTF_8.toString());
- byte[] httpBody = Jsonya.of(parameters.getAllConfig()).toString().getBytes();
- String effectorUrl = Urls.mergePaths("effectors", Urls.encode(remoteEffectorName));
- HttpToolResponse result = ((BrooklynEntityMirror)entity()).http().post(effectorUrl, headers, httpBody);
- if (resultParser!=null) return resultParser.apply(result);
- else return null;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
deleted file mode 100644
index e232d4e..0000000
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNode.java
+++ /dev/null
@@ -1,313 +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.brooklynnode;
-
-import java.net.InetAddress;
-import java.net.URI;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.brooklyn.api.catalog.Catalog;
-import org.apache.brooklyn.api.effector.Effector;
-import org.apache.brooklyn.api.entity.ImplementedBy;
-import org.apache.brooklyn.api.mgmt.ha.HighAvailabilityMode;
-import org.apache.brooklyn.api.mgmt.ha.ManagementNodeState;
-import org.apache.brooklyn.api.sensor.AttributeSensor;
-import org.apache.brooklyn.config.ConfigKey;
-import org.apache.brooklyn.core.BrooklynVersion;
-import org.apache.brooklyn.core.config.ConfigKeys;
-import org.apache.brooklyn.core.config.MapConfigKey;
-import org.apache.brooklyn.effector.core.Effectors;
-import org.apache.brooklyn.entity.core.BrooklynConfigKeys;
-import org.apache.brooklyn.sensor.core.BasicAttributeSensor;
-import org.apache.brooklyn.sensor.core.BasicAttributeSensorAndConfigKey;
-import org.apache.brooklyn.sensor.core.PortAttributeSensorAndConfigKey;
-import org.apache.brooklyn.sensor.core.Sensors;
-import org.apache.brooklyn.sensor.core.BasicAttributeSensorAndConfigKey.StringAttributeSensorAndConfigKey;
-import org.apache.brooklyn.util.collections.MutableMap;
-import org.apache.brooklyn.util.core.flags.SetFromFlag;
-import org.apache.brooklyn.util.net.Networking;
-import org.apache.brooklyn.util.ssh.BashCommands;
-import org.apache.brooklyn.util.time.Duration;
-
-import brooklyn.entity.basic.SoftwareProcess;
-import brooklyn.entity.java.UsesJava;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Function;
-import com.google.common.base.Functions;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.common.reflect.TypeToken;
-
-@Catalog(name="Brooklyn Node", description="Deploys a Brooklyn management server")
-@ImplementedBy(BrooklynNodeImpl.class)
-public interface BrooklynNode extends SoftwareProcess, UsesJava {
-
- @SuppressWarnings("serial")
- @SetFromFlag("copyToRundir")
- public static final BasicAttributeSensorAndConfigKey<Map<String,String>> COPY_TO_RUNDIR = new BasicAttributeSensorAndConfigKey<Map<String,String>>(
- new TypeToken<Map<String,String>>() {}, "brooklynnode.copytorundir", "URLs of resources to be copied across to the server, giving the path they are to be copied to", MutableMap.<String,String>of());
-
- @SetFromFlag("version")
- public static final ConfigKey<String> SUGGESTED_VERSION = ConfigKeys.newConfigKeyWithDefault(BrooklynConfigKeys.SUGGESTED_VERSION, "0.8.0-SNAPSHOT"); // BROOKLYN_VERSION
-
- @SetFromFlag("distroUploadUrl")
- public static final ConfigKey<String> DISTRO_UPLOAD_URL = ConfigKeys.newStringConfigKey(
- "brooklynnode.distro.uploadurl", "URL for uploading the brooklyn distro (retrieved locally and pushed to remote install location. Takes precedence over downloadUrl, if non-null)", null);
-
- // Note that download URL only supports versions in org.apache.brooklyn, so not 0.6.0 and earlier
- // (which used maven group io.brooklyn). Aled thinks we can live with that.
- @SetFromFlag("downloadUrl")
- BasicAttributeSensorAndConfigKey<String> DOWNLOAD_URL = new StringAttributeSensorAndConfigKey(
- SoftwareProcess.DOWNLOAD_URL,
- "<#if version?contains(\"SNAPSHOT\")>"+
- "https://repository.apache.org/service/local/artifact/maven/redirect?r=snapshots&g=org.apache.brooklyn&v=${version}&a=brooklyn-dist&c=dist&e=tar.gz" +
- "<#else>"+
- "http://search.maven.org/remotecontent?filepath=org/apache/brooklyn/brooklyn-dist/${version}/brooklyn-dist-${version}-dist.tar.gz"+
- "</#if>");
-
- @SetFromFlag("subpathInArchive")
- ConfigKey<String> SUBPATH_IN_ARCHIVE = ConfigKeys.newStringConfigKey("brooklynnode.download.archive.subpath",
- "Path to the main directory in the archive being supplied for installation; "
- + "to use the root of an archive, specify '.'; "
- + "default value taken based on download URL (e.g. 'name' for 'http://path/name.tgz' or 'http://path/name-dist.tgz') "
- + "falling back to an appropriate value for brooklyn, "
- + "e.g. 'brooklyn-"+BrooklynVersion.INSTANCE.getVersion()+"'", null);
-
- @SetFromFlag("managementUser")
- ConfigKey<String> MANAGEMENT_USER = ConfigKeys.newConfigKey("brooklynnode.managementUser",
- "The user for logging into the brooklyn web-console (also used for health-checks)",
- "admin");
-
- @SetFromFlag("managementPassword")
- ConfigKey<String> MANAGEMENT_PASSWORD =
- ConfigKeys.newStringConfigKey("brooklynnode.managementPassword", "Password for MANAGEMENT_USER", null);
-
- /** useful e.g. with {@link BashCommands#generateKeyInDotSshIdRsaIfNotThere() } */
- @SetFromFlag("extraCustomizationScript")
- ConfigKey<String> EXTRA_CUSTOMIZATION_SCRIPT = ConfigKeys.newStringConfigKey("brooklynnode.customization.extraScript",
- "Optional additional script commands to run as part of customization; this might e.g. ensure id_rsa is set up",
- null);
-
- static enum ExistingFileBehaviour {
- DO_NOT_USE, USE_EXISTING, OVERWRITE, FAIL
- }
-
- @SetFromFlag("onExistingProperties")
- ConfigKey<ExistingFileBehaviour> ON_EXISTING_PROPERTIES_FILE = ConfigKeys.newConfigKey(ExistingFileBehaviour.class,
- "brooklynnode.properties.file.ifExists",
- "What to do in the case where a global brooklyn.properties already exists",
- ExistingFileBehaviour.FAIL);
-
- @SetFromFlag("launchCommand")
- ConfigKey<String> LAUNCH_COMMAND = ConfigKeys.newStringConfigKey("brooklynnode.launch.command",
- "Path to the script to launch Brooklyn / the app relative to the subpath in the archive, defaulting to 'bin/brooklyn'",
- "bin/brooklyn");
-
- @SetFromFlag("launchParameters")
- ConfigKey<String> EXTRA_LAUNCH_PARAMETERS = ConfigKeys.newStringConfigKey("brooklynnode.launch.parameters.extra",
- "Launch parameters passed on the CLI, in addition to 'launch' and parameters implied by other config keys (and placed afterwards on the command line)");
-
- @SetFromFlag("launchCommandCreatesPidFile")
- ConfigKey<Boolean> LAUNCH_COMMAND_CREATES_PID_FILE = ConfigKeys.newBooleanConfigKey("brooklynnode.launch.command.pid.updated",
- "Whether the launch script creates/updates the PID file, if not the entity will do so, "
- + "but note it will not necessarily kill sub-processes",
- true);
-
- @SetFromFlag("app")
- public static final BasicAttributeSensorAndConfigKey<String> APP = new BasicAttributeSensorAndConfigKey<String>(
- String.class, "brooklynnode.app", "Application (fully qualified class name) to launch using the brooklyn CLI", null);
-
- @SetFromFlag("locations")
- public static final BasicAttributeSensorAndConfigKey<String> LOCATIONS = new BasicAttributeSensorAndConfigKey<String>(
- String.class, "brooklynnode.locations", "Locations to use when launching the app", null);
-
- /**
- * Exposed just for testing; remote path is not passed into the launched brooklyn so this won't be used!
- * This will likely change in a future version.
- */
- @VisibleForTesting
- @SetFromFlag("brooklynGlobalPropertiesRemotePath")
- public static final ConfigKey<String> BROOKLYN_GLOBAL_PROPERTIES_REMOTE_PATH = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklynproperties.global.remotepath",
- "Remote path for the global brooklyn.properties file to be uploaded", "${HOME}/.brooklyn/brooklyn.properties; "+
- "only useful for testing as this path will not be used on the remote system");
-
- @SetFromFlag("brooklynGlobalPropertiesUri")
- public static final ConfigKey<String> BROOKLYN_GLOBAL_PROPERTIES_URI = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklynproperties.global.uri", "URI for the global brooklyn properties file (uploaded to ~/.brooklyn/brooklyn.properties)", null);
-
- @SetFromFlag("brooklynGlobalPropertiesContents")
- public static final ConfigKey<String> BROOKLYN_GLOBAL_PROPERTIES_CONTENTS = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklynproperties.global.contents", "Contents for the global brooklyn properties file (uploaded to ~/.brooklyn/brooklyn.properties)", null);
-
- @SetFromFlag("brooklynLocalPropertiesRemotePath")
- public static final ConfigKey<String> BROOKLYN_LOCAL_PROPERTIES_REMOTE_PATH = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklynproperties.local.remotepath", "Remote path for the launch-specific brooklyn.properties file to be uploaded", "${driver.runDir}/brooklyn-local.properties");
-
- @SetFromFlag("brooklynLocalPropertiesUri")
- public static final ConfigKey<String> BROOKLYN_LOCAL_PROPERTIES_URI = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklynproperties.local.uri", "URI for the launch-specific brooklyn properties file", null);
-
- @SetFromFlag("brooklynLocalPropertiesContents")
- public static final ConfigKey<String> BROOKLYN_LOCAL_PROPERTIES_CONTENTS = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklynproperties.local.contents", "Contents for the launch-specific brooklyn properties file", null);
-
- // For use in testing primarily
- /** @deprecated since 0.7.0; TODO this should support BOM files */
- @Deprecated
- @SetFromFlag("brooklynCatalogRemotePath")
- public static final ConfigKey<String> BROOKLYN_CATALOG_REMOTE_PATH = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklyncatalog.remotepath", "Remote path for the brooklyn catalog.xml file to be uploaded", "${HOME}/.brooklyn/catalog.xml");
-
- /** @deprecated since 0.7.0; TODO this should support BOM files */
- @Deprecated
- @SetFromFlag("brooklynCatalogUri")
- public static final ConfigKey<String> BROOKLYN_CATALOG_URI = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklyncatalog.uri", "URI for the brooklyn catalog.xml file (uploaded to ~/.brooklyn/catalog.xml)", null);
-
- /** @deprecated since 0.7.0; TODO this should support BOM files */
- @Deprecated
- @SetFromFlag("brooklynCatalogContents")
- public static final ConfigKey<String> BROOKLYN_CATALOG_CONTENTS = ConfigKeys.newStringConfigKey(
- "brooklynnode.brooklyncatalog.contents", "Contents for the brooklyn catalog.xml file (uploaded to ~/.brooklyn/catalog.xml)", null);
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @SetFromFlag("enabledHttpProtocols")
- public static final BasicAttributeSensorAndConfigKey<List<String>> ENABLED_HTTP_PROTOCOLS = new BasicAttributeSensorAndConfigKey(
- List.class, "brooklynnode.webconsole.enabledHttpProtocols", "List of enabled protocols (e.g. http, https)", ImmutableList.of("http"));
-
- @SetFromFlag("httpPort")
- public static final PortAttributeSensorAndConfigKey HTTP_PORT = new PortAttributeSensorAndConfigKey(
- "brooklynnode.webconsole.httpPort", "HTTP Port for the brooklyn web-console", "8081+");
-
- @SetFromFlag("httpsPort")
- public static final PortAttributeSensorAndConfigKey HTTPS_PORT = new PortAttributeSensorAndConfigKey(
- "brooklynnode.webconsole.httpsPort", "HTTPS Port for the brooklyn web-console", "8443+");
-
- @SetFromFlag("noWebConsoleSecurity")
- public static final BasicAttributeSensorAndConfigKey<Boolean> NO_WEB_CONSOLE_AUTHENTICATION = new BasicAttributeSensorAndConfigKey<Boolean>(
- Boolean.class, "brooklynnode.webconsole.nosecurity", "Whether to start the web console with no security", false);
-
- @SetFromFlag("bindAddress")
- public static final BasicAttributeSensorAndConfigKey<InetAddress> WEB_CONSOLE_BIND_ADDRESS = new BasicAttributeSensorAndConfigKey<InetAddress>(
- InetAddress.class, "brooklynnode.webconsole.address.bind", "Specifies the IP address of the NIC to bind the Brooklyn Management Console to (default 0.0.0.0)", Networking.ANY_NIC);
-
- @SetFromFlag("publicAddress")
- public static final BasicAttributeSensorAndConfigKey<InetAddress> WEB_CONSOLE_PUBLIC_ADDRESS = new BasicAttributeSensorAndConfigKey<InetAddress>(
- InetAddress.class, "brooklynnode.webconsole.address.public", "Specifies the public IP address or hostname for the Brooklyn Management Console");
-
- public static final AttributeSensor<Boolean> WEB_CONSOLE_ACCESSIBLE = Sensors.newBooleanSensor(
- "brooklynnode.webconsole.up", "Whether the web console is responding normally");
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @SetFromFlag("classpath")
- public static final BasicAttributeSensorAndConfigKey<List<String>> CLASSPATH = new BasicAttributeSensorAndConfigKey(
- List.class, "brooklynnode.classpath", "classpath to use, as list of URL entries", Lists.newArrayList());
-
- @SuppressWarnings({ "rawtypes", "unchecked" })
- @SetFromFlag("portMapper")
- public static final ConfigKey<Function<? super Integer, ? extends Integer>> PORT_MAPPER = (ConfigKey) ConfigKeys.newConfigKey(Function.class,
- "brooklynnode.webconsole.portMapper", "Function for mapping private to public ports, for use in inferring the brooklyn URI", Functions.<Integer>identity());
-
- public static final AttributeSensor<URI> WEB_CONSOLE_URI = new BasicAttributeSensor<URI>(
- URI.class, "brooklynnode.webconsole.url", "URL of the brooklyn web-console");
-
- public static final AttributeSensor<ManagementNodeState> MANAGEMENT_NODE_STATE = new BasicAttributeSensor<ManagementNodeState>(
- ManagementNodeState.class, "brooklynnode.ha.state", "High-availability state of the management node (MASTER, HOT_STANDBY, etc)");
-
- public static final ConfigKey<Duration> POLL_PERIOD = ConfigKeys.newConfigKey(Duration.class, "brooklynnode.poll_period",
- "Frequency to poll for client sensors", Duration.seconds(2));
-
- public interface DeployBlueprintEffector {
- ConfigKey<Map<String,Object>> BLUEPRINT_CAMP_PLAN = new MapConfigKey<Object>(Object.class, "blueprintPlan",
- "CAMP plan for the blueprint to be deployed; currently only supports Java map or JSON string (not yet YAML)");
- ConfigKey<String> BLUEPRINT_TYPE = ConfigKeys.newStringConfigKey("blueprintType");
- ConfigKey<Map<String,Object>> BLUEPRINT_CONFIG = new MapConfigKey<Object>(Object.class, "blueprintConfig");
- Effector<String> DEPLOY_BLUEPRINT = Effectors.effector(String.class, "deployBlueprint")
- .description("Deploy a blueprint, either given a plan (as Java map or JSON string for a map), or given URL and optional config")
- .parameter(BLUEPRINT_TYPE)
- .parameter(BLUEPRINT_CONFIG)
- .parameter(BLUEPRINT_CAMP_PLAN)
- .buildAbstract();
- }
-
- public static final Effector<String> DEPLOY_BLUEPRINT = DeployBlueprintEffector.DEPLOY_BLUEPRINT;
-
- public interface ShutdownEffector {
- ConfigKey<Boolean> STOP_APPS_FIRST = ConfigKeys.newBooleanConfigKey("stopAppsFirst", "Whether to stop apps before shutting down");
- ConfigKey<Boolean> FORCE_SHUTDOWN_ON_ERROR = ConfigKeys.newBooleanConfigKey("forceShutdownOnError", "Force shutdown if apps fail to stop or timeout");
- ConfigKey<Duration> SHUTDOWN_TIMEOUT = ConfigKeys.newConfigKey(Duration.class, "shutdownTimeout", "A maximum delay to wait for apps to gracefully stop before giving up or forcibly exiting");
- ConfigKey<Duration> REQUEST_TIMEOUT = ConfigKeys.newConfigKey(Duration.class, "requestTimeout", "Maximum time to block the request for the shutdown to finish, 0 to wait infinitely");
- ConfigKey<Duration> DELAY_FOR_HTTP_RETURN = ConfigKeys.newConfigKey(Duration.class, "delayForHttpReturn", "The delay before exiting the process, to permit the REST response to be returned");
- Effector<Void> SHUTDOWN = Effectors.effector(Void.class, "shutdown")
- .description("Shutdown the remote brooklyn instance (stops via the REST API only; leaves any VM)")
- .parameter(STOP_APPS_FIRST)
- .parameter(FORCE_SHUTDOWN_ON_ERROR)
- .parameter(SHUTDOWN_TIMEOUT)
- .parameter(REQUEST_TIMEOUT)
- .parameter(DELAY_FOR_HTTP_RETURN)
- .buildAbstract();
- }
-
- public static final Effector<Void> SHUTDOWN = ShutdownEffector.SHUTDOWN;
-
- public interface StopNodeButLeaveAppsEffector {
- ConfigKey<Duration> TIMEOUT = ConfigKeys.newConfigKey(Duration.class, "timeout", "How long to wait before giving up on stopping the node", Duration.ONE_HOUR);
- Effector<Void> STOP_NODE_BUT_LEAVE_APPS = Effectors.effector(Void.class, "stopNodeButLeaveApps")
- .description("Stop the Brooklyn process, and any VM created, and unmanage this entity; but if it was managing other applications, leave them running")
- .parameter(TIMEOUT)
- .buildAbstract();
- }
-
- public static final Effector<Void> STOP_NODE_BUT_LEAVE_APPS = StopNodeButLeaveAppsEffector.STOP_NODE_BUT_LEAVE_APPS;
-
- public interface StopNodeAndKillAppsEffector {
- ConfigKey<Duration> TIMEOUT = ConfigKeys.newConfigKey(Duration.class, "timeout", "How long to wait before giving up on stopping the node", Duration.ONE_HOUR);
- Effector<Void> STOP_NODE_AND_KILL_APPS = Effectors.effector(Void.class, "stopNodeAndKillApps")
- .description("Stop all apps managed by the Brooklyn process, stop the process, and any VM created, and unmanage this entity")
- .parameter(TIMEOUT)
- .buildAbstract();
- }
-
- public static final Effector<Void> STOP_NODE_AND_KILL_APPS = StopNodeAndKillAppsEffector.STOP_NODE_AND_KILL_APPS;
-
- public interface SetHighAvailabilityPriorityEffector {
- ConfigKey<Integer> PRIORITY = ConfigKeys.newIntegerConfigKey("priority", "HA priority");
- Effector<Integer> SET_HIGH_AVAILABILITY_PRIORITY = Effectors.effector(Integer.class, "setHighAvailabilityPriority")
- .description("Set the HA priority on the node, returning the old priority")
- .parameter(PRIORITY)
- .buildAbstract();
- }
-
- public static final Effector<Integer> SET_HIGH_AVAILABILITY_PRIORITY = SetHighAvailabilityPriorityEffector.SET_HIGH_AVAILABILITY_PRIORITY;
-
- public interface SetHighAvailabilityModeEffector {
- ConfigKey<HighAvailabilityMode> MODE = ConfigKeys.newConfigKey(HighAvailabilityMode.class, "mode", "HA mode");
- Effector<ManagementNodeState> SET_HIGH_AVAILABILITY_MODE = Effectors.effector(ManagementNodeState.class, "setHighAvailabilityMode")
- .description("Set the HA mode on the node, returning the existing state")
- .parameter(MODE)
- .buildAbstract();
- }
-
- public static final Effector<ManagementNodeState> SET_HIGH_AVAILABILITY_MODE = SetHighAvailabilityModeEffector.SET_HIGH_AVAILABILITY_MODE;
-
- public EntityHttpClient http();
-}
http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/64c2b2e5/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeDriver.java
----------------------------------------------------------------------
diff --git a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeDriver.java b/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeDriver.java
deleted file mode 100644
index df27e1f..0000000
--- a/software/base/src/main/java/brooklyn/entity/brooklynnode/BrooklynNodeDriver.java
+++ /dev/null
@@ -1,27 +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.brooklynnode;
-
-import brooklyn.entity.java.JavaSoftwareProcessDriver;
-
-public interface BrooklynNodeDriver extends JavaSoftwareProcessDriver {
-
- void clearInstallDir();
-
-}