Repository: incubator-brooklyn Updated Branches: refs/heads/master 6212d198a -> 5d8ae8f44
Make SoftwareProcessImpl *much* fussier about which config it implicitly adds to the list of required open ports. Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/21e55409 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/21e55409 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/21e55409 Branch: refs/heads/master Commit: 21e554096b2da926f66799851449733743c0d4dd Parents: 6212d19 Author: Alasdair Hodge <[email protected]> Authored: Fri Aug 28 18:24:15 2015 +0100 Committer: Alasdair Hodge <[email protected]> Committed: Fri Aug 28 18:24:15 2015 +0100 ---------------------------------------------------------------------- .../software/base/SoftwareProcessImpl.java | 31 ++++++++------------ .../base/SoftwareProcessEntityTest.java | 19 ++++++++++++ 2 files changed, 31 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/21e55409/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java ---------------------------------------------------------------------- diff --git a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java index a777dcd..54b7c47 100644 --- a/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java +++ b/software/base/src/main/java/org/apache/brooklyn/entity/software/base/SoftwareProcessImpl.java @@ -47,15 +47,13 @@ import org.apache.brooklyn.core.entity.Attributes; import org.apache.brooklyn.core.entity.BrooklynConfigKeys; import org.apache.brooklyn.core.entity.Entities; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; -import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic; import org.apache.brooklyn.core.entity.lifecycle.Lifecycle.Transition; +import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic.ServiceNotUpLogic; import org.apache.brooklyn.core.location.LocationConfigKeys; import org.apache.brooklyn.core.location.cloud.CloudLocationConfig; import org.apache.brooklyn.feed.function.FunctionFeed; import org.apache.brooklyn.feed.function.FunctionPollConfig; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.apache.brooklyn.location.ssh.SshMachineLocation; import org.apache.brooklyn.util.collections.MutableMap; import org.apache.brooklyn.util.collections.MutableSet; @@ -68,6 +66,8 @@ import org.apache.brooklyn.util.guava.Maybe; import org.apache.brooklyn.util.time.CountdownTimer; import org.apache.brooklyn.util.time.Duration; import org.apache.brooklyn.util.time.Time; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; @@ -487,6 +487,7 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft * for each {@link org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey} config key {@link PortRange} * plus any ports defined with a config keys ending in {@code .port}. */ + @SuppressWarnings("serial") protected Collection<Integer> getRequiredOpenPorts() { Set<Integer> ports = MutableSet.copyOf(getConfig(REQUIRED_OPEN_LOGIN_PORTS)); Map<ConfigKey<?>, ?> allConfig = config().getBag().getAllConfigAsConfigKeyMap(); @@ -498,24 +499,16 @@ public abstract class SoftwareProcessImpl extends AbstractEntity implements Soft firewall will open the initial port instead. Mostly a problem for SameServerEntity, localhost location. */ for (ConfigKey<?> k: configKeys) { - Object value; if (PortRange.class.isAssignableFrom(k.getType()) || k.getName().matches(".*\\.port")) { - value = config().get(k); - } else { - // config().get() will cause this to block until all config has been resolved - // using config().getRaw(k) means that we won't be able to use e.g. 'http.port: $brooklyn:component("x").attributeWhenReady("foo")' - // but that's unlikely to be used - Maybe<Object> maybeValue = config().getRaw(k); - value = maybeValue.isPresent() ? maybeValue.get() : null; - } - - Maybe<PortRange> maybePortRange = TypeCoercions.tryCoerce(value, new TypeToken<PortRange>() {}); - - if (maybePortRange.isPresentAndNonNull()) { - PortRange p = maybePortRange.get(); - if (p != null && !p.isEmpty()) ports.add(p.iterator().next()); + Object value = config().get(k); + Maybe<PortRange> maybePortRange = TypeCoercions.tryCoerce(value, new TypeToken<PortRange>() {}); + if (maybePortRange.isPresentAndNonNull()) { + PortRange p = maybePortRange.get(); + if (p != null && !p.isEmpty()) + ports.add(p.iterator().next()); + } } - } + } log.debug("getRequiredOpenPorts detected default {} for {}", ports, this); return ports; http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/21e55409/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java ---------------------------------------------------------------------- diff --git a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java index eb77899..0b71a5a 100644 --- a/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java +++ b/software/base/src/test/java/org/apache/brooklyn/entity/software/base/SoftwareProcessEntityTest.java @@ -53,6 +53,7 @@ import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; import org.apache.brooklyn.core.entity.lifecycle.ServiceStateLogic; import org.apache.brooklyn.core.entity.trait.Startable; import org.apache.brooklyn.core.location.Locations; +import org.apache.brooklyn.core.location.PortRanges; import org.apache.brooklyn.core.location.SimulatedLocation; import org.apache.brooklyn.core.sensor.PortAttributeSensorAndConfigKey; import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; @@ -134,6 +135,24 @@ public class SoftwareProcessEntityTest extends BrooklynAppUnitTestSupport { } @Test + public void testRequiredPortsFromConfig() throws Exception { + // getRequiredOpenPorts() should only consider numeric and string config whose names end in '.port' + MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class) + .configure("foo.number.port", 1111) + .configure("foo.string.port", "2222") + .configure("foo.number.somethingElse", 3333) + .configure("foo.string.somethingElse", "4444") + ); + entity.start(ImmutableList.of(loc)); + + Collection<Integer> requiredPorts = entity.getRequiredOpenPorts(); + assertTrue(requiredPorts.contains(1111)); + assertTrue(requiredPorts.contains(2222)); + assertFalse(requiredPorts.contains(3333)); + assertFalse(requiredPorts.contains(4444)); + } + + @Test public void testProcessTemplateWithExtraSubstitutions() throws Exception { MyService entity = app.createAndManageChild(EntitySpec.create(MyService.class)); entity.start(ImmutableList.of(loc));
