From e64d2d643d8cf400263c9b01063fced6fc5edcb2 Mon Sep 17 00:00:00 2001 From: VENKATESH KUMAR Date: Mon, 6 Apr 2020 18:55:10 -0400 Subject: [PATCH] dcae r6 doc updates Change-Id: I348d9bcf9eb69286fc4a12d8866d102186d26722 Signed-off-by: VENKATESH KUMAR Issue-ID: DCAEGEN2-1892 Signed-off-by: VENKATESH KUMAR --- docs/sections/apis/deployment-handler-API.json | 2 +- docs/sections/apis/deployment-handler-API.yaml | 2 +- docs/sections/architecture.rst | 18 +++-- docs/sections/components/blueprint_generator.rst | 77 ++++++++++++++++++ docs/sections/components/component-development.rst | 1 + docs/sections/images/R6_architecture_diagram.png | Bin 0 -> 50093 bytes docs/sections/release-notes.rst | 10 +-- docs/sections/services/snmptrap/delivery.rst | 2 +- docs/sections/services/snmptrap/installation.rst | 2 +- docs/sections/services/snmptrap/release-notes.rst | 32 ++++++++ .../services/tcagen2-docker/configuration.rst | 37 +++++++++ docs/sections/services/tcagen2-docker/delivery.rst | 14 ++++ .../services/tcagen2-docker/functionality.rst | 88 +++++++++++++++++++++ docs/sections/services/tcagen2-docker/index.rst | 21 +++++ .../services/tcagen2-docker/installation.rst | 69 ++++++++++++++++ 15 files changed, 358 insertions(+), 17 deletions(-) create mode 100644 docs/sections/components/blueprint_generator.rst create mode 100644 docs/sections/images/R6_architecture_diagram.png create mode 100644 docs/sections/services/tcagen2-docker/configuration.rst create mode 100644 docs/sections/services/tcagen2-docker/delivery.rst create mode 100644 docs/sections/services/tcagen2-docker/functionality.rst create mode 100644 docs/sections/services/tcagen2-docker/index.rst create mode 100644 docs/sections/services/tcagen2-docker/installation.rst diff --git a/docs/sections/apis/deployment-handler-API.json b/docs/sections/apis/deployment-handler-API.json index 91a78279..f72cc183 100644 --- a/docs/sections/apis/deployment-handler-API.json +++ b/docs/sections/apis/deployment-handler-API.json @@ -1,7 +1,7 @@ { "swagger": "2.0", "info": { - "version": "3.0.3", + "version": "4.3.0", "title": "deployment-handler API", "license": { "name": "Apache 2.0", diff --git a/docs/sections/apis/deployment-handler-API.yaml b/docs/sections/apis/deployment-handler-API.yaml index 7d3cf6e3..edf55821 100644 --- a/docs/sections/apis/deployment-handler-API.yaml +++ b/docs/sections/apis/deployment-handler-API.yaml @@ -19,7 +19,7 @@ swagger: '2.0' info: - version: "3.0.3" + version: "4.3.0" title: "deployment-handler API" license: name: "Apache 2.0" diff --git a/docs/sections/architecture.rst b/docs/sections/architecture.rst index f4084eeb..70410838 100644 --- a/docs/sections/architecture.rst +++ b/docs/sections/architecture.rst @@ -25,10 +25,10 @@ transported among different DCAE service components. DCAE use Consul's distributed K-V store service to manage component configurations where each key is based on the unique identity of a DCAE component (identified by ServiceComponentName), and the value is the configuration for the corresponding component. The K-V store for each service components is created during deployment. DCAE platform creates and updates the K-V pairs based on information provided as part of the control loop blueprint deployment, or through a notification/trigger received from other ONAP components such as Policy Framework and CLAMP. Either through periodically polling or proactive pushing, the DCAE components get the configuration updates in realtime and apply the configuration updates. DCAE Platform also offers dynamic template resolution for configuration parameters that are dynamic and only known by the DCAE platform, such as dynamically provisioned DMaaP topics. This approach standardizes component deployment and configuration management for DCAE service components in multi-site deployment. -DCAE R4 Components ------------------- +DCAE Components +--------------- -The following list displays the details of what are included in ONAP DCAE R4. All DCAE components are offered as Docker containers. Following ONAP level deployment methods, these components can be deployed as Kubernetes Deployments and Services. +The following lists the components included in ONAP DCAE . All DCAE components are offered as Docker containers. Following ONAP level deployment methods, these components can be deployed as Kubernetes Deployments and Services. - DCAE Platform - Core Platform @@ -56,6 +56,7 @@ The following list displays the details of what are included in ONAP DCAE R4. A - Analytics - Holmes correlation analytics - CDAP based Threshold Crosssing Analytics application (tca) + - Docker based Threshold Crosssing Analytics - Heartbeat Services - SON-Handler Service - Microservices @@ -63,11 +64,12 @@ The following list displays the details of what are included in ONAP DCAE R4. A - VES Mapper Service - PM-Mapper Service - BBS-EventProcessor Service + - PM Subcription Handler -The figure below shows the DCAE R4 architecture and how the components work with each other. The components on the right constitute the Platform/controller components which are statically deployed. The components on the right represent the services which can be both deployed statically or dynamically (via CLAMP) +The figure below shows the DCAE architecture and how the components work with each other. The components on the right constitute the Platform/controller components which are statically deployed. The components on the right represent the services which can be both deployed statically or dynamically (via CLAMP) -.. image:: images/R4_architecture_diagram.png +.. image:: images/R6_architecture_diagram.png Deployment Scenarios @@ -75,7 +77,7 @@ 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 on-demand based on usecase needs triggered by control loop request originated from CLAMP, or even by operator manually invoking DCAE's deployment API call. -For R4, ONAP supports deployment via OOM Helm Chart method and Heat deployment support is discontinued. DCAE Platform components are deployed via Helm charts - this includes Cloudify Manager, ConfigBinding service, ServiceChange Handler, Policy Handler and Inventory. Once DCAE platform components are up and running, rest of DCAE service components required for ONAP flow are deployed via bootstrap POD, which invokes Cloudify Manager API with Blueprints for various DCAE components that are needed for the built-in collections and control loops flow support. +ONAP supports deployment through OOM Helm Chart currently (Heat deployment support is discontinued since R3). Hence all DCAE Platform components are deployed via Helm charts - this includes Cloudify Manager, ConfigBinding service, ServiceChange Handler, Policy Handler, Dashboard and Inventory, each with corresponding Helm charts under OOM (https://git.onap.org/oom/tree/kubernetes/dcaegen2/components). Once DCAE platform components are up and running, rest of DCAE service components required for ONAP flow are deployed via bootstrap POD, which invokes Cloudify Manager API with Blueprints for various DCAE components that are needed for the built-in collections and control loops flow support. To keep the ONAP footprint minimal, only minimal set of MS (required for ONAP Integration usecases) are deployed via bootstrap pod. Rest of service blueprints are available for operator to deploy on-demand as required. @@ -87,7 +89,7 @@ More details of the DCAE deployment can be found under Installation section. Usage Scenarios --------------- -For ONAP R4 DCAE participates in the following use cases. +For ONAP DCAE participates in the following use cases. - vDNS: VES collector, TCA analytics @@ -101,7 +103,7 @@ For ONAP R4 DCAE participates in the following use cases. - BBS : VES Collector, PRH, BBS-Event Processor, VES-Mapper, RESTConf Collector -- 5g : DataFile Collector, PM-Mapper, HV-VES +- 5g Bulk PM : DataFile Collector, PM-Mapper, HV-VES In addition, DCAE supports on-demand deployment and configuration of service components via CLAMP. In such case CLAMP invokes the deployment and configuration of additional TCA instances. diff --git a/docs/sections/components/blueprint_generator.rst b/docs/sections/components/blueprint_generator.rst new file mode 100644 index 00000000..8813cefd --- /dev/null +++ b/docs/sections/components/blueprint_generator.rst @@ -0,0 +1,77 @@ + +Blueprint Generator (DCAE) +============================================= + +What is the Blueprint Generator? +++++++++++++++++++++++++++++++++ +The blueprint generator is a java rewrite of the tosca lab python tool. The point of this tool is to be able to take a component spec for a given micro-service and translate that component spec into a blueprint yaml file that can be used during deployment. + + +Steps to run the blueprint generator: ++++++++++++++++++++++++++++++++++++++ + +1. Download the jar file from Nexus by clicking `here `_ or running + ``https://nexus.onap.org/service/local/repositories/releases/content/org/onap/dcaegen2/platform/mod/blueprint-generator/1.3.1/blueprint-generator-1.3.1-executable.jar`` + +2. To execute the application, run the following command: + ``java -jar blueprint-generator-1.3.1-executable.jar blueprint`` + +3. This execution will provide the help, as you have not provided the required flags. + +4. When ready you can run the program again except with the required flags. + +5. OPTIONS: + -p: The path to where the final blueprint yaml file will be created (required) + + -i: The path to the JSON spec file (required) + + -n: Name of the blueprint (optional) + + -t: the path to the import yaml file (optional) + + -d: If this flag is present the bp generator will be created with dmaap plugin (optional) + + -o: This flag will create a service component override for your deployment equal to the value you put (optional) + +6. An example running this program would look like this: + ``java -jar blueprint-generator-1.2.1-executable.jar -p blueprint_output -i ComponentSpecs/TestComponentSpec.json -n TestAppBlueprint`` + + +Extra information +----------------- + +1. The component spec must be of the same format as stated in the onap `readthedocs `_ page + +2. If the tag says required then the program will not run without those tags being there + +3. If the tag says optional then it is not necessary to run the program with those tags + +4. If you do not add a -n tag the blueprint name will default to what it is in the component spec + +5. If the directory you specified in the -p tag does not already exist the directory will be created for you + +6. The -t flag will override the default imports set for the blueprints. To see an example of how the import yaml file should be structured see the testImports.yaml file under the folder TestCases + + +How to create policy models: ++++++++++++++++++++++++++++++++++++++ + +1. Policy model creation can be done with the same jar as downloaded for the blueprint generation. + +2. Run the same command as the blueprint generator except replace the ``blueprint`` positional with ``policy`` + +3. Example command: + ``java -jar blueprint-generator-1.3.1-executable.jar policy`` + +4. Options: + + -i: The path to the JSON spec file (required) + + -p: The Output path for all of the models (required) + +Extra information +----------------- + +1. Not all component specs will be able to create policy models + +2. Multiple policy model files may be create from a single component spec \ No newline at end of file diff --git a/docs/sections/components/component-development.rst b/docs/sections/components/component-development.rst index 24463902..d4b34a74 100644 --- a/docs/sections/components/component-development.rst +++ b/docs/sections/components/component-development.rst @@ -10,6 +10,7 @@ Onboarding Pre-requisite (Service Component) ./intro.rst ./architecture/pieces.rst ./architecture/service-discovery.rst + ./architecture/blueprint_generator.rst ./requirements-guidelines.rst ./component-specification/component-specification.rst ./component-json-schema.rst diff --git a/docs/sections/images/R6_architecture_diagram.png b/docs/sections/images/R6_architecture_diagram.png new file mode 100644 index 0000000000000000000000000000000000000000..f12d86d263aab44eaa2f28c5b9606bf626be6728 GIT binary patch literal 50093 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 -e CONFIG_BINDING_SERVICE_SERVICE_PORT= -e HOSTNAME= nexus3.onap.org:10001/onap/org.onap.dcaegen2.analytics.tca-gen2.dcae-analytics-tca-web:`` diff --git a/docs/sections/services/tcagen2-docker/functionality.rst b/docs/sections/services/tcagen2-docker/functionality.rst new file mode 100644 index 00000000..8b729b1d --- /dev/null +++ b/docs/sections/services/tcagen2-docker/functionality.rst @@ -0,0 +1,88 @@ +Functionality +============= + +TCA-gen2 is driven by the VES collector events published into Message Router. This Message Router topic is the source for the CDAP application which will read each incoming message. If a message meets the VES (CEF, v28.4) as specified by the VES 5.4 standard, it will be parsed and if it contains a message which matches the policy configuration for a given metric (denoted primarily by the "eventName" and the "fieldPath"), the value of the metric will be compared to the "thresholdValue". If that comparison indicates that a Control Loop Event Message should be generated, the application will output the alarm to the Message Router topic in a format that matches the interface spec defined for Control-Loop by ONAP-Policy + +Assumptions: + +TCA-gen2 output will be similar to R0 Tca/cdap implementation, where CL event will be triggered each time threshold rules are met. + +In the context of the vCPE use case, the CLEAR event (aka ABATED event) is driven by a measured metric (i.e. packet loss equal to 0) rather than by the lapse of a threshold crossing event over some minimum number of measured intervals. Thus, this requirement can be accommodated by use of the low threshold with a policy of "direction = 0". TCA-gen2 implementation will keep only the minimal state needed to correlate an ABATED event with the corresponding ONSET event. This correlation will be indicated by the requestID in the Control Loop Event Message. + + +TCA-gen2 can support multiple ONAP usecases. Single TCA instance can be deployed to support all 3 usecases. +- vFirewall +- vDNS +- vCPE + +Following is default configuration set for TCA-gen2 during deployment. + +.. code-block:: json + + { + "domain": "measurementsForVfScaling", + "metricsPerEventName": [{ + "eventName": "measurement_vFirewall-Att-Linkdownerr", + "controlLoopSchemaType": "VM", + "policyScope": "DCAE", + "policyName": "DCAE.Config_tca-hi-lo", + "policyVersion": "v0.0.1", + "thresholds": [{ + "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a", + "version": "1.0.2", + "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta", + "thresholdValue": 300, + "direction": "LESS_OR_EQUAL", + "severity": "MAJOR", + "closedLoopEventStatus": "ONSET" + }, { + "closedLoopControlName": "ControlLoop-vFirewall-d0a1dfc6-94f5-4fd4-a5b5-4630b438850a", + "version": "1.0.2", + "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta", + "thresholdValue": 700, + "direction": "GREATER_OR_EQUAL", + "severity": "CRITICAL", + "closedLoopEventStatus": "ONSET" + }] + }, { + "eventName": "vLoadBalancer", + "controlLoopSchemaType": "VM", + "policyScope": "DCAE", + "policyName": "DCAE.Config_tca-hi-lo", + "policyVersion": "v0.0.1", + "thresholds": [{ + "closedLoopControlName": "ControlLoop-vDNS-6f37f56d-a87d-4b85-b6a9-cc953cf779b3", + "version": "1.0.2", + "fieldPath": "$.event.measurementsForVfScalingFields.vNicPerformanceArray[*].receivedTotalPacketsDelta", + "thresholdValue": 300, + "direction": "GREATER_OR_EQUAL", + "severity": "CRITICAL", + "closedLoopEventStatus": "ONSET" + }] + }, { + "eventName": "Measurement_vGMUX", + "controlLoopSchemaType": "VNF", + "policyScope": "DCAE", + "policyName": "DCAE.Config_tca-hi-lo", + "policyVersion": "v0.0.1", + "thresholds": [{ + "closedLoopControlName": "ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e", + "version": "1.0.2", + "fieldPath": "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value", + "thresholdValue": 0, + "direction": "EQUAL", + "severity": "MAJOR", + "closedLoopEventStatus": "ABATED" + }, { + "closedLoopControlName": "ControlLoop-vCPE-48f0c2c3-a172-4192-9ae3-052274181b6e", + "version": "1.0.2", + "fieldPath": "$.event.measurementsForVfScalingFields.additionalMeasurements[*].arrayOfFields[0].value", + "thresholdValue": 0, + "direction": "GREATER", + "severity": "CRITICAL", + "closedLoopEventStatus": "ONSET" + }] + }] + } + +For more details about the exact flows - please refer to usecases wiki diff --git a/docs/sections/services/tcagen2-docker/index.rst b/docs/sections/services/tcagen2-docker/index.rst new file mode 100644 index 00000000..b2e32a68 --- /dev/null +++ b/docs/sections/services/tcagen2-docker/index.rst @@ -0,0 +1,21 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 International License. +.. http://creativecommons.org/licenses/by/4.0 + +===================================================== +Docker based Threshold Crossing Analytics (TCA-gen2) +===================================================== + + +Overview +======== + +The TCA-gen2 is docker based mS intended to replace TCA/cdap version, which was first delivered as part of ONAP R0. Functionality of TCA-gen2 is identical to that of TCA - where meaurement events are subscribed from DMAAP in VES structure, once events are recieved TCA-gen2 performs a comparison of an incoming performance metric(s) against both a high and low threshold defined and generates CL events when threshold are exceeded. When the original threshold defined are cleared, TCA-Gen2 will generate an ABATEMENT event to notify the downstream system on original problem being cleared. + + +.. toctree:: + :maxdepth: 1 + + ./installation + ./configuration + ./functionality + ./delivery \ No newline at end of file diff --git a/docs/sections/services/tcagen2-docker/installation.rst b/docs/sections/services/tcagen2-docker/installation.rst new file mode 100644 index 00000000..7fa53e29 --- /dev/null +++ b/docs/sections/services/tcagen2-docker/installation.rst @@ -0,0 +1,69 @@ +Installation +============ + +TCA-gen2 is a microservice that will be configured and instantiated through Cloudify Manager.TCA-gen2 will be deployed by DCAE deployment among the bootstrapped services. This is more to facilitate automated deployment of ONAP regression test cases required services. During instantiation, the TCA-gen2 will fetch its configuration through the Config Binding Service. Steps to deploy using the CLI tool are shown below. + +Deployment Prerequisite/dependencies +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + - DCAE and DMaaP pods should be up and running. + - MongoDB should be up and running + - Make sure that cfy is installed and configured to work with the Cloudify deployment. + +Deployment steps +^^^^^^^^^^^^^^^^ + +Following are steps if manual deployment/undeployment is required. Steps to deploy are below + + +Enter the Cloudify Manager kuberenetes pod + + - Tca-gen2 blueprint directory (/blueprints/k8s-tcagen2.yaml). The blueprint is also maintained in gerrit and can be downloaded from + https://git.onap.org/dcaegen2/platform/blueprints/tree/blueprints/k8s-tcagen2.yaml + + - Create input file required for deployment + + Configuration of the service consists of generating an inputs file (YAML) which will be used as part of the + Cloudify install. The tca-gen2 blueprints was designed with known defaults for the majority of the fields. + + Below you will find examples of fields which can be configured, and some of the fields + which must be configured. The full list of configurable parameters can be seen within the bootstrap container under + /inputs/k8s-tcagen2-inputs.yaml + + + .. csv-table:: + :widths: auto + :delim: ; + :header: Property , Sample Value , Description , Required + tca_handle_in_subscribe_url ; http://message-router:3904/events/unauthenticated.TCAGEN2_OUTPUT/; DMaap topic to publish CL event output ; No + tca_handle_in_subscribe_url ; http://message-router:3904/events/unauthenticated.VES_MEASUREMENT_OUTPUT/; DMaap topic to subscribe VES measurement feeds ; No + tag_version ; nexus3.onap.org:10001/onap/org.onap.dcaegen2.analytics.tca-gen2.dcae-analytics-tca-web:1.0.1 ; The tag of the Docker image will be used when deploying the tca-gen2. ; No + + Example inputs.yaml + + .. code-block:: yaml + + tag_version: nexus3.onap.org:10001/onap/org.onap.dcaegen2.analytics.tca-gen2.dcae-analytics-tca-web:1.0.1 + tca_handle_in_subscribe_url: "http://message-router:3904/events/unauthenticated.VES_MEASUREMENT_OUTPUT/" + tca_handle_out_publish_url: "http://message-router:3904/events/unauthenticated.TCAGEN2_OUTPUT/" + + + - Create deployment + + .. code-block:: bash + + cfy install --blueprint-id tca-gen2 --deployment-id tca-gen2 -i k8s-tcagen2-inputs.yaml /blueprints/k8s-tcagen2.yaml + + + +To undeploy TCA-gen2, steps are shown below + +- Uninstall running TCA-gen2 and delete deployment + .. code-block:: bash + + cfy uninstall tca-gen2 +- Delete blueprint + .. code-block:: bash + + cfy blueprints delete tca-gen2 + \ No newline at end of file -- 2.16.6