http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java deleted file mode 100644 index 1dbf1a8..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/ApplicationResource.java +++ /dev/null @@ -1,449 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import com.google.common.base.Throwables; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import org.apache.brooklyn.api.entity.Application; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.entity.Group; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.mgmt.Task; -import org.apache.brooklyn.api.objs.BrooklynObject; -import org.apache.brooklyn.api.sensor.AttributeSensor; -import org.apache.brooklyn.api.sensor.Sensor; -import org.apache.brooklyn.api.typereg.RegisteredType; -import org.apache.brooklyn.core.config.ConstraintViolationException; -import org.apache.brooklyn.core.entity.Attributes; -import org.apache.brooklyn.core.entity.EntityPredicates; -import org.apache.brooklyn.core.entity.lifecycle.Lifecycle; -import org.apache.brooklyn.core.entity.trait.Startable; -import org.apache.brooklyn.core.mgmt.EntityManagementUtils; -import org.apache.brooklyn.core.mgmt.EntityManagementUtils.CreationResult; -import org.apache.brooklyn.core.mgmt.entitlement.EntitlementPredicates; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.EntityAndItem; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument; -import org.apache.brooklyn.core.sensor.Sensors; -import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts; -import org.apache.brooklyn.core.typereg.RegisteredTypes; -import org.apache.brooklyn.entity.group.AbstractGroup; -import org.apache.brooklyn.rest.api.ApplicationApi; -import org.apache.brooklyn.rest.domain.ApplicationSpec; -import org.apache.brooklyn.rest.domain.ApplicationSummary; -import org.apache.brooklyn.rest.domain.EntityDetail; -import org.apache.brooklyn.rest.domain.EntitySummary; -import org.apache.brooklyn.rest.domain.TaskSummary; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.ApplicationTransformer; -import org.apache.brooklyn.rest.transform.EntityTransformer; -import org.apache.brooklyn.rest.transform.TaskTransformer; -import org.apache.brooklyn.rest.util.BrooklynRestResourceUtils; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.exceptions.UserFacingException; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.javalang.JavaClassNames; -import org.apache.brooklyn.util.text.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.ws.rs.core.Context; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.UriInfo; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.Collection; -import java.util.Collections; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import static com.google.common.base.Preconditions.checkNotNull; -import static javax.ws.rs.core.Response.Status.ACCEPTED; -import static javax.ws.rs.core.Response.created; -import static javax.ws.rs.core.Response.status; - -@HaHotStateRequired -public class ApplicationResource extends AbstractBrooklynRestResource implements ApplicationApi { - - private static final Logger log = LoggerFactory.getLogger(ApplicationResource.class); - - @Context - private UriInfo uriInfo; - - private EntityDetail fromEntity(Entity entity) { - Boolean serviceUp = entity.getAttribute(Attributes.SERVICE_UP); - - Lifecycle serviceState = entity.getAttribute(Attributes.SERVICE_STATE_ACTUAL); - - String iconUrl = entity.getIconUrl(); - if (iconUrl!=null) { - if (brooklyn().isUrlServerSideAndSafe(iconUrl)) - // route to server if it is a server-side url - iconUrl = EntityTransformer.entityUri(entity)+"/icon"; - } - - List<EntitySummary> children = Lists.newArrayList(); - if (!entity.getChildren().isEmpty()) { - for (Entity child : entity.getChildren()) { - children.add(fromEntity(child)); - } - } - - String parentId = null; - if (entity.getParent()!= null) { - parentId = entity.getParent().getId(); - } - - List<String> groupIds = Lists.newArrayList(); - if (!entity.groups().isEmpty()) { - groupIds.addAll(entitiesIdAsArray(entity.groups())); - } - - List<Map<String, String>> members = Lists.newArrayList(); - if (entity instanceof Group) { - // use attribute instead of method in case it is read-only - Collection<Entity> memberEntities = entity.getAttribute(AbstractGroup.GROUP_MEMBERS); - if (memberEntities != null && !memberEntities.isEmpty()) - members.addAll(entitiesIdAndNameAsList(memberEntities)); - } - - return new EntityDetail( - entity.getApplicationId(), - entity.getId(), - parentId, - entity.getDisplayName(), - entity.getEntityType().getName(), - serviceUp, - serviceState, - iconUrl, - entity.getCatalogItemId(), - children, - groupIds, - members); - } - - private List<Map<String, String>> entitiesIdAndNameAsList(Collection<? extends Entity> entities) { - List<Map<String, String>> members = Lists.newArrayList(); - for (Entity entity : entities) { - if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - members.add(ImmutableMap.of("id", entity.getId(), "name", entity.getDisplayName())); - } - } - return members; - } - - private List<String> entitiesIdAsArray(Iterable<? extends Entity> entities) { - List<String> ids = Lists.newArrayList(); - for (Entity entity : entities) { - if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - ids.add(entity.getId()); - } - } - return ids; - } - - @Override - public List<EntityDetail> fetch(String entityIds) { - - List<EntityDetail> entitySummaries = Lists.newArrayList(); - for (Entity application : mgmt().getApplications()) { - entitySummaries.add(fromEntity(application)); - } - - if (entityIds != null) { - for (String entityId: entityIds.split(",")) { - Entity entity = mgmt().getEntityManager().getEntity(entityId.trim()); - while (entity != null && entity.getParent() != null) { - if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - entitySummaries.add(fromEntity(entity)); - } - entity = entity.getParent(); - } - } - } - return entitySummaries; - } - - @Override - public List<ApplicationSummary> list(String typeRegex) { - if (Strings.isBlank(typeRegex)) { - typeRegex = ".*"; - } - return FluentIterable - .from(mgmt().getApplications()) - .filter(EntitlementPredicates.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY)) - .filter(EntityPredicates.hasInterfaceMatching(typeRegex)) - .transform(ApplicationTransformer.FROM_APPLICATION) - .toList(); - } - - @Override - public ApplicationSummary get(String application) { - return ApplicationTransformer.summaryFromApplication(brooklyn().getApplication(application)); - } - - public Response create(ApplicationSpec applicationSpec) { - return createFromAppSpec(applicationSpec); - } - - /** @deprecated since 0.7.0 see #create */ @Deprecated - protected Response createFromAppSpec(ApplicationSpec applicationSpec) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.DEPLOY_APPLICATION, applicationSpec)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to start application %s", - Entitlements.getEntitlementContext().user(), applicationSpec); - } - - checkApplicationTypesAreValid(applicationSpec); - checkLocationsAreValid(applicationSpec); - // TODO duplicate prevention - List<Location> locations = brooklyn().getLocations(applicationSpec); - Application app = brooklyn().create(applicationSpec); - Task<?> t = brooklyn().start(app, locations); - TaskSummary ts = TaskTransformer.FROM_TASK.apply(t); - URI ref = uriInfo.getBaseUriBuilder() - .path(ApplicationApi.class) - .path(ApplicationApi.class, "get") - .build(app.getApplicationId()); - return created(ref).entity(ts).build(); - } - - @Override - public Response createFromYaml(String yaml) { - // First of all, see if it's a URL - URI uri; - try { - uri = new URI(yaml); - } catch (URISyntaxException e) { - // It's not a URI then... - uri = null; - } - if (uri != null) { - log.debug("Create app called with URI; retrieving contents: {}", uri); - yaml = ResourceUtils.create(mgmt()).getResourceAsString(uri.toString()); - } - - log.debug("Creating app from yaml:\n{}", yaml); - EntitySpec<? extends Application> spec = createEntitySpecForApplication(yaml); - - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.DEPLOY_APPLICATION, spec)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to start application %s", - Entitlements.getEntitlementContext().user(), yaml); - } - - return launch(yaml, spec); - } - - 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.forbidden("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); - } - } - - @Override - public Response createPoly(byte[] inputToAutodetectType) { - log.debug("Creating app from autodetecting input"); - - boolean looksLikeLegacy = false; - Exception legacyFormatException = null; - // attempt legacy format - try { - ApplicationSpec appSpec = mapper().readValue(inputToAutodetectType, ApplicationSpec.class); - if (appSpec.getType() != null || appSpec.getEntities() != null) { - looksLikeLegacy = true; - } - return createFromAppSpec(appSpec); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - legacyFormatException = e; - log.debug("Input is not legacy ApplicationSpec JSON (will try others): "+e, e); - } - - //TODO infer encoding from request - String potentialYaml = new String(inputToAutodetectType); - EntitySpec<? extends Application> spec = createEntitySpecForApplication(potentialYaml); - - // TODO not json - try ZIP, etc - - if (spec != null) { - return launch(potentialYaml, spec); - } else if (looksLikeLegacy) { - throw Throwables.propagate(legacyFormatException); - } else { - return Response.serverError().entity("Unsupported format; not able to autodetect.").build(); - } - } - - @Override - public Response createFromForm(String contents) { - log.debug("Creating app from form"); - return createPoly(contents.getBytes()); - } - - @Override - public Response delete(String application) { - Application app = brooklyn().getApplication(application); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, Entitlements.EntityAndItem.of(app, - StringAndArgument.of(Entitlements.LifecycleEffectors.DELETE, null)))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to delete application %s", - Entitlements.getEntitlementContext().user(), app); - } - Task<?> t = brooklyn().destroy(app); - TaskSummary ts = TaskTransformer.FROM_TASK.apply(t); - return status(ACCEPTED).entity(ts).build(); - } - - private EntitySpec<? extends Application> createEntitySpecForApplication(String potentialYaml) { - try { - return EntityManagementUtils.createEntitySpecForApplication(mgmt(), potentialYaml); - } catch (Exception e) { - // An IllegalArgumentException for creating the entity spec gets wrapped in a ISE, and possibly a Compound. - // But we want to return a 400 rather than 500, so ensure we throw IAE. - IllegalArgumentException iae = (IllegalArgumentException) Exceptions.getFirstThrowableOfType(e, IllegalArgumentException.class); - if (iae != null) { - throw new IllegalArgumentException("Cannot create spec for app: "+iae.getMessage(), e); - } else { - throw Exceptions.propagate(e); - } - } - } - - private void checkApplicationTypesAreValid(ApplicationSpec applicationSpec) { - String appType = applicationSpec.getType(); - if (appType != null) { - checkEntityTypeIsValid(appType); - - if (applicationSpec.getEntities() != null) { - throw WebResourceUtils.preconditionFailed("Application given explicit type '%s' must not define entities", appType); - } - return; - } - - for (org.apache.brooklyn.rest.domain.EntitySpec entitySpec : applicationSpec.getEntities()) { - String entityType = entitySpec.getType(); - checkEntityTypeIsValid(checkNotNull(entityType, "entityType")); - } - } - - private void checkSpecTypeIsValid(String type, Class<? extends BrooklynObject> subType) { - Maybe<RegisteredType> typeV = RegisteredTypes.tryValidate(mgmt().getTypeRegistry().get(type), RegisteredTypeLoadingContexts.spec(subType)); - if (!typeV.isNull()) { - // found, throw if any problem - typeV.get(); - return; - } - - // not found, try classloading - try { - brooklyn().getCatalogClassLoader().loadClass(type); - } catch (ClassNotFoundException e) { - log.debug("Class not found for type '" + type + "'; reporting 404", e); - throw WebResourceUtils.notFound("Undefined type '%s'", type); - } - log.info(JavaClassNames.simpleClassName(subType)+" type '{}' not defined in catalog but is on classpath; continuing", type); - } - - private void checkEntityTypeIsValid(String type) { - checkSpecTypeIsValid(type, Entity.class); - } - - @SuppressWarnings("deprecation") - private void checkLocationsAreValid(ApplicationSpec applicationSpec) { - for (String locationId : applicationSpec.getLocations()) { - locationId = BrooklynRestResourceUtils.fixLocation(locationId); - if (!brooklyn().getLocationRegistry().canMaybeResolve(locationId) && brooklyn().getLocationRegistry().getDefinedLocationById(locationId)==null) { - throw WebResourceUtils.notFound("Undefined location '%s'", locationId); - } - } - } - - @Override - public List<EntitySummary> getDescendants(String application, String typeRegex) { - return EntityTransformer.entitySummaries(brooklyn().descendantsOfType(application, application, typeRegex)); - } - - @Override - public Map<String, Object> getDescendantsSensor(String application, String sensor, String typeRegex) { - Iterable<Entity> descs = brooklyn().descendantsOfType(application, application, typeRegex); - return getSensorMap(sensor, descs); - } - - public static Map<String, Object> getSensorMap(String sensor, Iterable<Entity> descs) { - if (Iterables.isEmpty(descs)) - return Collections.emptyMap(); - Map<String, Object> result = MutableMap.of(); - Iterator<Entity> di = descs.iterator(); - Sensor<?> s = null; - while (di.hasNext()) { - Entity potentialSource = di.next(); - s = potentialSource.getEntityType().getSensor(sensor); - if (s!=null) break; - } - if (s==null) - s = Sensors.newSensor(Object.class, sensor); - if (!(s instanceof AttributeSensor<?>)) { - log.warn("Cannot retrieve non-attribute sensor "+s+" for entities; returning empty map"); - return result; - } - for (Entity e: descs) { - Object v = null; - try { - v = e.getAttribute((AttributeSensor<?>)s); - } catch (Exception exc) { - Exceptions.propagateIfFatal(exc); - log.warn("Error retrieving sensor "+s+" for "+e+" (ignoring): "+exc); - } - if (v!=null) - result.put(e.getId(), v); - } - return result; - } - -}
http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java deleted file mode 100644 index a26f1a1..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/CatalogResource.java +++ /dev/null @@ -1,521 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import java.io.InputStream; -import java.net.URI; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.NoSuchElementException; -import java.util.Set; - -import javax.annotation.Nullable; -import javax.ws.rs.Consumes; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -import org.apache.brooklyn.api.catalog.CatalogItem; -import org.apache.brooklyn.api.entity.Application; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.entity.EntitySpec; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationSpec; -import org.apache.brooklyn.api.policy.Policy; -import org.apache.brooklyn.api.policy.PolicySpec; -import org.apache.brooklyn.api.typereg.RegisteredType; -import org.apache.brooklyn.core.catalog.CatalogPredicates; -import org.apache.brooklyn.core.catalog.internal.BasicBrooklynCatalog; -import org.apache.brooklyn.core.catalog.internal.CatalogDto; -import org.apache.brooklyn.core.catalog.internal.CatalogItemComparator; -import org.apache.brooklyn.core.catalog.internal.CatalogUtils; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument; -import org.apache.brooklyn.core.typereg.RegisteredTypeLoadingContexts; -import org.apache.brooklyn.core.typereg.RegisteredTypePredicates; -import org.apache.brooklyn.core.typereg.RegisteredTypes; -import org.apache.brooklyn.rest.api.CatalogApi; -import org.apache.brooklyn.rest.domain.ApiError; -import org.apache.brooklyn.rest.domain.CatalogEntitySummary; -import org.apache.brooklyn.rest.domain.CatalogItemSummary; -import org.apache.brooklyn.rest.domain.CatalogLocationSummary; -import org.apache.brooklyn.rest.domain.CatalogPolicySummary; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.CatalogTransformer; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.collections.MutableSet; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.stream.Streams; -import org.apache.brooklyn.util.text.StringPredicates; -import org.apache.brooklyn.util.text.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.base.Predicates; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.io.Files; -import com.sun.jersey.core.header.FormDataContentDisposition; - -@HaHotStateRequired -public class CatalogResource extends AbstractBrooklynRestResource implements CatalogApi { - - private static final Logger log = LoggerFactory.getLogger(CatalogResource.class); - - @SuppressWarnings("rawtypes") - private final Function<CatalogItem, CatalogItemSummary> TO_CATALOG_ITEM_SUMMARY = new Function<CatalogItem, CatalogItemSummary>() { - @Override - public CatalogItemSummary apply(@Nullable CatalogItem input) { - return CatalogTransformer.catalogItemSummary(brooklyn(), input); - } - }; - - @Override - @Consumes(MediaType.MULTIPART_FORM_DATA) - public Response createFromMultipart(InputStream uploadedInputStream, FormDataContentDisposition fileDetail) { - return create(Streams.readFullyString(uploadedInputStream)); - } - - static Set<String> missingIcons = MutableSet.of(); - - @Override - public Response create(String yaml) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.ADD_CATALOG_ITEM, yaml)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to add catalog item", - Entitlements.getEntitlementContext().user()); - } - - Iterable<? extends CatalogItem<?, ?>> items; - try { - items = brooklyn().getCatalog().addItems(yaml); - } catch (IllegalArgumentException e) { - return Response.status(Status.BAD_REQUEST) - .type(MediaType.APPLICATION_JSON) - .entity(ApiError.of(e)) - .build(); - } - - log.info("REST created catalog items: "+items); - - Map<String,Object> result = MutableMap.of(); - - for (CatalogItem<?,?> item: items) { - try { - result.put(item.getId(), CatalogTransformer.catalogItemSummary(brooklyn(), item)); - } catch (Throwable t) { - log.warn("Error loading catalog item '"+item+"' (rethrowing): "+t); - throw Exceptions.propagate(t); - } - } - return Response.status(Status.CREATED).entity(result).build(); - } - - @SuppressWarnings("deprecation") - @Override - public Response resetXml(String xml, boolean ignoreErrors) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, null) || - !Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.ADD_CATALOG_ITEM, null)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - - ((BasicBrooklynCatalog)mgmt().getCatalog()).reset(CatalogDto.newDtoFromXmlContents(xml, "REST reset"), !ignoreErrors); - return Response.ok().build(); - } - - @Override - @Deprecated - public void deleteEntity(String entityId) throws Exception { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(entityId, "delete"))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - try { - Maybe<RegisteredType> item = RegisteredTypes.tryValidate(mgmt().getTypeRegistry().get(entityId), RegisteredTypeLoadingContexts.spec(Entity.class)); - if (item.isNull()) { - throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId); - } - if (item.isAbsent()) { - throw WebResourceUtils.notFound("Item with id '%s' is not an entity", entityId); - } - - brooklyn().getCatalog().deleteCatalogItem(item.get().getSymbolicName(), item.get().getVersion()); - - } catch (NoSuchElementException e) { - // shouldn't come here - throw WebResourceUtils.notFound("Entity with id '%s' could not be deleted", entityId); - - } - } - - @Override - public void deleteApplication(String symbolicName, String version) throws Exception { - deleteEntity(symbolicName, version); - } - - @Override - public void deleteEntity(String symbolicName, String version) throws Exception { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(symbolicName+(Strings.isBlank(version) ? "" : ":"+version), "delete"))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - - RegisteredType item = mgmt().getTypeRegistry().get(symbolicName, version); - if (item == null) { - throw WebResourceUtils.notFound("Entity with id '%s:%s' not found", symbolicName, version); - } else if (!RegisteredTypePredicates.IS_ENTITY.apply(item) && !RegisteredTypePredicates.IS_APPLICATION.apply(item)) { - throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not an entity", symbolicName, version); - } else { - brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion()); - } - } - - @Override - public void deletePolicy(String policyId, String version) throws Exception { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(policyId+(Strings.isBlank(version) ? "" : ":"+version), "delete"))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - - RegisteredType item = mgmt().getTypeRegistry().get(policyId, version); - if (item == null) { - throw WebResourceUtils.notFound("Policy with id '%s:%s' not found", policyId, version); - } else if (!RegisteredTypePredicates.IS_POLICY.apply(item)) { - throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not a policy", policyId, version); - } else { - brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion()); - } - } - - @Override - public void deleteLocation(String locationId, String version) throws Exception { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(locationId+(Strings.isBlank(version) ? "" : ":"+version), "delete"))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - - RegisteredType item = mgmt().getTypeRegistry().get(locationId, version); - if (item == null) { - throw WebResourceUtils.notFound("Location with id '%s:%s' not found", locationId, version); - } else if (!RegisteredTypePredicates.IS_LOCATION.apply(item)) { - throw WebResourceUtils.preconditionFailed("Item with id '%s:%s' not a location", locationId, version); - } else { - brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion()); - } - } - - @Override - public List<CatalogEntitySummary> listEntities(String regex, String fragment, boolean allVersions) { - Predicate<CatalogItem<Entity, EntitySpec<?>>> filter = - Predicates.and( - CatalogPredicates.IS_ENTITY, - CatalogPredicates.<Entity, EntitySpec<?>>disabled(false)); - List<CatalogItemSummary> result = getCatalogItemSummariesMatchingRegexFragment(filter, regex, fragment, allVersions); - return castList(result, CatalogEntitySummary.class); - } - - @Override - public List<CatalogItemSummary> listApplications(String regex, String fragment, boolean allVersions) { - @SuppressWarnings("unchecked") - Predicate<CatalogItem<Application, EntitySpec<? extends Application>>> filter = - Predicates.and( - CatalogPredicates.IS_TEMPLATE, - CatalogPredicates.<Application,EntitySpec<? extends Application>>deprecated(false), - CatalogPredicates.<Application,EntitySpec<? extends Application>>disabled(false)); - return getCatalogItemSummariesMatchingRegexFragment(filter, regex, fragment, allVersions); - } - - @Override - @Deprecated - public CatalogEntitySummary getEntity(String entityId) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, entityId)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - CatalogItem<Entity,EntitySpec<?>> result = - CatalogUtils.getCatalogItemOptionalVersion(mgmt(), Entity.class, entityId); - - if (result==null) { - throw WebResourceUtils.notFound("Entity with id '%s' not found", entityId); - } - - return CatalogTransformer.catalogEntitySummary(brooklyn(), result); - } - - @Override - public CatalogEntitySummary getEntity(String symbolicName, String version) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, symbolicName+(Strings.isBlank(version)?"":":"+version))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - //TODO These casts are not pretty, we could just provide separate get methods for the different types? - //Or we could provide asEntity/asPolicy cast methods on the CataloItem doing a safety check internally - @SuppressWarnings("unchecked") - CatalogItem<Entity, EntitySpec<?>> result = - (CatalogItem<Entity, EntitySpec<?>>) brooklyn().getCatalog().getCatalogItem(symbolicName, version); - - if (result==null) { - throw WebResourceUtils.notFound("Entity with id '%s:%s' not found", symbolicName, version); - } - - return CatalogTransformer.catalogEntitySummary(brooklyn(), result); - } - - @Override - @Deprecated - public CatalogEntitySummary getApplication(String applicationId) throws Exception { - return getEntity(applicationId); - } - - @Override - public CatalogEntitySummary getApplication(String symbolicName, String version) { - return getEntity(symbolicName, version); - } - - @Override - public List<CatalogPolicySummary> listPolicies(String regex, String fragment, boolean allVersions) { - Predicate<CatalogItem<Policy, PolicySpec<?>>> filter = - Predicates.and( - CatalogPredicates.IS_POLICY, - CatalogPredicates.<Policy, PolicySpec<?>>disabled(false)); - List<CatalogItemSummary> result = getCatalogItemSummariesMatchingRegexFragment(filter, regex, fragment, allVersions); - return castList(result, CatalogPolicySummary.class); - } - - @Override - @Deprecated - public CatalogPolicySummary getPolicy(String policyId) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, policyId)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - CatalogItem<? extends Policy, PolicySpec<?>> result = - CatalogUtils.getCatalogItemOptionalVersion(mgmt(), Policy.class, policyId); - - if (result==null) { - throw WebResourceUtils.notFound("Policy with id '%s' not found", policyId); - } - - return CatalogTransformer.catalogPolicySummary(brooklyn(), result); - } - - @Override - public CatalogPolicySummary getPolicy(String policyId, String version) throws Exception { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, policyId+(Strings.isBlank(version)?"":":"+version))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - @SuppressWarnings("unchecked") - CatalogItem<? extends Policy, PolicySpec<?>> result = - (CatalogItem<? extends Policy, PolicySpec<?>>)brooklyn().getCatalog().getCatalogItem(policyId, version); - - if (result==null) { - throw WebResourceUtils.notFound("Policy with id '%s:%s' not found", policyId, version); - } - - return CatalogTransformer.catalogPolicySummary(brooklyn(), result); - } - - @Override - public List<CatalogLocationSummary> listLocations(String regex, String fragment, boolean allVersions) { - Predicate<CatalogItem<Location, LocationSpec<?>>> filter = - Predicates.and( - CatalogPredicates.IS_LOCATION, - CatalogPredicates.<Location, LocationSpec<?>>disabled(false)); - List<CatalogItemSummary> result = getCatalogItemSummariesMatchingRegexFragment(filter, regex, fragment, allVersions); - return castList(result, CatalogLocationSummary.class); - } - - @Override - @Deprecated - public CatalogLocationSummary getLocation(String locationId) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, locationId)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - CatalogItem<? extends Location, LocationSpec<?>> result = - CatalogUtils.getCatalogItemOptionalVersion(mgmt(), Location.class, locationId); - - if (result==null) { - throw WebResourceUtils.notFound("Location with id '%s' not found", locationId); - } - - return CatalogTransformer.catalogLocationSummary(brooklyn(), result); - } - - @Override - public CatalogLocationSummary getLocation(String locationId, String version) throws Exception { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, locationId+(Strings.isBlank(version)?"":":"+version))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - @SuppressWarnings("unchecked") - CatalogItem<? extends Location, LocationSpec<?>> result = - (CatalogItem<? extends Location, LocationSpec<?>>)brooklyn().getCatalog().getCatalogItem(locationId, version); - - if (result==null) { - throw WebResourceUtils.notFound("Location with id '%s:%s' not found", locationId, version); - } - - return CatalogTransformer.catalogLocationSummary(brooklyn(), result); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - private <T,SpecT> List<CatalogItemSummary> getCatalogItemSummariesMatchingRegexFragment(Predicate<CatalogItem<T,SpecT>> type, String regex, String fragment, boolean allVersions) { - List filters = new ArrayList(); - filters.add(type); - if (Strings.isNonEmpty(regex)) - filters.add(CatalogPredicates.xml(StringPredicates.containsRegex(regex))); - if (Strings.isNonEmpty(fragment)) - filters.add(CatalogPredicates.xml(StringPredicates.containsLiteralIgnoreCase(fragment))); - if (!allVersions) - filters.add(CatalogPredicates.isBestVersion(mgmt())); - - filters.add(CatalogPredicates.entitledToSee(mgmt())); - - ImmutableList<CatalogItem<Object, Object>> sortedItems = - FluentIterable.from(brooklyn().getCatalog().getCatalogItems()) - .filter(Predicates.and(filters)) - .toSortedList(CatalogItemComparator.getInstance()); - return Lists.transform(sortedItems, TO_CATALOG_ITEM_SUMMARY); - } - - @Override - @Deprecated - public Response getIcon(String itemId) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, itemId)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - return getCatalogItemIcon( mgmt().getTypeRegistry().get(itemId) ); - } - - @Override - public Response getIcon(String itemId, String version) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CATALOG_ITEM, itemId+(Strings.isBlank(version)?"":":"+version))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see catalog entry", - Entitlements.getEntitlementContext().user()); - } - - return getCatalogItemIcon(mgmt().getTypeRegistry().get(itemId, version)); - } - - @Override - public void setDeprecatedLegacy(String itemId, boolean deprecated) { - log.warn("Use of deprecated \"/v1/catalog/entities/{itemId}/deprecated/{deprecated}\" for "+itemId - +"; use \"/v1/catalog/entities/{itemId}/deprecated\" with request body"); - setDeprecated(itemId, deprecated); - } - - @SuppressWarnings("deprecation") - @Override - public void setDeprecated(String itemId, boolean deprecated) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(itemId, "deprecated"))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - CatalogUtils.setDeprecated(mgmt(), itemId, deprecated); - } - - @SuppressWarnings("deprecation") - @Override - public void setDisabled(String itemId, boolean disabled) { - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_CATALOG_ITEM, StringAndArgument.of(itemId, "disabled"))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify catalog", - Entitlements.getEntitlementContext().user()); - } - CatalogUtils.setDisabled(mgmt(), itemId, disabled); - } - - private Response getCatalogItemIcon(RegisteredType result) { - String url = result.getIconUrl(); - if (url==null) { - log.debug("No icon available for "+result+"; returning "+Status.NO_CONTENT); - return Response.status(Status.NO_CONTENT).build(); - } - - if (brooklyn().isUrlServerSideAndSafe(url)) { - // classpath URL's we will serve IF they end with a recognised image format; - // paths (ie non-protocol) and - // NB, for security, file URL's are NOT served - log.debug("Loading and returning "+url+" as icon for "+result); - - MediaType mime = WebResourceUtils.getImageMediaTypeFromExtension(Files.getFileExtension(url)); - try { - Object content = ResourceUtils.create(CatalogUtils.newClassLoadingContext(mgmt(), result)).getResourceFromUrl(url); - return Response.ok(content, mime).build(); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - synchronized (missingIcons) { - if (missingIcons.add(url)) { - // note: this can be quite common when running from an IDE, as resources may not be copied; - // a mvn build should sort it out (the IDE will then find the resources, until you clean or maybe refresh...) - log.warn("Missing icon data for "+result.getId()+", expected at: "+url+" (subsequent messages will log debug only)"); - log.debug("Trace for missing icon data at "+url+": "+e, e); - } else { - log.debug("Missing icon data for "+result.getId()+", expected at: "+url+" (already logged WARN and error details)"); - } - } - throw WebResourceUtils.notFound("Icon unavailable for %s", result.getId()); - } - } - - log.debug("Returning redirect to "+url+" as icon for "+result); - - // for anything else we do a redirect (e.g. http / https; perhaps ftp) - return Response.temporaryRedirect(URI.create(url)).build(); - } - - // TODO Move to an appropriate utility class? - @SuppressWarnings("unchecked") - private static <T> List<T> castList(List<? super T> list, Class<T> elementType) { - List<T> result = Lists.newArrayList(); - Iterator<? super T> li = list.iterator(); - while (li.hasNext()) { - try { - result.add((T) li.next()); - } catch (Throwable throwable) { - if (throwable instanceof NoClassDefFoundError) { - // happens if class cannot be loaded for any reason during transformation - don't treat as fatal - } else { - Exceptions.propagateIfFatal(throwable); - } - - // item cannot be transformed; we will have logged a warning earlier - log.debug("Ignoring invalid catalog item: "+throwable); - } - } - return result; - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java deleted file mode 100644 index 710e2de..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EffectorResource.java +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import javax.annotation.Nullable; -import javax.ws.rs.core.Response; - -import org.apache.brooklyn.api.effector.Effector; -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.mgmt.Task; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.StringAndArgument; -import org.apache.brooklyn.core.mgmt.internal.EffectorUtils; -import org.apache.brooklyn.rest.api.EffectorApi; -import org.apache.brooklyn.rest.domain.EffectorSummary; -import org.apache.brooklyn.rest.domain.SummaryComparators; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.EffectorTransformer; -import org.apache.brooklyn.rest.transform.TaskTransformer; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.guava.Maybe; -import org.apache.brooklyn.util.time.Time; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.FluentIterable; - -@HaHotStateRequired -public class EffectorResource extends AbstractBrooklynRestResource implements EffectorApi { - - private static final Logger log = LoggerFactory.getLogger(EffectorResource.class); - - @Override - public List<EffectorSummary> list(final String application, final String entityToken) { - final Entity entity = brooklyn().getEntity(application, entityToken); - return FluentIterable - .from(entity.getEntityType().getEffectors()) - .filter(new Predicate<Effector<?>>() { - @Override - public boolean apply(@Nullable Effector<?> input) { - return Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, - Entitlements.EntityAndItem.of(entity, StringAndArgument.of(input.getName(), null))); - } - }) - .transform(new Function<Effector<?>, EffectorSummary>() { - @Override - public EffectorSummary apply(Effector<?> effector) { - return EffectorTransformer.effectorSummary(entity, effector); - } - }) - .toSortedList(SummaryComparators.nameComparator()); - } - - @Override - public Response invoke(String application, String entityToken, String effectorName, - String timeout, Map<String, Object> parameters) { - final Entity entity = brooklyn().getEntity(application, entityToken); - - // TODO check effectors? - Maybe<Effector<?>> effector = EffectorUtils.findEffectorDeclared(entity, effectorName); - if (effector.isAbsentOrNull()) { - throw WebResourceUtils.notFound("Entity '%s' has no effector with name '%s'", entityToken, effectorName); - } else if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.INVOKE_EFFECTOR, - Entitlements.EntityAndItem.of(entity, StringAndArgument.of(effector.get().getName(), null)))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to invoke effector %s on entity %s", - Entitlements.getEntitlementContext().user(), effector.get().getName(), entity); - } - log.info("REST invocation of " + entity + "." + effector.get() + " " + parameters); - Task<?> t = entity.invoke(effector.get(), parameters); - - try { - Object result; - if (timeout == null || timeout.isEmpty() || "never".equalsIgnoreCase(timeout)) { - result = t.get(); - } else { - long timeoutMillis = "always".equalsIgnoreCase(timeout) ? 0 : Time.parseElapsedTime(timeout); - try { - if (timeoutMillis == 0) throw new TimeoutException(); - result = t.get(timeoutMillis, TimeUnit.MILLISECONDS); - } catch (TimeoutException e) { - result = TaskTransformer.taskSummary(t); - } - } - return Response.status(Response.Status.ACCEPTED).entity(result).build(); - } catch (Exception e) { - throw Exceptions.propagate(e); - } - } - -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java deleted file mode 100644 index 7aaa3f7..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityConfigResource.java +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import java.util.List; -import java.util.Map; -import java.util.concurrent.Callable; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.mgmt.ManagementContext; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.config.BasicConfigKey; -import org.apache.brooklyn.core.entity.Entities; -import org.apache.brooklyn.core.entity.EntityInternal; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements.EntityAndItem; -import org.apache.brooklyn.rest.api.EntityConfigApi; -import org.apache.brooklyn.rest.domain.EntityConfigSummary; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.EntityTransformer; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.core.flags.TypeCoercions; -import org.apache.brooklyn.util.core.task.Tasks; -import org.apache.brooklyn.util.core.task.ValueResolver; -import org.apache.brooklyn.util.text.Strings; -import org.apache.brooklyn.util.time.Duration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Predicates; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -@HaHotStateRequired -public class EntityConfigResource extends AbstractBrooklynRestResource implements EntityConfigApi { - - private static final Logger LOG = LoggerFactory.getLogger(EntityConfigResource.class); - - @Override - public List<EntityConfigSummary> list(final String application, final String entityToken) { - final Entity entity = brooklyn().getEntity(application, entityToken); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - - // TODO merge with keys which have values: - // ((EntityInternal) entity).config().getBag().getAllConfigAsConfigKeyMap(); - List<EntityConfigSummary> result = Lists.newArrayList(); - - for (ConfigKey<?> key : entity.getEntityType().getConfigKeys()) { - // Exclude config that user is not allowed to see - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CONFIG, new EntityAndItem<String>(entity, key.getName()))) { - LOG.trace("User {} not authorized to see config {} of entity {}; excluding from ConfigKey list results", - new Object[] {Entitlements.getEntitlementContext().user(), key.getName(), entity}); - continue; - } - result.add(EntityTransformer.entityConfigSummary(entity, key)); - } - - return result; - } - - // TODO support parameters ?show=value,summary&name=xxx &format={string,json,xml} - // (and in sensors class) - @Override - public Map<String, Object> batchConfigRead(String application, String entityToken, Boolean raw) { - // TODO: add test - Entity entity = brooklyn().getEntity(application, entityToken); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - - // wrap in a task for better runtime view - return Entities.submit(entity, Tasks.<Map<String,Object>>builder().displayName("REST API batch config read").body(new BatchConfigRead(mgmt(), this, entity, raw)).build()).getUnchecked(); - } - - private static class BatchConfigRead implements Callable<Map<String,Object>> { - private final ManagementContext mgmt; - private final EntityConfigResource resource; - private final Entity entity; - private final Boolean raw; - - public BatchConfigRead(ManagementContext mgmt, EntityConfigResource resource, Entity entity, Boolean raw) { - this.mgmt = mgmt; - this.resource = resource; - this.entity = entity; - this.raw = raw; - } - - @Override - public Map<String, Object> call() throws Exception { - Map<ConfigKey<?>, ?> source = ((EntityInternal) entity).config().getBag().getAllConfigAsConfigKeyMap(); - Map<String, Object> result = Maps.newLinkedHashMap(); - for (Map.Entry<ConfigKey<?>, ?> ek : source.entrySet()) { - ConfigKey<?> key = ek.getKey(); - Object value = ek.getValue(); - - // Exclude config that user is not allowed to see - if (!Entitlements.isEntitled(mgmt.getEntitlementManager(), Entitlements.SEE_CONFIG, new EntityAndItem<String>(entity, ek.getKey().getName()))) { - LOG.trace("User {} not authorized to see sensor {} of entity {}; excluding from current-state results", - new Object[] {Entitlements.getEntitlementContext().user(), ek.getKey().getName(), entity}); - continue; - } - result.put(key.getName(), - resource.resolving(value).preferJson(true).asJerseyOutermostReturnValue(false).raw(raw).context(entity).timeout(Duration.ZERO).renderAs(key).resolve()); - } - return result; - } - } - - @Override - public Object get(String application, String entityToken, String configKeyName, Boolean raw) { - return get(true, application, entityToken, configKeyName, raw); - } - - @Override - public String getPlain(String application, String entityToken, String configKeyName, Boolean raw) { - return Strings.toString(get(false, application, entityToken, configKeyName, raw)); - } - - public Object get(boolean preferJson, String application, String entityToken, String configKeyName, Boolean raw) { - Entity entity = brooklyn().getEntity(application, entityToken); - ConfigKey<?> ck = findConfig(entity, configKeyName); - - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_CONFIG, new EntityAndItem<String>(entity, ck.getName()))) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to see entity '%s' config '%s'", - Entitlements.getEntitlementContext().user(), entity, ck.getName()); - } - - Object value = ((EntityInternal)entity).config().getRaw(ck).orNull(); - return resolving(value).preferJson(preferJson).asJerseyOutermostReturnValue(true).raw(raw).context(entity).timeout(ValueResolver.PRETTY_QUICK_WAIT).renderAs(ck).resolve(); - } - - private ConfigKey<?> findConfig(Entity entity, String configKeyName) { - ConfigKey<?> ck = entity.getEntityType().getConfigKey(configKeyName); - if (ck == null) - ck = new BasicConfigKey<Object>(Object.class, configKeyName); - return ck; - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void setFromMap(String application, String entityToken, Boolean recurse, Map newValues) { - final Entity entity = brooklyn().getEntity(application, entityToken); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - - if (LOG.isDebugEnabled()) - LOG.debug("REST user " + Entitlements.getEntitlementContext() + " setting configs " + newValues); - for (Object entry : newValues.entrySet()) { - String configName = Strings.toString(((Map.Entry) entry).getKey()); - Object newValue = ((Map.Entry) entry).getValue(); - - ConfigKey ck = findConfig(entity, configName); - ((EntityInternal) entity).config().set(ck, TypeCoercions.coerce(newValue, ck.getTypeToken())); - if (Boolean.TRUE.equals(recurse)) { - for (Entity e2 : Entities.descendants(entity, Predicates.alwaysTrue(), false)) { - ((EntityInternal) e2).config().set(ck, newValue); - } - } - } - } - - @SuppressWarnings({ "rawtypes", "unchecked" }) - @Override - public void set(String application, String entityToken, String configName, Boolean recurse, Object newValue) { - final Entity entity = brooklyn().getEntity(application, entityToken); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - - ConfigKey ck = findConfig(entity, configName); - LOG.debug("REST setting config " + configName + " on " + entity + " to " + newValue); - ((EntityInternal) entity).config().set(ck, TypeCoercions.coerce(newValue, ck.getTypeToken())); - if (Boolean.TRUE.equals(recurse)) { - for (Entity e2 : Entities.descendants(entity, Predicates.alwaysTrue(), false)) { - ((EntityInternal) e2).config().set(ck, newValue); - } - } - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java deleted file mode 100644 index c4df6d4..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/EntityResource.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import static javax.ws.rs.core.Response.created; -import static javax.ws.rs.core.Response.status; -import static javax.ws.rs.core.Response.Status.ACCEPTED; - -import java.net.URI; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; -import javax.ws.rs.core.UriInfo; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.mgmt.Task; -import org.apache.brooklyn.core.mgmt.BrooklynTags; -import org.apache.brooklyn.core.mgmt.BrooklynTags.NamedStringTag; -import org.apache.brooklyn.core.mgmt.BrooklynTaskTags; -import org.apache.brooklyn.core.mgmt.EntityManagementUtils; -import org.apache.brooklyn.core.mgmt.EntityManagementUtils.CreationResult; -import org.apache.brooklyn.core.mgmt.entitlement.EntitlementPredicates; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; -import org.apache.brooklyn.rest.api.EntityApi; -import org.apache.brooklyn.rest.domain.EntitySummary; -import org.apache.brooklyn.rest.domain.LocationSummary; -import org.apache.brooklyn.rest.domain.TaskSummary; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.EntityTransformer; -import org.apache.brooklyn.rest.transform.LocationTransformer; -import org.apache.brooklyn.rest.transform.LocationTransformer.LocationDetailLevel; -import org.apache.brooklyn.rest.transform.TaskTransformer; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.collections.MutableList; -import org.apache.brooklyn.util.core.ResourceUtils; -import org.apache.brooklyn.util.time.Duration; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.Collections2; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.io.Files; - -@HaHotStateRequired -public class EntityResource extends AbstractBrooklynRestResource implements EntityApi { - - private static final Logger log = LoggerFactory.getLogger(EntityResource.class); - - @Context - private UriInfo uriInfo; - - @Override - public List<EntitySummary> list(final String application) { - return FluentIterable - .from(brooklyn().getApplication(application).getChildren()) - .filter(EntitlementPredicates.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY)) - .transform(EntityTransformer.FROM_ENTITY) - .toList(); - } - - @Override - public EntitySummary get(String application, String entityName) { - Entity entity = brooklyn().getEntity(application, entityName); - if (Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY, entity)) { - return EntityTransformer.entitySummary(entity); - } - throw WebResourceUtils.forbidden("User '%s' is not authorized to get entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - - @Override - public List<EntitySummary> getChildren(final String application, final String entity) { - return FluentIterable - .from(brooklyn().getEntity(application, entity).getChildren()) - .filter(EntitlementPredicates.isEntitled(mgmt().getEntitlementManager(), Entitlements.SEE_ENTITY)) - .transform(EntityTransformer.FROM_ENTITY) - .toList(); - } - - @Override - public List<EntitySummary> getChildrenOld(String application, String entity) { - log.warn("Using deprecated call to /entities when /children should be used"); - return getChildren(application, entity); - } - - @Override - public Response addChildren(String applicationToken, String entityToken, Boolean start, String timeoutS, String yaml) { - final Entity parent = brooklyn().getEntity(applicationToken, entityToken); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, parent)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify entity '%s'", - Entitlements.getEntitlementContext().user(), entityToken); - } - CreationResult<List<Entity>, List<String>> added = EntityManagementUtils.addChildren(parent, yaml, start) - .blockUntilComplete(timeoutS==null ? Duration.millis(20) : Duration.of(timeoutS)); - ResponseBuilder response; - - if (added.get().size()==1) { - Entity child = Iterables.getOnlyElement(added.get()); - URI ref = uriInfo.getBaseUriBuilder() - .path(EntityApi.class) - .path(EntityApi.class, "get") - .build(child.getApplicationId(), child.getId()); - response = created(ref); - } else { - response = Response.status(Status.CREATED); - } - return response.entity(TaskTransformer.taskSummary(added.task())).build(); - } - - @Override - public List<TaskSummary> listTasks(String applicationId, String entityId) { - Entity entity = brooklyn().getEntity(applicationId, entityId); - Set<Task<?>> tasks = BrooklynTaskTags.getTasksInEntityContext(mgmt().getExecutionManager(), entity); - return new LinkedList<TaskSummary>(Collections2.transform(tasks, TaskTransformer.FROM_TASK)); - } - - @Override - public TaskSummary getTask(final String application, final String entityToken, String taskId) { - // TODO deprecate in favour of ActivityApi.get ? - Task<?> t = mgmt().getExecutionManager().getTask(taskId); - if (t == null) - throw WebResourceUtils.notFound("Cannot find task '%s'", taskId); - return TaskTransformer.FROM_TASK.apply(t); - } - - @SuppressWarnings("unchecked") - @Override - public List<Object> listTags(String applicationId, String entityId) { - Entity entity = brooklyn().getEntity(applicationId, entityId); - return (List<Object>) resolving(MutableList.copyOf(entity.tags().getTags())).preferJson(true).resolve(); - } - - @Override - public Response getIcon(String applicationId, String entityId) { - Entity entity = brooklyn().getEntity(applicationId, entityId); - String url = entity.getIconUrl(); - if (url == null) - return Response.status(Status.NO_CONTENT).build(); - - if (brooklyn().isUrlServerSideAndSafe(url)) { - // classpath URL's we will serve IF they end with a recognised image format; - // paths (ie non-protocol) and - // NB, for security, file URL's are NOT served - MediaType mime = WebResourceUtils.getImageMediaTypeFromExtension(Files.getFileExtension(url)); - Object content = ResourceUtils.create(brooklyn().getCatalogClassLoader()).getResourceFromUrl(url); - return Response.ok(content, mime).build(); - } - - // for anything else we do a redirect (e.g. http / https; perhaps ftp) - return Response.temporaryRedirect(URI.create(url)).build(); - } - - @Override - public Response rename(String application, String entity, String newName) { - Entity entityLocal = brooklyn().getEntity(application, entity); - entityLocal.setDisplayName(newName); - return status(Response.Status.OK).build(); - } - - @Override - public Response expunge(String application, String entity, boolean release) { - Entity entityLocal = brooklyn().getEntity(application, entity); - Task<?> task = brooklyn().expunge(entityLocal, release); - TaskSummary summary = TaskTransformer.FROM_TASK.apply(task); - return status(ACCEPTED).entity(summary).build(); - } - - @Override - public List<EntitySummary> getDescendants(String application, String entity, String typeRegex) { - return EntityTransformer.entitySummaries(brooklyn().descendantsOfType(application, entity, typeRegex)); - } - - @Override - public Map<String, Object> getDescendantsSensor(String application, String entity, String sensor, String typeRegex) { - Iterable<Entity> descs = brooklyn().descendantsOfType(application, entity, typeRegex); - return ApplicationResource.getSensorMap(sensor, descs); - } - - @Override - public List<LocationSummary> getLocations(String application, String entity) { - List<LocationSummary> result = Lists.newArrayList(); - Entity e = brooklyn().getEntity(application, entity); - for (Location l : e.getLocations()) { - result.add(LocationTransformer.newInstance(mgmt(), l, LocationDetailLevel.NONE)); - } - return result; - } - - @Override - public String getSpec(String applicationToken, String entityToken) { - Entity entity = brooklyn().getEntity(applicationToken, entityToken); - NamedStringTag spec = BrooklynTags.findFirst(BrooklynTags.YAML_SPEC_KIND, entity.tags().getTags()); - if (spec == null) - return null; - return (String) WebResourceUtils.getValueForDisplay(spec.getContents(), true, true); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java deleted file mode 100644 index 5922ebd..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/LocationResource.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import java.net.URI; -import java.util.Comparator; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.ws.rs.core.Response; - -import org.apache.brooklyn.api.location.Location; -import org.apache.brooklyn.api.location.LocationDefinition; -import org.apache.brooklyn.api.typereg.RegisteredType; -import org.apache.brooklyn.core.location.LocationConfigKeys; -import org.apache.brooklyn.rest.api.LocationApi; -import org.apache.brooklyn.rest.domain.LocationSpec; -import org.apache.brooklyn.rest.domain.LocationSummary; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.LocationTransformer; -import org.apache.brooklyn.rest.transform.LocationTransformer.LocationDetailLevel; -import org.apache.brooklyn.rest.util.EntityLocationUtils; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.collections.MutableMap; -import org.apache.brooklyn.util.exceptions.Exceptions; -import org.apache.brooklyn.util.text.NaturalOrderComparator; -import org.apache.brooklyn.util.text.Strings; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.collect.FluentIterable; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Sets; - -@SuppressWarnings("deprecation") -@HaHotStateRequired -public class LocationResource extends AbstractBrooklynRestResource implements LocationApi { - - private static final Logger log = LoggerFactory.getLogger(LocationResource.class); - - private final Set<String> specsWarnedOnException = Sets.newConcurrentHashSet(); - - @Override - public List<LocationSummary> list() { - Function<LocationDefinition, LocationSummary> transformer = new Function<LocationDefinition, LocationSummary>() { - @Override - public LocationSummary apply(LocationDefinition l) { - try { - return LocationTransformer.newInstance(mgmt(), l, LocationDetailLevel.LOCAL_EXCLUDING_SECRET); - } catch (Exception e) { - Exceptions.propagateIfFatal(e); - String spec = l.getSpec(); - if (spec == null || specsWarnedOnException.add(spec)) { - log.warn("Unable to find details of location {} in REST call to list (ignoring location): {}", l, e); - if (log.isDebugEnabled()) log.debug("Error details for location " + l, e); - } else { - if (log.isTraceEnabled()) - log.trace("Unable again to find details of location {} in REST call to list (ignoring location): {}", l, e); - } - return null; - } - } - }; - return FluentIterable.from(brooklyn().getLocationRegistry().getDefinedLocations().values()) - .transform(transformer) - .filter(LocationSummary.class) - .toSortedList(nameOrSpecComparator()); - } - - private static NaturalOrderComparator COMPARATOR = new NaturalOrderComparator(); - private static Comparator<LocationSummary> nameOrSpecComparator() { - return new Comparator<LocationSummary>() { - @Override - public int compare(LocationSummary o1, LocationSummary o2) { - return COMPARATOR.compare(getNameOrSpec(o1).toLowerCase(), getNameOrSpec(o2).toLowerCase()); - } - }; - } - private static String getNameOrSpec(LocationSummary o) { - if (Strings.isNonBlank(o.getName())) return o.getName(); - if (Strings.isNonBlank(o.getSpec())) return o.getSpec(); - return o.getId(); - } - - // this is here to support the web GUI's circles - @Override - public Map<String,Map<String,Object>> getLocatedLocations() { - Map<String,Map<String,Object>> result = new LinkedHashMap<String,Map<String,Object>>(); - Map<Location, Integer> counts = new EntityLocationUtils(mgmt()).countLeafEntitiesByLocatedLocations(); - for (Map.Entry<Location,Integer> count: counts.entrySet()) { - Location l = count.getKey(); - Map<String,Object> m = MutableMap.<String,Object>of( - "id", l.getId(), - "name", l.getDisplayName(), - "leafEntityCount", count.getValue(), - "latitude", l.getConfig(LocationConfigKeys.LATITUDE), - "longitude", l.getConfig(LocationConfigKeys.LONGITUDE) - ); - result.put(l.getId(), m); - } - return result; - } - - /** @deprecated since 0.7.0; REST call now handled by below (optional query parameter added) */ - public LocationSummary get(String locationId) { - return get(locationId, false); - } - - @Override - public LocationSummary get(String locationId, String fullConfig) { - return get(locationId, Boolean.valueOf(fullConfig)); - } - - public LocationSummary get(String locationId, boolean fullConfig) { - LocationDetailLevel configLevel = fullConfig ? LocationDetailLevel.FULL_EXCLUDING_SECRET : LocationDetailLevel.LOCAL_EXCLUDING_SECRET; - Location l1 = mgmt().getLocationManager().getLocation(locationId); - if (l1!=null) { - return LocationTransformer.newInstance(mgmt(), l1, configLevel); - } - - LocationDefinition l2 = brooklyn().getLocationRegistry().getDefinedLocationById(locationId); - if (l2==null) throw WebResourceUtils.notFound("No location matching %s", locationId); - return LocationTransformer.newInstance(mgmt(), l2, configLevel); - } - - @Override - public Response create(LocationSpec locationSpec) { - String name = locationSpec.getName(); - ImmutableList.Builder<String> yaml = ImmutableList.<String>builder().add( - "brooklyn.catalog:", - " symbolicName: "+name, - "", - "brooklyn.locations:", - "- type: "+locationSpec.getSpec()); - if (locationSpec.getConfig().size() > 0) { - yaml.add(" brooklyn.config:"); - for (Map.Entry<String, ?> entry : locationSpec.getConfig().entrySet()) { - yaml.add(" " + entry.getKey() + ": " + entry.getValue()); - } - } - - String locationBlueprint = Joiner.on("\n").join(yaml.build()); - brooklyn().getCatalog().addItems(locationBlueprint); - LocationDefinition l = brooklyn().getLocationRegistry().getDefinedLocationByName(name); - return Response.created(URI.create(name)) - .entity(LocationTransformer.newInstance(mgmt(), l, LocationDetailLevel.LOCAL_EXCLUDING_SECRET)) - .build(); - } - - @Override - @Deprecated - public void delete(String locationId) { - // TODO make all locations be part of the catalog, then flip the JS GUI to use catalog api - if (deleteAllVersions(locationId)>0) return; - throw WebResourceUtils.notFound("No catalog item location matching %s; only catalog item locations can be deleted", locationId); - } - - private int deleteAllVersions(String locationId) { - RegisteredType item = mgmt().getTypeRegistry().get(locationId); - if (item==null) return 0; - brooklyn().getCatalog().deleteCatalogItem(item.getSymbolicName(), item.getVersion()); - return 1 + deleteAllVersions(locationId); - } -} http://git-wip-us.apache.org/repos/asf/brooklyn-server/blob/6f624c78/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java ---------------------------------------------------------------------- diff --git a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java b/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java deleted file mode 100644 index fbb13a7..0000000 --- a/rest/rest-server/src/main/java/org/apache/brooklyn/rest/resources/PolicyConfigResource.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.brooklyn.rest.resources; - -import java.util.List; -import java.util.Map; - -import javax.ws.rs.core.Response; - -import org.apache.brooklyn.api.entity.Entity; -import org.apache.brooklyn.api.policy.Policy; -import org.apache.brooklyn.config.ConfigKey; -import org.apache.brooklyn.core.mgmt.entitlement.Entitlements; -import org.apache.brooklyn.core.objs.BrooklynObjectInternal; -import org.apache.brooklyn.rest.api.PolicyConfigApi; -import org.apache.brooklyn.rest.domain.PolicyConfigSummary; -import org.apache.brooklyn.rest.filter.HaHotStateRequired; -import org.apache.brooklyn.rest.transform.PolicyTransformer; -import org.apache.brooklyn.rest.util.BrooklynRestResourceUtils; -import org.apache.brooklyn.rest.util.WebResourceUtils; -import org.apache.brooklyn.util.core.flags.TypeCoercions; - -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; - -@HaHotStateRequired -public class PolicyConfigResource extends AbstractBrooklynRestResource implements PolicyConfigApi { - - @Override - public List<PolicyConfigSummary> list( - final String application, final String entityToken, final String policyToken) { - Entity entity = brooklyn().getEntity(application, entityToken); - Policy policy = brooklyn().getPolicy(entity, policyToken); - - List<PolicyConfigSummary> result = Lists.newArrayList(); - for (ConfigKey<?> key : policy.getPolicyType().getConfigKeys()) { - result.add(PolicyTransformer.policyConfigSummary(brooklyn(), entity, policy, key)); - } - return result; - } - - // TODO support parameters ?show=value,summary&name=xxx &format={string,json,xml} - // (and in sensors class) - @Override - public Map<String, Object> batchConfigRead(String application, String entityToken, String policyToken) { - // TODO: add test - Policy policy = brooklyn().getPolicy(application, entityToken, policyToken); - Map<String, Object> source = ((BrooklynObjectInternal)policy).config().getBag().getAllConfig(); - Map<String, Object> result = Maps.newLinkedHashMap(); - for (Map.Entry<String, Object> ek : source.entrySet()) { - result.put(ek.getKey(), getStringValueForDisplay(brooklyn(), policy, ek.getValue())); - } - return result; - } - - @Override - public String get(String application, String entityToken, String policyToken, String configKeyName) { - Policy policy = brooklyn().getPolicy(application, entityToken, policyToken); - ConfigKey<?> ck = policy.getPolicyType().getConfigKey(configKeyName); - if (ck == null) throw WebResourceUtils.notFound("Cannot find config key '%s' in policy '%s' of entity '%s'", configKeyName, policy, entityToken); - - return getStringValueForDisplay(brooklyn(), policy, policy.getConfig(ck)); - } - - @Override - @Deprecated - public Response set(String application, String entityToken, String policyToken, String configKeyName, String value) { - return set(application, entityToken, policyToken, configKeyName, (Object) value); - } - - @SuppressWarnings({ "unchecked", "rawtypes" }) - @Override - public Response set(String application, String entityToken, String policyToken, String configKeyName, Object value) { - Entity entity = brooklyn().getEntity(application, entityToken); - if (!Entitlements.isEntitled(mgmt().getEntitlementManager(), Entitlements.MODIFY_ENTITY, entity)) { - throw WebResourceUtils.forbidden("User '%s' is not authorized to modify entity '%s'", - Entitlements.getEntitlementContext().user(), entity); - } - - Policy policy = brooklyn().getPolicy(application, entityToken, policyToken); - ConfigKey<?> ck = policy.getPolicyType().getConfigKey(configKeyName); - if (ck == null) throw WebResourceUtils.notFound("Cannot find config key '%s' in policy '%s' of entity '%s'", configKeyName, policy, entityToken); - - policy.config().set((ConfigKey) ck, TypeCoercions.coerce(value, ck.getTypeToken())); - - return Response.status(Response.Status.OK).build(); - } - - public static String getStringValueForDisplay(BrooklynRestResourceUtils utils, Policy policy, Object value) { - return utils.getStringValueForDisplay(value); - } -}