From: PatrikBuhr Date: Fri, 29 Jan 2021 14:36:29 +0000 (+0100) Subject: Uplift springboot, swagger X-Git-Tag: 2.2.0~77 X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=c5ea745a563f8bae0c0c3de3649a943e167f01cc;p=nonrtric.git Uplift springboot, swagger Changed the API document generation to use swagger3. Change-Id: I130b611735e11b0104e0c69c63025786d51a9ed6 Signed-off-by: PatrikBuhr Issue-ID: NONRTRIC-415 --- diff --git a/enrichment-coordinator-service/api/ecs-api.json b/enrichment-coordinator-service/api/ecs-api.json index 37416ac8..c99873b3 100644 --- a/enrichment-coordinator-service/api/ecs-api.json +++ b/enrichment-coordinator-service/api/ecs-api.json @@ -1,790 +1,684 @@ { - "basePath": "/", + "components": {"schemas": { + "producer_ei_job_request": { + "description": "The body of the EI producer callbacks for EI job creation and deletion", + "type": "object", + "required": ["ei_job_identity"], + "properties": { + "owner": { + "description": "The owner of the job", + "type": "string" + }, + "ei_job_identity": { + "description": "Idenitity of the EI job", + "type": "string" + }, + "last_updated": { + "description": "The time when the job was last updated or created (ISO-8601)", + "type": "string" + }, + "ei_job_data": { + "description": "Json for the job data", + "type": "object" + }, + "target_uri": { + "description": "URI for the target of the EI", + "type": "string" + }, + "ei_type_identity": { + "description": "Type idenitity for the job", + "type": "string" + } + } + }, + "EiTypeObject": { + "description": "Information for an EI type", + "type": "object" + }, + "status_info": { + "type": "object", + "required": [ + "no_of_jobs", + "no_of_producers", + "no_of_types", + "status" + ], + "properties": { + "no_of_producers": { + "format": "int32", + "description": "Number of EI producers", + "type": "integer" + }, + "no_of_types": { + "format": "int32", + "description": "Number of EI types", + "type": "integer" + }, + "no_of_jobs": { + "format": "int32", + "description": "Number of EI jobs", + "type": "integer" + }, + "status": { + "description": "status text", + "type": "string" + } + } + }, + "producer_ei_type_info": { + "description": "Information for an EI type", + "type": "object", + "required": ["ei_job_data_schema"], + "properties": {"ei_job_data_schema": { + "description": "Json schema for the job data", + "type": "object" + }} + }, + "producer_registration_info": { + "description": "Information for an EI producer", + "type": "object", + "required": [ + "ei_job_callback_url", + "ei_producer_supervision_callback_url", + "supported_ei_types" + ], + "properties": { + "supported_ei_types": { + "description": "Supported EI type IDs", + "type": "array", + "items": { + "description": "Supported EI type IDs", + "type": "string" + } + }, + "ei_producer_supervision_callback_url": { + "description": "callback for producer supervision", + "type": "string" + }, + "ei_job_callback_url": { + "description": "callback for EI job", + "type": "string" + } + } + }, + "producer_status": { + "description": "Status for an EI Producer", + "type": "object", + "required": ["operational_state"], + "properties": {"operational_state": { + "description": "Represents the operational states", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ] + }} + }, + "ProblemDetails": { + "description": "A problem detail to carry details in a HTTP response according to RFC 7807", + "type": "object", + "properties": { + "detail": { + "description": "A human-readable explanation specific to this occurrence of the problem.", + "type": "string", + "example": "EI job type not found" + }, + "status": { + "format": "int32", + "description": "The HTTP status code generated by the origin server for this occurrence of the problem.", + "type": "integer", + "example": 404 + } + } + }, + "Void": { + "description": "Void/empty ", + "type": "object" + }, + "EiJobStatusObject": { + "description": "Status for an EI job", + "type": "object", + "required": ["eiJobStatus"], + "properties": {"eiJobStatus": { + "description": "Allowed values for EI job status", + "type": "string", + "enum": [ + "ENABLED", + "DISABLED" + ] + }} + }, + "EiJobObject": { + "description": "Information for an Enrichment Information Job", + "type": "object", + "required": [ + "eiTypeId", + "jobDefinition", + "jobOwner", + "jobResultUri" + ], + "properties": { + "eiTypeId": { + "description": "EI type Idenitifier of the EI job", + "type": "string" + }, + "jobResultUri": { + "description": "The target URI of the EI data", + "type": "string" + }, + "jobOwner": { + "description": "Identity of the owner of the job", + "type": "string" + }, + "statusNotificationUri": { + "description": "The target of EI job status notifications", + "type": "string" + }, + "jobDefinition": { + "description": "EI type specific job data", + "type": "object" + } + } + } + }}, + "openapi": "3.0.1", "paths": { "/producer_simulator/ei_job": {"post": { - "summary": "Callback for EI job creation", - "deprecated": false, - "produces": ["application/json"], - "operationId": "jobCreatedCallbackUsingPOST", - "responses": { - "200": {"description": "OK"}, - "201": {"description": "Created"}, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "parameters": [{ - "schema": {"$ref": "#/definitions/producer_ei_job_request"}, - "in": "body", - "name": "request", - "description": "request", + "summary": "Callback for EI job creation/modification", + "requestBody": { + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_ei_job_request"}}}, "required": true - }], - "tags": ["Data Producer Job Control (example producer)"], - "consumes": ["application/json"] + }, + "description": "The call is invoked to activate or to modify a data subscription. The endpoint is provided by the EI producer.", + "operationId": "jobCreatedCallback", + "responses": {"200": { + "description": "OK", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }}, + "tags": ["Data producer (callbacks)"] }}, "/A1-EI/v1/eitypes/{eiTypeId}": {"get": { "summary": "Individual EI type", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiTypeUsingGET", + "operationId": "getEiType_1", "responses": { "200": { - "schema": {"$ref": "#/definitions/EiTypeObject"}, - "description": "EI type" + "description": "EI type", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiTypeObject"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information type is not found" + "description": "Enrichment Information type is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiTypeId", - "description": "eiTypeId", - "type": "string", "required": true }], - "tags": ["A1-EI (enrichment information)"] - }}, - "/consumer_simulator/eijobs/{eiJobId}/status": {"post": { - "summary": "Callback for EI job status", - "deprecated": false, - "produces": ["application/json"], - "operationId": "jobStatusCallbackUsingPOST", - "responses": { - "200": {"description": "OK"}, - "201": {"description": "Created"}, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "parameters": [ - { - "in": "path", - "name": "eiJobId", - "description": "eiJobId", - "type": "string", - "required": true - }, - { - "schema": {"$ref": "#/definitions/EiJobStatusObject"}, - "in": "body", - "name": "status", - "description": "status", - "required": true - } - ], - "tags": ["A1-EI (enrichment information) callbacks"], - "consumes": ["application/json"] + "tags": ["A1-EI (registration)"] }}, "/ei-producer/v1/eitypes": {"get": { "summary": "EI type identifiers", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiTypeIdentifiersUsingGET_1", - "responses": { - "200": { - "schema": { - "type": "array", - "items": {"type": "string"} - }, - "description": "EI type identifiers" - }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "tags": ["Data Producer Registry API"] + "operationId": "getEiTypeIdentifiers", + "responses": {"200": { + "description": "EI type identifiers", + "content": {"application/json": {"schema": { + "type": "array", + "items": {"type": "string"} + }}} + }}, + "tags": ["Data producer (registration)"] }}, "/A1-EI/v1/eitypes": {"get": { "summary": "EI type identifiers", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiTypeIdentifiersUsingGET", - "responses": { - "200": { - "schema": { - "type": "array", - "items": {"type": "string"} - }, - "description": "EI type identifiers" - }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "tags": ["A1-EI (enrichment information)"] + "operationId": "getEiTypeIdentifiers_1", + "responses": {"200": { + "description": "EI type identifiers", + "content": {"application/json": {"schema": { + "type": "array", + "items": {"type": "string"} + }}} + }}, + "tags": ["A1-EI (registration)"] }}, "/ei-producer/v1/eiproducers/{eiProducerId}/status": {"get": { "summary": "EI producer status", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiProducerStatusUsingGET", + "operationId": "getEiProducerStatus", "responses": { "200": { - "schema": {"$ref": "#/definitions/producer_status"}, - "description": "EI producer status" + "description": "EI producer status", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_status"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information producer is not found" + "description": "Enrichment Information producer is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiProducerId", - "description": "eiProducerId", - "type": "string", "required": true }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (registration)"] }}, "/producer_simulator/ei_job/{eiJobId}": {"delete": { "summary": "Callback for EI job deletion", - "deprecated": false, - "produces": ["application/json"], - "operationId": "jobDeletedCallbackUsingDELETE", - "responses": { - "200": {"description": "OK"}, - "401": {"description": "Unauthorized"}, - "204": {"description": "No Content"}, - "403": {"description": "Forbidden"} - }, + "description": "The call is invoked to terminate a data subscription. The endpoint is provided by the EI producer.", + "operationId": "jobDeletedCallback", + "responses": {"200": { + "description": "OK", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }}, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiJobId", - "description": "eiJobId", - "type": "string", "required": true }], - "tags": ["Data Producer Job Control (example producer)"] - }}, - "/ei-producer/v1/eiproducers": {"get": { - "summary": "EI producer identifiers", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiProducerIdentifiersUsingGET", - "responses": { - "200": { - "schema": { - "type": "array", - "items": {"type": "string"} - }, - "description": "EI producer identifiers" - }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "parameters": [{ - "in": "query", - "allowEmptyValue": false, - "name": "ei_type_id", - "description": "If given, only the producers for the EI Data type is returned.", - "type": "string", - "required": false - }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (callbacks)"] }}, "/ei-producer/v1/eitypes/{eiTypeId}": { "get": { "summary": "Individual EI type", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiTypeUsingGET_1", + "operationId": "getEiType", "responses": { "200": { - "schema": {"$ref": "#/definitions/producer_ei_type_info"}, - "description": "EI type" + "description": "EI type", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_ei_type_info"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information type is not found" + "description": "Enrichment Information type is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiTypeId", - "description": "eiTypeId", - "type": "string", "required": true }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (registration)"] }, "delete": { "summary": "Individual EI type", - "deprecated": false, - "produces": ["application/json"], - "operationId": "deleteEiTypeUsingDELETE", + "operationId": "deleteEiType", "responses": { - "200": {"description": "Not used"}, - "401": {"description": "Unauthorized"}, - "204": {"description": "Producer deleted"}, - "403": {"description": "Forbidden"}, + "200": { + "description": "Not used", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, + "204": { + "description": "Producer deleted", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information type is not found" + "description": "Enrichment Information type is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} }, "406": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "The Enrichment Information type has one or several active producers" + "description": "The Enrichment Information type has one or several active producers", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiTypeId", - "description": "eiTypeId", - "type": "string", "required": true }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (registration)"] }, "put": { "summary": "Individual EI type", - "deprecated": false, - "produces": ["application/json"], - "operationId": "putEiTypeUsingPUT", + "requestBody": { + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_ei_type_info"}}}, + "required": true + }, + "operationId": "putEiType", "responses": { - "200": {"description": "Type updated"}, - "201": {"description": "Type created"}, - "400": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Bad request" + "200": { + "description": "Type updated", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "parameters": [ - { - "in": "path", - "name": "eiTypeId", - "description": "eiTypeId", - "type": "string", - "required": true + "201": { + "description": "Type created", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} }, - { - "schema": {"$ref": "#/definitions/producer_ei_type_info"}, - "in": "body", - "name": "registrationInfo", - "description": "registrationInfo", - "required": true + "400": { + "description": "Bad request", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } - ], - "tags": ["Data Producer Registry API"], - "consumes": ["application/json"] + }, + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "eiTypeId", + "required": true + }], + "tags": ["Data producer (registration)"] } }, "/status": {"get": { "summary": "Returns status and statistics of this service", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getStatusUsingGET", - "responses": { - "200": { - "schema": {"$ref": "#/definitions/status_info"}, - "description": "Service is living" - }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "tags": ["Service status"] + "operationId": "getStatus", + "responses": {"200": { + "description": "Service is living", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/status_info"}}} + }}, + "tags": ["EI Service status"] + }}, + "/ei-producer/v1/eiproducers": {"get": { + "summary": "EI producer identifiers", + "operationId": "getEiProducerIdentifiers", + "responses": {"200": { + "description": "EI producer identifiers", + "content": {"application/json": {"schema": { + "type": "array", + "items": {"type": "string"} + }}} + }}, + "parameters": [{ + "schema": {"type": "string"}, + "in": "query", + "name": "ei_type_id", + "description": "If given, only the producers for the EI Data type is returned.", + "required": false + }], + "tags": ["Data producer (registration)"] }}, "/A1-EI/v1/eijobs/{eiJobId}": { "get": { "summary": "Individual EI job", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getIndividualEiJobUsingGET", + "operationId": "getIndividualEiJob", "responses": { "200": { - "schema": {"$ref": "#/definitions/EiJobObject"}, - "description": "EI job" + "description": "EI job", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobObject"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information job is not found" + "description": "Enrichment Information job is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiJobId", - "description": "eiJobId", - "type": "string", "required": true }], - "tags": ["A1-EI (enrichment information)"] + "tags": ["A1-EI (registration)"] }, "delete": { "summary": "Individual EI job", - "deprecated": false, - "produces": ["application/json"], - "operationId": "deleteIndividualEiJobUsingDELETE", + "operationId": "deleteIndividualEiJob", "responses": { - "200": {"description": "Not used"}, - "401": {"description": "Unauthorized"}, - "204": {"description": "Job deleted"}, - "403": {"description": "Forbidden"}, + "200": { + "description": "Not used", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, + "204": { + "description": "Job deleted", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information job is not found" + "description": "Enrichment Information job is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiJobId", - "description": "eiJobId", - "type": "string", "required": true }], - "tags": ["A1-EI (enrichment information)"] + "tags": ["A1-EI (registration)"] }, "put": { "summary": "Individual EI job", - "deprecated": false, - "produces": ["application/json"], - "operationId": "putIndividualEiJobUsingPUT", + "requestBody": { + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobObject"}}}, + "required": true + }, + "operationId": "putIndividualEiJob", "responses": { - "200": {"description": "Job updated"}, - "201": {"description": "Job created"}, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, + "200": { + "description": "Job updated", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, + "201": { + "description": "Job created", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information type is not found" + "description": "Enrichment Information type is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, - "parameters": [ - { - "in": "path", - "name": "eiJobId", - "description": "eiJobId", - "type": "string", - "required": true - }, - { - "schema": {"$ref": "#/definitions/EiJobObject"}, - "in": "body", - "name": "eiJobObject", - "description": "eiJobObject", - "required": true - } - ], - "tags": ["A1-EI (enrichment information)"], - "consumes": ["application/json"] + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "eiJobId", + "required": true + }], + "tags": ["A1-EI (registration)"] } }, "/ei-producer/v1/eiproducers/{eiProducerId}": { "get": { "summary": "Individual EI producer", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiProducerUsingGET", + "operationId": "getEiProducer", "responses": { "200": { - "schema": {"$ref": "#/definitions/producer_registration_info"}, - "description": "EI producer" + "description": "EI producer", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_registration_info"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information producer is not found" + "description": "Enrichment Information producer is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiProducerId", - "description": "eiProducerId", - "type": "string", "required": true }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (registration)"] }, "delete": { "summary": "Individual EI producer", - "deprecated": false, - "produces": ["application/json"], - "operationId": "deleteEiProducerUsingDELETE", + "operationId": "deleteEiProducer", "responses": { - "200": {"description": "Not used"}, - "401": {"description": "Unauthorized"}, - "204": {"description": "Producer deleted"}, - "403": {"description": "Forbidden"}, + "200": { + "description": "Not used", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, + "204": { + "description": "Producer deleted", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Producer is not found" + "description": "Producer is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiProducerId", - "description": "eiProducerId", - "type": "string", "required": true }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (registration)"] }, "put": { "summary": "Individual EI producer", - "deprecated": false, - "produces": ["application/json"], - "operationId": "putEiProducerUsingPUT", + "requestBody": { + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_registration_info"}}}, + "required": true + }, + "operationId": "putEiProducer", "responses": { - "200": {"description": "Producer updated"}, - "201": {"description": "Producer created"}, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "parameters": [ - { - "in": "path", - "name": "eiProducerId", - "description": "eiProducerId", - "type": "string", - "required": true + "200": { + "description": "Producer updated", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} }, - { - "schema": {"$ref": "#/definitions/producer_registration_info"}, - "in": "body", - "name": "registrationInfo", - "description": "registrationInfo", - "required": true + "201": { + "description": "Producer created", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} } - ], - "tags": ["Data Producer Registry API"], - "consumes": ["application/json"] + }, + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "eiProducerId", + "required": true + }], + "tags": ["Data producer (registration)"] } }, "/producer_simulator/health_check": {"get": { "summary": "Producer supervision", - "deprecated": false, - "produces": ["application/json"], - "operationId": "producerSupervisionUsingGET", - "responses": { - "200": { - "schema": {"type": "string"}, - "description": "OK" - }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, - "404": {"description": "Not Found"} - }, - "tags": ["Data Producer Job Control (example producer)"] + "description": "The endpoint is provided by the EI producer and is used for supervision of the producer.", + "operationId": "producerSupervision", + "responses": {"200": { + "description": "The producer is OK", + "content": {"application/json": {"schema": {"type": "string"}}} + }}, + "tags": ["Data producer (callbacks)"] }}, "/ei-producer/v1/eiproducers/{eiProducerId}/eijobs": {"get": { "summary": "EI job definitions", - "deprecated": false, - "produces": ["application/json"], "description": "EI job definitions for one EI producer", - "operationId": "getEiProducerJobsUsingGET", + "operationId": "getEiProducerJobs", "responses": { "200": { - "schema": { + "description": "EI producer", + "content": {"application/json": {"schema": { "type": "array", - "items": {"$ref": "#/definitions/producer_ei_job_request"} - }, - "description": "EI producer" + "items": {"$ref": "#/components/schemas/producer_ei_job_request"} + }}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information producer is not found" + "description": "Enrichment Information producer is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiProducerId", - "description": "eiProducerId", - "type": "string", "required": true }], - "tags": ["Data Producer Registry API"] + "tags": ["Data producer (registration)"] }}, "/A1-EI/v1/eijobs": {"get": { "summary": "EI job identifiers", - "deprecated": false, - "produces": ["application/json"], "description": "query for EI job identifiers", - "operationId": "getEiJobIdsUsingGET", + "operationId": "getEiJobIds", "responses": { "200": { - "schema": { + "description": "EI job identifiers", + "content": {"application/json": {"schema": { "type": "array", "items": {"type": "string"} - }, - "description": "EI job identifiers" + }}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information type is not found" + "description": "Enrichment Information type is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [ { + "schema": {"type": "string"}, "in": "query", - "allowEmptyValue": false, "name": "eiTypeId", "description": "selects EI jobs of matching EI type", - "type": "string", "required": false }, { + "schema": {"type": "string"}, "in": "query", - "allowEmptyValue": false, "name": "owner", "description": "selects EI jobs for one EI job owner", - "type": "string", "required": false } ], - "tags": ["A1-EI (enrichment information)"] + "tags": ["A1-EI (registration)"] }}, "/A1-EI/v1/eijobs/{eiJobId}/status": {"get": { "summary": "EI job status", - "deprecated": false, - "produces": ["application/json"], - "operationId": "getEiJobStatusUsingGET", + "operationId": "getEiJobStatus", "responses": { "200": { - "schema": {"$ref": "#/definitions/EiJobStatusObject"}, - "description": "EI job status" + "description": "EI job status", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobStatusObject"}}} }, - "401": {"description": "Unauthorized"}, - "403": {"description": "Forbidden"}, "404": { - "schema": {"$ref": "#/definitions/ProblemDetails"}, - "description": "Enrichment Information job is not found" + "description": "Enrichment Information job is not found", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}} } }, "parameters": [{ + "schema": {"type": "string"}, "in": "path", "name": "eiJobId", - "description": "eiJobId", - "type": "string", "required": true }], - "tags": ["A1-EI (enrichment information)"] + "tags": ["A1-EI (registration)"] + }}, + "/example_dataconsumer/eijobs/{eiJobId}/status": {"post": { + "summary": "Callback for changed EI job status", + "requestBody": { + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobStatusObject"}}}, + "required": true + }, + "description": "The primitive is implemented by the data consumer and is invoked when a EI job status has been changed.", + "operationId": "jobStatusCallback", + "responses": {"200": { + "description": "OK", + "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}} + }}, + "parameters": [{ + "schema": {"type": "string"}, + "in": "path", + "name": "eiJobId", + "required": true + }], + "tags": ["A1-EI (callbacks)"] }} }, - "definitions": { - "producer_ei_job_request": { - "description": "The body of the EI producer callbacks for EI job creation and deletion", - "type": "object", - "title": "producer_ei_job_request", - "required": ["ei_job_identity"], - "properties": { - "owner": { - "description": "The owner of the job", - "type": "string" - }, - "ei_job_identity": { - "description": "Idenitity of the EI job", - "type": "string" - }, - "last_updated": { - "description": "The time when the job was last updated or created (ISO-8601)", - "type": "string" - }, - "ei_job_data": { - "description": "Json for the job data", - "type": "object" - }, - "target_uri": { - "description": "URI for the target of the EI", - "type": "string" - }, - "ei_type_identity": { - "description": "Type idenitity for the job", - "type": "string" - } - } - }, - "EiTypeObject": { - "description": "Information for an EI type", - "type": "object", - "title": "EiTypeObject" - }, - "status_info": { - "type": "object", - "title": "status_info", - "properties": { - "no_of_producers": { - "format": "int32", - "description": "Number of EI producers", - "type": "integer" - }, - "no_of_jobs": { - "format": "int32", - "description": "Number of EI jobs", - "type": "integer" - }, - "no_of_types": { - "format": "int32", - "description": "Number of EI types", - "type": "integer" - }, - "status": { - "description": "status text", - "type": "string" - } - } - }, - "producer_ei_type_info": { - "description": "Information for an EI type", - "type": "object", - "title": "producer_ei_type_info", - "required": ["ei_job_data_schema"], - "properties": {"ei_job_data_schema": { - "description": "Json schema for the job data", - "type": "object" - }} - }, - "producer_registration_info": { - "description": "Information for an EI producer", - "type": "object", - "title": "producer_registration_info", - "required": [ - "ei_job_callback_url", - "ei_producer_supervision_callback_url", - "supported_ei_types" - ], - "properties": { - "supported_ei_types": { - "description": "Supported EI type IDs", - "type": "array", - "items": {"type": "string"} - }, - "ei_producer_supervision_callback_url": { - "description": "callback for producer supervision", - "type": "string" - }, - "ei_job_callback_url": { - "description": "callback for EI job", - "type": "string" - } - } - }, - "producer_status": { - "description": "Status for an EI Producer", - "type": "object", - "title": "producer_status", - "required": ["operational_state"], - "properties": {"operational_state": { - "description": "Operational state, values:\nENABLED: TBD\nDISABLED: TBD.", - "type": "string", - "enum": [ - "ENABLED", - "DISABLED" - ] - }} - }, - "ProblemDetails": { - "description": "A problem detail to carry details in a HTTP response according to RFC 7807", - "type": "object", - "title": "ProblemDetails", - "properties": { - "detail": { - "description": "A human-readable explanation specific to this occurrence of the problem.", - "type": "string", - "example": "EI job type not found" - }, - "status": { - "format": "int32", - "description": "The HTTP status code generated by the origin server for this occurrence of the problem.", - "type": "integer", - "example": 404 - } - } - }, - "EiJobStatusObject": { - "description": "Status for an EI job", - "type": "object", - "title": "EiJobStatusObject", - "required": ["eiJobStatus"], - "properties": {"eiJobStatus": { - "description": "values:\nENABLED: the A1-EI producer is able to deliver EI result for the EI job\nDISABLED: the A1-EI producer is unable to deliver EI result for the EI job", - "type": "string", - "enum": [ - "ENABLED", - "DISABLED" - ] - }} - }, - "EiJobObject": { - "description": "Information for an Enrichment Information Job", - "type": "object", - "title": "EiJobObject", - "required": [ - "eiTypeId", - "jobDefinition", - "jobOwner", - "jobResultUri" - ], - "properties": { - "eiTypeId": { - "description": "EI type Idenitifier of the EI job", - "type": "string" - }, - "jobResultUri": { - "description": "The target URI of the EI data", - "type": "string" - }, - "jobOwner": { - "description": "Identity of the owner of the job", - "type": "string" - }, - "jobStatusNotificationUri": { - "description": "The target of EI job status notifications", - "type": "string" - }, - "jobDefinition": { - "description": "EI type specific job data", - "type": "object" - } - } - } - }, - "swagger": "2.0", "info": { - "description": "This page lists all the rest apis for the service.", - "title": "Enrichment Data service", + "license": { + "name": "Copyright (C) 2020 Nordix Foundation. Licensed under the Apache License.", + "url": "http://www.apache.org/licenses/LICENSE-2.0" + }, + "description": "

API documentation<\/h1>

General<\/h2>

The service is mainly a broker between data producers and data consumers. A data producer has the ability to producer one or several type of data (EI type). One type of data can be produced by zero to many producers.

A data consumer can have several active data subscriptions (EI job). One EI job consists of the the type of data to produce and additional parameters for filtering of the data. These parameters are different for different data types.<\/p>

APIs provided by the service<\/h2>

A1-EI<\/h4>

This API is between Near-RT RIC, which is a data consumer and the Non-RT RIC. <\/p>

Data producer API<\/h4>

This API is between data producers and this service. It is divivided into two parts, where one is provided by this service (registration) and one part is provided by the data producer.<\/p>

EI Service status<\/h4>

This API provides a means to monitor the service.<\/p>", + "title": "Enrichment Information Service", "version": "1.0" }, "tags": [ { - "name": "A1-EI (enrichment information)", - "description": "Consumer Controller" + "name": "A1-EI (registration)", + "description": "Data consumer EI job registration" }, { - "name": "A1-EI (enrichment information) callbacks", - "description": "Consumer Simulator Controller" + "name": "A1-EI (callbacks)", + "description": "Data consumer EI job status callbacks" }, { - "name": "Data Producer Job Control (example producer)", - "description": "Producer Simulator Controller" + "name": "Data producer (callbacks)", + "description": "API implemented by data producers" }, { - "name": "Data Producer Registry API", - "description": "Producer Controller" + "name": "Data producer (registration)", + "description": "API for data producers" }, { - "name": "Service status", - "description": "Status Controller" + "name": "EI Service status", + "description": "API for monitoring of the service" } ] } \ No newline at end of file diff --git a/enrichment-coordinator-service/api/ecs-api.yaml b/enrichment-coordinator-service/api/ecs-api.yaml index d1aa1873..3b705cff 100644 --- a/enrichment-coordinator-service/api/ecs-api.yaml +++ b/enrichment-coordinator-service/api/ecs-api.yaml @@ -1,30 +1,45 @@ openapi: 3.0.1 info: - title: Enrichment Data service - description: This page lists all the rest apis for the service. + title: Enrichment Information Service + description:

API documentation

General

The service is mainly + a broker between data producers and data consumers. A data producer has the ability + to producer one or several type of data (EI type). One type of data can be produced + by zero to many producers.

A data consumer can have several active + data subscriptions (EI job). One EI job consists of the the type of data to produce + and additional parameters for filtering of the data. These parameters are different + for different data types.

APIs provided by the service

A1-EI

This + API is between Near-RT RIC, which is a data consumer and the Non-RT RIC.

Data + producer API

This API is between data producers and this service. It + is divivided into two parts, where one is provided by this service (registration) + and one part is provided by the data producer.

EI Service status

This + API provides a means to monitor the service.

+ license: + name: Copyright (C) 2020 Nordix Foundation. Licensed under the Apache License. + url: http://www.apache.org/licenses/LICENSE-2.0 version: "1.0" servers: - url: / tags: -- name: A1-EI (enrichment information) - description: Consumer Controller -- name: A1-EI (enrichment information) callbacks - description: Consumer Simulator Controller -- name: Data Producer Job Control (example producer) - description: Producer Simulator Controller -- name: Data Producer Registry API - description: Producer Controller -- name: Service status - description: Status Controller +- name: A1-EI (registration) + description: Data consumer EI job registration +- name: A1-EI (callbacks) + description: Data consumer EI job status callbacks +- name: Data producer (callbacks) + description: API implemented by data producers +- name: Data producer (registration) + description: API for data producers +- name: EI Service status + description: API for monitoring of the service paths: /producer_simulator/ei_job: post: tags: - - Data Producer Job Control (example producer) - summary: Callback for EI job creation - operationId: jobCreatedCallbackUsingPOST + - Data producer (callbacks) + summary: Callback for EI job creation/modification + description: The call is invoked to activate or to modify a data subscription. + The endpoint is provided by the EI producer. + operationId: jobCreatedCallback requestBody: - description: request content: application/json: schema: @@ -33,31 +48,22 @@ paths: responses: 200: description: OK - content: {} - 201: - description: Created - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false + content: + application/json: + schema: + $ref: '#/components/schemas/Void' /A1-EI/v1/eitypes/{eiTypeId}: get: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: Individual EI type - operationId: getEiTypeUsingGET + operationId: getEiType_1 parameters: - name: eiTypeId in: path - description: eiTypeId required: true + style: simple + explode: false schema: type: string responses: @@ -67,62 +73,18 @@ paths: application/json: schema: $ref: '#/components/schemas/EiTypeObject' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information type is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false - /consumer_simulator/eijobs/{eiJobId}/status: - post: - tags: - - A1-EI (enrichment information) callbacks - summary: Callback for EI job status - operationId: jobStatusCallbackUsingPOST - parameters: - - name: eiJobId - in: path - description: eiJobId - required: true - schema: - type: string - requestBody: - description: status - content: - application/json: - schema: - $ref: '#/components/schemas/EiJobStatusObject' - required: true - responses: - 200: - description: OK - content: {} - 201: - description: Created - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false /ei-producer/v1/eitypes: get: tags: - - Data Producer Registry API + - Data producer (registration) summary: EI type identifiers - operationId: getEiTypeIdentifiersUsingGET_1 + operationId: getEiTypeIdentifiers responses: 200: description: EI type identifiers @@ -132,22 +94,12 @@ paths: type: array items: type: string - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false /A1-EI/v1/eitypes: get: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: EI type identifiers - operationId: getEiTypeIdentifiersUsingGET + operationId: getEiTypeIdentifiers_1 responses: 200: description: EI type identifiers @@ -157,27 +109,18 @@ paths: type: array items: type: string - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false /ei-producer/v1/eiproducers/{eiProducerId}/status: get: tags: - - Data Producer Registry API + - Data producer (registration) summary: EI producer status - operationId: getEiProducerStatusUsingGET + operationId: getEiProducerStatus parameters: - name: eiProducerId in: path - description: eiProducerId required: true + style: simple + explode: false schema: type: string responses: @@ -187,89 +130,47 @@ paths: application/json: schema: $ref: '#/components/schemas/producer_status' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information producer is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false /producer_simulator/ei_job/{eiJobId}: delete: tags: - - Data Producer Job Control (example producer) + - Data producer (callbacks) summary: Callback for EI job deletion - operationId: jobDeletedCallbackUsingDELETE + description: The call is invoked to terminate a data subscription. The endpoint + is provided by the EI producer. + operationId: jobDeletedCallback parameters: - name: eiJobId in: path - description: eiJobId required: true + style: simple + explode: false schema: type: string responses: 200: description: OK - content: {} - 204: - description: No Content - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - deprecated: false - /ei-producer/v1/eiproducers: - get: - tags: - - Data Producer Registry API - summary: EI producer identifiers - operationId: getEiProducerIdentifiersUsingGET - parameters: - - name: ei_type_id - in: query - description: If given, only the producers for the EI Data type is returned. - allowEmptyValue: false - schema: - type: string - responses: - 200: - description: EI producer identifiers content: application/json: schema: - type: array - items: - type: string - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false + $ref: '#/components/schemas/Void' /ei-producer/v1/eitypes/{eiTypeId}: get: tags: - - Data Producer Registry API + - Data producer (registration) summary: Individual EI type - operationId: getEiTypeUsingGET_1 + operationId: getEiType parameters: - name: eiTypeId in: path - description: eiTypeId required: true + style: simple + explode: false schema: type: string responses: @@ -279,33 +180,26 @@ paths: application/json: schema: $ref: '#/components/schemas/producer_ei_type_info' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information type is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false put: tags: - - Data Producer Registry API + - Data producer (registration) summary: Individual EI type - operationId: putEiTypeUsingPUT + operationId: putEiType parameters: - name: eiTypeId in: path - description: eiTypeId required: true + style: simple + explode: false schema: type: string requestBody: - description: registrationInfo content: application/json: schema: @@ -314,51 +208,48 @@ paths: responses: 200: description: Type updated - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 201: description: Type created - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 400: description: Bad request content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false delete: tags: - - Data Producer Registry API + - Data producer (registration) summary: Individual EI type - operationId: deleteEiTypeUsingDELETE + operationId: deleteEiType parameters: - name: eiTypeId in: path - description: eiTypeId required: true + style: simple + explode: false schema: type: string responses: 200: description: Not used - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 204: description: Producer deleted - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 404: description: Enrichment Information type is not found content: @@ -371,13 +262,12 @@ paths: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false /status: get: tags: - - Service status + - EI Service status summary: Returns status and statistics of this service - operationId: getStatusUsingGET + operationId: getStatus responses: 200: description: Service is living @@ -385,27 +275,42 @@ paths: application/json: schema: $ref: '#/components/schemas/status_info' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false + /ei-producer/v1/eiproducers: + get: + tags: + - Data producer (registration) + summary: EI producer identifiers + operationId: getEiProducerIdentifiers + parameters: + - name: ei_type_id + in: query + description: If given, only the producers for the EI Data type is returned. + required: false + style: form + explode: true + schema: + type: string + responses: + 200: + description: EI producer identifiers + content: + application/json: + schema: + type: array + items: + type: string /A1-EI/v1/eijobs/{eiJobId}: get: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: Individual EI job - operationId: getIndividualEiJobUsingGET + operationId: getIndividualEiJob parameters: - name: eiJobId in: path - description: eiJobId required: true + style: simple + explode: false schema: type: string responses: @@ -415,33 +320,26 @@ paths: application/json: schema: $ref: '#/components/schemas/EiJobObject' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information job is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false put: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: Individual EI job - operationId: putIndividualEiJobUsingPUT + operationId: putIndividualEiJob parameters: - name: eiJobId in: path - description: eiJobId required: true + style: simple + explode: false schema: type: string requestBody: - description: eiJobObject content: application/json: schema: @@ -450,66 +348,66 @@ paths: responses: 200: description: Job updated - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 201: description: Job created - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 404: description: Enrichment Information type is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false delete: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: Individual EI job - operationId: deleteIndividualEiJobUsingDELETE + operationId: deleteIndividualEiJob parameters: - name: eiJobId in: path - description: eiJobId required: true + style: simple + explode: false schema: type: string responses: 200: description: Not used - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 204: description: Job deleted - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 404: description: Enrichment Information job is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false /ei-producer/v1/eiproducers/{eiProducerId}: get: tags: - - Data Producer Registry API + - Data producer (registration) summary: Individual EI producer - operationId: getEiProducerUsingGET + operationId: getEiProducer parameters: - name: eiProducerId in: path - description: eiProducerId required: true + style: simple + explode: false schema: type: string responses: @@ -519,33 +417,26 @@ paths: application/json: schema: $ref: '#/components/schemas/producer_registration_info' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information producer is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false put: tags: - - Data Producer Registry API + - Data producer (registration) summary: Individual EI producer - operationId: putEiProducerUsingPUT + operationId: putEiProducer parameters: - name: eiProducerId in: path - description: eiProducerId required: true + style: simple + explode: false schema: type: string requestBody: - description: registrationInfo content: application/json: schema: @@ -554,87 +445,76 @@ paths: responses: 200: description: Producer updated - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 201: description: Producer created - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false + content: + application/json: + schema: + $ref: '#/components/schemas/Void' delete: tags: - - Data Producer Registry API + - Data producer (registration) summary: Individual EI producer - operationId: deleteEiProducerUsingDELETE + operationId: deleteEiProducer parameters: - name: eiProducerId in: path - description: eiProducerId required: true + style: simple + explode: false schema: type: string responses: 200: description: Not used - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 204: description: Producer deleted - content: {} - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} + content: + application/json: + schema: + $ref: '#/components/schemas/Void' 404: description: Producer is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false /producer_simulator/health_check: get: tags: - - Data Producer Job Control (example producer) + - Data producer (callbacks) summary: Producer supervision - operationId: producerSupervisionUsingGET + description: The endpoint is provided by the EI producer and is used for supervision + of the producer. + operationId: producerSupervision responses: 200: - description: OK + description: The producer is OK content: application/json: schema: type: string - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} - 404: - description: Not Found - content: {} - deprecated: false /ei-producer/v1/eiproducers/{eiProducerId}/eijobs: get: tags: - - Data Producer Registry API + - Data producer (registration) summary: EI job definitions description: EI job definitions for one EI producer - operationId: getEiProducerJobsUsingGET + operationId: getEiProducerJobs parameters: - name: eiProducerId in: path - description: eiProducerId required: true + style: simple + explode: false schema: type: string responses: @@ -646,37 +526,34 @@ paths: type: array items: $ref: '#/components/schemas/producer_ei_job_request' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information producer is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false /A1-EI/v1/eijobs: get: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: EI job identifiers description: query for EI job identifiers - operationId: getEiJobIdsUsingGET + operationId: getEiJobIds parameters: - name: eiTypeId in: query description: selects EI jobs of matching EI type - allowEmptyValue: false + required: false + style: form + explode: true schema: type: string - name: owner in: query description: selects EI jobs for one EI job owner - allowEmptyValue: false + required: false + style: form + explode: true schema: type: string responses: @@ -688,30 +565,24 @@ paths: type: array items: type: string - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information type is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false /A1-EI/v1/eijobs/{eiJobId}/status: get: tags: - - A1-EI (enrichment information) + - A1-EI (registration) summary: EI job status - operationId: getEiJobStatusUsingGET + operationId: getEiJobStatus parameters: - name: eiJobId in: path - description: eiJobId required: true + style: simple + explode: false schema: type: string responses: @@ -721,23 +592,44 @@ paths: application/json: schema: $ref: '#/components/schemas/EiJobStatusObject' - 401: - description: Unauthorized - content: {} - 403: - description: Forbidden - content: {} 404: description: Enrichment Information job is not found content: application/json: schema: $ref: '#/components/schemas/ProblemDetails' - deprecated: false + /example_dataconsumer/eijobs/{eiJobId}/status: + post: + tags: + - A1-EI (callbacks) + summary: Callback for changed EI job status + description: The primitive is implemented by the data consumer and is invoked + when a EI job status has been changed. + operationId: jobStatusCallback + parameters: + - name: eiJobId + in: path + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/EiJobStatusObject' + required: true + responses: + 200: + description: OK + content: + application/json: + schema: + $ref: '#/components/schemas/Void' components: schemas: producer_ei_job_request: - title: producer_ei_job_request required: - ei_job_identity type: object @@ -753,7 +645,6 @@ components: description: The time when the job was last updated or created (ISO-8601) ei_job_data: type: object - properties: {} description: Json for the job data target_uri: type: string @@ -763,41 +654,41 @@ components: description: Type idenitity for the job description: The body of the EI producer callbacks for EI job creation and deletion EiTypeObject: - title: EiTypeObject type: object description: Information for an EI type status_info: - title: status_info + required: + - no_of_jobs + - no_of_producers + - no_of_types + - status type: object properties: no_of_producers: type: integer description: Number of EI producers format: int32 - no_of_jobs: - type: integer - description: Number of EI jobs - format: int32 no_of_types: type: integer description: Number of EI types format: int32 + no_of_jobs: + type: integer + description: Number of EI jobs + format: int32 status: type: string description: status text producer_ei_type_info: - title: producer_ei_type_info required: - ei_job_data_schema type: object properties: ei_job_data_schema: type: object - properties: {} description: Json schema for the job data description: Information for an EI type producer_registration_info: - title: producer_registration_info required: - ei_job_callback_url - ei_producer_supervision_callback_url @@ -809,6 +700,7 @@ components: description: Supported EI type IDs items: type: string + description: Supported EI type IDs ei_producer_supervision_callback_url: type: string description: callback for producer supervision @@ -817,23 +709,18 @@ components: description: callback for EI job description: Information for an EI producer producer_status: - title: producer_status required: - operational_state type: object properties: operational_state: type: string - description: |- - Operational state, values: - ENABLED: TBD - DISABLED: TBD. + description: Represents the operational states enum: - ENABLED - DISABLED description: Status for an EI Producer ProblemDetails: - title: ProblemDetails type: object properties: detail: @@ -849,24 +736,22 @@ components: example: 404 description: A problem detail to carry details in a HTTP response according to RFC 7807 + Void: + type: object + description: 'Void/empty ' EiJobStatusObject: - title: EiJobStatusObject required: - eiJobStatus type: object properties: eiJobStatus: type: string - description: |- - values: - ENABLED: the A1-EI producer is able to deliver EI result for the EI job - DISABLED: the A1-EI producer is unable to deliver EI result for the EI job + description: Allowed values for EI job status enum: - ENABLED - DISABLED description: Status for an EI job EiJobObject: - title: EiJobObject required: - eiTypeId - jobDefinition @@ -883,11 +768,10 @@ components: jobOwner: type: string description: Identity of the owner of the job - jobStatusNotificationUri: + statusNotificationUri: type: string description: The target of EI job status notifications jobDefinition: type: object - properties: {} description: EI type specific job data description: Information for an Enrichment Information Job diff --git a/enrichment-coordinator-service/pom.xml b/enrichment-coordinator-service/pom.xml index 2a653150..e7f2bd67 100644 --- a/enrichment-coordinator-service/pom.xml +++ b/enrichment-coordinator-service/pom.xml @@ -26,7 +26,7 @@ org.springframework.boot spring-boot-starter-parent - 2.3.4.RELEASE + 2.4.2 org.o-ran-sc.nonrtric @@ -47,10 +47,10 @@ 11 - 2.9.2 + 3.0.0 2.8.2 1.1.6 - 2.0.0 + 2.1.6 20190722 3.6 3.8.0 @@ -65,6 +65,11 @@ true + + org.springdoc + springdoc-openapi-ui + 1.5.2 + org.springframework.boot spring-boot-starter-web @@ -375,4 +380,4 @@ JIRA https://jira.o-ran-sc.org/ - + \ No newline at end of file diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java index 6fa38aa1..944cbf0b 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/SwaggerConfig.java @@ -20,74 +20,51 @@ package org.oransc.enrichment; -import com.fasterxml.classmate.TypeResolver; -import com.google.common.base.Predicates; +import io.swagger.v3.oas.annotations.OpenAPIDefinition; +import io.swagger.v3.oas.annotations.info.Info; +import io.swagger.v3.oas.annotations.info.License; +import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport; - -import springfox.documentation.builders.ApiInfoBuilder; -import springfox.documentation.builders.PathSelectors; -import springfox.documentation.builders.RequestHandlerSelectors; -import springfox.documentation.service.ApiInfo; -import springfox.documentation.spi.DocumentationType; -import springfox.documentation.spring.web.plugins.Docket; -import springfox.documentation.swagger2.annotations.EnableSwagger2; +import org.oransc.enrichment.controllers.StatusController; +import org.oransc.enrichment.controllers.consumer.ConsumerConsts; +import org.oransc.enrichment.controllers.producer.ProducerConsts; /** - * Swagger configuration class that uses swagger2 documentation type and scans + * Swagger configuration class that uses swagger documentation type and scans * all the controllers. To access the swagger gui go to * http://ip:port/swagger-ui.html */ -@Configuration -@EnableSwagger2 -public class SwaggerConfig extends WebMvcConfigurationSupport { - - static final String API_TITLE = "Enrichment Data service"; - static final String DESCRIPTION = "This page lists all the rest apis for the service."; - static final String VERSION = "1.0"; - @SuppressWarnings("squid:S1075") // Refactor your code to get this URI from a customizable parameter. - static final String RESOURCES_PATH = "classpath:/META-INF/resources/"; - static final String WEBJARS_PATH = RESOURCES_PATH + "webjars/"; - static final String SWAGGER_UI = "swagger-ui.html"; - static final String WEBJARS = "/webjars/**"; - /** - * Gets the API info. - * - * @return the API info. - */ - @Bean - public Docket api(TypeResolver resolver) { - return new Docket(DocumentationType.SWAGGER_2) // - .apiInfo(apiInfo()) // - .select() // - .apis(RequestHandlerSelectors.any()) // - .paths(PathSelectors.any()) // - .paths(Predicates.not(PathSelectors.regex("/error"))) // this endpoint is not implemented, but was - // visible for Swagger - .paths(Predicates.not(PathSelectors.regex("/actuator.*"))) // this endpoint is implemented by spring - // framework, exclude for now - .build(); +@OpenAPIDefinition( // + tags = {@Tag(name = ConsumerConsts.CONSUMER_API_NAME, description = ConsumerConsts.CONSUMER_API_DESCRIPTION), + @Tag( + name = ConsumerConsts.CONSUMER_API_CALLBACKS_NAME, + description = ConsumerConsts.CONSUMER_API_CALLBACKS_DESCRIPTION), + @Tag( + name = ProducerConsts.PRODUCER_API_CALLBACKS_NAME, + description = ProducerConsts.PRODUCER_API_CALLBACKS_DESCRIPTION), + @Tag(name = ProducerConsts.PRODUCER_API_NAME, description = ProducerConsts.PRODUCER_API_DESCRIPTION), // + @Tag(name = StatusController.API_NAME, description = StatusController.API_DESCRIPTION)}, // + info = @Info( + title = "Enrichment Information Service", // + version = "1.0", // + description = SwaggerConfig.DESCRIPTION, // + license = @License( + name = "Copyright (C) 2020 Nordix Foundation. Licensed under the Apache License.", + url = "http://www.apache.org/licenses/LICENSE-2.0"))) +public class SwaggerConfig { + private SwaggerConfig() { } - private static ApiInfo apiInfo() { - return new ApiInfoBuilder() // - .title(API_TITLE) // - .description(DESCRIPTION) // - .version(VERSION) // - .build(); - } - - @Override - protected void addResourceHandlers(ResourceHandlerRegistry registry) { - registry.addResourceHandler(SWAGGER_UI) // - .addResourceLocations(RESOURCES_PATH); + static final String API_TITLE = "Enrichment Data service"; - registry.addResourceHandler(WEBJARS) // - .addResourceLocations(WEBJARS_PATH); - } + static final String DESCRIPTION = "

API documentation

" + "

General

" + "

" + + " The service is mainly a broker between data producers and data consumers. A data producer has the ability to producer one or several type of data (EI type). One type of data can be produced by zero to many producers.

A data consumer can have several active data subscriptions (EI job). One EI job consists of the the type of data to produce and additional parameters for filtering of the data. These parameters are different for different data types." + + "

" + "

APIs provided by the service

" + "

A1-EI

" + "

" + + " This API is between Near-RT RIC, which is a data consumer and the Non-RT RIC. " + "

" + + "

Data producer API

" + "

" + + " This API is between data producers and this service. It is divivided into two parts, where one is provided by this service (registration) and one part is provided by the data producer." + + "

" + "

EI Service status

" + "

" + " This API provides a means to monitor the service." + + "

"; } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java index f0f6c4b1..85927c77 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/clients/AsyncRestClient.java @@ -42,9 +42,7 @@ import org.springframework.web.reactive.function.client.WebClientResponseExcepti import reactor.core.publisher.Mono; import reactor.netty.http.client.HttpClient; -import reactor.netty.resources.ConnectionProvider; -import reactor.netty.tcp.ProxyProvider.Proxy; -import reactor.netty.tcp.TcpClient; +import reactor.netty.transport.ProxyProvider; /** * Generic reactive REST client. @@ -200,32 +198,34 @@ public class AsyncRestClient { && !httpProxyConfig.httpProxyHost().isEmpty(); } - private TcpClient createTcpClient() { - TcpClient client = TcpClient.create(ConnectionProvider.newConnection()) // + private HttpClient buildHttpClient() { + HttpClient httpClient = HttpClient.create() // .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000) // .doOnConnected(connection -> { connection.addHandlerLast(new ReadTimeoutHandler(30)); connection.addHandlerLast(new WriteTimeoutHandler(30)); }); + if (this.sslContext != null) { - client = client.secure(c -> c.sslContext(sslContext)); + httpClient = httpClient.secure(ssl -> { + ssl.sslContext(sslContext); + }); } + if (isHttpProxyConfigured()) { - client = client.proxy(proxy -> proxy.type(Proxy.HTTP).host(httpProxyConfig.httpProxyHost()) - .port(httpProxyConfig.httpProxyPort())); + httpClient = httpClient.proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP) + .host(httpProxyConfig.httpProxyHost()).port(httpProxyConfig.httpProxyPort())); } - return client; + return httpClient; } - private WebClient createWebClient(String baseUrl, TcpClient tcpClient) { - HttpClient httpClient = HttpClient.from(tcpClient); - - ReactorClientHttpConnector connector = new ReactorClientHttpConnector(httpClient); + private WebClient buildWebClient(String baseUrl) { + final HttpClient httpClient = buildHttpClient(); ExchangeStrategies exchangeStrategies = ExchangeStrategies.builder() // .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(-1)) // .build(); return WebClient.builder() // - .clientConnector(connector) // + .clientConnector(new ReactorClientHttpConnector(httpClient)) // .baseUrl(baseUrl) // .exchangeStrategies(exchangeStrategies) // .build(); @@ -233,15 +233,9 @@ public class AsyncRestClient { private Mono getWebClient() { if (this.webClient == null) { - try { - TcpClient tcpClient = createTcpClient(); - this.webClient = createWebClient(this.baseUrl, tcpClient); - } catch (Exception e) { - logger.error("Could not create WebClient {}", e.getMessage()); - return Mono.error(e); - } + this.webClient = buildWebClient(baseUrl); } - return Mono.just(this.webClient); + return Mono.just(buildWebClient(baseUrl)); } } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java index 921b8073..d423e19f 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/ErrorResponse.java @@ -24,8 +24,7 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import org.oransc.enrichment.exceptions.ServiceException; import org.springframework.http.HttpHeaders; @@ -38,8 +37,8 @@ public class ErrorResponse { private static Gson gson = new GsonBuilder().create(); // Returned as body for all failed REST calls - @ApiModel( - value = "ProblemDetails", + @Schema( + name = "ProblemDetails", description = "A problem detail to carry details in a HTTP response according to RFC 7807") public static class ErrorInfo { @SerializedName("type") @@ -62,22 +61,22 @@ public class ErrorResponse { this.status = status; } - @ApiModelProperty( + @Schema( example = "404", - value = "The HTTP status code generated by the origin server for this occurrence of the problem.") + description = "The HTTP status code generated by the origin server for this occurrence of the problem.") public Integer getStatus() { return status; } - @ApiModelProperty( + @Schema( example = "EI job type not found", - value = "A human-readable explanation specific to this occurrence of the problem.") + description = "A human-readable explanation specific to this occurrence of the problem.") public String getDetail() { return this.detail; } } - @ApiModelProperty(value = "message") + @Schema(name = "message") public final String message; ErrorResponse(String message) { diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java index 42ab7cb8..e823a939 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/StatusController.java @@ -23,12 +23,12 @@ package org.oransc.enrichment.controllers; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Operation; +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 org.immutables.gson.Gson; import org.oransc.enrichment.repository.EiJobs; @@ -43,9 +43,12 @@ import org.springframework.web.bind.annotation.RestController; import reactor.core.publisher.Mono; @RestController("StatusController") -@Api(tags = "Service status") +@Tag(name = StatusController.API_NAME) public class StatusController { + public static final String API_NAME = "EI Service status"; + public static final String API_DESCRIPTION = "API for monitoring of the service"; + @Autowired private EiJobs eiJobs; @@ -56,24 +59,24 @@ public class StatusController { private EiProducers eiProducers; @Gson.TypeAdapters - @ApiModel(value = "status_info") + @Schema(name = "status_info") public static class StatusInfo { - @ApiModelProperty(value = "status text") + @Schema(name = "status", description = "status text") @SerializedName("status") @JsonProperty(value = "status", required = true) public final String status; - @ApiModelProperty(value = "Number of EI producers") + @Schema(name = "no_of_producers", description = "Number of EI producers") @SerializedName("no_of_producers") @JsonProperty(value = "no_of_producers", required = true) public final int noOfProducers; - @ApiModelProperty(value = "Number of EI types") + @Schema(name = "no_of_types", description = "Number of EI types") @SerializedName("no_of_types") @JsonProperty(value = "no_of_types", required = true) public final int noOfTypes; - @ApiModelProperty(value = "Number of EI jobs") + @Schema(name = "no_of_jobs", description = "Number of EI jobs") @SerializedName("no_of_jobs") @JsonProperty(value = "no_of_jobs", required = true) public final int noOfJobs; @@ -87,10 +90,13 @@ public class StatusController { } @GetMapping(path = "/status", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Returns status and statistics of this service") + @Operation(summary = "Returns status and statistics of this service") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "Service is living", response = StatusInfo.class) // + @ApiResponse( + responseCode = "200", + description = "Service is living", // + content = @Content(schema = @Schema(implementation = StatusInfo.class))) // }) public Mono> getStatus() { StatusInfo info = new StatusInfo("hunky dory", this.eiProducers, this.eiTypes, this.eiJobs); diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java index b28da8d2..b7c2673c 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/VoidResponse.java @@ -20,12 +20,12 @@ package org.oransc.enrichment.controllers; -import io.swagger.annotations.ApiModel; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "Void", description = "Void/empty") +@Schema(name = "Void", description = "Void/empty ") public class VoidResponse { private VoidResponse() { } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java index 8603142b..48aad131 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerConsts.java @@ -22,8 +22,13 @@ package org.oransc.enrichment.controllers.consumer; public class ConsumerConsts { + public static final String CONSUMER_API_NAME = "A1-EI (registration)"; + public static final String CONSUMER_API_DESCRIPTION = "Data consumer EI job registration"; + + public static final String CONSUMER_API_CALLBACKS_NAME = "A1-EI (callbacks)"; + public static final String CONSUMER_API_CALLBACKS_DESCRIPTION = "Data consumer EI job status callbacks"; + public static final String API_ROOT = "/A1-EI/v1"; - public static final String CONSUMER_API_NAME = "A1-EI (enrichment information)"; public static final String OWNER_PARAM = "owner"; public static final String OWNER_PARAM_DESCRIPTION = "selects EI jobs for one EI job owner"; 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 8267b6af..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.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; @@ -64,8 +65,8 @@ 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 { @@ -89,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( // ) { @@ -109,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 { @@ -129,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<>(); @@ -173,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 { @@ -193,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 { @@ -219,15 +231,22 @@ public class ConsumerController { } @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 { @@ -243,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) { @@ -275,7 +301,7 @@ public class ConsumerController { 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)) { @@ -294,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); @@ -310,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(); } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java index d88091f5..0b750f5c 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobInfo.java @@ -23,36 +23,35 @@ package org.oransc.enrichment.controllers.consumer; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "EiJobObject", description = "Information for an Enrichment Information Job") +@Schema(name = "EiJobObject", description = "Information for an Enrichment Information Job") public class ConsumerEiJobInfo { - @ApiModelProperty(value = "EI type Idenitifier of the EI job", required = true) + @Schema(name = "eiTypeId", description = "EI type Idenitifier of the EI job", required = true) @SerializedName("eiTypeId") @JsonProperty(value = "eiTypeId", required = true) public String eiTypeId; - @ApiModelProperty(value = "Identity of the owner of the job", required = true) + @Schema(name = "jobOwner", description = "Identity of the owner of the job", required = true) @SerializedName("jobOwner") @JsonProperty(value = "jobOwner", required = true) public String owner; - @ApiModelProperty(value = "EI type specific job data", required = true) + @Schema(name = "jobDefinition", description = "EI type specific job data", required = true) @SerializedName("jobDefinition") @JsonProperty(value = "jobDefinition", required = true) - public Object jobData; + public Object jobDefinition; - @ApiModelProperty(value = "The target URI of the EI data", required = true) + @Schema(name = "jobResultUri", description = "The target URI of the EI data", required = true) @SerializedName("jobResultUri") @JsonProperty(value = "jobResultUri", required = true) - public String targetUri; + public String jobResultUri; - @ApiModelProperty(value = "The target of EI job status notifications", required = false) + @Schema(name = "statusNotificationUri", description = "The target of EI job status notifications", required = false) @SerializedName("jobStatusNotificationUri") @JsonProperty(value = "jobStatusNotificationUri", required = false) public String statusNotificationUri; @@ -63,9 +62,9 @@ public class ConsumerEiJobInfo { public ConsumerEiJobInfo(String eiTypeId, Object jobData, String owner, String targetUri, String statusNotificationUri) { this.eiTypeId = eiTypeId; - this.jobData = jobData; + this.jobDefinition = jobData; this.owner = owner; - this.targetUri = targetUri; + this.jobResultUri = targetUri; this.statusNotificationUri = statusNotificationUri; } } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java index 60752ec2..87a69bb4 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiJobStatus.java @@ -23,17 +23,16 @@ package org.oransc.enrichment.controllers.consumer; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "EiJobStatusObject", description = "Status for an EI job") +@Schema(name = "EiJobStatusObject", description = "Status for an EI job") public class ConsumerEiJobStatus { @Gson.TypeAdapters - @ApiModel(value = "EiJobStatusValues", description = "Allowed values for EI job status") + @Schema(name = "EiJobStatusValues", description = "Allowed values for EI job status") public enum EiJobStatusValues { ENABLED, DISABLED } @@ -42,7 +41,7 @@ public class ConsumerEiJobStatus { + "ENABLED: the A1-EI producer is able to deliver EI result for the EI job\n" // + "DISABLED: the A1-EI producer is unable to deliver EI result for the EI job"; - @ApiModelProperty(value = OPERATIONAL_STATE_DESCRIPTION, name = "eiJobStatus", required = true) + @Schema(name = "eiJobStatus", description = OPERATIONAL_STATE_DESCRIPTION, required = true) @SerializedName("eiJobStatus") @JsonProperty(value = "eiJobStatus", required = true) public EiJobStatusValues state; diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java index b5d664bf..c63d6f74 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/consumer/ConsumerEiTypeInfo.java @@ -20,12 +20,12 @@ package org.oransc.enrichment.controllers.consumer; -import io.swagger.annotations.ApiModel; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "EiTypeObject", description = "Information for an EI type") +@Schema(name = "EiTypeObject", description = "Information for an EI type") public class ConsumerEiTypeInfo { } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java index 7c46117e..3d37267b 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerConsts.java @@ -23,7 +23,11 @@ package org.oransc.enrichment.controllers.producer; public class ProducerConsts { public static final String API_ROOT = "/ei-producer/v1"; - public static final String PRODUCER_API_NAME = "Data Producer Registry API"; + public static final String PRODUCER_API_NAME = "Data producer (registration)"; + public static final String PRODUCER_API_DESCRIPTION = "API for data producers"; + + public static final String PRODUCER_API_CALLBACKS_NAME = "Data producer (callbacks)"; + public static final String PRODUCER_API_CALLBACKS_DESCRIPTION = "API implemented by data producers"; private ProducerConsts() { } diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java index 7e905dab..fb2253db 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerController.java @@ -23,11 +23,14 @@ package org.oransc.enrichment.controllers.producer; 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.util.ArrayList; import java.util.Collection; @@ -56,8 +59,8 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @SuppressWarnings("squid:S2629") // Invoke method(s) only conditionally -@RestController("ProducerController") -@Api(tags = {ProducerConsts.PRODUCER_API_NAME}) +@RestController("Producer registry") +@Tag(name = ProducerConsts.PRODUCER_API_NAME) public class ProducerController { private static Gson gson = new GsonBuilder().create(); @@ -71,15 +74,14 @@ public class ProducerController { @Autowired private EiProducers eiProducers; - @GetMapping(path = ProducerConsts.API_ROOT + "/eitypes", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI type identifiers", notes = "") + @GetMapping(path = ProducerConsts.API_ROOT + "/eitypes", produces = MediaType.APPLICATION_JSON_VALUE) // + @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( // ) { @@ -92,14 +94,17 @@ public class ProducerController { } @GetMapping(path = ProducerConsts.API_ROOT + "/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 = ProducerEiTypeInfo.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 = ProducerEiTypeInfo.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 { @@ -114,13 +119,22 @@ public class ProducerController { @PutMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE) @ApiResponses( value = { // - @ApiResponse(code = 200, message = "Type updated", response = VoidResponse.class), // - @ApiResponse(code = 201, message = "Type created", response = VoidResponse.class), // - @ApiResponse(code = 400, message = "Bad request", response = ErrorResponse.ErrorInfo.class)}) - - @ApiOperation(value = "Individual EI type", notes = "") + @ApiResponse( + responseCode = "200", + description = "Type updated", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "201", + description = "Type created", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "400", + description = "Bad request", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class)))}) + @Operation(summary = "Individual EI type", description = "") public ResponseEntity putEiType( // - @PathVariable("eiTypeId") String eiTypeId, @RequestBody ProducerEiTypeInfo registrationInfo) { + @PathVariable("eiTypeId") String eiTypeId, // + @RequestBody ProducerEiTypeInfo registrationInfo) { EiType previousDefinition = this.eiTypes.get(eiTypeId); if (registrationInfo.jobDataSchema == null) { @@ -130,20 +144,27 @@ public class ProducerController { return new ResponseEntity<>(previousDefinition == null ? HttpStatus.CREATED : HttpStatus.OK); } - @DeleteMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI type", notes = "") + @DeleteMapping(path = ProducerConsts.API_ROOT + "/eitypes/{eiTypeId}", produces = MediaType.APPLICATION_JSON_VALUE) // + @Operation(summary = "Individual EI type", description = "") // @ApiResponses( value = { // - @ApiResponse(code = 200, message = "Not used", response = VoidResponse.class), - @ApiResponse(code = 204, message = "Producer deleted", response = VoidResponse.class), @ApiResponse( - code = 404, - message = "Enrichment Information type is not found", - response = ErrorResponse.ErrorInfo.class), + responseCode = "200", + description = "Not used", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "204", + description = "Producer deleted", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // @ApiResponse( - code = 406, - message = "The Enrichment Information type has one or several active producers", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "404", + description = "Enrichment Information type is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))), // + @ApiResponse( + responseCode = "406", + description = "The Enrichment Information type has one or several active producers", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity deleteEiType( // @PathVariable("eiTypeId") String eiTypeId) { @@ -160,20 +181,19 @@ public class ProducerController { } @GetMapping(path = ProducerConsts.API_ROOT + "/eiproducers", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI producer identifiers", notes = "") + @Operation(summary = "EI producer identifiers", description = "") @ApiResponses( value = { // @ApiResponse( - code = 200, - message = "EI producer identifiers", - response = String.class, - responseContainer = "List"), // + responseCode = "200", + description = "EI producer identifiers", // + content = @Content(array = @ArraySchema(schema = @Schema(implementation = String.class)))) // }) public ResponseEntity getEiProducerIdentifiers( // - @ApiParam( + @Parameter( name = "ei_type_id", required = false, - value = "If given, only the producers for the EI Data type is returned.") // + description = "If given, only the producers for the EI Data type is returned.") // @RequestParam(name = "ei_type_id", required = false) String typeId // ) { List result = new ArrayList<>(); @@ -188,14 +208,18 @@ public class ProducerController { @GetMapping( path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI producer", notes = "") + @Operation(summary = "Individual EI producer", description = "") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "EI producer", response = ProducerRegistrationInfo.class), // @ApiResponse( - code = 404, - message = "Enrichment Information producer is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "EI producer", // + content = @Content(schema = @Schema(implementation = ProducerRegistrationInfo.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information producer is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class)))// + }) public ResponseEntity getEiProducer( // @PathVariable("eiProducerId") String eiProducerId) { try { @@ -210,18 +234,18 @@ public class ProducerController { @GetMapping( path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}/eijobs", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI job definitions", notes = "EI job definitions for one EI producer") + @Operation(summary = "EI job definitions", description = "EI job definitions for one EI producer") @ApiResponses( value = { // @ApiResponse( - code = 200, - message = "EI producer", - response = ProducerJobInfo.class, - responseContainer = "List"), // + responseCode = "404", + description = "Enrichment Information producer is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))), // @ApiResponse( - code = 404, - message = "Enrichment Information producer is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "EI producer", // + content = @Content(array = @ArraySchema(schema = @Schema(implementation = ProducerJobInfo.class)))), // + }) public ResponseEntity getEiProducerJobs( // @PathVariable("eiProducerId") String eiProducerId) { try { @@ -242,15 +266,19 @@ public class ProducerController { @GetMapping( path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}/status", - produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "EI producer status") + produces = MediaType.APPLICATION_JSON_VALUE) // + @Operation(summary = "EI producer status") // @ApiResponses( value = { // - @ApiResponse(code = 200, message = "EI producer status", response = ProducerStatusInfo.class), // @ApiResponse( - code = 404, - message = "Enrichment Information producer is not found", - response = ErrorResponse.ErrorInfo.class)}) + responseCode = "200", + description = "EI producer status", // + content = @Content(schema = @Schema(implementation = ProducerStatusInfo.class))), // + @ApiResponse( + responseCode = "404", + description = "Enrichment Information producer is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity getEiProducerStatus( // @PathVariable("eiProducerId") String eiProducerId) { try { @@ -271,12 +299,18 @@ public class ProducerController { @PutMapping( path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}", // produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI producer", notes = "") + @Operation(summary = "Individual EI producer", description = "") @ApiResponses( value = { // - @ApiResponse(code = 201, message = "Producer created", response = VoidResponse.class), // - @ApiResponse(code = 200, message = "Producer updated", response = VoidResponse.class)} // - ) + @ApiResponse( + responseCode = "201", + description = "Producer created", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), // + @ApiResponse( + responseCode = "200", + description = "Producer updated", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))) // + }) public ResponseEntity putEiProducer( // @PathVariable("eiProducerId") String eiProducerId, // @RequestBody ProducerRegistrationInfo registrationInfo) { @@ -292,12 +326,22 @@ public class ProducerController { @DeleteMapping( path = ProducerConsts.API_ROOT + "/eiproducers/{eiProducerId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Individual EI producer", notes = "") + @Operation(summary = "Individual EI producer", description = "") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "Not used", response = VoidResponse.class), - @ApiResponse(code = 204, message = "Producer deleted", response = VoidResponse.class), - @ApiResponse(code = 404, message = "Producer is not found", response = ErrorResponse.ErrorInfo.class)}) + @ApiResponse( + responseCode = "200", + description = "Not used", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), + @ApiResponse( + responseCode = "204", + description = "Producer deleted", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))), + @ApiResponse( + responseCode = "404", + description = "Producer is not found", // + content = @Content(schema = @Schema(implementation = ErrorResponse.ErrorInfo.class))) // + }) public ResponseEntity deleteEiProducer(@PathVariable("eiProducerId") String eiProducerId) { try { final EiProducer producer = this.eiProducers.getProducer(eiProducerId); diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java index d2b89ef3..e587ce36 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerEiTypeInfo.java @@ -23,16 +23,15 @@ package org.oransc.enrichment.controllers.producer; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "producer_ei_type_info", description = "Information for an EI type") +@Schema(name = "producer_ei_type_info", description = "Information for an EI type") public class ProducerEiTypeInfo { - @ApiModelProperty(value = "Json schema for the job data", required = true) + @Schema(name = "ei_job_data_schema", description = "Json schema for the job data", required = true) @SerializedName("ei_job_data_schema") @JsonProperty(value = "ei_job_data_schema", required = true) public Object jobDataSchema; diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java index bc3dba2e..d7dd7174 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerJobInfo.java @@ -23,44 +23,43 @@ package org.oransc.enrichment.controllers.producer; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; import org.oransc.enrichment.repository.EiJob; @Gson.TypeAdapters -@ApiModel( - value = "producer_ei_job_request", +@Schema( + name = "producer_ei_job_request", description = "The body of the EI producer callbacks for EI job creation and deletion") public class ProducerJobInfo { - @ApiModelProperty(value = "Idenitity of the EI job", required = true) + @Schema(name = "ei_job_identity", description = "Idenitity of the EI job", required = true) @SerializedName("ei_job_identity") @JsonProperty("ei_job_identity") public String id; - @ApiModelProperty(value = "Type idenitity for the job") + @Schema(name = "ei_type_identity", description = "Type idenitity for the job") @SerializedName("ei_type_identity") @JsonProperty("ei_type_identity") public String typeId; - @ApiModelProperty(value = "Json for the job data") + @Schema(name = "ei_job_data", description = "Json for the job data") @SerializedName("ei_job_data") @JsonProperty("ei_job_data") public Object jobData; - @ApiModelProperty(value = "URI for the target of the EI") + @Schema(name = "target_uri", description = "URI for the target of the EI") @SerializedName("target_uri") @JsonProperty("target_uri") public String targetUri; - @ApiModelProperty(value = "The owner of the job") + @Schema(name = "owner", description = "The owner of the job") @SerializedName("owner") @JsonProperty("owner") public String owner; - @ApiModelProperty(value = "The time when the job was last updated or created (ISO-8601)") + @Schema(name = "last_updated", description = "The time when the job was last updated or created (ISO-8601)") @SerializedName("last_updated") @JsonProperty("last_updated") public String lastUpdated; diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java index 94ae4a6a..b270c853 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerRegistrationInfo.java @@ -23,51 +23,30 @@ package org.oransc.enrichment.controllers.producer; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import java.util.Collection; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "producer_registration_info", description = "Information for an EI producer") +@Schema(name = "producer_registration_info", description = "Information for an EI producer") public class ProducerRegistrationInfo { - @Gson.TypeAdapters - @ApiModel(value = "producer_ei_type_registration_info", description = "Information for an EI type") - public static class ProducerEiTypeRegistrationInfo { - - @ApiModelProperty(value = "EI type identity", required = true) - @SerializedName("ei_type_identity") - @JsonProperty(value = "ei_type_identity", required = true) - public String eiTypeId; - - @ApiModelProperty(value = "Json schema for the job data") - @SerializedName("ei_job_data_schema") - @JsonProperty("ei_job_data_schema") - public Object jobDataSchema; - - public ProducerEiTypeRegistrationInfo(Object jobDataSchema, String eiTypeId) { - this.jobDataSchema = jobDataSchema; - this.eiTypeId = eiTypeId; - } - - public ProducerEiTypeRegistrationInfo() { - } - } - - @ApiModelProperty(value = "Supported EI type IDs", required = true) + @Schema(name = "supported_ei_types", description = "Supported EI type IDs", required = true) @SerializedName("supported_ei_types") @JsonProperty(value = "supported_ei_types", required = true) public Collection supportedTypeIds; - @ApiModelProperty(value = "callback for EI job", required = true) + @Schema(name = "ei_job_callback_url", description = "callback for EI job", required = true) @SerializedName("ei_job_callback_url") @JsonProperty(value = "ei_job_callback_url", required = true) public String jobCallbackUrl; - @ApiModelProperty(value = "callback for producer supervision", required = true) + @Schema( + name = "ei_producer_supervision_callback_url", + description = "callback for producer supervision", + required = true) @SerializedName("ei_producer_supervision_callback_url") @JsonProperty(value = "ei_producer_supervision_callback_url", required = true) public String producerSupervisionCallbackUrl; diff --git a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java index 8f2e0d0e..fc19bcae 100644 --- a/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java +++ b/enrichment-coordinator-service/src/main/java/org/oransc/enrichment/controllers/producer/ProducerStatusInfo.java @@ -23,17 +23,16 @@ package org.oransc.enrichment.controllers.producer; import com.fasterxml.jackson.annotation.JsonProperty; import com.google.gson.annotations.SerializedName; -import io.swagger.annotations.ApiModel; -import io.swagger.annotations.ApiModelProperty; +import io.swagger.v3.oas.annotations.media.Schema; import org.immutables.gson.Gson; @Gson.TypeAdapters -@ApiModel(value = "producer_status", description = "Status for an EI Producer") +@Schema(name = "producer_status", description = "Status for an EI Producer") public class ProducerStatusInfo { @Gson.TypeAdapters - @ApiModel(value = "producer_operational_state", description = "Represents the operational states") + @Schema(name = "producer_operational_state", description = "Represents the operational states") public enum OperationalState { ENABLED, DISABLED } @@ -42,7 +41,7 @@ public class ProducerStatusInfo { + "ENABLED: TBD\n" // + "DISABLED: TBD."; - @ApiModelProperty(value = OPERATIONAL_STATE_DESCRIPTION, name = "operational_state", required = true) + @Schema(name = "operational_state", description = OPERATIONAL_STATE_DESCRIPTION, required = true) @SerializedName("operational_state") @JsonProperty(value = "operational_state", required = true) public final OperationalState opState; diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java index a863c103..29e9aadf 100644 --- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java +++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/ApplicationTest.java @@ -59,7 +59,6 @@ import org.oransc.enrichment.controllers.producer.ProducerConsts; import org.oransc.enrichment.controllers.producer.ProducerEiTypeInfo; import org.oransc.enrichment.controllers.producer.ProducerJobInfo; import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo; -import org.oransc.enrichment.controllers.producer.ProducerRegistrationInfo.ProducerEiTypeRegistrationInfo; import org.oransc.enrichment.controllers.producer.ProducerStatusInfo; import org.oransc.enrichment.exceptions.ServiceException; import org.oransc.enrichment.repository.EiJob; @@ -163,15 +162,14 @@ class ApplicationTest { } @Test - void createApiDoc() throws FileNotFoundException { - String url = "/v2/api-docs"; + void generateApiDoc() throws FileNotFoundException { + String url = "/v3/api-docs"; ResponseEntity resp = restClient().getForEntity(url).block(); assertThat(resp.getStatusCode()).isEqualTo(HttpStatus.OK); JSONObject jsonObj = new JSONObject(resp.getBody()); - jsonObj.remove("host"); - assertThat(jsonObj.getJSONObject("definitions").remove("Mono«ResponseEntity«object»»")).isNotNull(); - assertThat(jsonObj.getJSONObject("definitions").remove("Void")).isNotNull(); + assertThat(jsonObj.remove("servers")).isNotNull(); + String indented = jsonObj.toString(4); try (PrintStream out = new PrintStream(new FileOutputStream("api/ecs-api.json"))) { out.print(indented); @@ -731,9 +729,9 @@ class ApplicationTest { assertThat(statusInfo.opState).isEqualTo(expectedOperationalState); } - ProducerEiTypeRegistrationInfo producerEiTypeRegistrationInfo(String typeId) + ProducerEiTypeInfo producerEiTypeRegistrationInfo(String typeId) throws JsonMappingException, JsonProcessingException { - return new ProducerEiTypeRegistrationInfo(jsonSchemaObject(), typeId); + return new ProducerEiTypeInfo(jsonSchemaObject()); } ProducerRegistrationInfo producerEiRegistratioInfoRejecting(String typeId) @@ -801,6 +799,7 @@ class ApplicationTest { throws JsonMappingException, JsonProcessingException, ServiceException { String url = ProducerConsts.API_ROOT + "/eitypes/" + eiTypeId; String body = gson.toJson(producerEiTypeRegistrationInfo(eiTypeId)); + ResponseEntity resp = restClient().putForEntity(url, body).block(); this.eiTypes.getType(eiTypeId); return resp.getStatusCode(); diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java index e8bb659c..660277f7 100644 --- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java +++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ConsumerSimulatorController.java @@ -20,10 +20,12 @@ package org.oransc.enrichment.controller; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Operation; +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; @@ -33,6 +35,7 @@ import java.util.List; import lombok.Getter; import org.oransc.enrichment.controllers.VoidResponse; +import org.oransc.enrichment.controllers.consumer.ConsumerConsts; import org.oransc.enrichment.controllers.consumer.ConsumerEiJobStatus; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -45,7 +48,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController("ConsumerSimulatorController") -@Api(tags = {"A1-EI (enrichment information) callbacks"}) +@Tag(name = ConsumerConsts.CONSUMER_API_CALLBACKS_NAME) public class ConsumerSimulatorController { private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -63,15 +66,20 @@ public class ConsumerSimulatorController { private TestResults testResults = new TestResults(); public static String getJobStatusUrl(String eiJobId) { - return "/consumer_simulator/eijobs/" + eiJobId + "/status"; + return "/example_dataconsumer/eijobs/" + eiJobId + "/status"; } - @PostMapping(path = "/consumer_simulator/eijobs/{eiJobId}/status", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Callback for EI job status", notes = "") + @PostMapping(path = "/example_dataconsumer/eijobs/{eiJobId}/status", produces = MediaType.APPLICATION_JSON_VALUE) + @Operation( + summary = "Callback for changed EI job status", + description = "The primitive is implemented by the data consumer and is invoked when a EI job status has been changed.") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)} // - ) + @ApiResponse( + responseCode = "200", + description = "OK", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))) // + }) public ResponseEntity jobStatusCallback( // @PathVariable("eiJobId") String eiJobId, // @RequestBody ConsumerEiJobStatus status) { diff --git a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java index 726cef7e..8f99e501 100644 --- a/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java +++ b/enrichment-coordinator-service/src/test/java/org/oransc/enrichment/controller/ProducerSimulatorController.java @@ -20,10 +20,12 @@ package org.oransc.enrichment.controller; -import io.swagger.annotations.Api; -import io.swagger.annotations.ApiOperation; -import io.swagger.annotations.ApiResponse; -import io.swagger.annotations.ApiResponses; +import io.swagger.v3.oas.annotations.Operation; +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; @@ -34,6 +36,7 @@ import lombok.Getter; import org.oransc.enrichment.controllers.ErrorResponse; import org.oransc.enrichment.controllers.VoidResponse; +import org.oransc.enrichment.controllers.producer.ProducerConsts; import org.oransc.enrichment.controllers.producer.ProducerJobInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -48,7 +51,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; @RestController("ProducerSimulatorController") -@Api(tags = {"Data Producer Job Control (example producer)"}) +@Tag(name = ProducerConsts.PRODUCER_API_CALLBACKS_NAME) public class ProducerSimulatorController { private final Logger logger = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); @@ -83,11 +86,16 @@ public class ProducerSimulatorController { private TestResults testResults = new TestResults(); @PostMapping(path = JOB_URL, produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Callback for EI job creation", notes = "") + @Operation( + summary = "Callback for EI job creation/modification", + description = "The call is invoked to activate or to modify a data subscription. The endpoint is provided by the EI producer.") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}// - ) + @ApiResponse( + responseCode = "200", + description = "OK", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))) // + }) public ResponseEntity jobCreatedCallback( // @RequestBody ProducerJobInfo request) { try { @@ -104,11 +112,16 @@ public class ProducerSimulatorController { } @DeleteMapping(path = "/producer_simulator/ei_job/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Callback for EI job deletion", notes = "") + @Operation( + summary = "Callback for EI job deletion", + description = "The call is invoked to terminate a data subscription. The endpoint is provided by the EI producer.") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}// - ) + @ApiResponse( + responseCode = "200", + description = "OK", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))) // + }) public ResponseEntity jobDeletedCallback( // @PathVariable("eiJobId") String eiJobId) { try { @@ -121,11 +134,14 @@ public class ProducerSimulatorController { } @PostMapping(path = JOB_ERROR_URL, produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Callback for EI job creation, returns error", notes = "", hidden = true) + @Operation(summary = "Callback for EI job creation, returns error", description = "", hidden = true) @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}// - ) + @ApiResponse( + responseCode = "200", + description = "OK", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))) // + }) public ResponseEntity jobCreatedCallbackReturnError( // @RequestBody ProducerJobInfo request) { logger.info("Job created (returning error) callback {}", request.id); @@ -134,35 +150,46 @@ public class ProducerSimulatorController { } @DeleteMapping(path = JOB_ERROR_URL + "/{eiJobId}", produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Callback for EI job deletion, returns error", notes = "", hidden = true) + @Operation(summary = "Callback for EI job deletion, returns error", description = "", hidden = true) @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = VoidResponse.class)}// - ) + @ApiResponse( + responseCode = "200", + description = "OK", // + content = @Content(schema = @Schema(implementation = VoidResponse.class))) // + }) public ResponseEntity jobDeletedCallbackReturnError( // - @RequestBody ProducerJobInfo request) { - logger.info("Job created (returning error) callback {}", request.id); + @PathVariable("eiJobId") String eiJobId) { + logger.info("Job created (returning error) callback {}", eiJobId); this.testResults.noOfRejectedDelete += 1; return ErrorResponse.create("Producer returns error on delete job", HttpStatus.NOT_FOUND); } @GetMapping(path = SUPERVISION_URL, produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Producer supervision", notes = "") + @Operation( + summary = "Producer supervision", + description = "The endpoint is provided by the EI producer and is used for supervision of the producer.") @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = String.class)}// - ) + @ApiResponse( + responseCode = "200", + description = "The producer is OK", // + content = @Content(schema = @Schema(implementation = String.class))) // + }) public ResponseEntity producerSupervision() { logger.info("Producer supervision"); return new ResponseEntity<>(HttpStatus.OK); } @GetMapping(path = SUPERVISION_ERROR_URL, produces = MediaType.APPLICATION_JSON_VALUE) - @ApiOperation(value = "Producer supervision error", notes = "", hidden = true) + @Operation(summary = "Producer supervision error", description = "", hidden = true) @ApiResponses( value = { // - @ApiResponse(code = 200, message = "OK", response = String.class)}// - ) + @ApiResponse( + responseCode = "200", + description = "OK", // + content = @Content(schema = @Schema(implementation = String.class))) // + }) public ResponseEntity producerSupervisionError() { logger.info("Producer supervision error"); return new ResponseEntity<>(HttpStatus.NOT_FOUND);