Creating a Management Resource

Publishing a Management Resource

Creating a management resource is done through the use of the Fabric3 org.fabric3.api.annotation.management annotations. Note management components must be composite-scoped. Below is a simple component that exposes a property and an operation:

@Scope("COMPOSITE")
@Management(path="/myapp/audit")
public class AuditServiceImpl implements AuditService {
 
    @ManagementOperation
    public void setAuditLevel(String level) {
        //...
    }
     
    @ManagementOperation
    public String getAuditLevel() {
        //...
    }
 
    @ManagementOperation
    public void startAudit() {
        // ...
    }
 
    @ManagementOperation
    public void stopAudit() {
        // ..
    }
}

The above component will be published at http:<runtime address:port>/management/myapp/audit. Components are published relative to http:<runtime address:port>/management using the path attribute of the @Management annotation. Methods annotated with @ManagementOperation are exposed relative to the resource root. For example, the URI for stopAudit will be http:<runtime address:port>/management/myapp/audit/stopAudit. If a path is also present on the @ManagementOperation annotation, it will be added to the root path when calculating the URI for a method. For example, if the stopAudit operation was annotated as follows:

@ManagementOperation (path="stop")
public void stopAudit() {
   // ..
}

the URI would be: http:<runtime address:port>/management/myapp/audit/stop.

If the type attribute of @ManagementOperation is not specified, the HTTP verb is calculated from the method name as follows:

  • If the method starts with "delete" the HTTP verb is DELETE
  • If the method starts with "set" the HTTP verb is POST
  • If the method starts with "create" the HTTP verb is PUT
  • Otherwise the HTTP verb is GET

org.fabric3.api.annotation.management.OperationType defines the possible values for the type attribute.

Obtaining the HTTP Request

Sometimes it is necessary to obtain the HTTP Servlet Request associated with a management operation, for example, to receive an InputStream to read binary contants associated with a management request. This is done by having the operation take HttpServletRequest as a parameter:

    @ManagementOperation(type = OperationType.PUT, path = "contribution")
    public String receiveBinaryData(HttpServletRequest request) throws ResourceException {
        // ...
    }
}

Customizing an Operation Response

TODO include description of the org.fabric3.management.rest.model package.

Authorization

HTTP authorization can be enabled at an resource or operation level using the readRoles and writeRoles parameters for @Management and the rolesAllowed parameter for @ManagementOperation. By default on system components, readRoles is set to ROLE_FABRIC3_ADMIN and ROLE_FABRIC3_OBSERVER while writeRoles is set to ROLE_FABRIC3_ADMIN. The following example enables custom authorization:

@Scope("COMPOSITE")
@Management(readRoles={"ROLE_OPERATIONS", "ROLE_ADMIN"}, writeRoles={"ROLE_ADMIN"})
public class AuditServiceImpl implements AuditService {
 
    @ManagementOperation(rolesAllowed={"ROLE_SUPER_ADMIN"})
    public void setAuditLevel(String level) {
        // ...
    }
     
    @ManagementOperation(rolesAllowed={"ROLE_SUPER_ADMIN"})
    public String getAuditLevel() {
        // ...
    }
 
    @ManagementOperation
    public void startAudit() {
        // ...
    }
 
    @ManagementOperation
    public void stopAudit() {
        // ..
    }
}

Cluster Propagation

Note that all POST operations performed to a cluster member will be automatically propagated across a zone.