From 86cd893e8dbbbd02a1b3209baa6da60337ae417a Mon Sep 17 00:00:00 2001 From: Vijay VK Date: Tue, 23 Oct 2018 16:35:29 +0100 Subject: [PATCH] dcaegen2 doc updates Change-Id: I8f0a8a733b6e28fc9d18bed81c9ac4e82c954af8 Signed-off-by: VENKATESH KUMAR Issue-ID: DCAEGEN2-573 --- .project | 17 + .settings/org.eclipse.core.resources.prefs | 2 + docs/sections/apis/configbinding.yaml | 5 +- docs/sections/apis/deployment-handler-API.yaml | 5 +- docs/sections/apis/deployment-handler.rst | 2 +- docs/sections/apis/inventory.rst | 2 +- docs/sections/apis/swagger_inventory.yaml | 2 +- docs/sections/apis/swagger_vescollector.yaml | 2463 +++++--------------- docs/sections/architecture.rst | 4 +- docs/sections/build.rst | 1 - docs/sections/healthcheck.rst | 58 +- docs/sections/installation_heat.rst | 5 +- docs/sections/installation_oom.rst | 28 +- docs/sections/release-notes.rst | 6 +- .../services/ves-http/VES-processingFlow.png | Bin 0 -> 71422 bytes docs/sections/services/ves-http/architecture.rst | 60 + docs/sections/services/ves-http/configuration.rst | 67 + docs/sections/services/ves-http/delivery.rst | 9 + docs/sections/services/ves-http/index.rst | 15 + docs/sections/services/ves-http/installation.rst | 24 + docs/sections/services/ves-http/ves-deployarch.png | Bin 0 -> 123286 bytes docs/sections/tls_enablement.rst | 19 +- 22 files changed, 872 insertions(+), 1922 deletions(-) create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 docs/sections/services/ves-http/VES-processingFlow.png create mode 100644 docs/sections/services/ves-http/architecture.rst create mode 100644 docs/sections/services/ves-http/configuration.rst create mode 100644 docs/sections/services/ves-http/delivery.rst create mode 100644 docs/sections/services/ves-http/installation.rst create mode 100644 docs/sections/services/ves-http/ves-deployarch.png diff --git a/.project b/.project new file mode 100644 index 00000000..f87dd048 --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + dcaegen2 + + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.eclipse.m2e.core.maven2Nature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 00000000..99f26c02 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,2 @@ +eclipse.preferences.version=1 +encoding/=UTF-8 diff --git a/docs/sections/apis/configbinding.yaml b/docs/sections/apis/configbinding.yaml index cfe09440..1d3e7884 100644 --- a/docs/sections/apis/configbinding.yaml +++ b/docs/sections/apis/configbinding.yaml @@ -13,14 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============LICENSE_END========================================================= -# -# ECOMP is a trademark and service mark of AT&T Intellectual Property. + --- swagger: "2.0" info: - version: "2.1.0" + version: "2.2.3" title: "Config Binding Service" paths: /service_component/{service_component_name}: diff --git a/docs/sections/apis/deployment-handler-API.yaml b/docs/sections/apis/deployment-handler-API.yaml index 887e3361..7d3cf6e3 100644 --- a/docs/sections/apis/deployment-handler-API.yaml +++ b/docs/sections/apis/deployment-handler-API.yaml @@ -13,14 +13,13 @@ # See the License for the specific language governing permissions and # limitations under the License. # ============LICENSE_END========================================================= -# -# ECOMP is a trademark and service mark of AT&T Intellectual Property. + --- swagger: '2.0' info: - version: "4.2.0" + version: "3.0.3" title: "deployment-handler API" license: name: "Apache 2.0" diff --git a/docs/sections/apis/deployment-handler.rst b/docs/sections/apis/deployment-handler.rst index c3e9c6c0..32373c9b 100644 --- a/docs/sections/apis/deployment-handler.rst +++ b/docs/sections/apis/deployment-handler.rst @@ -1,4 +1,4 @@ -deployment-handler API 4.2.0 +deployment-handler API 3.0.3 ============================ .. toctree:: diff --git a/docs/sections/apis/inventory.rst b/docs/sections/apis/inventory.rst index 4dd02170..a37ef14e 100644 --- a/docs/sections/apis/inventory.rst +++ b/docs/sections/apis/inventory.rst @@ -1,4 +1,4 @@ -DCAE Inventory API 2.1.0 +DCAE Inventory API 3.0.4 ======================== .. toctree:: diff --git a/docs/sections/apis/swagger_inventory.yaml b/docs/sections/apis/swagger_inventory.yaml index 068f2216..6fd57162 100644 --- a/docs/sections/apis/swagger_inventory.yaml +++ b/docs/sections/apis/swagger_inventory.yaml @@ -17,7 +17,7 @@ # ECOMP is a trademark and service mark of AT&T Intellectual Property. swagger: '2.0' info: - version: "2.1.0" + version: "3.0.4" title: DCAE Inventory API description: | DCAE Inventory is a web service that provides the following: diff --git a/docs/sections/apis/swagger_vescollector.yaml b/docs/sections/apis/swagger_vescollector.yaml index 6acae21e..52b19226 100644 --- a/docs/sections/apis/swagger_vescollector.yaml +++ b/docs/sections/apis/swagger_vescollector.yaml @@ -1,5 +1,5 @@ # ================================================================================ -# Copyright (c) 2017-2018 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2018 AT&T Intellectual Property. All rights reserved. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -14,1931 +14,636 @@ # limitations under the License. # ============LICENSE_END========================================================= # -# ECOMP is a trademark and service mark of AT&T Intellectual Property. swagger: '2.0' info: - version: 1.1.0 + version: 1.3.1 title: VES Collector description: > Virtual Event Streaming (VES) Collector is RESTful collector for processing JSON messages. The collector verifies the source and validates the events against VES schema before distributing to DMAAP MR topics - contact: - email: dcae@lists.openecomp.org -externalDocs: - description: VESCollector - url: 'https://gerrit.onap.org/r/#/admin/projects/dcaegen2/collectors/ves' -schemes: - - http - - https -securityDefinitions: - basicAuth: - type: basic - description: HTTP Basic Authentication. Works over `HTTP` and `HTTPS` + termsOfService: 'urn:tos' + contact: {} + license: + name: Apache 2.0 + url: 'http://www.apache.org/licenses/LICENSE-2.0' +host: 'localhost:8080' +basePath: / +tags: + - name: basic-error-controller + description: Basic Error Controller + - name: ves-rest-controller + description: Ves Rest Controller paths: - /eventListener/v5: + /: + get: + tags: + - ves-rest-controller + summary: mainPage + operationId: mainPageUsingGET + produces: + - '*/*' + responses: + '200': + description: OK + schema: + type: string + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /error: + get: + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingGET + produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + head: + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingHEAD + consumes: + - application/json + produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden post: - security: - - basicAuth: [] - summary: '' - description: uri for posting VES event objects - operationId: veseventPut + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingPOST + consumes: + - application/json + produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + put: + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingPUT consumes: - application/json produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + delete: + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingDELETE + produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + options: + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingOPTIONS + consumes: + - application/json + produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + patch: + tags: + - basic-error-controller + summary: errorHtml + operationId: errorHtmlUsingPATCH + consumes: + - application/json + produces: + - text/html + responses: + '200': + description: OK + schema: + $ref: '#/definitions/ModelAndView' + '204': + description: No Content + '401': + description: Unauthorized + '403': + description: Forbidden + /eventListener/v1: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST + consumes: - application/json + produces: + - '*/*' parameters: - in: body - name: body + name: jsonPayload + description: jsonPayload required: true schema: - $ref: '#/definitions/VES5Request' + type: string responses: '200': - description: VES Event Accepted. + description: OK schema: - $ref: '#/definitions/ApiResponseMessage' - '400': - description: Bad request provided + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v1/eventBatch: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_1 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: + type: string + responses: + '200': + description: OK schema: - $ref: '#/definitions/ApiResponseMessage' + type: string + '201': + description: Created '401': - description: Unauthorized request + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v2: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_2 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true schema: - $ref: '#/definitions/ApiResponseMessage' - '503': - description: Service Unavailable + type: string + responses: + '200': + description: OK schema: - $ref: '#/definitions/ApiResponseMessage' - /eventListener/v5/eventBatch: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v2/eventBatch: post: - security: - - basicAuth: [] - summary: '' - description: uri for posting VES batch event objects - operationId: veseventbatchPut + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_3 consumes: - application/json produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: + type: string + responses: + '200': + description: OK + schema: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v3: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_4 + consumes: - application/json + produces: + - '*/*' parameters: - in: body - name: body + name: jsonPayload + description: jsonPayload required: true schema: - $ref: '#/definitions/VES5Request' + type: string responses: '200': - description: VES Event Accepted. + description: OK schema: - $ref: '#/definitions/ApiResponseMessage' - '400': - description: Bad request provided + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v3/eventBatch: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_5 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true schema: - $ref: '#/definitions/ApiResponseMessage' + type: string + responses: + '200': + description: OK + schema: + type: string + '201': + description: Created '401': - description: Unauthorized request + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v4: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_6 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true schema: - $ref: '#/definitions/ApiResponseMessage' - '503': - description: Service Unavailable + type: string + responses: + '200': + description: OK schema: - $ref: '#/definitions/ApiResponseMessage' - /healthcheck: - get: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v4/eventBatch: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_7 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: + type: string responses: '200': - description: healthcheck successful -definitions: - ApiResponseMessage: - type: object - properties: - code: - type: integer - format: int32 - type: - type: string - message: - type: string - VES5Request: - type: object - properties: - event: - $ref: '#/definitions/event' - codecsInUse: - description: number of times an identified codec was used over the measurementInterval - type: object - properties: - codecIdentifier: - type: string - numberInUse: - type: integer - required: - - codecIdentifier - - numberInUse - command: - description: command from an event collector toward an event source - type: object - properties: - commandType: - type: string - enum: - - heartbeatIntervalChange - - measurementIntervalChange - - provideThrottlingState - - throttlingSpecification - eventDomainThrottleSpecification: - $ref: '#/definitions/eventDomainThrottleSpecification' - heartbeatInterval: - type: integer - measurementInterval: - type: integer - required: - - commandType - commonEventHeader: - description: fields common to all events - type: object - properties: - domain: - description: the eventing domain associated with the event - type: string - enum: - - fault - - heartbeat - - measurementsForVfScaling - - mobileFlow - - other - - sipSignaling - - stateChange - - syslog - - thresholdCrossingAlert - - voiceQuality - eventId: - description: event key that is unique to the event source - type: string - eventName: - description: unique event name - type: string - eventType: - description: 'for example - applicationVnf, guestOS, hostOS, platform' - type: string - internalHeaderFields: - $ref: '#/definitions/internalHeaderFields' - lastEpochMicrosec: - description: >- - the latest unix time aka epoch time associated with the event from any - component--as microseconds elapsed since 1 Jan 1970 not including leap - seconds - type: number - nfcNamingCode: - description: >- - 3 character network function component type, aligned with vfc naming - standards - type: string - nfNamingCode: - description: '4 character network function type, aligned with vnf naming standards' - type: string - priority: - description: processing priority - type: string - enum: - - High - - Medium - - Normal - - Low - reportingEntityId: - description: >- - UUID identifying the entity reporting the event, for example an OAM - VM; must be populated by the ATT enrichment process - type: string - reportingEntityName: - description: >- - name of the entity reporting the event, for example, an EMS name; may - be the same as sourceName - type: string - sequence: - description: >- - ordering of events communicated by an event source instance or 0 if - not needed - type: integer - sourceId: - description: >- - UUID identifying the entity experiencing the event issue; must be - populated by the ATT enrichment process - type: string - sourceName: - description: name of the entity experiencing the event issue - type: string - startEpochMicrosec: - description: >- - the earliest unix time aka epoch time associated with the event from - any component--as microseconds elapsed since 1 Jan 1970 not including - leap seconds - type: number - version: - description: version of the event header - type: number - required: - - domain - - eventId - - eventName - - lastEpochMicrosec - - priority - - reportingEntityName - - sequence - - sourceName - - startEpochMicrosec - - version - counter: - description: performance counter - type: object - properties: - criticality: - type: string - enum: - - CRIT - - MAJ - name: - type: string - thresholdCrossed: - type: string - value: - type: string - required: - - criticality - - name - - thresholdCrossed - - value - cpuUsage: - description: usage of an identified CPU - type: object - properties: - cpuIdentifier: - description: cpu identifer - type: string - cpuIdle: - description: percentage of CPU time spent in the idle task - type: number - cpuUsageInterrupt: - description: percentage of time spent servicing interrupts - type: number - cpuUsageNice: - description: >- - percentage of time spent running user space processes that have been - niced - type: number - cpuUsageSoftIrq: - description: percentage of time spent handling soft irq interrupts - type: number - cpuUsageSteal: - description: >- - percentage of time spent in involuntary wait which is neither user, - system or idle time and is effectively time that went missing - type: number - cpuUsageSystem: - description: percentage of time spent on system tasks running the kernel - type: number - cpuUsageUser: - description: percentage of time spent running un-niced user space processes - type: number - cpuWait: - description: percentage of CPU time spent waiting for I/O operations to complete - type: number - percentUsage: - description: >- - aggregate cpu usage of the virtual machine on which the VNFC reporting - the event is running - type: number - required: - - cpuIdentifier - - percentUsage - diskUsage: - description: usage of an identified disk - type: object - properties: - diskIdentifier: - description: disk identifier - type: string - diskIoTimeAvg: - description: >- - milliseconds spent doing input/output operations over 1 sec; treat - this metric as a device load percentage where 1000ms matches 100% - load; provide the average over the measurement interval - type: number - diskIoTimeLast: - description: >- - milliseconds spent doing input/output operations over 1 sec; treat - this metric as a device load percentage where 1000ms matches 100% - load; provide the last value measurement within the measurement - interval - type: number - diskIoTimeMax: - description: >- - milliseconds spent doing input/output operations over 1 sec; treat - this metric as a device load percentage where 1000ms matches 100% - load; provide the maximum value measurement within the measurement - interval - type: number - diskIoTimeMin: - description: >- - milliseconds spent doing input/output operations over 1 sec; treat - this metric as a device load percentage where 1000ms matches 100% - load; provide the minimum value measurement within the measurement - interval - type: number - diskMergedReadAvg: - description: >- - number of logical read operations that were merged into physical read - operations, e.g., two logical reads were served by one physical disk - access; provide the average measurement within the measurement - interval - type: number - diskMergedReadLast: - description: >- - number of logical read operations that were merged into physical read - operations, e.g., two logical reads were served by one physical disk - access; provide the last value measurement within the measurement - interval - type: number - diskMergedReadMax: - description: >- - number of logical read operations that were merged into physical read - operations, e.g., two logical reads were served by one physical disk - access; provide the maximum value measurement within the measurement - interval - type: number - diskMergedReadMin: - description: >- - number of logical read operations that were merged into physical read - operations, e.g., two logical reads were served by one physical disk - access; provide the minimum value measurement within the measurement - interval - type: number - diskMergedWriteAvg: - description: >- - number of logical write operations that were merged into physical - write operations, e.g., two logical writes were served by one physical - disk access; provide the average measurement within the measurement - interval - type: number - diskMergedWriteLast: - description: >- - number of logical write operations that were merged into physical - write operations, e.g., two logical writes were served by one physical - disk access; provide the last value measurement within the measurement - interval - type: number - diskMergedWriteMax: - description: >- - number of logical write operations that were merged into physical - write operations, e.g., two logical writes were served by one physical - disk access; provide the maximum value measurement within the - measurement interval - type: number - diskMergedWriteMin: - description: >- - number of logical write operations that were merged into physical - write operations, e.g., two logical writes were served by one physical - disk access; provide the minimum value measurement within the - measurement interval - type: number - diskOctetsReadAvg: - description: >- - number of octets per second read from a disk or partition; provide the - average measurement within the measurement interval - type: number - diskOctetsReadLast: - description: >- - number of octets per second read from a disk or partition; provide the - last measurement within the measurement interval - type: number - diskOctetsReadMax: - description: >- - number of octets per second read from a disk or partition; provide the - maximum measurement within the measurement interval - type: number - diskOctetsReadMin: - description: >- - number of octets per second read from a disk or partition; provide the - minimum measurement within the measurement interval - type: number - diskOctetsWriteAvg: - description: >- - number of octets per second written to a disk or partition; provide - the average measurement within the measurement interval - type: number - diskOctetsWriteLast: - description: >- - number of octets per second written to a disk or partition; provide - the last measurement within the measurement interval - type: number - diskOctetsWriteMax: - description: >- - number of octets per second written to a disk or partition; provide - the maximum measurement within the measurement interval - type: number - diskOctetsWriteMin: - description: >- - number of octets per second written to a disk or partition; provide - the minimum measurement within the measurement interval - type: number - diskOpsReadAvg: - description: >- - number of read operations per second issued to the disk; provide the - average measurement within the measurement interval - type: number - diskOpsReadLast: - description: >- - number of read operations per second issued to the disk; provide the - last measurement within the measurement interval - type: number - diskOpsReadMax: - description: >- - number of read operations per second issued to the disk; provide the - maximum measurement within the measurement interval - type: number - diskOpsReadMin: - description: >- - number of read operations per second issued to the disk; provide the - minimum measurement within the measurement interval - type: number - diskOpsWriteAvg: - description: >- - number of write operations per second issued to the disk; provide the - average measurement within the measurement interval - type: number - diskOpsWriteLast: - description: >- - number of write operations per second issued to the disk; provide the - last measurement within the measurement interval - type: number - diskOpsWriteMax: - description: >- - number of write operations per second issued to the disk; provide the - maximum measurement within the measurement interval - type: number - diskOpsWriteMin: - description: >- - number of write operations per second issued to the disk; provide the - minimum measurement within the measurement interval - type: number - diskPendingOperationsAvg: - description: >- - queue size of pending I/O operations per second; provide the average - measurement within the measurement interval - type: number - diskPendingOperationsLast: - description: >- - queue size of pending I/O operations per second; provide the last - measurement within the measurement interval - type: number - diskPendingOperationsMax: - description: >- - queue size of pending I/O operations per second; provide the maximum - measurement within the measurement interval - type: number - diskPendingOperationsMin: - description: >- - queue size of pending I/O operations per second; provide the minimum - measurement within the measurement interval - type: number - diskTimeReadAvg: - description: >- - milliseconds a read operation took to complete; provide the average - measurement within the measurement interval - type: number - diskTimeReadLast: - description: >- - milliseconds a read operation took to complete; provide the last - measurement within the measurement interval - type: number - diskTimeReadMax: - description: >- - milliseconds a read operation took to complete; provide the maximum - measurement within the measurement interval - type: number - diskTimeReadMin: - description: >- - milliseconds a read operation took to complete; provide the minimum - measurement within the measurement interval - type: number - diskTimeWriteAvg: - description: >- - milliseconds a write operation took to complete; provide the average - measurement within the measurement interval - type: number - diskTimeWriteLast: - description: >- - milliseconds a write operation took to complete; provide the last - measurement within the measurement interval - type: number - diskTimeWriteMax: - description: >- - milliseconds a write operation took to complete; provide the maximum - measurement within the measurement interval - type: number - diskTimeWriteMin: - description: >- - milliseconds a write operation took to complete; provide the minimum - measurement within the measurement interval - type: number - required: - - diskIdentifier - endOfCallVqmSummaries: - description: provides end of call voice quality metrics - type: object - properties: - adjacencyName: - description: ' adjacency name' - type: string - endpointDescription: - description: Either Caller or Callee - type: string - enum: - - Caller - - Callee - endpointJitter: - description: '' - type: number - endpointRtpOctetsDiscarded: - description: '' - type: number - endpointRtpOctetsReceived: - description: '' - type: number - endpointRtpOctetsSent: - description: '' - type: number - endpointRtpPacketsDiscarded: - description: '' - type: number - endpointRtpPacketsReceived: - description: '' - type: number - endpointRtpPacketsSent: - description: '' - type: number - localJitter: - description: '' - type: number - localRtpOctetsDiscarded: - description: '' - type: number - localRtpOctetsReceived: - description: '' - type: number - localRtpOctetsSent: - description: '' - type: number - localRtpPacketsDiscarded: - description: '' - type: number - localRtpPacketsReceived: - description: '' - type: number - localRtpPacketsSent: - description: '' - type: number - mosCqe: - description: 1-5 1dp - type: number - packetsLost: - description: '' - type: number - packetLossPercent: - description: >- - Calculated percentage packet loss based on Endpoint RTP packets lost - (as reported in RTCP) and Local RTP packets sent. Direction is based - on Endpoint description (Caller, Callee). Decimal (2 dp) - type: number - rFactor: - description: 0-100 - type: number - roundTripDelay: - description: millisecs - type: number - required: - - adjacencyName - - endpointDescription - event: - description: the root level of the common event format - type: object - properties: - commonEventHeader: - $ref: '#/definitions/commonEventHeader' - faultFields: - $ref: '#/definitions/faultFields' - heartbeatFields: - $ref: '#/definitions/heartbeatFields' - measurementsForVfScalingFields: - $ref: '#/definitions/measurementsForVfScalingFields' - mobileFlowFields: - $ref: '#/definitions/mobileFlowFields' - otherFields: - $ref: '#/definitions/otherFields' - sipSignalingFields: - $ref: '#/definitions/sipSignalingFields' - stateChangeFields: - $ref: '#/definitions/stateChangeFields' - syslogFields: - $ref: '#/definitions/syslogFields' - thresholdCrossingAlertFields: - $ref: '#/definitions/thresholdCrossingAlertFields' - voiceQualityFields: - $ref: '#/definitions/voiceQualityFields' - required: - - commonEventHeader - eventDomainThrottleSpecification: - description: specification of what information to suppress within an event domain - type: object - properties: - eventDomain: - description: Event domain enum from the commonEventHeader domain field - type: string - suppressedFieldNames: - description: >- - List of optional field names in the event block that should not be - sent to the Event Listener - type: array - items: - type: string - suppressedNvPairsList: - description: >- - Optional list of specific NvPairsNames to suppress within a given - Name-Value Field - type: array - items: - $ref: '#/definitions/suppressedNvPairs' - required: - - eventDomain - eventDomainThrottleSpecificationList: - description: array of eventDomainThrottleSpecifications - type: array - items: - $ref: '#/definitions/eventDomainThrottleSpecification' - minItems: 0 - eventList: - description: array of events - type: array - items: - $ref: '#/definitions/event' - faultFields: - description: fields specific to fault events - type: object - properties: - alarmAdditionalInformation: - description: additional alarm information - type: array - items: - $ref: '#/definitions/field' - alarmCondition: - description: alarm condition reported by the device - type: string - alarmInterfaceA: - description: >- - card, port, channel or interface name of the device generating the - alarm - type: string - eventCategory: - description: >- - Event category, for example: license, link, routing, security, - signaling - type: string - eventSeverity: - description: event severity - type: string - enum: - - CRITICAL - - MAJOR - - MINOR - - WARNING - - NORMAL - eventSourceType: - description: >- - type of event source; examples: card, host, other, port, - portThreshold, router, slotThreshold, switch, virtualMachine, - virtualNetworkFunction - type: string - faultFieldsVersion: - description: version of the faultFields block - type: number - specificProblem: - description: short description of the alarm or problem - type: string - vfStatus: - description: virtual function status enumeration - type: string - enum: - - Active - - Idle - - Preparing to terminate - - Ready to terminate - - Requesting termination - required: - - alarmCondition - - eventSeverity - - eventSourceType - - faultFieldsVersion - - specificProblem - - vfStatus - featuresInUse: - description: >- - number of times an identified feature was used over the - measurementInterval - type: object - properties: - featureIdentifier: - type: string - featureUtilization: - type: integer - required: - - featureIdentifier - - featureUtilization - field: - description: name value pair - type: object - properties: - name: - type: string - value: - type: string - required: - - name - - value - filesystemUsage: - description: >- - disk usage of an identified virtual machine in gigabytes and/or gigabytes - per second - type: object - properties: - blockConfigured: - type: number - blockIops: - type: number - blockUsed: - type: number - ephemeralConfigured: - type: number - ephemeralIops: - type: number - ephemeralUsed: - type: number - filesystemName: - type: string - required: - - blockConfigured - - blockIops - - blockUsed - - ephemeralConfigured - - ephemeralIops - - ephemeralUsed - - filesystemName - gtpPerFlowMetrics: - description: Mobility GTP Protocol per flow metrics - type: object - properties: - avgBitErrorRate: - description: average bit error rate - type: number - avgPacketDelayVariation: - description: >- - Average packet delay variation or jitter in milliseconds for received - packets: Average difference between the packet timestamp and time - received for all pairs of consecutive packets - type: number - avgPacketLatency: - description: average delivery latency - type: number - avgReceiveThroughput: - description: average receive throughput - type: number - avgTransmitThroughput: - description: average transmit throughput - type: number - durConnectionFailedStatus: - description: >- - duration of failed state in milliseconds, computed as the cumulative - time between a failed echo request and the next following successful - error request, over this reporting interval - type: number - durTunnelFailedStatus: - description: >- - Duration of errored state, computed as the cumulative time between a - tunnel error indicator and the next following non-errored indicator, - over this reporting interval - type: number - flowActivatedBy: - description: Endpoint activating the flow - type: string - flowActivationEpoch: - description: >- - Time the connection is activated in the flow (connection) being - reported on, or transmission time of the first packet if activation - time is not available - type: number - flowActivationMicrosec: - description: Integer microseconds for the start of the flow connection - type: number - flowActivationTime: - description: >- - time the connection is activated in the flow being reported on, or - transmission time of the first packet if activation time is not - available; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 - -0800 - type: string - flowDeactivatedBy: - description: Endpoint deactivating the flow - type: string - flowDeactivationEpoch: - description: >- - Time for the start of the flow connection, in integer UTC epoch time - aka UNIX time - type: number - flowDeactivationMicrosec: - description: Integer microseconds for the start of the flow connection - type: number - flowDeactivationTime: - description: >- - Transmission time of the first packet in the flow connection being - reported on; with RFC 2822 compliant format: Sat, 13 Mar 2010 11:29:05 - -0800 - type: string - flowStatus: - description: >- - connection status at reporting time as a working / inactive / failed - indicator value - type: string - gtpConnectionStatus: - description: Current connection state at reporting time - type: string - gtpTunnelStatus: - description: Current tunnel state at reporting time - type: string - ipTosCountList: - description: >- - array of key: value pairs where the keys are drawn from the IP - Type-of-Service identifiers which range from '0' to '255', and the - values are the count of packets that had those ToS identifiers in the - flow - type: array - items: - type: array - items: + description: OK + schema: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v5: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_8 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: type: string - type: number - ipTosList: - description: >- - Array of unique IP Type-of-Service values observed in the flow where - values range from '0' to '255' - type: array - items: - type: string - largePacketRtt: - description: large packet round trip time - type: number - largePacketThreshold: - description: large packet threshold being applied - type: number - maxPacketDelayVariation: - description: >- - Maximum packet delay variation or jitter in milliseconds for received - packets: Maximum of the difference between the packet timestamp and - time received for all pairs of consecutive packets - type: number - maxReceiveBitRate: - description: maximum receive bit rate - type: number - maxTransmitBitRate: - description: maximum transmit bit rate - type: number - mobileQciCosCountList: - description: >- - array of key: value pairs where the keys are drawn from LTE QCI or - UMTS class of service strings, and the values are the count of packets - that had those strings in the flow - type: array - items: - type: array - items: + responses: + '200': + description: OK + schema: type: string - type: number - mobileQciCosList: - description: >- - Array of unique LTE QCI or UMTS class-of-service values observed in - the flow - type: array - items: - type: string - numActivationFailures: - description: >- - Number of failed activation requests, as observed by the reporting - node - type: number - numBitErrors: - description: number of errored bits - type: number - numBytesReceived: - description: 'number of bytes received, including retransmissions' - type: number - numBytesTransmitted: - description: 'number of bytes transmitted, including retransmissions' - type: number - numDroppedPackets: - description: number of received packets dropped due to errors per virtual interface - type: number - numGtpEchoFailures: - description: >- - Number of Echo request path failures where failed paths are defined in - 3GPP TS 29.281 sec 7.2.1 and 3GPP TS 29.060 sec. 11.2 - type: number - numGtpTunnelErrors: - description: >- - Number of tunnel error indications where errors are defined in 3GPP TS - 29.281 sec 7.3.1 and 3GPP TS 29.060 sec. 11.1 - type: number - numHttpErrors: - description: Http error count - type: number - numL7BytesReceived: - description: 'number of tunneled layer 7 bytes received, including retransmissions' - type: number - numL7BytesTransmitted: - description: >- - number of tunneled layer 7 bytes transmitted, excluding - retransmissions - type: number - numLostPackets: - description: number of lost packets - type: number - numOutOfOrderPackets: - description: number of out-of-order packets - type: number - numPacketErrors: - description: number of errored packets - type: number - numPacketsReceivedExclRetrans: - description: 'number of packets received, excluding retransmission' - type: number - numPacketsReceivedInclRetrans: - description: 'number of packets received, including retransmission' - type: number - numPacketsTransmittedInclRetrans: - description: 'number of packets transmitted, including retransmissions' - type: number - numRetries: - description: number of packet retries - type: number - numTimeouts: - description: number of packet timeouts - type: number - numTunneledL7BytesReceived: - description: 'number of tunneled layer 7 bytes received, excluding retransmissions' - type: number - roundTripTime: - description: round trip time - type: number - tcpFlagCountList: - description: >- - array of key: value pairs where the keys are drawn from TCP Flags and - the values are the count of packets that had that TCP Flag in the flow - type: array - items: - type: array - items: + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v5/eventBatch: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_9 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: type: string - type: number - tcpFlagList: - description: Array of unique TCP Flags observed in the flow - type: array - items: - type: string - timeToFirstByte: - description: >- - Time in milliseconds between the connection activation and first byte - received - type: number - required: - - avgBitErrorRate - - avgPacketDelayVariation - - avgPacketLatency - - avgReceiveThroughput - - avgTransmitThroughput - - flowActivationEpoch - - flowActivationMicrosec - - flowDeactivationEpoch - - flowDeactivationMicrosec - - flowDeactivationTime - - flowStatus - - maxPacketDelayVariation - - numActivationFailures - - numBitErrors - - numBytesReceived - - numBytesTransmitted - - numDroppedPackets - - numL7BytesReceived - - numL7BytesTransmitted - - numLostPackets - - numOutOfOrderPackets - - numPacketErrors - - numPacketsReceivedExclRetrans - - numPacketsReceivedInclRetrans - - numPacketsTransmittedInclRetrans - - numRetries - - numTimeouts - - numTunneledL7BytesReceived - - roundTripTime - - timeToFirstByte - heartbeatFields: - description: optional field block for fields specific to heartbeat events - type: object - properties: - additionalFields: - description: additional heartbeat fields if needed - type: array - items: - $ref: '#/definitions/field' - heartbeatFieldsVersion: - description: version of the heartbeatFields block - type: number - heartbeatInterval: - description: current heartbeat interval in seconds - type: integer - required: - - heartbeatFieldsVersion - - heartbeatInterval - internalHeaderFields: - description: >- - enrichment fields for internal VES Event Listener service use only, not - supplied by event sources - type: object - jsonObject: - description: >- - json object schema, name and other meta-information along with one or more - object instances - type: object - properties: - objectInstances: - description: one or more instances of the jsonObject - type: array - items: - $ref: '#/definitions/jsonObjectInstance' - objectName: - description: name of the JSON Object - type: string - objectSchema: - description: json schema for the object - type: string - objectSchemaUrl: - description: Url to the json schema for the object - type: string - nfSubscribedObjectName: - description: name of the object associated with the nfSubscriptonId - type: string - nfSubscriptionId: - description: >- - identifies an openConfig telemetry subscription on a network function, - which configures the network function to send complex object data - associated with the jsonObject - type: string - required: - - objectInstances - - objectName - jsonObjectInstance: - description: >- - meta-information about an instance of a jsonObject along with the actual - object instance + responses: + '200': + description: OK + schema: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v7: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_10 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: + type: string + responses: + '200': + description: OK + schema: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found + /eventListener/v7/eventBatch: + post: + tags: + - ves-rest-controller + summary: receiveEvent + operationId: receiveEventUsingPOST_11 + consumes: + - application/json + produces: + - '*/*' + parameters: + - in: body + name: jsonPayload + description: jsonPayload + required: true + schema: + type: string + responses: + '200': + description: OK + schema: + type: string + '201': + description: Created + '401': + description: Unauthorized + '403': + description: Forbidden + '404': + description: Not Found +definitions: + ModelAndView: type: object properties: - objectInstance: - description: an instance conforming to the jsonObject schema + empty: + type: boolean + model: type: object - objectInstanceEpochMicrosec: - description: >- - the unix time aka epoch time associated with this objectInstance--as - microseconds elapsed since 1 Jan 1970 not including leap seconds - type: number - objectKeys: - description: >- - an ordered set of keys that identifies this particular instance of - jsonObject - type: array - items: - $ref: '#/definitions/key' - required: - - objectInstance - key: - description: >- - tuple which provides the name of a key along with its value and relative - order - type: object - properties: - keyName: - description: name of the key - type: string - keyOrder: - description: relative sequence or order of the key with respect to other keys - type: integer - keyValue: - description: value of the key - type: string - required: - - keyName - latencyBucketMeasure: - description: number of counts falling within a defined latency bucket - type: object - properties: - countsInTheBucket: - type: number - highEndOfLatencyBucket: - type: number - lowEndOfLatencyBucket: - type: number - required: - - countsInTheBucket - measurementsForVfScalingFields: - description: measurementsForVfScaling fields - type: object - properties: - additionalFields: - description: additional name-value-pair fields - type: array - items: - $ref: '#/definitions/field' - additionalMeasurements: - description: array of named name-value-pair arrays - type: array - items: - $ref: '#/definitions/namedArrayOfFields' - additionalObjects: - description: >- - array of JSON objects described by name, schema and other - meta-information - type: array - items: - $ref: '#/definitions/jsonObject' - codecUsageArray: - description: array of codecs in use - type: array - items: - $ref: '#/definitions/codecsInUse' - concurrentSessions: - description: >- - peak concurrent sessions for the VM or VNF over the - measurementInterval - type: integer - configuredEntities: - description: >- - over the measurementInterval, peak total number of: users, - subscribers, devices, adjacencies, etc., for the VM, or subscribers, - devices, etc., for the VNF - type: integer - cpuUsageArray: - description: usage of an array of CPUs - type: array - items: - $ref: '#/definitions/cpuUsage' - diskUsageArray: - description: usage of an array of disks - type: array - items: - $ref: '#/definitions/diskUsage' - featureUsageArray: - description: array of features in use - type: array - items: - $ref: '#/definitions/featuresInUse' - filesystemUsageArray: - description: >- - filesystem usage of the VM on which the VNFC reporting the event is - running - type: array - items: - $ref: '#/definitions/filesystemUsage' - latencyDistribution: - description: >- - array of integers representing counts of requests whose latency in - milliseconds falls within per-VNF configured ranges - type: array - items: - $ref: '#/definitions/latencyBucketMeasure' - meanRequestLatency: - description: >- - mean seconds required to respond to each request for the VM on which - the VNFC reporting the event is running - type: number - measurementInterval: - description: interval over which measurements are being reported in seconds - type: number - measurementsForVfScalingVersion: - description: version of the measurementsForVfScaling block - type: number - memoryUsageArray: - description: memory usage of an array of VMs - type: array - items: - $ref: '#/definitions/memoryUsage' - numberOfMediaPortsInUse: - description: number of media ports in use - type: integer - requestRate: - description: >- - peak rate of service requests per second to the VNF over the - measurementInterval - type: number - vnfcScalingMetric: - description: represents busy-ness of the VNF from 0 to 100 as reported by the VNFC - type: integer - vNicPerformanceArray: - description: usage of an array of virtual network interface cards - type: array - items: - $ref: '#/definitions/vNicPerformance' - required: - - measurementInterval - - measurementsForVfScalingVersion - memoryUsage: - description: memory usage of an identified virtual machine - type: object - properties: - memoryBuffered: - description: kibibytes of temporary storage for raw disk blocks - type: number - memoryCached: - description: kibibytes of memory used for cache - type: number - memoryConfigured: - description: >- - kibibytes of memory configured in the virtual machine on which the - VNFC reporting the event is running - type: number - memoryFree: - description: kibibytes of physical RAM left unused by the system - type: number - memorySlabRecl: - description: >- - the part of the slab that can be reclaimed such as caches measured in - kibibytes - type: number - memorySlabUnrecl: - description: >- - the part of the slab that cannot be reclaimed even when lacking memory - measured in kibibytes - type: number - memoryUsed: - description: >- - total memory minus the sum of free, buffered, cached and slab memory - measured in kibibytes - type: number - vmIdentifier: - description: virtual machine identifier associated with the memory metrics - type: string - required: - - memoryFree - - memoryUsed - - vmIdentifier - mobileFlowFields: - description: mobileFlow fields - type: object - properties: - additionalFields: - description: additional mobileFlow fields if needed - type: array - items: - $ref: '#/definitions/field' - applicationType: - description: Application type inferred - type: string - appProtocolType: - description: application protocol - type: string - appProtocolVersion: - description: application protocol version - type: string - cid: - description: cell id - type: string - connectionType: - description: 'Abbreviation referencing a 3GPP reference point e.g., S1-U, S11, etc' - type: string - ecgi: - description: Evolved Cell Global Id - type: string - flowDirection: - description: >- - Flow direction, indicating if the reporting node is the source of the - flow or destination for the flow - type: string - gtpPerFlowMetrics: - $ref: '#/definitions/gtpPerFlowMetrics' - gtpProtocolType: - description: GTP protocol - type: string - gtpVersion: - description: GTP protocol version - type: string - httpHeader: - description: 'HTTP request header, if the flow connects to a node referenced by HTTP' - type: string - imei: - description: >- - IMEI for the subscriber UE used in this flow, if the flow connects to - a mobile device - type: string - imsi: - description: >- - IMSI for the subscriber UE used in this flow, if the flow connects to - a mobile device - type: string - ipProtocolType: - description: 'IP protocol type e.g., TCP, UDP, RTP...' - type: string - ipVersion: - description: 'IP protocol version e.g., IPv4, IPv6' - type: string - lac: - description: location area code - type: string - mcc: - description: mobile country code - type: string - mnc: - description: mobile network code - type: string - mobileFlowFieldsVersion: - description: version of the mobileFlowFields block - type: number - msisdn: - description: >- - MSISDN for the subscriber UE used in this flow, as an integer, if the - flow connects to a mobile device - type: string - otherEndpointIpAddress: - description: >- - IP address for the other endpoint, as used for the flow being reported - on - type: string - otherEndpointPort: - description: >- - IP Port for the reporting entity, as used for the flow being reported - on - type: integer - otherFunctionalRole: - description: >- - Functional role of the other endpoint for the flow being reported on - e.g., MME, S-GW, P-GW, PCRF... - type: string - rac: - description: routing area code - type: string - radioAccessTechnology: - description: 'Radio Access Technology e.g., 2G, 3G, LTE' - type: string - reportingEndpointIpAddr: - description: >- - IP address for the reporting entity, as used for the flow being - reported on - type: string - reportingEndpointPort: - description: >- - IP port for the reporting entity, as used for the flow being reported - on - type: integer - sac: - description: service area code - type: string - samplingAlgorithm: - description: >- - Integer identifier for the sampling algorithm or rule being applied in - calculating the flow metrics if metrics are calculated based on a - sample of packets, or 0 if no sampling is applied - type: integer - tac: - description: transport area code - type: string - tunnelId: - description: tunnel identifier - type: string - vlanId: - description: VLAN identifier used by this flow - type: string - required: - - flowDirection - - gtpPerFlowMetrics - - ipProtocolType - - ipVersion - - mobileFlowFieldsVersion - - otherEndpointIpAddress - - otherEndpointPort - - reportingEndpointIpAddr - - reportingEndpointPort - namedArrayOfFields: - description: an array of name value pairs along with a name for the array - type: object - properties: - name: - type: string - arrayOfFields: - description: array of name value pairs - type: array - items: - $ref: '#/definitions/field' - required: - - name - - arrayOfFields - otherFields: - description: >- - fields for events belonging to the 'other' domain of the commonEventHeader - domain enumeration - type: object - properties: - hashOfNameValuePairArrays: - description: array of named name-value-pair arrays - type: array - items: - $ref: '#/definitions/namedArrayOfFields' - jsonObjects: - description: >- - array of JSON objects described by name, schema and other - meta-information - type: array - items: - $ref: '#/definitions/jsonObject' - nameValuePairs: - description: array of name-value pairs - type: array - items: - $ref: '#/definitions/field' - otherFieldsVersion: - description: version of the otherFields block - type: number - required: - - otherFieldsVersion - requestError: - description: standard request error data structure - type: object - properties: - messageId: - description: >- - Unique message identifier of the format ABCnnnn where ABC is either - SVC for Service Exceptions or POL for Policy Exception - type: string - text: - description: >- - Message text, with replacement variables marked with %n, where n is an - index into the list of elements, starting at 1 - type: string - url: - description: >- - Hyperlink to a detailed error resource e.g., an HTML page for browser - user agents - type: string - variables: - description: >- - List of zero or more strings that represent the contents of the - variables used by the message text - type: string - required: - - messageId - - text - sipSignalingFields: - description: sip signaling fields - type: object - properties: - additionalInformation: - description: additional sip signaling fields if needed - type: array - items: - $ref: '#/definitions/field' - compressedSip: - description: the full SIP request/response including headers and bodies - type: string - correlator: - description: this is the same for all events on this call - type: string - localIpAddress: - description: IP address on VNF - type: string - localPort: - description: port on VNF - type: string - remoteIpAddress: - description: IP address of peer endpoint - type: string - remotePort: - description: port of peer endpoint - type: string - sipSignalingFieldsVersion: - description: version of the sipSignalingFields block - type: number - summarySip: - description: >- - the SIP Method or Response (INVITE, 200 OK, BYE, - etc) - type: string - vendorVnfNameFields: - $ref: '#/definitions/vendorVnfNameFields' - required: - - correlator - - localIpAddress - - localPort - - remoteIpAddress - - remotePort - - sipSignalingFieldsVersion - - vendorVnfNameFields - stateChangeFields: - description: stateChange fields - type: object - properties: - additionalFields: - description: additional stateChange fields if needed - type: array - items: - $ref: '#/definitions/field' - newState: - description: new state of the entity - type: string - enum: - - inService - - maintenance - - outOfService - oldState: - description: previous state of the entity - type: string - enum: - - inService - - maintenance - - outOfService - stateChangeFieldsVersion: - description: version of the stateChangeFields block - type: number - stateInterface: - description: card or port name of the entity that changed state - type: string - required: - - newState - - oldState - - stateChangeFieldsVersion - - stateInterface - suppressedNvPairs: - description: >- - List of specific NvPairsNames to suppress within a given Name-Value Field - for event Throttling - type: object - properties: - nvPairFieldName: - description: Name of the field within which are the nvpair names to suppress - type: string - suppressedNvPairNames: - description: Array of nvpair names to suppress within the nvpairFieldName - type: array - items: - type: string - required: - - nvPairFieldName - - suppressedNvPairNames - syslogFields: - description: sysLog fields - type: object - properties: - additionalFields: - description: >- - additional syslog fields if needed provided as name=value delimited by - a pipe | symbol, for example: 'name1=value1|name2=value2|' - type: string - eventSourceHost: - description: hostname of the device - type: string - eventSourceType: - description: >- - type of event source; examples: other, router, switch, host, card, - port, slotThreshold, portThreshold, virtualMachine, - virtualNetworkFunction - type: string - syslogFacility: - description: numeric code from 0 to 23 for facility--see table in documentation - type: integer - syslogFieldsVersion: - description: version of the syslogFields block - type: number - syslogMsg: - description: syslog message - type: string - syslogPri: - description: 0-192 combined severity and facility - type: integer - syslogProc: - description: identifies the application that originated the message - type: string - syslogProcId: - description: >- - a change in the value of this field indicates a discontinuity in - syslog reporting - type: number - syslogSData: - description: >- - syslog structured data consisting of a structured data Id followed by - a set of key value pairs - type: string - syslogSdId: - description: 0-32 char in format name@number for example ourSDID@32473 - type: string - syslogSev: - description: >- - numerical Code for severity derived from syslogPri as remaider of - syslogPri / 8 - type: string - enum: - - Alert - - Critical - - Debug - - Emergency - - Error - - Info - - Notice - - Warning - syslogTag: - description: >- - msgId indicating the type of message such as TCPOUT or TCPIN; NILVALUE - should be used when no other value can be provided - type: string - syslogVer: - description: >- - IANA assigned version of the syslog protocol specification - typically - 1 - type: number - required: - - eventSourceType - - syslogFieldsVersion - - syslogMsg - - syslogTag - thresholdCrossingAlertFields: - description: fields specific to threshold crossing alert events - type: object - properties: - additionalFields: - description: additional threshold crossing alert fields if needed - type: array - items: - $ref: '#/definitions/field' - additionalParameters: - description: performance counters - type: array - items: - $ref: '#/definitions/counter' - alertAction: - description: Event action - type: string - enum: - - CLEAR - - CONT - - SET - alertDescription: - description: Unique short alert description such as IF-SHUB-ERRDROP - type: string - alertType: - description: Event type - type: string - enum: - - CARD-ANOMALY - - ELEMENT-ANOMALY - - INTERFACE-ANOMALY - - SERVICE-ANOMALY - alertValue: - description: Calculated API value (if applicable) - type: string - associatedAlertIdList: - description: List of eventIds associated with the event being reported - type: array - items: - type: string - collectionTimestamp: - description: >- - Time when the performance collector picked up the data; with RFC 2822 - compliant format: Sat, 13 Mar 2010 11:29:05 -0800 - type: string - dataCollector: - description: Specific performance collector instance used - type: string - elementType: - description: type of network element - internal ATT field - type: string - eventSeverity: - description: event severity or priority - type: string - enum: - - CRITICAL - - MAJOR - - MINOR - - WARNING - - NORMAL - eventStartTimestamp: - description: >- - Time closest to when the measurement was made; with RFC 2822 compliant - format: Sat, 13 Mar 2010 11:29:05 -0800 - type: string - interfaceName: - description: Physical or logical port or card (if applicable) - type: string - networkService: - description: network name - internal ATT field - type: string - possibleRootCause: - description: Reserved for future use - type: string - thresholdCrossingFieldsVersion: - description: version of the thresholdCrossingAlertFields block - type: number - required: - - additionalParameters - - alertAction - - alertDescription - - alertType - - collectionTimestamp - - eventSeverity - - eventStartTimestamp - - thresholdCrossingFieldsVersion - vendorVnfNameFields: - description: 'provides vendor, vnf and vfModule identifying information' - type: object - properties: - vendorName: - description: VNF vendor name - type: string - vfModuleName: - description: ASDC vfModuleName for the vfModule generating the event - type: string - vnfName: - description: ASDC modelName for the VNF generating the event - type: string - required: - - vendorName - vNicPerformance: - description: >- - describes the performance and errors of an identified virtual network - interface card - type: object - properties: - receivedBroadcastPacketsAccumulated: - description: >- - Cumulative count of broadcast packets received as read at the end of - the measurement interval - type: number - receivedBroadcastPacketsDelta: - description: Count of broadcast packets received within the measurement interval - type: number - receivedDiscardedPacketsAccumulated: - description: >- - Cumulative count of discarded packets received as read at the end of - the measurement interval - type: number - receivedDiscardedPacketsDelta: - description: Count of discarded packets received within the measurement interval - type: number - receivedErrorPacketsAccumulated: - description: >- - Cumulative count of error packets received as read at the end of the - measurement interval - type: number - receivedErrorPacketsDelta: - description: Count of error packets received within the measurement interval - type: number - receivedMulticastPacketsAccumulated: - description: >- - Cumulative count of multicast packets received as read at the end of - the measurement interval - type: number - receivedMulticastPacketsDelta: - description: Count of multicast packets received within the measurement interval - type: number - receivedOctetsAccumulated: - description: >- - Cumulative count of octets received as read at the end of the - measurement interval - type: number - receivedOctetsDelta: - description: Count of octets received within the measurement interval - type: number - receivedTotalPacketsAccumulated: - description: >- - Cumulative count of all packets received as read at the end of the - measurement interval - type: number - receivedTotalPacketsDelta: - description: Count of all packets received within the measurement interval - type: number - receivedUnicastPacketsAccumulated: - description: >- - Cumulative count of unicast packets received as read at the end of the - measurement interval - type: number - receivedUnicastPacketsDelta: - description: Count of unicast packets received within the measurement interval - type: number - transmittedBroadcastPacketsAccumulated: - description: >- - Cumulative count of broadcast packets transmitted as read at the end - of the measurement interval - type: number - transmittedBroadcastPacketsDelta: - description: Count of broadcast packets transmitted within the measurement interval - type: number - transmittedDiscardedPacketsAccumulated: - description: >- - Cumulative count of discarded packets transmitted as read at the end - of the measurement interval - type: number - transmittedDiscardedPacketsDelta: - description: Count of discarded packets transmitted within the measurement interval - type: number - transmittedErrorPacketsAccumulated: - description: >- - Cumulative count of error packets transmitted as read at the end of - the measurement interval - type: number - transmittedErrorPacketsDelta: - description: Count of error packets transmitted within the measurement interval - type: number - transmittedMulticastPacketsAccumulated: - description: >- - Cumulative count of multicast packets transmitted as read at the end - of the measurement interval - type: number - transmittedMulticastPacketsDelta: - description: Count of multicast packets transmitted within the measurement interval - type: number - transmittedOctetsAccumulated: - description: >- - Cumulative count of octets transmitted as read at the end of the - measurement interval - type: number - transmittedOctetsDelta: - description: Count of octets transmitted within the measurement interval - type: number - transmittedTotalPacketsAccumulated: - description: >- - Cumulative count of all packets transmitted as read at the end of the - measurement interval - type: number - transmittedTotalPacketsDelta: - description: Count of all packets transmitted within the measurement interval - type: number - transmittedUnicastPacketsAccumulated: - description: >- - Cumulative count of unicast packets transmitted as read at the end of - the measurement interval - type: number - transmittedUnicastPacketsDelta: - description: Count of unicast packets transmitted within the measurement interval - type: number - valuesAreSuspect: - description: >- - Indicates whether vNicPerformance values are likely inaccurate due to - counter overflow or other condtions + modelMap: + type: object + additionalProperties: + type: object + reference: + type: boolean + status: type: string enum: - - 'true' - - 'false' - vNicIdentifier: - description: vNic identification - type: string - required: - - valuesAreSuspect - - vNicIdentifier - voiceQualityFields: - description: provides statistics related to customer facing voice products - type: object - properties: - additionalInformation: - description: additional voice quality fields if needed - type: array - items: - $ref: '#/definitions/field' - calleeSideCodec: - description: callee codec for the call - type: string - callerSideCodec: - description: caller codec for the call - type: string - correlator: - description: this is the same for all events on this call - type: string - endOfCallVqmSummaries: - $ref: '#/definitions/endOfCallVqmSummaries' - phoneNumber: - description: phone number associated with the correlator - type: string - midCallRtcp: - description: Base64 encoding of the binary RTCP data excluding Eth/IP/UDP headers - type: string - vendorVnfNameFields: - $ref: '#/definitions/vendorVnfNameFields' - voiceQualityFieldsVersion: - description: version of the voiceQualityFields block - type: number - required: - - calleeSideCodec - - callerSideCodec - - correlator - - midCallRtcp - - vendorVnfNameFields - - voiceQualityFieldsVersion + - '100' + - '101' + - '102' + - '103' + - '200' + - '201' + - '202' + - '203' + - '204' + - '205' + - '206' + - '207' + - '208' + - '226' + - '300' + - '301' + - '302' + - '303' + - '304' + - '305' + - '307' + - '308' + - '400' + - '401' + - '402' + - '403' + - '404' + - '405' + - '406' + - '407' + - '408' + - '409' + - '410' + - '411' + - '412' + - '413' + - '414' + - '415' + - '416' + - '417' + - '418' + - '419' + - '420' + - '421' + - '422' + - '423' + - '424' + - '426' + - '428' + - '429' + - '431' + - '451' + - '500' + - '501' + - '502' + - '503' + - '504' + - '505' + - '506' + - '507' + - '508' + - '509' + - '510' + - '511' + view: + $ref: '#/definitions/View' + viewName: + type: string + title: ModelAndView + View: + type: object + properties: + contentType: + type: string + title: View diff --git a/docs/sections/architecture.rst b/docs/sections/architecture.rst index b1c00889..a53480b0 100644 --- a/docs/sections/architecture.rst +++ b/docs/sections/architecture.rst @@ -59,14 +59,14 @@ The figure below shows the DCAE R3 architecture and how the components work with .. image:: images/R3_architecture_diagram.gif -Note: PM-Mapper was descoped from R3 +Note: Missing Heartbeat, Universal Data-mapper, PM-Mapper descoped from R3 Deployment Scenarios -------------------- Because DCAE service components are deployed on-demand following the control loop needs for managing ONAP deployed services, DCAE must support dynamic and on-demand deployment of service components based on ONAP control loop demands. This is why all other ONAP components are launched from the ONAP level method, DCAE only deploys a subset of its components during this ONAP deployment process and rest of DCAE components will be deployed either as TOSCA executor launches a series of Blueprints, or deployed by control loop request originated from CLAMP, or even by operator manually invoking DCAE's deployment API call. -For R2, ONAP supports two deployment methodologies: Heat Orchestration Template method, or Helm Chart method. No matter which method, DCAE is deployed following the same flow. At its minimum, only the TOSCA model executor, the DCAE Cloudify Manager, needs to be deployed through the ONAP deployment process. Once the Cloudify Manager is up and running, all the rest of DCAE platform can be deployed by a bootstrap script, which makes a number of calls into the Cloudify Manager API with Blueprints for various DCAE components, first the DCAE Platform components, then the service components that are needed for the built-in control loops, such as vFW/vDNS traffic throttling. It is also possible that additional DCAE components are also launched as part of the ONAP deployment process using the ONAP level method instead of TOSCA model based method. +For R3, ONAP supports two deployment methodologies: Heat Orchestration Template method, or Helm Chart method. No matter which method, DCAE is deployed following the same flow. At its minimum, only the TOSCA model executor, the DCAE Cloudify Manager, needs to be deployed through the ONAP deployment process. Once the Cloudify Manager is up and running, all the rest of DCAE platform can be deployed by a bootstrap script, which makes a number of calls into the Cloudify Manager API with Blueprints for various DCAE components, first the DCAE Platform components, then the service components that are needed for the built-in control loops, such as vFW/vDNS traffic throttling. It is also possible that additional DCAE components are also launched as part of the ONAP deployment process using the ONAP level method instead of TOSCA model based method. More details of the DCAE R3 deployment will be covered by the Installation section. diff --git a/docs/sections/build.rst b/docs/sections/build.rst index 641773c6..6b3a1140 100644 --- a/docs/sections/build.rst +++ b/docs/sections/build.rst @@ -51,7 +51,6 @@ Below is a list of the repos and their sub-modules, and the language they are wr - dcaegen2.services.heartbeat (Python) - dcaegen2.services.prh (Java) - - dcaegen2.services.mapper (Java) * dcaegen2.deployments diff --git a/docs/sections/healthcheck.rst b/docs/sections/healthcheck.rst index 10572fc8..57266bbf 100644 --- a/docs/sections/healthcheck.rst +++ b/docs/sections/healthcheck.rst @@ -11,8 +11,62 @@ OOM Deployment In OOM deployments DCAE healthcheck are reported by separate service - dcae-healthcheck; this is deployment of org.onap.dcaegen2.deployments.healthcheck-container which is built from dcaegen2/deployment repo - healthcheck-container module. The container includes list of deployments done in DCAE (both via helm charts and Cloudify) for which periodic health check is performed. For helm deployed component - servicename defined is charts are used and for cloudify, the deployments identified in bootstrap are prefixed with release name. The container itself is deployed via helm charts (oom/kubernetes/dcaegen2/charts/dcae-healthcheck). This polls the deployments specified periodically and reports the status. The service can be queried for status as below. - curl dcae-healthcheck - {"type":"summary","count":8,"ready":8,"items":[{"name":"dev-dcae-cloudify-manager","ready":1,"unavailable":0},{"name":"dep-config-binding-service","ready":1,"unavailable":0},{"name":"dep-deployment-handler","ready":1,"unavailable":0},{"name":"dep-inventory","ready":1,"unavailable":0},{"name":"dep-service-change-handler","ready":1,"unavailable":0},{"name":"dep-policy-handler","ready":1,"unavailable":0},{"name":"dep-dcae-ves-collector","ready":1,"unavailable":0},{"name":"dep-dcae-tca-analytics","ready":1,"unavailable":0}]} +curl dcae-healthcheck +.. code-block:: json + + + + { + "type": "summary", + "count": 11, + "ready": 11, + "items": [{ + "name": "dev-dcaegen2-dcae-cloudify-manager", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-config-binding-service", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-deployment-handler", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-inventory", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-service-change-handler", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-policy-handler", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-dcae-ves-collector", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-dcae-tca-analytics", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-dcae-prh", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-dcae-hv-ves-collector", + "ready": 1, + "unavailable": 0 + }, { + "name": "dep-dcae-datafile-collector", + "ready": 1, + "unavailable": 0 + }] + } + Heat Deployment diff --git a/docs/sections/installation_heat.rst b/docs/sections/installation_heat.rst index 1cb2d865..82f93947 100644 --- a/docs/sections/installation_heat.rst +++ b/docs/sections/installation_heat.rst @@ -84,10 +84,9 @@ In DCAE R3, the configuration for DCAE deployment in Heat is greatly simplified. * R3PLUS: This profile deploys the DCAE R2 stretch goal service components, namely: * PNF Registration Handler, * SNMP Trap collector, + * HV-VES Collector * Missing Heartbeat Detection analytics, - * Universal Mapper. - - + * Universal Mapper Tips for Manual Interventions diff --git a/docs/sections/installation_oom.rst b/docs/sections/installation_oom.rst index f5c58bed..d071f833 100644 --- a/docs/sections/installation_oom.rst +++ b/docs/sections/installation_oom.rst @@ -120,19 +120,21 @@ DCAE Service Endpoints ---------------------- Below is a table of default hostnames and ports for DCAE component service endpoints in Kuubernetes deployment: - ================== ============================ ================================= - Component Cluster Internal (host:port) Cluster external (svc_name:port) - ================== ============================ ================================= - VES dcae-ves-collector:8080 xdcae-ves-collector.onap:30235 - HV-VES dcae-hv-ves-collector:6061 xdcae-hv-ves-collector.onap:30222 - TCA dcae-tca-analytics:11011 xdcae-tca-analytics.onap:32010 - Policy Handler policy-handler:25577 NA - Deployment Handler deployment-handler:8443 NA - Inventory inventory:8080 NA - Config binding config-binding-service:10000 NA - DCAE Healthcheck dcae-healthcheck:80 NA - Cloudify Manager dcae-cloudify-manager:80 NA - ================== ============================ ================================= + ================== ============================ ====================================================== + Component Cluster Internal (host:port) Cluster external (svc_name:port) + ================== ============================ ====================================================== + VES dcae-ves-collector:8080 xdcae-ves-collector.onap:30235 + HV-VES dcae-hv-ves-collector:6061 xdcae-hv-ves-collector.onap:30222 + TCA dcae-tca-analytics:11011 xdcae-tca-analytics.onap:32010 + DataFileCollector dcae-datafile-collector:8443/8100 xdcae-datafile-collector:8433:30224/TCP,8100:30223/TCP + SNMPTrap dcae-snmptrap-collector:6162/udp NA + Policy Handler policy-handler:25577 NA + Deployment Handler deployment-handler:8443 NA + Inventory inventory:8080 NA + Config binding config-binding-service:10000 NA + DCAE Healthcheck dcae-healthcheck:80 NA + Cloudify Manager dcae-cloudify-manager:80 NA + ================== ============================ ====================================================== In addition, a number of ONAP service endpoints that are used by DCAE components are listed as follows for reference by DCAE developers and testers: diff --git a/docs/sections/release-notes.rst b/docs/sections/release-notes.rst index 204a2845..cda7e970 100644 --- a/docs/sections/release-notes.rst +++ b/docs/sections/release-notes.rst @@ -94,16 +94,16 @@ Quick Links: The following components are upgraded from R2: - Cloudify Manager: - - Docker container tag: onap/org.onap.dcaegen2.deployments.cm-container:1.4.1 + - Docker container tag: onap/org.onap.dcaegen2.deployments.cm-container:1.4.2 - Description: R3 DCAE's Cloudify Manager container is based on Cloudify Manager Community Version 18.2.28, which is based on Cloudify Manager 4.3. - Bootstrap container: - - Docker container tag: onap/org.onap.dcaegen2.deployments.k8s-bootstrap-container:1.4.2 + - Docker container tag: onap/org.onap.dcaegen2.deployments.k8s-bootstrap-container:1.4.4 - Description: R3 DCAE no longer uses bootstrap container for Heat based deployment, -- deployment is done through cloud-init scripts and docker-compose specifications. The bootstrap is for OOM (Kubernetes) based deployment. - Configuration Binding Service: - Docker container tag: onap/org.onap.dcaegen2.platform.configbinding.app-app:2.2.3 - Description: Configuration Binding Sevice now supports the new configuration policy format and support for TLS - Deployment Handler - - Docker container image tag: onap/org.onap.dcaegen2.platform.deployment-handler:3.0.2 + - Docker container image tag: onap/org.onap.dcaegen2.platform.deployment-handler:3.0.3 - Policy Handler - Docker container image tag: onap/org.onap.dcaegen2.platform.policy-handler:4.3.1 - Description: Policy Handler now supports the new configuration policy format and support for TLS diff --git a/docs/sections/services/ves-http/VES-processingFlow.png b/docs/sections/services/ves-http/VES-processingFlow.png new file mode 100644 index 0000000000000000000000000000000000000000..6d9e28bcb4e6ff74ce2dcf7bf04518b523490ef3 GIT binary patch literal 71422 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≺%&!Bs3i(m0$B1Pg-~ScPA|LehQUGT`ND2!HDa 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 Ba##QW literal 0 HcmV?d00001 diff --git a/docs/sections/services/ves-http/architecture.rst b/docs/sections/services/ves-http/architecture.rst new file mode 100644 index 00000000..d7815d36 --- /dev/null +++ b/docs/sections/services/ves-http/architecture.rst @@ -0,0 +1,60 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +VES Architecture +=================== + +.. image:: ./ves-deployarch.png + +VES Processing Flow +=================== + +.. image:: ./VES-processingFlow.png + + +VES Schema Validation +===================== + +VES Collector is configured to support below VES Version; the corresponding API uses VES schema definition for event validation. + +============== ========================== ================================= +VES Version API version Schema Definition +============== ========================== ================================= +VES 1.2 eventListener/v1 CommonEventFormat_Vendors_v25.json +VES 4.1 eventListener/v4 CommonEventFormat_27.2.json +VES 5.4 eventListener/v5 CommonEventFormat_28.4.1.json +VES 7.0 eventListener/v7 CommonEventFormat_30.0.1.json +============== ========================== ================================== + +Schema definition files are contained within VES collector gerrit repo - https://git.onap.org/dcaegen2/collectors/ves/tree/etc + + +Features Supported +================== +- VES collector deployed as docker containers +- Acknowledged the sender with appropriate response code (both successful and failure) +- Authentication of the events posted to collector +- Support single or batch JSON events input +- Schema validation (against standard VES definition) +- Multiple schema support and backward compatibility +- Configurable event transformation +- Configurable suppression +- Publish events into Dmaap Topic (with/without AAF) + +The collector can receive events via standard HTTP port (8080) or secure port (8443). Depending on the install/configuration – either one or both can be supported (ports are also modifiable). + + +Dynamic configuration fed into Collector via DCAEPlatform +========================================================= + +- Outbound Dmaap/UEB topic +- Schema version to be validated against +- Authentication account for VNF + +POST requests result in standard HTTP status codes: + +200-299 Success +400-499 Client request has a problem (data error) +500-599 Collector service has a problem + + diff --git a/docs/sections/services/ves-http/configuration.rst b/docs/sections/services/ves-http/configuration.rst new file mode 100644 index 00000000..c7f2fe6e --- /dev/null +++ b/docs/sections/services/ves-http/configuration.rst @@ -0,0 +1,67 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Configuration +============= + +VES expects to be able to fetch configuration directly from consul service in following JSON format: + +.. code-block:: json + + { + "collector.dynamic.config.update.frequency": "5", + "event.transform.flag": "0", + "collector.schema.checkflag": "1", + "collector.dmaap.streamid": "fault=ves-fault|syslog=ves-syslog|heartbeat=ves-heartbeat|measurementsForVfScaling=ves-measurement|mobileFlow=ves-mobileflow|other=ves-other|stateChange=ves-statechange|thresholdCrossingAlert=ves-thresholdCrossingAlert|voiceQuality=ves-voicequality|sipSignaling=ves-sipsignaling|notification=ves-notification|pnfRegistration=ves-pnfRegistration", + "collector.service.port": "8080", + "collector.schema.file": "{\"v1\":\"./etc/CommonEventFormat_27.2.json\",\"v2\":\"./etc/CommonEventFormat_27.2.json\",\"v3\":\"./etc/CommonEventFormat_27.2.json\",\"v4\":\"./etc/CommonEventFormat_27.2.json\",\"v5\":\"./etc/CommonEventFormat_28.4.1.json\",\"v7\":\"./etc/CommonEventFormat_30.0.1.json\"}", + "collector.keystore.passwordfile": "/opt/app/VESCollector/etc/passwordfile", + "collector.inputQueue.maxPending": "8096", + "streams_publishes": { + "ves-measurement": { + "type": "message_router", + "dmaap_info": { + "topic_url": "http://message-router:3904/events/unauthenticated.VES_MEASUREMENT_OUTPUT/" + } + }, + "ves-fault": { + "type": "message_router", + "dmaap_info": { + "topic_url": "http://message-router:3904/events/unauthenticated.SEC_FAULT_OUTPUT/" + } + }, + "ves-pnfRegistration": { + "type": "message_router", + "dmaap_info": { + "topic_url": "http://message-router:3904/events/unauthenticated.VES_PNFREG_OUTPUT/" + } + }, + "ves-other": { + "type": "message_router", + "dmaap_info": { + "topic_url": "http://message-router:3904/events/unauthenticated.SEC_OTHER_OUTPUT/" + } + }, + "ves-heartbeat": { + "type": "message_router", + "dmaap_info": { + "topic_url": "http://message-router:3904/events/unauthenticated.SEC_HEARTBEAT_OUTPUT/" + } + }, + "ves-notification": { + "type": "message_router", + "dmaap_info": { + "topic_url": "http://message-router:3904/events/unauthenticated.VES_NOTIFICATION_OUTPUT/" + } + } + }, + "collector.service.secure.port": "8443", + "header.authflag": "0", + "collector.keystore.file.location": "/opt/app/VESCollector/etc/keystore", + "collector.keystore.alias": "dynamically generated", + "services_calls": [], + "header.authlist": "sample1,c2FtcGxlMQ==" + } + + +During ONAP OOM/Kubernetes deployment this configuration is created from VES cloudify blueprint. diff --git a/docs/sections/services/ves-http/delivery.rst b/docs/sections/services/ves-http/delivery.rst new file mode 100644 index 00000000..0e5e826a --- /dev/null +++ b/docs/sections/services/ves-http/delivery.rst @@ -0,0 +1,9 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Delivery +======== + +**VES** is delivered as a docker container and published in ONAP Nexus repository following image naming convention. + +Full image name is `onap/org.onap.dcaegen2.collectors.ves.vescollector`. \ No newline at end of file diff --git a/docs/sections/services/ves-http/index.rst b/docs/sections/services/ves-http/index.rst index e1ad6e72..286e765b 100644 --- a/docs/sections/services/ves-http/index.rst +++ b/docs/sections/services/ves-http/index.rst @@ -7,5 +7,20 @@ VNF Event Streaming (VES) Collector .. Add or remove sections below as appropriate for the platform component. +**Virtual Event Streaming** (VES) Collector (formerly known as Standard Event Collector/Common Event Collector) is RESTful collector for processing JSON messages into DCAE. The collector supports individual events or eventbatch posted to collector end-point(s) and post them to interface/bus for other application to subscribe. +The collector verifies the source (when authentication is enabled) and validates the events against VES schema before distributing to DMAAP MR topics for downstream system to subscribe. The VESCollector also supports configurable event transformation function and event distribution to DMAAP MR topics. + + + VES Collector (HTTP) overview and functions +=========================================== + +.. toctree:: + :maxdepth: 1 + ./architecture.rst + ./configuration.rst + ./delivery.rst + ./installation.rst + `API`_ +.. _API: ../../apis/swagger_vescollector.yaml \ No newline at end of file diff --git a/docs/sections/services/ves-http/installation.rst b/docs/sections/services/ves-http/installation.rst new file mode 100644 index 00000000..27f46463 --- /dev/null +++ b/docs/sections/services/ves-http/installation.rst @@ -0,0 +1,24 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +Installation +============ + +To run VES Collector container on standalone mode, following parameters are required + + ``docker run -d -p 8080:8080/tcp -p 8443:8443/tcp -P -e DMAAPHOST='10.0.11.1' nexus.onap.org:10001/onap/org.onap.dcaegen2.collectors.ves.vescollector:1.3.1`` + + +DMAAPHOST is required for standalone; for normal platform installed instance the publish URL are obtained from Consul. Below parameters are exposed for DCAE platform (cloudify) deployed instance + + +- COLLECTOR_IP +- DMAAPHOST - should contain an address to DMaaP, so that event publishing can work +- CBSPOLLTIMER - it should be put in here if we want to automatically fetch configuration from CBS. +- CONSUL_PROTOCOL - Consul protocol by default set to **http**, if it is need to change it then that can be set to different value +- CONSUL_HOST - used with conjunction with CBSPOLLTIMER, should be a host address (without port! e.g my-ip-or-host) where Consul service lies +- CBS_PROTOCOL - Config Binding Service protocol by default set to **http**, if it is need to change it then that can be set to different value +- CONFIG_BINDING_SERVICE - used with conjunction with CBSPOLLTIMER, should be a name of CBS as it is registered in Consul +- HOSTNAME - used with conjunction with CBSPOLLTIMER, should be a name of VESCollector application as it is registered in CBS catalog + +These parameters can be configured either by passing command line option during `docker run` call or by specifying environment variables named after command line option name \ No newline at end of file diff --git a/docs/sections/services/ves-http/ves-deployarch.png b/docs/sections/services/ves-http/ves-deployarch.png new file mode 100644 index 0000000000000000000000000000000000000000..fd4db1bce574f4437af698713f965e7b2ee7fdbd GIT binary patch literal 123286 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%0Dl?%rh|u5%NXzp2p=QwtRAe21R>TB&ct*&` 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%0D(D(XRTt8VL}`&uTaII~jWhY)$wBu%J8O4>&=~u{ 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 O1&61rpUXO@geCyJ7eK=R literal 0 HcmV?d00001 diff --git a/docs/sections/tls_enablement.rst b/docs/sections/tls_enablement.rst index 92556b58..0f75bc88 100644 --- a/docs/sections/tls_enablement.rst +++ b/docs/sections/tls_enablement.rst @@ -14,8 +14,7 @@ Solution overview 2. Plugin and Blueprint: Update blueprint to include new (optional) node property (tls_info) to the type definitions for the Kubernetes component types. The property is a dictionary with two elements: A boolean (use_tls) that indicates whether the com ponent uses TLS. A string (cert_directory) that indicates where the component expects to find certificate artifacts - During deployment Kubernetes plugin (referenced in blueprint) will check if the tls_info property is set and use_tls is set to true, then the plugin will add -some elements to the Kubernetes Deployment for the component: + During deployment Kubernetes plugin (referenced in blueprint) will check if the tls_info property is set and use_tls is set to true, then the plugin will add some elements to the Kubernetes Deployment for the component: * A Kubernetes volume (tls-info) that will hold the certificate artifacts * A Kubernetes initContainer (tls-init) * A Kubernetes volumeMount for the initContainer that mounts the tlsinit volume at /opt/tls/shared. @@ -25,11 +24,11 @@ some elements to the Kubernetes Deployment for the component: 3. Certificate Artifacts The certificate directory m ounted on the container will include the following files: - * cert.jks: A Java keystore containing the DCAE certificate. - * jks.pass: A text file with a single line that contains the password for the cert.jks keystore. - * trust.jks: A Jave truststore containing the AAF CA certificate (needed by clients) - * trust.pass: A text file with a single line that contains the password for the trust.jks keystore. - * cert.p12: The DCAE certificate and private key package in PKCS12 form at. - * p12.pass: A text file with a single line that contains the password for cert.p12 file. - * cert.pem: The DCAE certificate, in PEM form at. - * key.pem: The private key for the DCAE certificate. The key is not encrypted. + - cert.jks: A Java keystore containing the DCAE certificate. + - jks.pass: A text file with a single line that contains the password for the cert.jks keystore. + - trust.jks: A Jave truststore containing the AAF CA certificate (needed by clients) + - trust.pass: A text file with a single line that contains the password for the trust.jks keystore. + - cert.p12: The DCAE certificate and private key package in PKCS12 form at. + - p12.pass: A text file with a single line that contains the password for cert.p12 file. + - cert.pem: The DCAE certificate, in PEM form at. + - key.pem: The private key for the DCAE certificate. The key is not encrypted. -- 2.16.6