This is an automated email from the ASF dual-hosted git repository. heneveld pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/brooklyn-server.git
commit 6dd3bb6dddc1a8de721488b5aa0dc93dda083679 Author: Alex Heneveld <a...@cloudsoft.io> AuthorDate: Mon Feb 19 09:56:51 2024 +0000 support prescanning entities for dynamic group to see if there are changes --- .../org/apache/brooklyn/entity/group/DynamicGroup.java | 2 ++ .../apache/brooklyn/entity/group/DynamicGroupImpl.java | 15 +++++++++++++-- .../core/workflow/WorkflowConfigSensorEffectorTest.java | 3 +++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroup.java b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroup.java index a4fdace6a9..3e61ec80fc 100644 --- a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroup.java +++ b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroup.java @@ -70,6 +70,8 @@ public interface DynamicGroup extends AbstractGroup { /** Rescans <em>all</em> entities to determine whether they match the filter. */ @Effector(description = "Rescans all entities to determine whether they match the configured filter.") void rescanEntities(); + /** return true/false whether there are any changes detected */ + boolean prescanEntities(); /** Sets {@link #ENTITY_FILTER}, overriding (and rescanning all) if already set. */ void setEntityFilter(Predicate<? super Entity> filter); diff --git a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java index abeaaeeacf..b755b1f314 100644 --- a/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java +++ b/core/src/main/java/org/apache/brooklyn/entity/group/DynamicGroupImpl.java @@ -205,15 +205,23 @@ public class DynamicGroupImpl extends AbstractGroupImpl implements DynamicGroup @Override public void rescanEntities() { + rescanEntitiesInternal(true); + } + + public boolean prescanEntities() { + return rescanEntitiesInternal(false); + } + + protected boolean rescanEntitiesInternal(boolean makeChanges) { synchronized (memberChangeMutex) { if (!isRunning() || !getManagementSupport().isDeployed()) { if (log.isDebugEnabled()) log.debug("{} not scanning for children: stopped", this); - return; + return false; } if (getAncestorToScan() == null) { BrooklynLogging.log(log, BrooklynLogging.levelDependingIfReadOnly(this, LoggingLevel.WARN, LoggingLevel.TRACE, LoggingLevel.TRACE), "{} not (yet) scanning for children: no application defined", this); - return; + return false; } boolean changed = false; Collection<Entity> currentMembers = getMembers(); @@ -225,17 +233,20 @@ public class DynamicGroupImpl extends AbstractGroupImpl implements DynamicGroup toRemove.remove(it); if (!currentMembers.contains(it)) { if (log.isDebugEnabled()) log.debug("{} rescan detected new item {}", this, it); + if (!makeChanges) return true; addMember(it); changed = true; } } for (Entity it : toRemove) { if (log.isDebugEnabled()) log.debug("{} rescan detected vanished item {}", this, it); + if (!makeChanges) return true; removeMember(it); changed = true; } if (changed && log.isDebugEnabled()) log.debug("{} rescan complete, members now {}", this, getMembers()); + return changed; } } diff --git a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowConfigSensorEffectorTest.java b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowConfigSensorEffectorTest.java index ea02bc12b0..d1b81f6231 100644 --- a/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowConfigSensorEffectorTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/workflow/WorkflowConfigSensorEffectorTest.java @@ -194,6 +194,9 @@ public class WorkflowConfigSensorEffectorTest extends RebindTestFixture<TestAppl Entity chilld = Iterables.getOnlyElement(app.getChildren()); Asserts.assertEquals(lastInvocation.getUnchecked(), chilld); + runWorkflow(MutableList.of("let entity x = "+chilld.getId(), "return ${x}")); + Asserts.assertEquals(lastInvocation.getUnchecked(), chilld); + runWorkflow(MutableList.of("let entity x = chilldx", "let y = ${x} ?? missing", "return ${y}"));