/** * Retrieves the specified input port. * * @param clientId Optional client id. If the client id is not specified, a new one will be * generated. This value (whether specified or generated) is included in the response. * @param id The id of the input port to retrieve * @return A inputPortEntity. */ @GET @Consumes(MediaType.WILDCARD) @Produces(MediaType.APPLICATION_JSON) @Path("{id}") // TODO - @PreAuthorize("hasAnyRole('ROLE_MONITOR', 'ROLE_DFM', 'ROLE_ADMIN')") @ApiOperation( value = "Gets an input port", response = InputPortEntity.class, authorizations = { @Authorization(value = "Read Only", type = "ROLE_MONITOR"), @Authorization(value = "Data Flow Manager", type = "ROLE_DFM"), @Authorization(value = "Administrator", type = "ROLE_ADMIN") }) @ApiResponses( value = { @ApiResponse( code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."), @ApiResponse(code = 401, message = "Client could not be authenticated."), @ApiResponse(code = 403, message = "Client is not authorized to make this request."), @ApiResponse(code = 404, message = "The specified resource could not be found."), @ApiResponse( code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.") }) public Response getInputPort( @ApiParam( value = "If the client id is not specified, new one will be generated. This value (whether specified or generated) is included in the response.", required = false) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) ClientIdParameter clientId, @ApiParam(value = "The input port id.", required = true) @PathParam("id") String id) { // replicate if cluster manager if (properties.isClusterManager()) { return clusterManager .applyRequest(HttpMethod.GET, getAbsolutePath(), getRequestParameters(true), getHeaders()) .getResponse(); } // get the port final PortDTO port = serviceFacade.getInputPort(id); // create the revision final RevisionDTO revision = new RevisionDTO(); revision.setClientId(clientId.getClientId()); // create the response entity final InputPortEntity entity = new InputPortEntity(); entity.setRevision(revision); entity.setInputPort(populateRemainingInputPortContent(port)); return clusterContext(generateOkResponse(entity)).build(); }
private ProcessorDTO createProcessor(final String token) throws Exception { String url = BASE_URL + "/process-groups/root/processors"; // authorization header Map<String, String> headers = new HashMap<>(); headers.put("Authorization", "Bearer " + token); // create the processor ProcessorDTO processor = new ProcessorDTO(); processor.setName("Copy"); processor.setType(SourceTestProcessor.class.getName()); // create the revision final RevisionDTO revision = new RevisionDTO(); revision.setClientId(CLIENT_ID); revision.setVersion(0l); // create the entity body ProcessorEntity entity = new ProcessorEntity(); entity.setRevision(revision); entity.setComponent(processor); // perform the request ClientResponse response = TOKEN_USER.testPostWithHeaders(url, entity, headers); // ensure the request is successful Assert.assertEquals(201, response.getStatus()); // get the entity body entity = response.getEntity(ProcessorEntity.class); // verify creation processor = entity.getComponent(); Assert.assertEquals("Copy", processor.getName()); Assert.assertEquals( "org.apache.nifi.integration.util.SourceTestProcessor", processor.getType()); return processor; }
/** * Creates a new access policy. * * @param httpServletRequest request * @param accessPolicyEntity An accessPolicyEntity. * @return An accessPolicyEntity. */ @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) // TODO - @PreAuthorize("hasRole('ROLE_DFM')") @ApiOperation( value = "Creates an access policy", response = AccessPolicyEntity.class, authorizations = {@Authorization(value = "Data Flow Manager", type = "ROLE_DFM")}) @ApiResponses( value = { @ApiResponse( code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."), @ApiResponse(code = 401, message = "Client could not be authenticated."), @ApiResponse(code = 403, message = "Client is not authorized to make this request."), @ApiResponse(code = 404, message = "The specified resource could not be found."), @ApiResponse( code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.") }) public Response createAccessPolicy( @Context final HttpServletRequest httpServletRequest, @ApiParam(value = "The access policy configuration details.", required = true) final AccessPolicyEntity accessPolicyEntity) { if (accessPolicyEntity == null || accessPolicyEntity.getComponent() == null) { throw new IllegalArgumentException("Access policy details must be specified."); } if (accessPolicyEntity.getRevision() == null || (accessPolicyEntity.getRevision().getVersion() == null || accessPolicyEntity.getRevision().getVersion() != 0)) { throw new IllegalArgumentException( "A revision of 0 must be specified when creating a new Policy."); } final AccessPolicyDTO requestAccessPolicy = accessPolicyEntity.getComponent(); if (requestAccessPolicy.getId() != null) { throw new IllegalArgumentException("Access policy ID cannot be specified."); } if (requestAccessPolicy.getResource() == null) { throw new IllegalArgumentException("Access policy resource must be specified."); } // ensure this is a valid action RequestAction.valueOfValue(requestAccessPolicy.getAction()); if (isReplicateRequest()) { return replicate(HttpMethod.POST, accessPolicyEntity); } // handle expects request (usually from the cluster manager) final boolean validationPhase = isValidationPhase(httpServletRequest); if (validationPhase || !isTwoPhaseRequest(httpServletRequest)) { // authorize access serviceFacade.authorizeAccess( lookup -> { final Authorizable accessPolicies = lookup.getAccessPolicyByResource(requestAccessPolicy.getResource()); accessPolicies.authorize(authorizer, RequestAction.WRITE, NiFiUserUtils.getNiFiUser()); }); } if (validationPhase) { return generateContinueResponse().build(); } // set the access policy id as appropriate requestAccessPolicy.setId(generateUuid()); // get revision from the config final RevisionDTO revisionDTO = accessPolicyEntity.getRevision(); Revision revision = new Revision( revisionDTO.getVersion(), revisionDTO.getClientId(), accessPolicyEntity.getComponent().getId()); // create the access policy and generate the json final AccessPolicyEntity entity = serviceFacade.createAccessPolicy(revision, accessPolicyEntity.getComponent()); populateRemainingAccessPolicyEntityContent(entity); // build the response return clusterContext(generateCreatedResponse(URI.create(entity.getUri()), entity)).build(); }
/** * Converts a Revision DTO and an associated Component ID into a Revision object * * @param revisionDto the Revision DTO * @param componentId the ID of the component that the Revision DTO belongs to * @return a Revision that has the same client ID and Version as the Revision DTO and the * Component ID specified */ protected Revision getRevision(final RevisionDTO revisionDto, final String componentId) { return new Revision(revisionDto.getVersion(), revisionDto.getClientId(), componentId); }
/** * Removes the specified input port. * * @param httpServletRequest request * @param version The revision is used to verify the client is working with the latest version of * the flow. * @param clientId Optional client id. If the client id is not specified, a new one will be * generated. This value (whether specified or generated) is included in the response. * @param id The id of the input port to remove. * @return A inputPortEntity. */ @DELETE @Consumes(MediaType.WILDCARD) @Produces(MediaType.APPLICATION_JSON) @Path("{id}") // TODO - @PreAuthorize("hasRole('ROLE_DFM')") @ApiOperation( value = "Deletes an input port", response = InputPortEntity.class, authorizations = {@Authorization(value = "Data Flow Manager", type = "ROLE_DFM")}) @ApiResponses( value = { @ApiResponse( code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."), @ApiResponse(code = 401, message = "Client could not be authenticated."), @ApiResponse(code = 403, message = "Client is not authorized to make this request."), @ApiResponse(code = 404, message = "The specified resource could not be found."), @ApiResponse( code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.") }) public Response removeInputPort( @Context HttpServletRequest httpServletRequest, @ApiParam( value = "The revision is used to verify the client is working with the latest version of the flow.", required = false) @QueryParam(VERSION) LongParameter version, @ApiParam( value = "If the client id is not specified, new one will be generated. This value (whether specified or generated) is included in the response.", required = false) @QueryParam(CLIENT_ID) @DefaultValue(StringUtils.EMPTY) ClientIdParameter clientId, @ApiParam(value = "The input port id.", required = true) @PathParam("id") String id) { // replicate if cluster manager if (properties.isClusterManager()) { return clusterManager .applyRequest( HttpMethod.DELETE, getAbsolutePath(), getRequestParameters(true), getHeaders()) .getResponse(); } // handle expects request (usually from the cluster manager) final String expects = httpServletRequest.getHeader(WebClusterManager.NCM_EXPECTS_HTTP_HEADER); if (expects != null) { serviceFacade.verifyDeleteInputPort(id); return generateContinueResponse().build(); } // determine the specified version Long clientVersion = null; if (version != null) { clientVersion = version.getLong(); } // delete the specified input port final ConfigurationSnapshot<Void> controllerResponse = serviceFacade.deleteInputPort(new Revision(clientVersion, clientId.getClientId()), id); // get the updated revision final RevisionDTO revision = new RevisionDTO(); revision.setClientId(clientId.getClientId()); revision.setVersion(controllerResponse.getVersion()); // build the response entity final InputPortEntity entity = new InputPortEntity(); entity.setRevision(revision); return clusterContext(generateOkResponse(entity)).build(); }
/** * Updates the specified input port. * * @param httpServletRequest request * @param id The id of the input port to update. * @param portEntity A inputPortEntity. * @return A inputPortEntity. */ @PUT @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) @Path("{id}") // TODO - @PreAuthorize("hasRole('ROLE_DFM')") @ApiOperation( value = "Updates an input port", response = InputPortEntity.class, authorizations = {@Authorization(value = "Data Flow Manager", type = "ROLE_DFM")}) @ApiResponses( value = { @ApiResponse( code = 400, message = "NiFi was unable to complete the request because it was invalid. The request should not be retried without modification."), @ApiResponse(code = 401, message = "Client could not be authenticated."), @ApiResponse(code = 403, message = "Client is not authorized to make this request."), @ApiResponse(code = 404, message = "The specified resource could not be found."), @ApiResponse( code = 409, message = "The request was valid but NiFi was not in the appropriate state to process it. Retrying the same request later may be successful.") }) public Response updateInputPort( @Context HttpServletRequest httpServletRequest, @ApiParam(value = "The input port id.", required = true) @PathParam("id") String id, @ApiParam(value = "The input port configuration details.", required = true) InputPortEntity portEntity) { if (portEntity == null || portEntity.getInputPort() == null) { throw new IllegalArgumentException("Input port details must be specified."); } if (portEntity.getRevision() == null) { throw new IllegalArgumentException("Revision must be specified."); } // ensure the ids are the same final PortDTO requestPortDTO = portEntity.getInputPort(); if (!id.equals(requestPortDTO.getId())) { throw new IllegalArgumentException( String.format( "The input port id (%s) in the request body does not equal the " + "input port id of the requested resource (%s).", requestPortDTO.getId(), id)); } // replicate if cluster manager if (properties.isClusterManager()) { // change content type to JSON for serializing entity final Map<String, String> headersToOverride = new HashMap<>(); headersToOverride.put("content-type", MediaType.APPLICATION_JSON); // replicate the request return clusterManager .applyRequest( HttpMethod.PUT, getAbsolutePath(), updateClientId(portEntity), getHeaders(headersToOverride)) .getResponse(); } // handle expects request (usually from the cluster manager) final String expects = httpServletRequest.getHeader(WebClusterManager.NCM_EXPECTS_HTTP_HEADER); if (expects != null) { serviceFacade.verifyUpdateInputPort(requestPortDTO); return generateContinueResponse().build(); } // update the input port final RevisionDTO revision = portEntity.getRevision(); final ConfigurationSnapshot<PortDTO> controllerResponse = serviceFacade.updateInputPort( new Revision(revision.getVersion(), revision.getClientId()), requestPortDTO); // get the results final PortDTO responsePortDTO = controllerResponse.getConfiguration(); populateRemainingInputPortContent(responsePortDTO); // get the updated revision final RevisionDTO updatedRevision = new RevisionDTO(); updatedRevision.setClientId(revision.getClientId()); updatedRevision.setVersion(controllerResponse.getVersion()); // build the response entity final InputPortEntity entity = new InputPortEntity(); entity.setRevision(updatedRevision); entity.setInputPort(responsePortDTO); if (controllerResponse.isNew()) { return clusterContext(generateCreatedResponse(URI.create(responsePortDTO.getUri()), entity)) .build(); } else { return clusterContext(generateOkResponse(entity)).build(); } }