Search in sources :

Example 1 with BatchRunnableInstances

use of co.cask.cdap.proto.BatchRunnableInstances in project cdap by caskdata.

the class ProgramLifecycleHttpHandler method getProgramInstances.

/**
   * Get requested and provisioned instances for a program type.
   * The program type passed here should be one that can have instances (flows, services, ...)
   * Requires caller to do this validation.
   */
private BatchRunnableInstances getProgramInstances(BatchRunnable runnable, ApplicationSpecification spec, ProgramId programId) {
    int requested;
    String programName = programId.getProgram();
    String runnableId = programName;
    ProgramType programType = programId.getType();
    if (programType == ProgramType.WORKER) {
        if (!spec.getWorkers().containsKey(programName)) {
            return new BatchRunnableInstances(runnable, HttpResponseStatus.NOT_FOUND.getCode(), "Worker: " + programName + " not found");
        }
        requested = spec.getWorkers().get(programName).getInstances();
    } else if (programType == ProgramType.SERVICE) {
        if (!spec.getServices().containsKey(programName)) {
            return new BatchRunnableInstances(runnable, HttpResponseStatus.NOT_FOUND.getCode(), "Service: " + programName + " not found");
        }
        requested = spec.getServices().get(programName).getInstances();
    } else if (programType == ProgramType.FLOW) {
        // flows must have runnable id
        runnableId = runnable.getRunnableId();
        if (runnableId == null) {
            return new BatchRunnableInstances(runnable, HttpResponseStatus.BAD_REQUEST.getCode(), "Must provide the flowlet id as the runnableId for flows");
        }
        FlowSpecification flowSpec = spec.getFlows().get(programName);
        if (flowSpec == null) {
            return new BatchRunnableInstances(runnable, HttpResponseStatus.NOT_FOUND.getCode(), "Flow: " + programName + " not found");
        }
        FlowletDefinition flowletDefinition = flowSpec.getFlowlets().get(runnableId);
        if (flowletDefinition == null) {
            return new BatchRunnableInstances(runnable, HttpResponseStatus.NOT_FOUND.getCode(), "Flowlet: " + runnableId + " not found");
        }
        requested = flowletDefinition.getInstances();
    } else {
        return new BatchRunnableInstances(runnable, HttpResponseStatus.BAD_REQUEST.getCode(), "Instances not supported for program type + " + programType);
    }
    int provisioned = getInstanceCount(programId, runnableId);
    // use the pretty name of program types to be consistent
    return new BatchRunnableInstances(runnable, HttpResponseStatus.OK.getCode(), provisioned, requested);
}
Also used : FlowletDefinition(co.cask.cdap.api.flow.FlowletDefinition) FlowSpecification(co.cask.cdap.api.flow.FlowSpecification) BatchRunnableInstances(co.cask.cdap.proto.BatchRunnableInstances) ProgramType(co.cask.cdap.proto.ProgramType) Constraint(co.cask.cdap.internal.schedule.constraint.Constraint) ProtoConstraint(co.cask.cdap.proto.ProtoConstraint)

Example 2 with BatchRunnableInstances

use of co.cask.cdap.proto.BatchRunnableInstances in project cdap by caskdata.

the class ProgramLifecycleHttpHandler method getInstances.

/**
   * Returns the number of instances for all program runnables that are passed into the data. The data is an array of
   * Json objects where each object must contain the following three elements: appId, programType, and programId
   * (flow name, service name). Retrieving instances only applies to flows, and user
   * services. For flows, another parameter, "runnableId", must be provided. This corresponds to the
   * flowlet/runnable for which to retrieve the instances.
   * <p>
   * Example input:
   * <pre><code>
   * [{"appId": "App1", "programType": "Service", "programId": "Service1", "runnableId": "Runnable1"},
   *  {"appId": "App1", "programType": "Mapreduce", "programId": "Mapreduce2"},
   *  {"appId": "App2", "programType": "Flow", "programId": "Flow1", "runnableId": "Flowlet1"}]
   * </code></pre>
   * </p><p>
   * The response will be an array of JsonObjects each of which will contain the three input parameters
   * as well as 3 fields:
   * <ul>
   * <li>"provisioned" which maps to the number of instances actually provided for the input runnable;</li>
   * <li>"requested" which maps to the number of instances the user has requested for the input runnable; and</li>
   * <li>"statusCode" which maps to the http status code for the data in that JsonObjects (200, 400, 404).</li>
   * </ul>
   * </p><p>
   * If an error occurs in the input (for the example above, Flowlet1 does not exist), then all JsonObjects for
   * which the parameters have a valid instances will have the provisioned and requested fields status code fields
   * but all JsonObjects for which the parameters are not valid will have an error message and statusCode.
   * </p><p>
   * For example, if there is no Flowlet1 in the above data, then the response could be 200 OK with the following data:
   * </p>
   * <pre><code>
   * [{"appId": "App1", "programType": "Service", "programId": "Service1", "runnableId": "Runnable1",
   *   "statusCode": 200, "provisioned": 2, "requested": 2},
   *  {"appId": "App1", "programType": "Mapreduce", "programId": "Mapreduce2", "statusCode": 400,
   *   "error": "Program type 'Mapreduce' is not a valid program type to get instances"},
   *  {"appId": "App2", "programType": "Flow", "programId": "Flow1", "runnableId": "Flowlet1", "statusCode": 404,
   *   "error": "Program": Flowlet1 not found"}]
   * </code></pre>
   */
