/** Walks the contents of a ManagementContext, to create a corresponding memento. */
  public static BrooklynMemento newBrooklynMemento(ManagementContext managementContext) {
    BrooklynMementoImpl.Builder builder = BrooklynMementoImpl.builder();

    for (Application app : managementContext.getApplications()) {
      builder.applicationIds.add(app.getId());
    }
    for (Entity entity : managementContext.getEntityManager().getEntities()) {
      builder.entities.put(
          entity.getId(), ((EntityInternal) entity).getRebindSupport().getMemento());

      for (Location location : entity.getLocations()) {
        if (!builder.locations.containsKey(location.getId())) {
          for (Location locationInHierarchy : TreeUtils.findLocationsInHierarchy(location)) {
            if (!builder.locations.containsKey(locationInHierarchy.getId())) {
              builder.locations.put(
                  locationInHierarchy.getId(),
                  ((LocationInternal) locationInHierarchy).getRebindSupport().getMemento());
            }
          }
        }
      }
    }
    for (LocationMemento memento : builder.locations.values()) {
      if (memento.getParent() == null) {
        builder.topLevelLocationIds.add(memento.getId());
      }
    }

    BrooklynMemento result = builder.build();
    MementoValidators.validateMemento(result);
    return result;
  }
  /**
   * finds the entity indicated by the given ID or name
   *
   * <p>prefers ID based lookup in which case appId is optional, and if supplied will be enforced.
   * optionally the name can be supplied, for cases when paths should work across versions, in which
   * case names will be searched recursively (and the application is required).
   *
   * @throws 404 or 412 (unless input is null in which case output is null)
   */
  public EntityLocal getEntity(String application, String entity) {
    if (entity == null) return null;
    Application app = application != null ? getApplication(application) : null;
    EntityLocal e = (EntityLocal) mgmt.getEntityManager().getEntity(entity);

    if (e != null) {
      if (!Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_ENTITY, e)) {
        throw WebResourceUtils.notFound(
            "Cannot find entity '%s': no known ID and application not supplied for searching",
            entity);
      }

      if (app == null || app.equals(findTopLevelApplication(e))) return e;
      throw WebResourceUtils.preconditionFailed(
          "Application '%s' specified does not match application '%s' to which entity '%s' (%s) is associated",
          application, e.getApplication().getId(), entity, e);
    }
    if (application == null)
      throw WebResourceUtils.notFound(
          "Cannot find entity '%s': no known ID and application not supplied for searching",
          entity);

    assert app != null : "null app should not be returned from getApplication";
    e = searchForEntityNamed(app, entity);
    if (e != null) return e;
    throw WebResourceUtils.notFound(
        "Cannot find entity '%s' in application '%s' (%s)", entity, application, app);
  }
Beispiel #3
0
 @Test
 public void testCreateAndManageChild() {
   TestEntity result = entity.createAndManageChild(TestEntity.Spec.newInstance());
   assertIsProxy(result);
   assertIsProxy(Iterables.get(entity.getChildren(), 0));
   assertIsProxy(result.getParent());
   assertIsProxy(managementContext.getEntityManager().getEntity(result.getId()));
 }
  /**
   * looks for the given application instance, first by ID then by name
   *
   * @throws 404 if not found, or not entitled
   */
  public Application getApplication(String application) {
    Entity e = mgmt.getEntityManager().getEntity(application);
    if (!Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_ENTITY, e)) {
      throw notFound("Application '%s' not found", application);
    }

    if (e != null && e instanceof Application) return (Application) e;
    for (Application app : mgmt.getApplications()) {
      if (app.getId().equals(application)) return app;
      if (application.equalsIgnoreCase(app.getDisplayName())) return app;
    }

    throw notFound("Application '%s' not found", application);
  }
