X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=enrichment-coordinator-service%2Fsrc%2Fmain%2Fjava%2Forg%2Foransc%2Fenrichment%2Fcontrollers%2Fconsumer%2FConsumerController.java;h=ec83f65cc6911e00de783d1157a7f4d51f7c362f;hb=c5ea745a563f8bae0c0c3de3649a943e167f01cc;hp=6e9438d3d8d7a37666aee93424f4a748daddb11a;hpb=f0019c8168b9d59f132ba47e939e8aa3ef324b7d;p=nonrtric.git diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java index 6e9438d3..ec83f65c 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerController.java @@ -24,18 +24,19 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiParam; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; - +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +import java.lang.invoke.MethodHandles; import java.util.ArrayList; -import java.util.Collection; import java.util.List; -import org.everit.json.schema.Schema; -import org.everit.json.schema.loader.SchemaLoader; import org.json.JSONObject; import org.oransc.enrichment.configuration.ApplicationConfig; import org.oransc.enrichment.controllers.ErrorResponse; @@ -44,10 +45,11 @@ import org.oransc.enrichment.controllers.producer.ProducerCallbacks; import org.oransc.enrichment.exceptions.ServiceException; import org.oransc.enrichment.repository.EiJob; import org.oransc.enrichment.repository.EiJobs; -import org.oransc.enrichment.repository.EiProducer; import org.oransc.enrichment.repository.EiProducers; import org.oransc.enrichment.repository.EiType; import org.oransc.enrichment.repository.EiTypes; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -63,11 +65,13 @@ import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; @SuppressWarnings("java:S3457") // No need to call "toString()" method as formatting and string .. -@RestController("ConsumerController") -@Api(tags = {ConsumerConsts.CONSUMER_API_NAME}) +@RestController("A1-EI") +@Tag(name = ConsumerConsts.CONSUMER_API_NAME) @RequestMapping(path = ConsumerConsts.API_ROOT, produces = MediaType.APPLICATION_JSON_VALUE) public class ConsumerController { + private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); + @Autowired ApplicationConfig applicationConfig; @@ -86,14 +90,13 @@ public class ConsumerController { private static Gson gson = new GsonBuilder().create(); @GetMapping(path = "/eitypes", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI type identifiers", notes = "") + @Operation(summary = "EI type identifiers", description = "") @ApiResponses( value = { // @ApiResponse( - code = 200, - message = "EI type identifiers", - response = String.class, - responseContainer = "List"), // + responseCode = "200", + description = "EI type identifiers", // + content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))), // }) public ResponseEntity getEiTypeIdentifiers( // ) { @@ -106,14 +109,18 @@ public class ConsumerController { } @GetMapping(path = "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI type", notes = "") + @Operation(summary = "Individual EI type", description = "") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "EI type", response = ConsumerEiTypeInfo.class), // @ApiResponse( - code = 404, - message = "Enrichment Information type is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "EI type", // + content = @Content(schema = @Schema(implementation = ConsumerEiTypeInfo.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information type is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity getEiType( // @PathVariable("eiTypeId") String eiTypeId) { try { @@ -126,28 +133,28 @@ public class ConsumerController { } @GetMapping(path = "/eijobs", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI job identifiers", notes = "query for EI job identifiers") + @Operation(summary = "EI job identifiers", description = "query for EI job identifiers") @ApiResponses( value = { // @ApiResponse( - code = 200, - message = "EI job identifiers", - response = String.class, - responseContainer = "List"), // + responseCode = "200", + description = "EI job identifiers", // + content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))), @ApiResponse( - code = 404, - message = "Enrichment Information type is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "404", + description = "Enrichment Information type is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity getEiJobIds( // - @ApiParam( + @Parameter( name = ConsumerConsts.EI_TYPE_ID_PARAM, required = false, // - value = ConsumerConsts.EI_TYPE_ID_PARAM_DESCRIPTION) // + description = ConsumerConsts.EI_TYPE_ID_PARAM_DESCRIPTION) // @RequestParam(name = ConsumerConsts.EI_TYPE_ID_PARAM, required = false) String eiTypeId, - @ApiParam( + @Parameter( name = ConsumerConsts.OWNER_PARAM, required = false, // - value = ConsumerConsts.OWNER_PARAM_DESCRIPTION) // + description = ConsumerConsts.OWNER_PARAM_DESCRIPTION) // @RequestParam(name = ConsumerConsts.OWNER_PARAM, required = false) String owner) { try { List result = new ArrayList<>(); @@ -170,15 +177,19 @@ public class ConsumerController { } } - @GetMapping(path = "/eijobs/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI job", notes = "") + @GetMapping(path = "/eijobs/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE) // + @Operation(summary = "Individual EI job", description = "") // @ApiResponses( value = { // - @ApiResponse(code = 200, message = "EI job", response = ConsumerEiJobInfo.class), // @ApiResponse( - code = 404, - message = "Enrichment Information job is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "EI job", // + content = @Content(schema = @Schema(implementation = ConsumerEiJobInfo.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information job is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity getIndividualEiJob( // @PathVariable("eiJobId") String eiJobId) { try { @@ -190,14 +201,18 @@ public class ConsumerController { } @GetMapping(path = "/eijobs/{eiJobId}/status", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI job status", notes = "") + @Operation(summary = "EI job status", description = "") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "EI job status", response = ConsumerEiJobStatus.class), // @ApiResponse( - code = 404, - message = "Enrichment Information job is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "EI job status", // + content = @Content(schema = @Schema(implementation = ConsumerEiJobStatus.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information job is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity getEiJobStatus( // @PathVariable("eiJobId") String eiJobId) { try { @@ -208,28 +223,30 @@ public class ConsumerController { } } - private Collection getProducers(EiJob eiJob) { - return this.eiProducers.getProducersForType(eiJob.getTypeId()); - } - private ConsumerEiJobStatus toEiJobStatus(EiJob job) { - if (getProducers(job).isEmpty()) { - return new ConsumerEiJobStatus(ConsumerEiJobStatus.EiJobStatusValues.DISABLED); - } else { - return new ConsumerEiJobStatus(ConsumerEiJobStatus.EiJobStatusValues.ENABLED); - } + return this.eiProducers.isJobEnabled(job) + ? new ConsumerEiJobStatus(ConsumerEiJobStatus.EiJobStatusValues.ENABLED) + : new ConsumerEiJobStatus(ConsumerEiJobStatus.EiJobStatusValues.DISABLED); + } @DeleteMapping(path = "/eijobs/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI job", notes = "") + @Operation(summary = "Individual EI job", description = "") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "Not used", response = VoidResponse.class), - @ApiResponse(code = 204, message = "Job deleted", response = VoidResponse.class), @ApiResponse( - code = 404, - message = "Enrichment Information job is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "Not used", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), + @ApiResponse( + responseCode = "204", + description = "Job deleted", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information job is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity deleteIndividualEiJob( // @PathVariable("eiJobId") String eiJobId) { try { @@ -245,15 +262,22 @@ public class ConsumerController { path = "/eijobs/{eiJobId}", // produces = MediaType.APPLICATION_JSON_VALUE, // consumes = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI job", notes = "") + @Operation(summary = "Individual EI job", description = "") @ApiResponses( value = { // - @ApiResponse(code = 201, message = "Job created", response = VoidResponse.class), // - @ApiResponse(code = 200, message = "Job updated", response = VoidResponse.class), // , @ApiResponse( - code = 404, - message = "Enrichment Information type is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "201", + description = "Job created", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "200", + description = "Job updated", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information type is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public Mono> putIndividualEiJob( // @PathVariable("eiJobId") String eiJobId, // @RequestBody ConsumerEiJobInfo eiJobObject) { @@ -269,19 +293,15 @@ public class ConsumerController { private Mono startEiJob(EiJob newEiJob) { return this.producerCallbacks.startEiJob(newEiJob, eiProducers) // - .flatMap(noOfAcceptingProducers -> { - if (noOfAcceptingProducers.intValue() > 0) { - return Mono.just(newEiJob); - } else { - return Mono.error(new ServiceException("Job not accepted by any producers", HttpStatus.CONFLICT)); - } - }); + .doOnNext(noOfAcceptingProducers -> this.logger.debug( + "Started EI job {}, number of activated producers: {}", newEiJob.getId(), noOfAcceptingProducers)) // + .flatMap(noOfAcceptingProducers -> Mono.just(newEiJob)); } private Mono validatePutEiJob(String eiJobId, ConsumerEiJobInfo eiJobInfo) { try { EiType eiType = this.eiTypes.getType(eiJobInfo.eiTypeId); - validateJsonObjectAgainstSchema(eiType.getJobDataSchema(), eiJobInfo.jobData); + validateJsonObjectAgainstSchema(eiType.getJobDataSchema(), eiJobInfo.jobDefinition); EiJob existingEiJob = this.eiJobs.get(eiJobId); if (existingEiJob != null && !existingEiJob.getTypeId().equals(eiJobInfo.eiTypeId)) { @@ -300,7 +320,7 @@ public class ConsumerController { String schemaAsString = mapper.writeValueAsString(schemaObj); JSONObject schemaJSON = new JSONObject(schemaAsString); - Schema schema = SchemaLoader.load(schemaJSON); + org.everit.json.schema.Schema schema = org.everit.json.schema.loader.SchemaLoader.load(schemaJSON); String objectAsString = mapper.writeValueAsString(object); JSONObject json = new JSONObject(objectAsString); @@ -316,8 +336,8 @@ public class ConsumerController { .id(id) // .typeId(type.getId()) // .owner(info.owner) // - .jobData(info.jobData) // - .targetUrl(info.targetUri) // + .jobData(info.jobDefinition) // + .targetUrl(info.jobResultUri) // .jobStatusUrl(info.statusNotificationUri == null ? "" : info.statusNotificationUri) // .build(); }