@POST
@Path("/instances")
@AuditPolicy(AuditDetail.REQUEST_BODY)
public void getInstances(HttpRequest request, HttpResponder responder, @PathParam("namespace-id") String namespaceId) throws IOException, BadRequestException {
    List<BatchRunnable> runnables = validateAndGetBatchInput(request, BATCH_RUNNABLES_TYPE);
    // cache app specs to perform fewer store lookups
    Map<ApplicationId, ApplicationSpecification> appSpecs = new HashMap<>();
    List<BatchRunnableInstances> output = new ArrayList<>(runnables.size());
    for (BatchRunnable runnable : runnables) {
        // cant get instances for things that are not flows, services, or workers
        if (!canHaveInstances(runnable.getProgramType())) {
            output.add(new BatchRunnableInstances(runnable, HttpResponseStatus.BAD_REQUEST.getCode(), String.format("Program type '%s' is not a valid program type to get instances", runnable.getProgramType().getPrettyName())));
            continue;
        }
        ApplicationId appId = new ApplicationId(namespaceId, runnable.getAppId());
        // populate spec cache if this is the first time we've seen the appid.
        if (!appSpecs.containsKey(appId)) {
            appSpecs.put(appId, store.getApplication(appId));
        }
        ApplicationSpecification spec = appSpecs.get(appId);
        if (spec == null) {
            output.add(new BatchRunnableInstances(runnable, HttpResponseStatus.NOT_FOUND.getCode(), String.format("App: %s not found", appId)));
            continue;
        }
        ProgramId programId = appId.program(runnable.getProgramType(), runnable.getProgramId());
        output.add(getProgramInstances(runnable, spec, programId));
    }
    responder.sendJson(HttpResponseStatus.OK, output);
}
Also used : BatchRunnable(co.cask.cdap.proto.BatchRunnable) ApplicationSpecification(co.cask.cdap.api.app.ApplicationSpecification) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) BatchRunnableInstances(co.cask.cdap.proto.BatchRunnableInstances) ApplicationId(co.cask.cdap.proto.id.ApplicationId) ProgramId(co.cask.cdap.proto.id.ProgramId) Path(javax.ws.rs.Path) AuditPolicy(co.cask.cdap.common.security.AuditPolicy) POST(javax.ws.rs.POST)

Aggregations

BatchRunnableInstances (co.cask.cdap.proto.BatchRunnableInstances)2 ApplicationSpecification (co.cask.cdap.api.app.ApplicationSpecification)1 FlowSpecification (co.cask.cdap.api.flow.FlowSpecification)1 FlowletDefinition (co.cask.cdap.api.flow.FlowletDefinition)1 AuditPolicy (co.cask.cdap.common.security.AuditPolicy)1 Constraint (co.cask.cdap.internal.schedule.constraint.Constraint)1 BatchRunnable (co.cask.cdap.proto.BatchRunnable)1 ProgramType (co.cask.cdap.proto.ProgramType)1 ProtoConstraint (co.cask.cdap.proto.ProtoConstraint)1 ApplicationId (co.cask.cdap.proto.id.ApplicationId)1 ProgramId (co.cask.cdap.proto.id.ProgramId)1 ArrayList (java.util.ArrayList)1 HashMap (java.util.HashMap)1 POST (javax.ws.rs.POST)1 Path (javax.ws.rs.Path)1