From 93c5a6aacd4c4d849e1f6e3274ddfb855fe80c97 Mon Sep 17 00:00:00 2001
From: elinuxhenrik The service is mainly a broker between data producers and data consumers. A data producer has the ability to produce one or several types of data (Information Type). One type of data can be produced by zero to many producers. This API is between Near-RT RIC and the Non-RT RIC. The Near-RT RIC is a data consumer, which creates Information Jobs to subscribe for data. In this context, the information is referred to as 'Enrichment Information', EI.<\/p> This API is provided by the Non-RT RIC platform and is intended to be part of the O-RAN R1 interface. The API is for use by different kinds of data producers and provides support for: This API is provided by the Non-RT RIC platform and is intended to be part of the O-RAN R1 interface. The API is for use by different kinds of data consumers and provides support for: This API provides a means to monitor the health of this service.<\/p>",
+ "title": "Data management and exposure",
+ "version": "1.0"
+ },
+ "tags": [
+ {
+ "name": "A1-EI (registration)",
+ "description": "Data consumer EI job registration"
+ },
+ {
+ "name": "A1-EI (callbacks)",
+ "description": "Data consumer EI job status callbacks"
+ },
+ {
+ "name": "Data consumer (callbacks)",
+ "description": "API for data consumers"
+ },
+ {
+ "name": "Data producer (registration)",
+ "description": "API for data producers"
+ },
+ {
+ "name": "Data producer (callbacks)",
+ "description": "API implemented by data producers"
+ },
+ {
+ "name": "Data consumer",
+ "description": "API for data consumers"
+ },
+ {
+ "name": "Service status",
+ "description": "API for monitoring of the service"
+ },
+ {
+ "name": "Actuator",
+ "description": "Monitor and interact",
+ "externalDocs": {
+ "description": "Spring Boot Actuator Web API Documentation",
+ "url": "https://docs.spring.io/spring-boot/docs/current/actuator-api/html/"
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/api/ics-api.yaml b/api/ics-api.yaml
new file mode 100644
index 0000000..be8fc94
--- /dev/null
+++ b/api/ics-api.yaml
@@ -0,0 +1,1486 @@
+openapi: 3.0.1
+info:
+ title: Data management and exposure
+ description: The service is mainly
+ a broker between data producers and data consumers. A data producer has the ability
+ to produce one or several types of data (Information Type). One type of data can
+ be produced by zero to many producers. This API is between Near-RT RIC and the Non-RT
+ RIC. The Near-RT RIC is a data consumer, which creates Information Jobs to subscribe
+ for data. In this context, the information is referred to as 'Enrichment Information',
+ EI. This API is provided by the Non-RT RIC platform
+ and is intended to be part of the O-RAN R1 interface. The API is for use by different
+ kinds of data producers and provides support for:
ENABLED: one or several producers for the information type are available
DISABLED: no producers for the information type are available",
+ "type": "string",
+ "enum": [
+ "ENABLED",
+ "DISABLED"
+ ]
+ },
+ "job_data_schema": {
+ "description": "Json schema for the job data",
+ "type": "object"
+ }
+ }
+ },
+ "EiTypeObject": {
+ "description": "Information for an EI type",
+ "type": "object"
+ },
+ "service_status_info": {
+ "type": "object",
+ "required": [
+ "no_of_jobs",
+ "no_of_producers",
+ "no_of_types",
+ "status"
+ ],
+ "properties": {
+ "no_of_producers": {
+ "format": "int32",
+ "description": "Number of Information Producers",
+ "type": "integer"
+ },
+ "no_of_types": {
+ "format": "int32",
+ "description": "Number of Information Types",
+ "type": "integer"
+ },
+ "no_of_jobs": {
+ "format": "int32",
+ "description": "Number of Information Jobs",
+ "type": "integer"
+ },
+ "status": {
+ "description": "status text",
+ "type": "string"
+ }
+ }
+ },
+ "producer_registration_info": {
+ "description": "Information for an Information Producer",
+ "type": "object",
+ "required": [
+ "info_job_callback_url",
+ "info_producer_supervision_callback_url",
+ "supported_info_types"
+ ],
+ "properties": {
+ "info_producer_supervision_callback_url": {
+ "description": "callback for producer supervision",
+ "type": "string"
+ },
+ "supported_info_types": {
+ "description": "Supported Information Type IDs",
+ "type": "array",
+ "items": {
+ "description": "Supported Information Type IDs",
+ "type": "string"
+ }
+ },
+ "info_job_callback_url": {
+ "description": "callback for Information Job",
+ "type": "string"
+ }
+ }
+ },
+ "consumer_type_registration_info": {
+ "description": "Information for an Information type",
+ "type": "object",
+ "required": [
+ "info_type_id",
+ "job_data_schema",
+ "status"
+ ],
+ "properties": {
+ "info_type_id": {
+ "description": "Information type identifier",
+ "type": "string"
+ },
+ "job_data_schema": {
+ "description": "Json schema for the job data",
+ "type": "object"
+ },
+ "status": {
+ "description": "Allowed values:
REGISTERED: the information type has been registered
DEREGISTERED: the information type has been removed",
+ "type": "string",
+ "enum": [
+ "REGISTERED",
+ "DEREGISTERED"
+ ]
+ }
+ }
+ },
+ "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": "Information 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",
+ "required": ["eiJobStatus"],
+ "properties": {"eiJobStatus": {
+ "description": "Allowed values for EI job status:
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",
+ "type": "string",
+ "enum": [
+ "ENABLED",
+ "DISABLED"
+ ]
+ }}
+ },
+ "consumer_job_status": {
+ "description": "Status for an Information Job",
+ "type": "object",
+ "required": [
+ "info_job_status",
+ "producers"
+ ],
+ "properties": {
+ "info_job_status": {
+ "description": "Allowed values:
ENABLED: the A1-Information producer is able to deliver result for the Information Job
DISABLED: the A1-Information producer is unable to deliver result for the Information Job",
+ "type": "string",
+ "enum": [
+ "ENABLED",
+ "DISABLED"
+ ]
+ },
+ "producers": {
+ "description": "An array of all registered Information Producer Identifiers.",
+ "type": "array",
+ "items": {
+ "description": "An array of all registered Information Producer Identifiers.",
+ "type": "string"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ }
+ },
+ "producer_info_type_info": {
+ "description": "Information for an Information Type",
+ "type": "object",
+ "required": ["info_job_data_schema"],
+ "properties": {
+ "info_type_information": {
+ "description": "Type specific information for the information type",
+ "type": "object"
+ },
+ "info_job_data_schema": {
+ "description": "Json schema for the job data",
+ "type": "object"
+ }
+ }
+ },
+ "producer_info_job_request": {
+ "description": "The body of the Information Producer callbacks for Information Job creation and deletion",
+ "type": "object",
+ "required": ["info_job_identity"],
+ "properties": {
+ "owner": {
+ "description": "The owner of the job",
+ "type": "string"
+ },
+ "last_updated": {
+ "description": "The time when the job was last updated or created (ISO-8601)",
+ "type": "string"
+ },
+ "info_job_identity": {
+ "description": "Identity of the Information Job",
+ "type": "string"
+ },
+ "target_uri": {
+ "description": "URI for the target of the produced Information",
+ "type": "string"
+ },
+ "info_job_data": {
+ "description": "Json for the job data",
+ "type": "object"
+ },
+ "info_type_identity": {
+ "description": "Type identity for the job",
+ "type": "string"
+ }
+ }
+ },
+ "consumer_job": {
+ "description": "Information for an Information Job",
+ "type": "object",
+ "required": [
+ "info_type_id",
+ "job_definition",
+ "job_owner",
+ "job_result_uri"
+ ],
+ "properties": {
+ "info_type_id": {
+ "description": "Information type Idenitifier of the subscription job",
+ "type": "string"
+ },
+ "job_result_uri": {
+ "description": "The target URI of the subscribed information",
+ "type": "string"
+ },
+ "job_owner": {
+ "description": "Identity of the owner of the job",
+ "type": "string"
+ },
+ "job_definition": {
+ "description": "Information type specific job data",
+ "type": "object"
+ },
+ "status_notification_uri": {
+ "description": "The target of Information subscription job status notifications",
+ "type": "string"
+ }
+ }
+ },
+ "producer_status": {
+ "description": "Status for an Info Producer",
+ "type": "object",
+ "required": ["operational_state"],
+ "properties": {"operational_state": {
+ "description": "Represents the operational states",
+ "type": "string",
+ "enum": [
+ "ENABLED",
+ "DISABLED"
+ ]
+ }}
+ },
+ "Void": {
+ "description": "Void/empty ",
+ "type": "object"
+ },
+ "Link": {
+ "type": "object",
+ "properties": {
+ "templated": {"type": "boolean"},
+ "href": {"type": "string"}
+ }
+ },
+ "consumer_type_subscription_info": {
+ "description": "Information for an information type subscription",
+ "type": "object",
+ "required": [
+ "owner",
+ "status_result_uri"
+ ],
+ "properties": {
+ "owner": {
+ "description": "Identity of the owner of the subscription",
+ "type": "string"
+ },
+ "status_result_uri": {
+ "description": "The target URI of the subscribed information",
+ "type": "string"
+ }
+ }
+ }
+ }},
+ "openapi": "3.0.1",
+ "paths": {
+ "/data-producer/v1/info-types": {"get": {
+ "summary": "Info Type identifiers",
+ "operationId": "getInfoTypdentifiers",
+ "responses": {"200": {
+ "description": "Info Type identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ }},
+ "tags": ["Data producer (registration)"]
+ }},
+ "/actuator/threaddump": {"get": {
+ "summary": "Actuator web endpoint 'threaddump'",
+ "operationId": "threaddump_2",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/A1-EI/v1/eitypes/{eiTypeId}": {"get": {
+ "summary": "Individual EI type",
+ "operationId": "getEiType",
+ "responses": {
+ "200": {
+ "description": "EI type",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiTypeObject"}}}
+ },
+ "404": {
+ "description": "Enrichment Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "eiTypeId",
+ "required": true
+ }],
+ "tags": ["A1-EI (registration)"]
+ }},
+ "/data-producer/v1/info-types/{infoTypeId}": {
+ "get": {
+ "summary": "Individual Information Type",
+ "operationId": "getInfoType",
+ "responses": {
+ "200": {
+ "description": "Info Type",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_info_type_info"}}}
+ },
+ "404": {
+ "description": "Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoTypeId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ },
+ "delete": {
+ "summary": "Individual Information Type",
+ "operationId": "deleteInfoType",
+ "responses": {
+ "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": {
+ "description": "Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ },
+ "409": {
+ "description": "The Information type has one or several active producers",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoTypeId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ },
+ "put": {
+ "summary": "Individual Information Type",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_info_type_info"}}},
+ "required": true
+ },
+ "operationId": "putInfoType",
+ "responses": {
+ "200": {
+ "description": "Type updated",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "201": {
+ "description": "Type created",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "400": {
+ "description": "Input validation failed",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoTypeId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ }
+ },
+ "/data-consumer/v1/info-type-subscription/{subscriptionId}": {
+ "get": {
+ "summary": "Individual subscription for information types (registration/deregistration)",
+ "operationId": "getIndividualTypeSubscription",
+ "responses": {
+ "200": {
+ "description": "Type subscription",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_type_subscription_info"}}}
+ },
+ "404": {
+ "description": "Subscription is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "subscriptionId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ },
+ "delete": {
+ "summary": "Individual subscription for information types (registration/deregistration)",
+ "operationId": "deleteIndividualTypeSubscription",
+ "responses": {
+ "200": {
+ "description": "Not used",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "204": {
+ "description": "Subscription deleted",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "404": {
+ "description": "Subscription is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "subscriptionId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ },
+ "put": {
+ "summary": "Individual subscription for information types (registration/deregistration)",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_type_subscription_info"}}},
+ "required": true
+ },
+ "description": "This service operation is used to subscribe to notifications for changes in the availability of data types.",
+ "operationId": "putIndividualTypeSubscription",
+ "responses": {
+ "200": {
+ "description": "Subscription updated",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "201": {
+ "description": "Subscription created",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "subscriptionId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ }
+ },
+ "/example-dataproducer/health-check": {"get": {
+ "summary": "Producer supervision",
+ "description": "The endpoint is provided by the Information 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)"]
+ }},
+ "/actuator/loggers": {"get": {
+ "summary": "Actuator web endpoint 'loggers'",
+ "operationId": "loggers",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/actuator/health/**": {"get": {
+ "summary": "Actuator web endpoint 'health-path'",
+ "operationId": "health-path",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/data-consumer/v1/info-types": {"get": {
+ "summary": "Information type identifiers",
+ "operationId": "getinfoTypeIdentifiers",
+ "responses": {"200": {
+ "description": "Information type identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ }},
+ "tags": ["Data consumer"]
+ }},
+ "/example-dataconsumer/info-type-status": {"post": {
+ "summary": "Callback for changed Information type registration status",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_type_registration_info"}}},
+ "required": true
+ },
+ "description": "The primitive is implemented by the data consumer and is invoked when a Information type status has been changed.
Subscription are managed by primitives in 'Data consumer'",
+ "operationId": "typeStatusCallback",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ }},
+ "tags": ["Data consumer (callbacks)"]
+ }},
+ "/actuator/metrics/{requiredMetricName}": {"get": {
+ "summary": "Actuator web endpoint 'metrics-requiredMetricName'",
+ "operationId": "metrics-requiredMetricName",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "requiredMetricName",
+ "required": true
+ }],
+ "tags": ["Actuator"]
+ }},
+ "/actuator": {"get": {
+ "summary": "Actuator root web endpoint",
+ "operationId": "links",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {
+ "additionalProperties": {
+ "additionalProperties": {"$ref": "#/components/schemas/Link"},
+ "type": "object"
+ },
+ "type": "object"
+ }}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/data-consumer/v1/info-jobs": {"get": {
+ "summary": "Information Job identifiers",
+ "description": "query for information job identifiers",
+ "operationId": "getJobIds",
+ "responses": {
+ "200": {
+ "description": "Information information job identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ },
+ "404": {
+ "description": "Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [
+ {
+ "schema": {"type": "string"},
+ "in": "query",
+ "name": "infoTypeId",
+ "description": "selects subscription jobs of matching information type",
+ "required": false
+ },
+ {
+ "schema": {"type": "string"},
+ "in": "query",
+ "name": "owner",
+ "description": "selects result for one owner",
+ "required": false
+ }
+ ],
+ "tags": ["Data consumer"]
+ }},
+ "/actuator/loggers/{name}": {
+ "post": {
+ "summary": "Actuator web endpoint 'loggers-name'",
+ "operationId": "loggers-name",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "name",
+ "required": true
+ }],
+ "tags": ["Actuator"]
+ },
+ "get": {
+ "summary": "Actuator web endpoint 'loggers-name'",
+ "operationId": "loggers-name_2",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "name",
+ "required": true
+ }],
+ "tags": ["Actuator"]
+ }
+ },
+ "/example-dataproducer/info-job": {"post": {
+ "summary": "Callback for Information Job creation/modification",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_info_job_request"}}},
+ "required": true
+ },
+ "description": "The call is invoked to activate or to modify a data subscription. The endpoint is provided by the Information Producer.",
+ "operationId": "jobCreatedCallback",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ }},
+ "tags": ["Data producer (callbacks)"]
+ }},
+ "/example-dataproducer/info-job/{infoJobId}": {"delete": {
+ "summary": "Callback for Information Job deletion",
+ "description": "The call is invoked to terminate a data subscription. The endpoint is provided by the Information Producer.",
+ "operationId": "jobDeletedCallback",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ }},
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoJobId",
+ "required": true
+ }],
+ "tags": ["Data producer (callbacks)"]
+ }},
+ "/A1-EI/v1/eijobs/{eiJobId}/status": {"get": {
+ "summary": "EI job status",
+ "operationId": "getEiJobStatus_1",
+ "responses": {
+ "200": {
+ "description": "EI job status",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobStatusObject"}}}
+ },
+ "404": {
+ "description": "Enrichment Information job is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "eiJobId",
+ "required": true
+ }],
+ "tags": ["A1-EI (registration)"]
+ }},
+ "/data-producer/v1/info-producers/{infoProducerId}/status": {"get": {
+ "summary": "Information producer status",
+ "operationId": "getInfoProducerStatus",
+ "responses": {
+ "200": {
+ "description": "Information producer status",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_status"}}}
+ },
+ "404": {
+ "description": "Information producer is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoProducerId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ }},
+ "/data-consumer/v1/info-jobs/{infoJobId}/status": {"get": {
+ "summary": "Job status",
+ "operationId": "getEiJobStatus",
+ "responses": {
+ "200": {
+ "description": "Information subscription job status",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_job_status"}}}
+ },
+ "404": {
+ "description": "Information subscription job is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoJobId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ }},
+ "/actuator/metrics": {"get": {
+ "summary": "Actuator web endpoint 'metrics'",
+ "operationId": "metrics",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/example-dataconsumer/info-jobs/{infoJobId}/status": {"post": {
+ "summary": "Callback for changed Information 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 Information 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": "infoJobId",
+ "required": true
+ }],
+ "tags": ["A1-EI (callbacks)"]
+ }},
+ "/actuator/info": {"get": {
+ "summary": "Actuator web endpoint 'info'",
+ "operationId": "info",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/A1-EI/v1/eitypes": {"get": {
+ "summary": "EI type identifiers",
+ "operationId": "getEiTypeIdentifiers",
+ "responses": {"200": {
+ "description": "EI type identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ }},
+ "tags": ["A1-EI (registration)"]
+ }},
+ "/data-producer/v1/info-producers/{infoProducerId}": {
+ "get": {
+ "summary": "Individual Information Producer",
+ "operationId": "getInfoProducer",
+ "responses": {
+ "200": {
+ "description": "Information producer",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_registration_info"}}}
+ },
+ "404": {
+ "description": "Information producer is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoProducerId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ },
+ "delete": {
+ "summary": "Individual Information Producer",
+ "operationId": "deleteInfoProducer",
+ "responses": {
+ "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": {
+ "description": "Producer is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoProducerId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ },
+ "put": {
+ "summary": "Individual Information Producer",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/producer_registration_info"}}},
+ "required": true
+ },
+ "operationId": "putInfoProducer",
+ "responses": {
+ "200": {
+ "description": "Producer updated",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "201": {
+ "description": "Producer created",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "400": {
+ "description": "Input validation failed",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ },
+ "404": {
+ "description": "Producer type not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoProducerId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ }
+ },
+ "/status": {"get": {
+ "summary": "Returns status and statistics of this service",
+ "operationId": "getStatus",
+ "responses": {"200": {
+ "description": "Service is living",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/service_status_info"}}}
+ }},
+ "tags": ["Service status"]
+ }},
+ "/data-consumer/v1/info-type-subscription": {"get": {
+ "summary": "Information type subscription identifiers",
+ "description": "query for information type subscription identifiers",
+ "operationId": "getInfoTypeSubscriptions",
+ "responses": {"200": {
+ "description": "Information type subscription identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ }},
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "query",
+ "name": "owner",
+ "description": "selects result for one owner",
+ "required": false
+ }],
+ "tags": ["Data consumer"]
+ }},
+ "/A1-EI/v1/eijobs/{eiJobId}": {
+ "get": {
+ "summary": "Individual EI job",
+ "operationId": "getIndividualEiJob_1",
+ "responses": {
+ "200": {
+ "description": "EI job",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobObject"}}}
+ },
+ "404": {
+ "description": "Enrichment Information job is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "eiJobId",
+ "required": true
+ }],
+ "tags": ["A1-EI (registration)"]
+ },
+ "delete": {
+ "summary": "Individual EI job",
+ "operationId": "deleteIndividualEiJob_1",
+ "responses": {
+ "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": {
+ "description": "Enrichment Information job is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "eiJobId",
+ "required": true
+ }],
+ "tags": ["A1-EI (registration)"]
+ },
+ "put": {
+ "summary": "Individual EI job",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EiJobObject"}}},
+ "required": true
+ },
+ "operationId": "putIndividualEiJob",
+ "responses": {
+ "200": {
+ "description": "Job updated",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "201": {
+ "description": "Job created",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "400": {
+ "description": "Input validation failed",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ },
+ "404": {
+ "description": "Enrichment Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ },
+ "409": {
+ "description": "Cannot modify job type",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "eiJobId",
+ "required": true
+ }],
+ "tags": ["A1-EI (registration)"]
+ }
+ },
+ "/actuator/logfile": {"get": {
+ "summary": "Actuator web endpoint 'logfile'",
+ "operationId": "logfile",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/data-consumer/v1/info-jobs/{infoJobId}": {
+ "get": {
+ "summary": "Individual data subscription job",
+ "operationId": "getIndividualEiJob",
+ "responses": {
+ "200": {
+ "description": "Information subscription job",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_job"}}}
+ },
+ "404": {
+ "description": "Information subscription job is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoJobId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ },
+ "delete": {
+ "summary": "Individual data subscription job",
+ "operationId": "deleteIndividualEiJob",
+ "responses": {
+ "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": {
+ "description": "Information subscription job is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoJobId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ },
+ "put": {
+ "summary": "Individual data subscription job",
+ "requestBody": {
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_job"}}},
+ "required": true
+ },
+ "description": "The job will be enabled when a producer is available",
+ "operationId": "putIndividualInfoJob",
+ "responses": {
+ "200": {
+ "description": "Job updated",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "201": {
+ "description": "Job created",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Void"}}}
+ },
+ "400": {
+ "description": "Input validation failed",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ },
+ "404": {
+ "description": "Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ },
+ "409": {
+ "description": "Cannot modify job type",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [
+ {
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoJobId",
+ "required": true
+ },
+ {
+ "schema": {
+ "default": false,
+ "type": "boolean"
+ },
+ "in": "query",
+ "name": "typeCheck",
+ "description": "when true, a validation of that the type exists and that the job matches the type schema.",
+ "required": false
+ }
+ ],
+ "tags": ["Data consumer"]
+ }
+ },
+ "/data-producer/v1/info-producers": {"get": {
+ "summary": "Information producer identifiers",
+ "operationId": "getInfoProducerIdentifiers",
+ "responses": {"200": {
+ "description": "Information producer identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ }},
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "query",
+ "name": "infoTypeId",
+ "description": "If given, only the producers for the EI Data type is returned.",
+ "required": false
+ }],
+ "tags": ["Data producer (registration)"]
+ }},
+ "/data-consumer/v1/info-types/{infoTypeId}": {"get": {
+ "summary": "Individual information type",
+ "operationId": "getInfoType_1",
+ "responses": {
+ "200": {
+ "description": "Information type",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/consumer_information_type"}}}
+ },
+ "404": {
+ "description": "Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoTypeId",
+ "required": true
+ }],
+ "tags": ["Data consumer"]
+ }},
+ "/actuator/health": {"get": {
+ "summary": "Actuator web endpoint 'health'",
+ "operationId": "health",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }},
+ "/A1-EI/v1/eijobs": {"get": {
+ "summary": "EI job identifiers",
+ "description": "query for EI job identifiers",
+ "operationId": "getEiJobIds",
+ "responses": {
+ "200": {
+ "description": "EI job identifiers",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"type": "string"}
+ }}}
+ },
+ "404": {
+ "description": "Enrichment Information type is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [
+ {
+ "schema": {"type": "string"},
+ "in": "query",
+ "name": "eiTypeId",
+ "description": "selects EI jobs of matching EI type",
+ "required": false
+ },
+ {
+ "schema": {"type": "string"},
+ "in": "query",
+ "name": "owner",
+ "description": "selects EI jobs for one EI job owner",
+ "required": false
+ }
+ ],
+ "tags": ["A1-EI (registration)"]
+ }},
+ "/data-producer/v1/info-producers/{infoProducerId}/info-jobs": {"get": {
+ "summary": "Information Job definitions",
+ "description": "Information Job definitions for one Information Producer",
+ "operationId": "getInfoProducerJobs",
+ "responses": {
+ "200": {
+ "description": "Information producer",
+ "content": {"application/json": {"schema": {
+ "type": "array",
+ "items": {"$ref": "#/components/schemas/producer_info_job_request"}
+ }}}
+ },
+ "404": {
+ "description": "Information producer is not found",
+ "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProblemDetails"}}}
+ }
+ },
+ "parameters": [{
+ "schema": {"type": "string"},
+ "in": "path",
+ "name": "infoProducerId",
+ "required": true
+ }],
+ "tags": ["Data producer (registration)"]
+ }},
+ "/actuator/heapdump": {"get": {
+ "summary": "Actuator web endpoint 'heapdump'",
+ "operationId": "heapdump",
+ "responses": {"200": {
+ "description": "OK",
+ "content": {"*/*": {"schema": {"type": "object"}}}
+ }},
+ "tags": ["Actuator"]
+ }}
+ },
+ "info": {
+ "license": {
+ "name": "Copyright (C) 2020-2022 Nordix Foundation. Licensed under the Apache License.",
+ "url": "http://www.apache.org/licenses/LICENSE-2.0"
+ },
+ "description": "API documentation<\/h1>
General<\/h2>
A data consumer can have several active data subscriptions (Information Job). One Information Job consists of 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>
Data producer API<\/h4>
Data consumer API<\/h4>
Service status<\/h4>
API documentation
General
A data consumer can have several
+ active data subscriptions (Information Job). One Information Job consists of 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
Data producer API
This API is provided + by the Non-RT RIC platform and is intended to be part of the O-RAN R1 interface. The + API is for use by different kinds of data consumers and provides support for:
This + API provides a means to monitor the health of this service.
+ license: + name: Copyright (C) 2020-2022 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 (registration) + description: Data consumer EI job registration +- name: A1-EI (callbacks) + description: Data consumer EI job status callbacks +- name: Data consumer (callbacks) + description: API for data consumers +- name: Data producer (registration) + description: API for data producers +- name: Data producer (callbacks) + description: API implemented by data producers +- name: Data consumer + description: API for data consumers +- name: Service status + description: API for monitoring of the service +- name: Actuator + description: Monitor and interact + externalDocs: + description: Spring Boot Actuator Web API Documentation + url: https://docs.spring.io/spring-boot/docs/current/actuator-api/html/ +paths: + /data-producer/v1/info-types: + get: + tags: + - Data producer (registration) + summary: Info Type identifiers + operationId: getInfoTypdentifiers + responses: + 200: + description: Info Type identifiers + content: + application/json: + schema: + type: array + items: + type: string + /actuator/threaddump: + get: + tags: + - Actuator + summary: Actuator web endpoint 'threaddump' + operationId: threaddump_2 + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /A1-EI/v1/eitypes/{eiTypeId}: + get: + tags: + - A1-EI (registration) + summary: Individual EI type + operationId: getEiType + parameters: + - name: eiTypeId + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: EI type + content: + application/json: + schema: + $ref: '#/components/schemas/EiTypeObject' + 404: + description: Enrichment Information type is not found + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + /data-producer/v1/info-types/{infoTypeId}: + get: + tags: + - Data producer (registration) + summary: Individual Information Type + operationId: getInfoType + parameters: + - name: infoTypeId + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: Info Type + content: + application/json: + schema: + $ref: '#/components/schemas/producer_info_type_info' + 404: + description: Information type is not found + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + put: + tags: + - Data producer (registration) + summary: Individual Information Type + operationId: putInfoType + parameters: + - name: infoTypeId + in: path + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/producer_info_type_info' + required: true + responses: + 200: + description: Type updated + content: + application/json: + schema: + $ref: '#/components/schemas/Void' + 201: + description: Type created + content: + application/json: + schema: + $ref: '#/components/schemas/Void' + 400: + description: Input validation failed + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + delete: + tags: + - Data producer (registration) + summary: Individual Information Type + operationId: deleteInfoType + parameters: + - name: infoTypeId + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 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: + description: Information type is not found + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + 409: + description: The Information type has one or several active producers + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + /data-consumer/v1/info-type-subscription/{subscriptionId}: + get: + tags: + - Data consumer + summary: Individual subscription for information types (registration/deregistration) + operationId: getIndividualTypeSubscription + parameters: + - name: subscriptionId + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: Type subscription + content: + application/json: + schema: + $ref: '#/components/schemas/consumer_type_subscription_info' + 404: + description: Subscription is not found + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + put: + tags: + - Data consumer + summary: Individual subscription for information types (registration/deregistration) + description: This service operation is used to subscribe to notifications for + changes in the availability of data types. + operationId: putIndividualTypeSubscription + parameters: + - name: subscriptionId + in: path + required: true + style: simple + explode: false + schema: + type: string + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/consumer_type_subscription_info' + required: true + responses: + 200: + description: Subscription updated + content: + application/json: + schema: + $ref: '#/components/schemas/Void' + 201: + description: Subscription created + content: + application/json: + schema: + $ref: '#/components/schemas/Void' + delete: + tags: + - Data consumer + summary: Individual subscription for information types (registration/deregistration) + operationId: deleteIndividualTypeSubscription + parameters: + - name: subscriptionId + in: path + required: true + style: simple + explode: false + schema: + type: string + responses: + 200: + description: Not used + content: + application/json: + schema: + $ref: '#/components/schemas/Void' + 204: + description: Subscription deleted + content: + application/json: + schema: + $ref: '#/components/schemas/Void' + 404: + description: Subscription is not found + content: + application/json: + schema: + $ref: '#/components/schemas/ProblemDetails' + /example-dataproducer/health-check: + get: + tags: + - Data producer (callbacks) + summary: Producer supervision + description: The endpoint is provided by the Information Producer and is used + for supervision of the producer. + operationId: producerSupervision + responses: + 200: + description: The producer is OK + content: + application/json: + schema: + type: string + /actuator/loggers: + get: + tags: + - Actuator + summary: Actuator web endpoint 'loggers' + operationId: loggers + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /actuator/health/**: + get: + tags: + - Actuator + summary: Actuator web endpoint 'health-path' + operationId: health-path + responses: + 200: + description: OK + content: + '*/*': + schema: + type: object + /data-consumer/v1/info-types: + get: + tags: + - Data consumer + summary: Information type identifiers + operationId: getinfoTypeIdentifiers + responses: + 200: + description: Information type identifiers + content: + application/json: + schema: + type: array + items: + type: string + /example-dataconsumer/info-type-status: + post: + tags: + - Data consumer (callbacks) + summary: Callback for changed Information type registration status + description: The primitive is implemented by the data consumer and is invoked + when a Information type status has been changed.$nVQ78vw$hazK2q^z{>>~5ks6mUAFnIFdyKu{ckR>gIZ%-hAbvV#5ah|(
zIVJpVfz^h*mgDe(MwkatcMXjwj*#Wz$NYtB;X?PD6!RYra{S3VE+F5y?2zw<)3-l6
zm8K%z0C**V%it4b r@f1gRWk|A*%4`3la7*fhEBO++
zfvvjve+IanAb3ebpxo91qho!$LEb@?k6|ww@9ND|r^>H%YwgJ3G{&6QZiQ(mXHDRr
za4yHb!baK{{OxHH8KCusjrz)sK~m1J%m6P)B3N`$$ack0DB~-kGNe}ZK1cs1(@jP*
z5!0niAjjsxj0xxK4K~L#5rwN1f!1SBih)1Zz&~XF_yZ~7(@(3bEw*V%9bAUU>3(0D
z-%=sal%EY%wVWwvB)umubUJhR7?KAYi9x!ayGpDKFf!{8VFZb+EDQk-4KCD`w;}Uv
z*9Q~)ebqj5ryHg^kUxXaXdr!yc^jKQ9p4m5$=cxC=0$=bPBz>vX;Vs87LJn2SYL~+
z#b^_%XoM$cYM7t|ZNj;wS6eYk*D1t&$V;RHaXc}thgrNPOJYVyq)`zUdaIz qpCI&8I)<6YA2T$ZK>M8P0oz
zwU!*AHkcI~o+Y7VrDZ?f(GqUF7OP7mmuYP8MJj7Uez!0^
zFg8ikua{>u3NhgHwPTPar7HH
zkokNXPF6uXwL(tyZ-G5P-jE=tIN
literal 0
HcmV?d00001
diff --git a/docs/_static/logo.png b/docs/_static/logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..c3b6ce56468d87a3d9463ee75297b3895fc9a414
GIT binary patch
literal 43935
zcmdRV1y>y1vgqK!-8I48-Gh5@cL>34aCe8`1P=r!c+dd`w=lT7ySqQWbI(2RuDjOz
z0k3=Y>h9{2y{mTbUD6%(MOg+Fi3kY*0HDgrN~!?>P>%11%Ln*(hyYMu_5B2EC9Wh6
z0MsTRKbyk6-&2^&swn{g-ZTI}U?>3a_znu(2LRmI0Dwc2cd85k0N*LQRaFQ8fJU~~
z&;jZwDGHc7+OwEiIGS0qc-lL?Qvd)$o&xWe_Le|X3Qv1G2Uh`4;ZOg<5O}}-2h943
z;$J90Tj5VSN?#}>99=9axLLSZ*glCMQBY6_xmbJ^P?MDYH~IUW@TYG;ppyVAtA~dN
ziw7r*ql* (Pt6JC~hqrUitn?hPUGDb{+Zn;|{8c
zyR)^WHKAv9(;z_){MV9Pz%z3gPP?Gz6)AANr4$L>t9(sPhF2^lP`qv#z1++x>i+mP
zNxA!PZF#(gz%Ym552N84{>cIAR>?Fj?D%_{VYbL!j!-(o$Z{GvU9!Z=K#x)GWmPZ5
zj(fxzj_^;PI{D&jQa&H~|b
zdPv2V9#~1*o@Nrer|nmLZZ}gT_gYt=RT=kh%~~%P@WzRijUx7CnHe+~VzS`%?o_2t194UgUk&Ytf>2d!I3^zS)S#)LJyiDsn%Fhqa
z+st>j4*nbVPdjbKUI2+0UqU4Zy>14HdH3u4U&n?gvf;P~nNkcPFGveb+Y?PIlPlt$
z`JE4)IP_)8&P15io;Lw$Zq7b&dLaERp!+Ee5JqS&
Z
zjpq90FJ!#ymo=xs*xE0t