private void testLocationUnmanagedOnStop(LocationSpec<? extends Location> locationSpec) {
    EntitySpec<BasicApplication> appSpec =
        EntitySpec.create(BasicApplication.class)
            .location(locationSpec)
            .child(
                EntitySpec.create(EmptySoftwareProcess.class)
                    .configure(BrooklynConfigKeys.SKIP_ON_BOX_BASE_DIR_RESOLUTION, Boolean.TRUE)
                    .configure(EmptySoftwareProcess.USE_SSH_MONITORING, Boolean.FALSE));

    BasicApplication app = mgmt.getEntityManager().createEntity(appSpec);
    Entity child = Iterables.getOnlyElement(app.getChildren());

    Assert.assertEquals(child.getLocations(), ImmutableList.of());

    app.start(ImmutableList.<Location>of());
    Location appLocation = Iterables.getOnlyElement(app.getLocations());
    assertOwned(app, appLocation);
    Location entityLocation = Iterables.getOnlyElement(child.getLocations());
    // No owner tag because it's created by SoftwareProcess, not by Brooklyn internals
    assertNotOwned(entityLocation);
    app.stop();

    Assert.assertEquals(child.getLocations(), ImmutableList.of());

    Assert.assertFalse(mgmt.getEntityManager().isManaged(child));
    Assert.assertFalse(mgmt.getEntityManager().isManaged(app));
    Set<Location> locs = ImmutableSet.copyOf(mgmt.getLocationManager().getLocations());
    Assert.assertFalse(
        locs.contains(entityLocation), locs + " should not contain " + entityLocation);
    Assert.assertFalse(locs.contains(appLocation), locs + " should not contain " + appLocation);
  }
  @Override
  public void initApp() {
    StringConfigMap config = getManagementContext().getConfig();

    GeoscalingDnsService geoDns =
        addChild(
            EntitySpec.create(GeoscalingDnsService.class)
                .displayName("GeoScaling DNS")
                .configure(
                    "username",
                    checkNotNull(config.getFirst("brooklyn.geoscaling.username"), "username"))
                .configure(
                    "password",
                    checkNotNull(config.getFirst("brooklyn.geoscaling.password"), "password"))
                .configure(
                    "primaryDomainName",
                    checkNotNull(
                        config.getFirst("brooklyn.geoscaling.primaryDomain"), "primaryDomain"))
                .configure("smartSubdomainName", "brooklyn"));

    DynamicRegionsFabric webFabric =
        addChild(
            EntitySpec.create(DynamicRegionsFabric.class)
                .displayName("Web Fabric")
                .configure(DynamicRegionsFabric.FACTORY, new ElasticJavaWebAppService.Factory())

                // specify the WAR file to use
                .configure(
                    JavaWebAppService.ROOT_WAR, Entities.getRequiredUrlConfig(this, WAR_PATH)));

    // tell GeoDNS what to monitor
    geoDns.setTargetEntityProvider(webFabric);
  }
 @Test
 public void testUnresolvedCatalogItemParameters() {
   // Insert template which is not instantiatable during catalog addition due to
   // missing dependencies, but the spec can be created (the
   // dependencies are already parsed).
   addCatalogItems(
       "brooklyn.catalog:",
       "  version: " + TEST_VERSION,
       "  items:",
       "  - id: " + SYMBOLIC_NAME,
       "    itemType: template",
       "    item:",
       "      services:",
       "      - type: basic-app",
       "  - id: basic-app",
       "    itemType: entity",
       "    item:",
       "      type: " + ConfigAppForTest.class.getName());
   EntitySpec<? extends Application> spec =
       createAppSpec("services:", "- type: " + ver(SYMBOLIC_NAME));
   List<SpecParameter<?>> params = spec.getParameters();
   assertEquals(
       params.size(),
       4,
       "Wrong number of params: "
           + params); // sample + defaultDisplayName + destroy_on_stop + start.latch
   assertEquals(
       ImmutableSet.copyOf(params),
       ImmutableSet.copyOf(BasicSpecParameter.fromClass(mgmt(), ConfigAppForTest.class)));
 }
 @Test
 public void testStartsWhenNoStartableChildren() {
   BasicStartable startable =
       app.createAndManageChild(
           EntitySpec.create(BasicStartable.class).child(EntitySpec.create(BasicEntity.class)));
   app.start(ImmutableList.of(app.newSimulatedLocation()));
   EntityAsserts.assertAttributeEquals(
       startable, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.RUNNING);
 }
  @Test
  public void testDefaultIsAllLocations() throws Exception {
    BasicStartable startable = app.addChild(EntitySpec.create(BasicStartable.class));
    TestEntity entity = startable.addChild(EntitySpec.create(TestEntity.class));
    TestEntity entity2 = startable.addChild(EntitySpec.create(TestEntity.class));
    app.start(ImmutableList.of(loc1, loc2));

    assertEqualsIgnoringOrder(entity.getLocations(), ImmutableSet.of(loc1, loc2));
    assertEqualsIgnoringOrder(entity2.getLocations(), ImmutableSet.of(loc1, loc2));
  }
 @Test
 public void testAppServiceParameters() throws Exception {
   EntitySpec<? extends Application> spec =
       createAppSpec(
           "services:",
           "- type: " + BasicApplication.class.getName(),
           "  brooklyn.parameters:",
           "  - simple");
   List<SpecParameter<?>> inputs = spec.getParameters();
   assertEquals(inputs.size(), 4);
   SpecParameter<?> firstInput = inputs.get(0);
   assertEquals(firstInput.getLabel(), "simple");
 }
  @Override
  public void init() {
    LOG.info("Starting Calico network id {}", getId());
    super.init();

    EntitySpec<?> agentSpec =
        EntitySpec.create(config().get(CALICO_NODE_SPEC)).configure(CalicoNode.SDN_PROVIDER, this);
    String calicoVersion = config().get(CALICO_VERSION);
    if (Strings.isNonBlank(calicoVersion)) {
      agentSpec.configure(SoftwareProcess.SUGGESTED_VERSION, calicoVersion);
    }
    sensors().set(SDN_AGENT_SPEC, agentSpec);
  }
 @Override
 @BeforeMethod(alwaysRun = true)
 public void setUp() throws Exception {
   super.setUp();
   origCluster =
       origApp.createAndManageChild(
           EntitySpec.create(DynamicCluster.class)
               .configure("memberSpec", EntitySpec.create(TestEntity.class)));
   origEntity = origApp.createAndManageChild(EntitySpec.create(TestEntity.class));
   origLoc =
       origManagementContext
           .getLocationManager()
           .createLocation(LocationSpec.create(SimulatedLocation.class));
 }
  private Response launch(String yaml, EntitySpec<? extends Application> spec) {
    try {
      Application app = EntityManagementUtils.createUnstarted(mgmt(), spec);
      CreationResult<Application, Void> result = EntityManagementUtils.start(app);

      boolean isEntitled =
          Entitlements.isEntitled(
              mgmt().getEntitlementManager(),
              Entitlements.INVOKE_EFFECTOR,
              EntityAndItem.of(app, StringAndArgument.of(Startable.START.getName(), null)));

      if (!isEntitled) {
        throw WebResourceUtils.unauthorized(
            "User '%s' is not authorized to start application %s",
            Entitlements.getEntitlementContext().user(), spec.getType());
      }

      log.info("Launched from YAML: " + yaml + " -> " + app + " (" + result.task() + ")");

      URI ref = URI.create(app.getApplicationId());
      ResponseBuilder response = created(ref);
      if (result.task() != null) response.entity(TaskTransformer.FROM_TASK.apply(result.task()));
      return response.build();
    } catch (ConstraintViolationException e) {
      throw new UserFacingException(e);
    } catch (Exception e) {
      throw Exceptions.propagate(e);
    }
  }
  // TODO BROOKLYN-272, Disabled, because fails non-deterministically in jenkins: BROOKLYN-256
  //    java.lang.AssertionError: Expected: eventually IsEqualTo([starting, running, stopping,
  // stopped]); got most recently: [starting, running, starting, running, stopping, stopped] (waited
  // 1s 11ms 498us 762ns, checked 100)
  //        at org.apache.brooklyn.test.Asserts.fail(Asserts.java:721)
  //        at org.apache.brooklyn.test.Asserts.eventually(Asserts.java:791)
  //        at org.apache.brooklyn.test.Asserts.eventually(Asserts.java:751)
  //        at
  // org.apache.brooklyn.entity.stock.BasicStartableTest.testTransitionsThroughLifecycles(BasicStartableTest.java:170)
  @Test(groups = {"Broken"})
  public void testTransitionsThroughLifecycles() throws Exception {
    BasicStartable startable = app.addChild(EntitySpec.create(BasicStartable.class));
    EntityAsserts.assertAttributeEqualsEventually(
        app, Attributes.SERVICE_STATE_ACTUAL, Lifecycle.STOPPED);

    final RecordingSensorEventListener<Lifecycle> listener =
        new RecordingSensorEventListener<Lifecycle>(true);
    mgmt.getSubscriptionContext(startable)
        .subscribe(startable, Attributes.SERVICE_STATE_ACTUAL, listener);

    app.start(ImmutableList.of(loc1));
    app.config().set(StartableApplication.DESTROY_ON_STOP, false);
    app.stop();

    Iterable<Lifecycle> expected =
        Lists.newArrayList(
            Lifecycle.STARTING, Lifecycle.RUNNING, Lifecycle.STOPPING, Lifecycle.STOPPED);
    Asserts.eventually(
        new Supplier<Iterable<Lifecycle>>() {
          @Override
          public Iterable<Lifecycle> get() {
            return MutableList.copyOf(listener.getEventValuesSortedByTimestamp());
          }
        },
        Predicates.equalTo(expected));
  }
  /** Test that a core can be created and used with SolrJ client. */
  @Test(groups = "Integration")
  public void testConnection() throws Exception {
    solr =
        app.createAndManageChild(
            EntitySpec.create(SolrServer.class)
                .configure(
                    SolrServer.SOLR_CORE_CONFIG,
                    ImmutableMap.of("example", "classpath://solr/example.tgz")));
    app.start(ImmutableList.of(testLocation));

    EntityAsserts.assertAttributeEqualsEventually(solr, Startable.SERVICE_UP, true);

    SolrJSupport client = new SolrJSupport(solr, "example");

    Iterable<SolrDocument> results = client.getDocuments();
    assertTrue(Iterables.isEmpty(results));

    client.addDocument(MutableMap.<String, Object>of("id", "1", "description", "first"));
    client.addDocument(MutableMap.<String, Object>of("id", "2", "description", "second"));
    client.addDocument(MutableMap.<String, Object>of("id", "3", "description", "third"));
    client.commit();

    results = client.getDocuments();
    assertEquals(Iterables.size(results), 3);
  }
  @BeforeMethod(alwaysRun = true)
  public void setUp() throws Exception {
    events = new CopyOnWriteArrayList<SensorEvent<FailureDescriptor>>();

    managementContext = new LocalManagementContextForTests();
    app = ApplicationBuilder.newManagedApp(TestApplication.class, managementContext);
    e1 = app.createAndManageChild(EntitySpec.create(TestEntity.class));
    e1.sensors().set(TestEntity.SERVICE_UP, true);
    ServiceStateLogic.setExpectedState(e1, Lifecycle.RUNNING);

    app.getManagementContext()
        .getSubscriptionManager()
        .subscribe(
            e1,
            HASensors.ENTITY_FAILED,
            new SensorEventListener<FailureDescriptor>() {
              @Override
              public void onEvent(SensorEvent<FailureDescriptor> event) {
                events.add(event);
              }
            });
    app.getManagementContext()
        .getSubscriptionManager()
        .subscribe(
            e1,
            HASensors.ENTITY_RECOVERED,
            new SensorEventListener<FailureDescriptor>() {
              @Override
              public void onEvent(SensorEvent<FailureDescriptor> event) {
                events.add(event);
              }
            });
  }
 @BeforeMethod(alwaysRun = true)
 @Override
 public void setUp() throws Exception {
   super.setUp();
   loc = new LocalhostMachineProvisioningLocation();
   entity = app.createAndManageChild(EntitySpec.create(TestEntity.class));
   app.start(ImmutableList.of(loc));
 }
  @Override
  protected void doTest(Location loc) throws Exception {
    RiakNode entity =
        app.createAndManageChild(
            EntitySpec.create(RiakNode.class).configure(RiakNode.SUGGESTED_VERSION, "2.1.1"));
    app.start(ImmutableList.of(loc));

    EntityTestUtils.assertAttributeEqualsEventually(entity, RiakNode.SERVICE_UP, true);
  }
  @Test
  public void testAppSpecInheritsCatalogRootParameters() {
    addCatalogItems(
        "brooklyn.catalog:",
        "  id: " + SYMBOLIC_NAME,
        "  version: " + TEST_VERSION,
        "  itemType: entity",
        "  item:",
        "    type: " + BasicApplication.class.getName(),
        "    brooklyn.parameters:",
        "    - simple");

    EntitySpec<? extends Application> spec =
        createAppSpec("services:", "- type: " + ver(SYMBOLIC_NAME));
    List<SpecParameter<?>> params = spec.getParameters();
    assertEquals(params.size(), 4);
    assertTrue(Iterables.tryFind(params, nameEqualTo("simple")).isPresent());
    assertTrue(Iterables.tryFind(params, labelEqualTo("simple")).isPresent());
  }
 @BeforeMethod(alwaysRun = true)
 @Override
 public void setUp() throws Exception {
   catalogPersistenceWasEnabled =
       BrooklynFeatureEnablement.isEnabled(
           BrooklynFeatureEnablement.FEATURE_CATALOG_PERSISTENCE_PROPERTY);
   BrooklynFeatureEnablement.enable(
       BrooklynFeatureEnablement.FEATURE_CATALOG_PERSISTENCE_PROPERTY);
   super.setUp();
   origApp.createAndManageChild(EntitySpec.create(TestEntity.class));
 }
 @Override
 public void addHost(DockerHost host) {
   SshMachineLocation machine = host.getDynamicLocation().getMachine();
   EntitySpec<?> spec =
       EntitySpec.create(sensors().get(SDN_AGENT_SPEC))
           .configure(CalicoNode.DOCKER_HOST, host)
           .configure(CalicoNode.ETCD_NODE, host.sensors().get(DockerHost.ETCD_NODE));
   CalicoNode agent = (CalicoNode) getAgents().addChild(spec);
   getAgents().addMember(agent);
   agent.start(ImmutableList.of(machine));
   if (LOG.isDebugEnabled()) LOG.debug("{} added calico plugin {}", this, agent);
 }
  /** Test that a node starts and sets SERVICE_UP correctly. */
  @Test(groups = "Integration")
  public void canStartupAndShutdown() {
    solr = app.createAndManageChild(EntitySpec.create(SolrServer.class));
    app.start(ImmutableList.of(testLocation));

    EntityAsserts.assertAttributeEqualsEventually(solr, Startable.SERVICE_UP, true);
    Entities.dumpInfo(app);

    solr.stop();

    EntityAsserts.assertAttributeEqualsEventually(solr, Startable.SERVICE_UP, false);
  }
  @BeforeMethod(alwaysRun = true)
  @Override
  public void setUp() throws Exception {
    super.setUp();

    entities = Lists.newArrayList();
    for (int i = 0; i < 10; i++) {
      entities.add(app.createAndManageChild(EntitySpec.create(TestEntity.class)));
    }
    entity = entities.get(0);

    app.start(ImmutableList.of(loc));
  }
  @Test
  public void testAppliesFilterToEntities() throws Exception {
    final List<Object> contexts = Lists.newCopyOnWriteArrayList();

    LocationsFilter filter =
        new LocationsFilter() {
          private static final long serialVersionUID = 7078046521812992013L;

          @Override
          public List<Location> filterForContext(List<Location> locations, Object context) {
            contexts.add(context);
            assertEquals(locations, ImmutableList.of(loc1, loc2));
            if (context instanceof Entity) {
              String entityName = ((Entity) context).getDisplayName();
              if ("1".equals(entityName)) {
                return ImmutableList.<Location>of(loc1);
              } else if ("2".equals(entityName)) {
                return ImmutableList.<Location>of(loc2);
              } else {
                return ImmutableList.<Location>of();
              }
            } else {
              return ImmutableList.<Location>of();
            }
          }
        };
    BasicStartable startable =
        app.addChild(
            EntitySpec.create(BasicStartable.class)
                .configure(BasicStartable.LOCATIONS_FILTER, filter));
    TestEntity entity = startable.addChild(EntitySpec.create(TestEntity.class).displayName("1"));
    TestEntity entity2 = startable.addChild(EntitySpec.create(TestEntity.class).displayName("2"));
    app.start(ImmutableList.of(loc1, loc2));

    assertEqualsIgnoringOrder(entity.getLocations(), ImmutableSet.of(loc1));
    assertEqualsIgnoringOrder(entity2.getLocations(), ImmutableSet.of(loc2));
    assertEqualsIgnoringOrder(contexts, ImmutableList.of(entity, entity2));
  }
  @BeforeMethod(alwaysRun = true)
  public void setUp() throws Exception {
    jmxObjectName = new ObjectName(objectName);

    // Create an entity and configure it with the above JMX service
    app = TestApplication.Factory.newManagedInstanceForTests();
    entity =
        app.createAndManageChild(EntitySpec.create(TestEntity.class).impl(TestEntityWithJmx.class));
    app.start(ImmutableList.of(new SimulatedLocation()));

    jmxHelper = new JmxHelper(entity);

    jmxService = new JmxService(entity);
  }
  @Test
  public void testChildEntitiyHasParameters() {
    addCatalogItems(
        "brooklyn.catalog:",
        "  id: " + SYMBOLIC_NAME,
        "  version: " + TEST_VERSION,
        "  itemType: entity",
        "  item:",
        "    type: " + ConfigEntityForTest.class.getName(),
        "    brooklyn.children:",
        "    - type: " + ConfigEntityForTest.class.getName(),
        "      brooklyn.parameters:",
        "      - simple");

    CatalogItem<?, ?> item = catalog.getCatalogItem(SYMBOLIC_NAME, TEST_VERSION);
    @SuppressWarnings({"rawtypes", "unchecked"})
    EntitySpec<?> parentSpec = (EntitySpec<?>) catalog.createSpec((CatalogItem) item);
    EntitySpec<?> spec = parentSpec.getChildren().get(0);
    List<SpecParameter<?>> params = spec.getParameters();
    assertEquals(params.size(), 3);
    assertTrue(Iterables.tryFind(params, nameEqualTo("simple")).isPresent());
    assertTrue(Iterables.tryFind(params, labelEqualTo("simple")).isPresent());
  }
  @Test
  public void testIgnoresUnstartableEntities() throws Exception {
    final AtomicReference<Exception> called = new AtomicReference<Exception>();
    LocationsFilter filter =
        new LocationsFilter() {
          private static final long serialVersionUID = -5625121945234751178L;

          @Override
          public List<Location> filterForContext(List<Location> locations, Object context) {
            called.set(new Exception());
            return locations;
          }
        };
    BasicStartable startable =
        app.addChild(
            EntitySpec.create(BasicStartable.class)
                .configure(BasicStartable.LOCATIONS_FILTER, filter));
    BasicEntity entity = startable.addChild(EntitySpec.create(BasicEntity.class));
    app.start(ImmutableList.of(loc1, loc2));

    assertEqualsIgnoringOrder(entity.getLocations(), ImmutableSet.of());
    assertNull(called.get());
  }
  public List<String> scanFrameworks(JsonArray frameworks) {
    List<String> frameworkNames = MutableList.<String>of();
    for (int i = 0; i < frameworks.size(); i++) {
      JsonObject task = frameworks.get(i).getAsJsonObject();
      String id = task.get("id").getAsString();
      JsonElement pidObj = task.get("pid");
      String pid = null;
      if (pidObj != null && !pidObj.isJsonNull()) {
        pid = pidObj.getAsString();
      }
      String name = task.get("name").getAsString();
      String url = task.get("webui_url").getAsString();
      frameworkNames.add(name);

      Optional<Entity> entity =
          Iterables.tryFind(
              sensors().get(MESOS_FRAMEWORKS).getMembers(),
              Predicates.compose(
                  Predicates.equalTo(id), EntityFunctions.attribute(MesosFramework.FRAMEWORK_ID)));
      if (entity.isPresent()) continue;

      EntitySpec<? extends MesosFramework> frameworkSpec =
          EntitySpec.create(
                  FRAMEWORKS.containsKey(name)
                      ? FRAMEWORKS.get(name)
                      : EntitySpec.create(MesosFramework.class))
              .configure(MesosFramework.FRAMEWORK_ID, id)
              .configure(MesosFramework.FRAMEWORK_PID, pid)
              .configure(MesosFramework.FRAMEWORK_NAME, name)
              .configure(MesosFramework.FRAMEWORK_URL, url)
              .configure(MesosFramework.MESOS_CLUSTER, this)
              .displayName(String.format("%s Framework", Strings.toInitialCapOnly(name)));
      MesosFramework added = sensors().get(MESOS_FRAMEWORKS).addMemberChild(frameworkSpec);
      added.start(ImmutableList.<Location>of());
    }
    return frameworkNames;
  }
  @Override
  protected void doTest(Location loc) throws Exception {
    MySqlNode mysql =
        app.createAndManageChild(
            EntitySpec.create(MySqlNode.class)
                .configure(
                    DatastoreCommon.CREATION_SCRIPT_CONTENTS, MySqlIntegrationTest.CREATION_SCRIPT)
                .configure("test.table.name", "COMMENTS"));

    app.start(ImmutableList.of(loc));

    new VogellaExampleAccess(
            "com.mysql.jdbc.Driver", mysql.getAttribute(DatastoreCommon.DATASTORE_URL))
        .readModifyAndRevertDataBase();
  }
  public static void main(String[] argv) {
    List<String> args = Lists.newArrayList(argv);
    String port = CommandLineUtil.getCommandLineOption(args, "--port", "8081+");
    String locations =
        CommandLineUtil.getCommandLineOption(
            args, "--locations", Joiner.on(",").join(DEFAULT_LOCATIONS));

    BrooklynLauncher launcher =
        BrooklynLauncher.newInstance()
            .application(
                EntitySpec.create(StartableApplication.class, GlobalWebFabricExample.class)
                    .displayName("Brooklyn Global Web Fabric Example"))
            .webconsolePort(port)
            .locations(Arrays.asList(locations))
            .start();

    Entities.dumpInfo(launcher.getApplications());
  }
