package alien4cloud.rest.csar; import java.util.List; import javax.inject.Inject; import javax.validation.Valid; import io.swagger.annotations.Api; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import alien4cloud.audit.annotation.Audit; import alien4cloud.csar.services.CsarGitRepositoryService; import alien4cloud.csar.services.CsarGitService; import alien4cloud.dao.model.GetMultipleDataResult; import org.alien4cloud.tosca.model.Csar; import alien4cloud.model.git.CsarGitRepository; import alien4cloud.rest.model.*; import alien4cloud.tosca.parser.ParsingErrorLevel; import alien4cloud.tosca.parser.ParsingResult; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; @RestController @RequestMapping(value = { "/rest/csarsgit", "/rest/v1/csarsgit", "/rest/latest/csarsgit" }) @Api(value = "", description = "Operations on CSAR Git") public class CsarGitController { @Inject private CsarGitService csarGitService; @Inject private CsarGitRepositoryService csarGitRepositoryService; /** * Create a new CsarGit in the system * * @param request The CsarGit to save in the system. * @return an the id of the created CsarGit {@link RestResponse}. */ @ApiOperation(value = "Create a new CSARGit from a Git location in ALIEN.") @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'ARCHITECT')") @Audit public RestResponse<String> create(@Valid @RequestBody CreateCsarGitRequest request) { String csarId = csarGitRepositoryService.create(request.getRepositoryUrl(), request.getUsername(), request.getPassword(), request.getImportLocations(), request.isStoredLocally()); return RestResponseBuilder.<String> builder().data(csarId).build(); } /** * Retrieve information on a repository from the system * * @param id The unique id of the CsarGit to retrieve. * @return The CsarGit matching the requested id. */ @ApiOperation(value = "Retrieve information on a registered TOSCA CSAR git repository.") @RequestMapping(value = "/{id}", method = RequestMethod.GET) @PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'ARCHITECT')") public RestResponse<CsarGitRepository> get(@ApiParam(value = "Id of the csar git repository to get", required = true) @PathVariable String id) { CsarGitRepository csargit = csarGitRepositoryService.getOrFail(id); return RestResponseBuilder.<CsarGitRepository> builder().data(csargit).build(); } /** * Search for tosca csar git repositories. * * @param query The search query. * @param from The index from which to get data. * @param size The size of the query. * @return A rest response that contains the query result. */ @ApiOperation(value = "Search for TOSCA CSAR git repositories.") @RequestMapping(method = RequestMethod.GET) @PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'ARCHITECT')") public RestResponse<GetMultipleDataResult<CsarGitRepository>> search(@ApiParam(value = "Query text.") @RequestParam(required = false) String query, @ApiParam(value = "Query from the given index.") @RequestParam(required = false, defaultValue = "0") int from, @ApiParam(value = "Maximum number of results to retrieve.") @RequestParam(required = false, defaultValue = "20") int size) { GetMultipleDataResult<CsarGitRepository> result = csarGitRepositoryService.search(query, from, size); return RestResponseBuilder.<GetMultipleDataResult<CsarGitRepository>> builder().data(result).build(); } /** * Delete information on a repository from the system * * @param id The unique id of the CsarGit to retrieve. * @return The CsarGit matching the requested id. */ @ApiOperation(value = "Delete a registered TOSCA CSAR git repository.") @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'ARCHITECT')") @Audit public RestResponse<Void> delete(@ApiParam(value = "Id of the csar git repository to delete", required = true) @PathVariable String id) { csarGitService.delete(id); return RestResponseBuilder.<Void> builder().build(); } /** * Update an existing CsarGit by id * * @param request The CsarGit data to update * @return an empty (void) rest {@link RestResponse}. */ @ApiOperation(value = "Update a CSARGit by id.") @RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) @PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'ARCHITECT')") @Audit public RestResponse<Void> update(@ApiParam(value = "Id of the csar git repository to delete", required = true) @PathVariable String id, @RequestBody CreateCsarGitRequest request) { csarGitRepositoryService.update(id, request.getRepositoryUrl(), request.getUsername(), request.getPassword(), request.getImportLocations(), request.isStoredLocally()); return RestResponseBuilder.<Void> builder().build(); } /** * Trigger the import the content of a repository into Alien 4 Cloud catalog. * * @param id The unique id of the CsarGit to retrieve. * @return The CsarGit matching the requested id. */ @ApiOperation(value = "Specify a CSAR from Git and proceed to its import in Alien.") @RequestMapping(value = "/{id:.+}", method = RequestMethod.POST) @PreAuthorize("hasAnyAuthority('ADMIN', 'COMPONENTS_MANAGER', 'ARCHITECT')") @Audit public RestResponse<List<ParsingResult<Csar>>> importCsar(@Valid @PathVariable String id) { List<ParsingResult<Csar>> parsingResult = csarGitService.importFromGitRepository(id); RestError error = null; for (ParsingResult<Csar> result : parsingResult) { // check if there is any critical failure in the import if (result.hasError(ParsingErrorLevel.ERROR)) { error = RestErrorBuilder.builder(RestErrorCode.CSAR_PARSING_ERROR).build(); } } return RestResponseBuilder.<List<ParsingResult<Csar>>> builder().error(error).data(parsingResult).build(); } }