Beispiel #5
0
  @Test
  public void testEntityManagerQueriesGiveProxies() {
    EntityManager entityManager = managementContext.getEntityManager();

    Application retrievedApp = (Application) entityManager.getEntity(app.getId());
    TestEntity retrievedEntity = (TestEntity) entityManager.getEntity(entity.getId());

    assertIsProxy(retrievedApp);
    assertIsProxy(retrievedEntity);

    Collection<Entity> entities = entityManager.getEntities();
    for (Entity e : entities) {
      assertIsProxy(e);
    }
    assertEquals(ImmutableSet.copyOf(entities), ImmutableSet.of(app, entity));
  }
 @Test
 public void testReloadBrooklynPropertiesDeploy() {
   brooklynMgmt.reloadBrooklynProperties();
   CampPlatform reloadedPlatform =
       brooklynMgmt.getConfig().getConfig(BrooklynCampConstants.CAMP_PLATFORM);
   Assert.assertNotNull(reloadedPlatform);
   Reader input =
       Streams.reader(
           new ResourceUtils(this).getResourceFromUrl("test-entity-basic-template.yaml"));
   AssemblyTemplate template = reloadedPlatform.pdp().registerDeploymentPlan(input);
   try {
     Assembly assembly =
         template.getInstantiator().newInstance().instantiate(template, reloadedPlatform);
     LOG.info("Test - created " + assembly);
     final Entity app = brooklynMgmt.getEntityManager().getEntity(assembly.getId());
     LOG.info("App - " + app);
     Assert.assertEquals(app.getDisplayName(), "test-entity-basic-template");
     EntityTestUtils.assertAttributeEqualsEventually(app, Startable.SERVICE_UP, true);
   } catch (Exception e) {
     LOG.warn("Unable to instantiate " + template + " (rethrowing): " + e);
     throw Exceptions.propagate(e);
   }
 }
  @SuppressWarnings("unchecked")
  public Application create(ApplicationSpec spec) {
    log.debug("REST creating application instance for {}", spec);

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

    final String type = spec.getType();
    final String name = spec.getName();
    final Map<String, String> configO = spec.getConfig();
    final Set<EntitySpec> entities =
        (spec.getEntities() == null) ? ImmutableSet.<EntitySpec>of() : spec.getEntities();

    final Application instance;

    // Load the class; first try to use the appropriate catalog item; but then allow anything that
    // is on the classpath
    final Class<? extends Entity> clazz;
    if (Strings.isEmpty(type)) {
      clazz = BasicApplication.class;
    } else {
      Class<? extends Entity> tempclazz;
      try {
        tempclazz = getCatalog().loadClassByType(type, Entity.class);
      } catch (NoSuchElementException e) {
        try {
          tempclazz = (Class<? extends Entity>) getCatalog().getRootClassLoader().loadClass(type);
          log.info(
              "Catalog does not contain item for type {}; loaded class directly instead", type);
        } catch (ClassNotFoundException e2) {
          log.warn(
              "No catalog item for type {}, and could not load class directly; rethrowing", type);
          throw e;
        }
      }
      clazz = tempclazz;
    }
    if (Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, null)) {

      try {
        if (ApplicationBuilder.class.isAssignableFrom(clazz)) {
          Constructor<?> constructor = clazz.getConstructor();
          ApplicationBuilder appBuilder = (ApplicationBuilder) constructor.newInstance();
          if (!Strings.isEmpty(name)) appBuilder.appDisplayName(name);
          if (entities.size() > 0)
            log.warn(
                "Cannot supply additional entities when using an ApplicationBuilder; ignoring in spec {}",
                spec);

          log.info("REST placing '{}' under management", spec.getName());
          appBuilder.configure(convertFlagsToKeys(appBuilder.getType(), configO));
          configureRenderingMetadata(spec, appBuilder);
          instance = appBuilder.manage(mgmt);

        } else if (Application.class.isAssignableFrom(clazz)) {
          brooklyn.entity.proxying.EntitySpec<?> coreSpec = toCoreEntitySpec(clazz, name, configO);
          configureRenderingMetadata(spec, coreSpec);
          instance = (Application) mgmt.getEntityManager().createEntity(coreSpec);
          for (EntitySpec entitySpec : entities) {
            log.info("REST creating instance for entity {}", entitySpec.getType());
            instance.addChild(mgmt.getEntityManager().createEntity(toCoreEntitySpec(entitySpec)));
          }

          log.info(
              "REST placing '{}' under management", spec.getName() != null ? spec.getName() : spec);
          Entities.startManagement(instance, mgmt);

        } else if (Entity.class.isAssignableFrom(clazz)) {
          if (entities.size() > 0)
            log.warn(
                "Cannot supply additional entities when using a non-application entity; ignoring in spec {}",
                spec);

          brooklyn.entity.proxying.EntitySpec<?> coreSpec =
              toCoreEntitySpec(BasicApplication.class, name, configO);
          configureRenderingMetadata(spec, coreSpec);

          instance = (Application) mgmt.getEntityManager().createEntity(coreSpec);

          final Class<? extends Entity> eclazz =
              getCatalog().loadClassByType(spec.getType(), Entity.class);
          Entity soleChild =
              mgmt.getEntityManager().createEntity(toCoreEntitySpec(eclazz, name, configO));
          instance.addChild(soleChild);
          instance.addEnricher(Enrichers.builder().propagatingAll().from(soleChild).build());

          log.info("REST placing '{}' under management", spec.getName());
          Entities.startManagement(instance, mgmt);

        } else {
          throw new IllegalArgumentException(
              "Class " + clazz + " must extend one of ApplicationBuilder, Application or Entity");
        }

        return instance;

      } catch (Exception e) {
        log.error("REST failed to create application: " + e, e);
        throw Exceptions.propagate(e);
      }
    }
    throw WebResourceUtils.unauthorized(
        "User '%s' is not authorized to create application from applicationSpec %s",
        Entitlements.getEntitlementContext().user(), spec);
  }