Return-Path: X-Original-To: archive-asf-public-internal@cust-asf2.ponee.io Delivered-To: archive-asf-public-internal@cust-asf2.ponee.io Received: from cust-asf.ponee.io (cust-asf.ponee.io [163.172.22.183]) by cust-asf2.ponee.io (Postfix) with ESMTP id 83F7E200C36 for ; Fri, 10 Mar 2017 11:38:30 +0100 (CET) Received: by cust-asf.ponee.io (Postfix) id 829A9160B82; Fri, 10 Mar 2017 10:38:30 +0000 (UTC) Delivered-To: archive-asf-public@cust-asf.ponee.io Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by cust-asf.ponee.io (Postfix) with SMTP id 93651160B69 for ; Fri, 10 Mar 2017 11:38:29 +0100 (CET) Received: (qmail 66866 invoked by uid 500); 10 Mar 2017 10:38:28 -0000 Mailing-List: contact commits-help@brooklyn.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@brooklyn.apache.org Delivered-To: mailing list commits@brooklyn.apache.org Received: (qmail 66857 invoked by uid 99); 10 Mar 2017 10:38:28 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Fri, 10 Mar 2017 10:38:28 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id B3FA6DFF30; Fri, 10 Mar 2017 10:38:28 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: geomacy@apache.org To: commits@brooklyn.apache.org Date: Fri, 10 Mar 2017 10:38:29 -0000 Message-Id: <40d384bd882c41ef930be797f57ecc61@git.apache.org> In-Reply-To: <824fb8232cd54648b89e64564fc8d4f5@git.apache.org> References: <824fb8232cd54648b89e64564fc8d4f5@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [2/4] brooklyn-server git commit: Add generalised Entities.waitFor(entity, condition, timeout) archived-at: Fri, 10 Mar 2017 10:38:30 -0000 Add generalised Entities.waitFor(entity, condition, timeout) Project: http://git-wip-us.apache.org/repos/asf/brooklyn-server/repo Commit: http://git-wip-us.apache.org/repos/asf/brooklyn-server/commit/d72a54b4 Tree: http://git-wip-us.apache.org/repos/asf/brooklyn-server/tree/d72a54b4 Diff: http://git-wip-us.apache.org/repos/asf/brooklyn-server/diff/d72a54b4 Branch: refs/heads/0.10.x Commit: d72a54b43f6a203378edd519f352767fdfc21b80 Parents: 33b5085 Author: Alasdair Hodge Authored: Wed Mar 8 13:21:37 2017 +0000 Committer: Alasdair Hodge Committed: Fri Mar 10 08:29:21 2017 +0000 ---------------------------------------------------------------------- .../apache/brooklyn/core/entity/Entities.java | 38 ++++++++++++-------- .../brooklyn/core/entity/EntitiesTest.java | 20 +++++++++-- 2 files changed, 41 insertions(+), 17 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d72a54b4/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java index 69670ec..0d7e263 100644 --- a/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java +++ b/core/src/main/java/org/apache/brooklyn/core/entity/Entities.java @@ -18,6 +18,9 @@ */ package org.apache.brooklyn.core.entity; +import static org.apache.brooklyn.core.entity.EntityPredicates.attributeEqualTo; +import static org.apache.brooklyn.util.guava.Functionals.isSatisfied; + import java.io.Closeable; import java.io.IOException; import java.io.PrintWriter; @@ -32,7 +35,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.Stack; -import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Semaphore; @@ -1232,24 +1234,32 @@ public class Entities { log.warn("Ignoring "+key+" set on "+entity+" ("+entity.getConfig(key)+")"); } - /** Waits until {@link Startable#SERVICE_UP} returns true. */ - public static void waitForServiceUp(final Entity entity, Duration timeout) { - String description = "Waiting for SERVICE_UP on "+entity; - Tasks.setBlockingDetails(description); + /** Waits until the passed entity satisfies the supplied predicate. */ + public static void waitFor(Entity entity, Predicate condition, Duration timeout) { try { - if (!Repeater.create(description).limitTimeTo(timeout) - .rethrowException().backoffTo(Duration.ONE_SECOND) - .until(new Callable() { - public Boolean call() { - return Boolean.TRUE.equals(entity.getAttribute(Startable.SERVICE_UP)); - }}) - .run()) { - throw new IllegalStateException("Timeout waiting for SERVICE_UP from "+entity); + String description = "Waiting for " + condition + " on " + entity; + Tasks.setBlockingDetails(description); + + Repeater repeater = Repeater.create(description) + .until(isSatisfied(entity, condition)) + .limitTimeTo(timeout) + .backoffTo(Duration.ONE_SECOND) + .rethrowException(); + + if (!repeater.run()) { + throw new IllegalStateException("Timeout waiting for " + condition + " on " + entity); } + } finally { Tasks.resetBlockingDetails(); } - log.debug("Detected SERVICE_UP for software {}", entity); + + log.debug("Detected {} for {}", condition, entity); + } + + /** Waits until {@link Startable#SERVICE_UP} returns true. */ + public static void waitForServiceUp(final Entity entity, Duration timeout) { + waitFor(entity, attributeEqualTo(Startable.SERVICE_UP, true), timeout); } public static void waitForServiceUp(final Entity entity, long duration, TimeUnit units) { waitForServiceUp(entity, Duration.of(duration, units)); http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/d72a54b4/core/src/test/java/org/apache/brooklyn/core/entity/EntitiesTest.java ---------------------------------------------------------------------- diff --git a/core/src/test/java/org/apache/brooklyn/core/entity/EntitiesTest.java b/core/src/test/java/org/apache/brooklyn/core/entity/EntitiesTest.java index 34cddb4..9b1840c 100644 --- a/core/src/test/java/org/apache/brooklyn/core/entity/EntitiesTest.java +++ b/core/src/test/java/org/apache/brooklyn/core/entity/EntitiesTest.java @@ -18,6 +18,7 @@ */ package org.apache.brooklyn.core.entity; +import static org.apache.brooklyn.core.entity.EntityPredicates.applicationIdEqualTo; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertTrue; @@ -26,14 +27,12 @@ import java.util.concurrent.atomic.AtomicReference; import org.apache.brooklyn.api.entity.EntitySpec; import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.entity.EntityAndAttribute; -import org.apache.brooklyn.core.entity.EntityInitializers; import org.apache.brooklyn.core.location.SimulatedLocation; import org.apache.brooklyn.core.test.BrooklynAppUnitTestSupport; import org.apache.brooklyn.core.test.entity.TestEntity; import org.apache.brooklyn.test.Asserts; import org.apache.brooklyn.util.collections.MutableSet; +import org.apache.brooklyn.util.time.Duration; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; @@ -171,4 +170,19 @@ public class EntitiesTest extends BrooklynAppUnitTestSupport { Assert.assertEquals(entity.tags().getTags(), MutableSet.of(app)); } + @Test + public void testWaitFor() throws Exception { + entity = app.createAndManageChild(EntitySpec.create(TestEntity.class)); + Duration timeout = Duration.ONE_MILLISECOND; + + Entities.waitFor(entity, applicationIdEqualTo(app.getApplicationId()), timeout); + + try { + Entities.waitFor(entity, applicationIdEqualTo(app.getApplicationId() + "-wrong"), timeout); + Asserts.shouldHaveFailedPreviously("Entities.waitFor() should have timed out"); + } catch (Exception e) { + Asserts.expectedFailureContains(e, "Timeout waiting for "); + } + } + }