@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;
}
  @Test
  public void testEntityCreatingItsEnricherDoesNotReCreateItUnlessUniqueTagDifferent()
      throws Exception {
    TestEntity e1 =
        origApp.createAndManageChild(
            EntitySpec.create(TestEntity.class, MyTestEntityWithEnricher.class));
    Collection<Enricher> e1e = e1.getEnrichers();
    log.info("enrichers1: " + e1e);
    Entities.dumpInfo(e1);
    assertEquals(e1e.size(), 5);

    newApp = (TestApplication) rebind();
    Entity e2 =
        Iterables.getOnlyElement(
            Entities.descendants(newApp, EntityPredicates.idEqualTo(e1.getId())));
    Collection<Enricher> e2e = e2.getEnrichers();
    log.info("enrichers2: " + e2e);
    Entities.dumpInfo(e2);

    assertEquals(e2e.size(), e1e.size() + 1);
  }
 @Override
 public void init() {
   super.init();
   checkNotNull(
       getConfig(HOSTNAME_SENSOR),
       "%s requires value for %s",
       getClass().getName(),
       HOSTNAME_SENSOR);
   DynamicGroup entities =
       addChild(
           EntitySpec.create(DynamicGroup.class)
               .configure(DynamicGroup.ENTITY_FILTER, getEntityFilter()));
   setAttribute(ENTITIES, entities);
   setAttribute(A_RECORDS, ImmutableMap.<String, String>of());
   setAttribute(CNAME_RECORDS, ImmutableMultimap.<String, String>of());
   setAttribute(PTR_RECORDS, ImmutableMap.<String, String>of());
   setAttribute(ADDRESS_MAPPINGS, ImmutableMultimap.<String, String>of());
   synchronized (serialMutex) {
     setAttribute(SERIAL, System.currentTimeMillis());
   }
 }
 public RabbitQueue createQueue(Map properties) {
   RabbitQueue result = addChild(EntitySpec.create(RabbitQueue.class).configure(properties));
   result.create();
   return result;
 }