From f361230f12e9183195bc9eb32d76b61f50a55057 Mon Sep 17 00:00:00 2001 From: andreasgeissler Date: Wed, 24 Apr 2019 12:42:08 +0200 Subject: [PATCH] Migration of Service Design from Wiki to Readthedocs User guide small changes Source: https://wiki.onap.org/display/DW/Control+Loop+Design Issue-ID: DOC-439 Change-Id: I5261d648b7d9a745738c8a01ffef86220e170af2 Signed-off-by: andreasgeissler --- docs/guides/onap-user/control-loop/index.rst | 271 +++++++++++++++++++++ .../onap-user/control-loop/media/DesignModel.png | Bin 0 -> 16235 bytes 2 files changed, 271 insertions(+) create mode 100644 docs/guides/onap-user/control-loop/index.rst create mode 100644 docs/guides/onap-user/control-loop/media/DesignModel.png diff --git a/docs/guides/onap-user/control-loop/index.rst b/docs/guides/onap-user/control-loop/index.rst new file mode 100644 index 000000000..a8e77007c --- /dev/null +++ b/docs/guides/onap-user/control-loop/index.rst @@ -0,0 +1,271 @@ +.. This work is licensed under a Creative Commons Attribution 4.0 +.. International License. http://creativecommons.org/licenses/by/4.0 +.. Copyright 2019 ONAP Contributors. All rights reserved. + +Control Loop Design +=================== +**Goal:** Create and distribute closed-loop models for automating: + * recovery of faults reported by traps or alarms + * capacity management as performance thresholds are crossed + +**Tool:** SDC/DCAE-DS/CLAMP + +**SDC user role:** Designer + +Closed loops use feedback to control and optimize their behavior. +A closed loop can proactively respond to network and service conditions +without human intervention. + +There are different phases to the Closed Loop (CL) design: + + #. Design a closed loop template and associate it to a Service, + the template represents the theoretical flow of the CL. (DCAE-DS/SDC) + + #. generate a deployment artifact that can be ingested by the DCAE, + today it is a "cloudify" blueprint. + + #. Distribute the control loop to CLAMP and DCAE, the csar is distributed + to CLAMP, the blueprint is distributed to both CLAMP and DCAE. (SDC) + #. Submit the closed loop, meaning provision Policy/DCAE with + closed loop data. (CLAMP) + #. Deploy the closed loop, it initiates the deployment of the micro + service on DCAE side (CLAMP) + +*Release 1 (Amsterdam)* includes control loop template designer in Clamp UI. + +*Release 2 (Bejing)* does not include the control loop template designer +in Clamp UI, this is implemented in DCAE-DS. + +**Steps** + + * `Design a Model`_ + * `Configure Collector`_ + * `Configure Alarm Detector`_ + * `Configure Data Analytics Function`_ + * `Configure Policy`_ + * `Distribute the Model`_ + * `Open Loop Design`_ + +Design a Model +-------------- + +.. note:: + When required, contact the DCAE Group (see `Mailing Lists `_) to + confirm that a blueprint for the Service has been generated and + is available on DCAE. + +**Prerequisites:** Create and test a VF +(see :ref:`VF Creation and Testing `). + + #. Create and name a new model + #. Associate a Service with the model + #. Based on the service, provide values for its attributes + #. Select the Resource-VF and Resource-VFC to associate with the model + #. Select one or more locations in the cloud where the + closed loop will be deployed + #. Here is a view of a hypothetical visual design tool + showing loop modeling components: + + |image0| + + #. Use the tool to select and connect components, + thus defining the structure of the model + #. Configure each of the components of the model + + #. `Configure Collector`_ + #. `Configure Alarm Detector`_ + #. `Configure Data Analytics Function`_ + #. `Configure Policy`_ + +Configure Collector +------------------- + +**Prerequisites:** `Design a Model`_. + +Using the modeling tool, assign a message topic to which this +component will subscribe. + +Configure Alarm Detector +------------------------ + +**Prerequisites:** `Design a Model`_. + +Using the modeling tool, configure the fields described in this table: + ++------------+----------------------------+-------------------------------+ +| Field | Values | Description | ++============+============================+===============================+ +| Topic | * DCAE-CL-EVENT | DMAAP message topic to | +| Publishes | * OPEN-DCAE-HIGHLANDPARK- | which the component | +| | EVENT-OUTPUT | subscribes. | ++------------+----------------------------+-------------------------------+ +| Alarm | (Multiple values) | Populated from vendor-provided| +| Condition | | list of alarm names. Stored in| +| | | SDC and retrieved by the | +| | | modeling tool. Alarms differ | +| | | per VNF. | ++------------+----------------------------+-------------------------------+ +| Event | (Multiple values) | Categories of alarms for a VNF| +| Source Type| | .Differs per VNF. | ++------------+----------------------------+-------------------------------+ +| Event | * NORMAL | Severity level of the alarm | +| Severity | * not-NORMAL | that caused the rule to match.| +| | * WARNING | All conditions are exact | +| | * MINOR | matches, except for not-Normal| +| | * MAYOR | , which matches anything | +| | * CRITICAL | except NORMAL. | ++------------+----------------------------+-------------------------------+ + + +Configure Data Analytics Function +--------------------------------- + +**Prerequisites:** `Design a Model`_. + + #. In the model, click the *StringMatch*. + #. Click the *Properties* icon. + #. Configure fields as required (see table). + #. Click *Close*. + ++------------+----------------------------+-------------------------------+ +| Field | Values | Description | ++============+============================+===============================+ +| Topic | * DCAE-CL-EVENT | DMAAP message topic to | +| Publishes | | which the component subscribes| ++------------+----------------------------+-------------------------------+ +| AAI Fields | (Multiple values) | Additional VM-related fields | +| Matching | | that downstream elements such | ++------------+ | as Policy and APPC can use to | +| AAI Field | | take action on the signature. | +| Send | | | +| (Select | | | +| Multiple) | | | ++------------+----------------------------+-------------------------------+ +| Resource- | Integer | Group of string matching rules| +| Group | | that are to be treated | +| | | together. For example, a | +| | | resource group could contain | +| | | two different traps that must | +| | | be received to produce a | +| | | signature, as well as the | +| | | abatement match. | ++------------+----------------------------+-------------------------------+ +| Alarm | (Multiple values) | Populated from vendor-provided| +| Condition | | list of alarm names. Stored in| +| | | SDC and retrieved by the | +| | | modeling tool. Alarms differ | +| | | per VNF. | ++------------+----------------------------+-------------------------------+ +| Event | * NORMAL | Severity level of the alarm | +| Severity | * not-NORMAL | that caused the rule to match.| +| | * WARNING | All conditions are exact | +| | * MINOR | matches, except for not-Normal| +| | * MAYOR | , which matches anything | +| | * CRITICAL | except NORMAL. | ++------------+----------------------------+-------------------------------+ +| Event | (Multiple values) | Categories of alarms for a | +| Source Type| | VNF. Differs per VNF. | ++------------+----------------------------+-------------------------------+ +| Time | Integer | Interval during which multiple| +| Window | | traps must be received in | +| | | order to produce a single | +| | | signature. This value has no | +| | | meaning if only one onset rule| +| | | exists. A value of 0 means an | +| | | unlimited time window. | ++------------+----------------------------+-------------------------------+ +| Age | Integer | Traps older than this limit | +| Limit | | are deemed too stale to be | +| | | meaningful and are not | +| | | processed. | ++------------+----------------------------+-------------------------------+ +| Create CL | * Initial | *Initial:* start a closed | +| Event ID | * Close | loop with a new request ID | +| | | | +| | | *Close:* end an existing | +| | | closed loop (Close) | ++------------+----------------------------+-------------------------------+ +| Create CL | * OnSet | *OnSet:* start a closed loop | +| Event ID | * Abatement | when a condition starts. | +| Output | | Triggered with a new | +| Event Name | | request_id and signature flag | +| | | of *Initial* | +| | | | +| | | *Abatement:* end a closed loop| +| | | when a condition is corrected.| +| | | Triggered with signature flag | +| | | of *Close*. | ++------------+----------------------------+-------------------------------+ + + +Configure Policy +---------------- + +Use this task to configure the operational policy of the closed loop. + +**Prerequisites:** `Design a Model`_. + +Model configuration involves setting the values in this table, +for each of the Rebuild and Migrate recipies in the model. + ++------------+----------------------------+-------------------------------+ +| Field | Values | Description | ++============+============================+===============================+ +| Overall | Integer | Maximum overall time that can | +| Time Limit | | be spent on attempting all | +| | | actions. | ++------------+----------------------------+-------------------------------+ +| Receipe | * Restart | The automated action to be | +| | * Rebuild | triggered on the VM by the | +| | * Migrate | closed loop. | ++------------+----------------------------+-------------------------------+ +| Max Retries| Positive Integer | Number of times this action | +| | | should be attempted before | +| | | failing on MaxRetriesExceeded.| ++------------+----------------------------+-------------------------------+ +| Retry Time | Positive Integer | Maximum amount of time to take| +| Limit | | performing retries before | +| | | failing on TimeLimitExceeded. | ++------------+----------------------------+-------------------------------+ +| Parent | (Selection | Recipe that precedes this one | +| Policy | | in the chain of operations. | +| | | If this is the first action in| +| | | the chain, this field is not | +| | | set. | ++------------+----------------------------+-------------------------------+ +| Parent | * Failure: | Types of results from the | +| Policy | MaxRetriesExceeded | previous action on the chain | +| Conditions | * Failure: | that would cause a transition | +| | TimeLimitExceeded | to this action. | +| | * Failure: Exception | | +| | * Failure: Other | | +| | * Success | | ++------------+----------------------------+-------------------------------+ + + +Distribute the Model +-------------------- + +**Prerequisites:** `Design a Model`_. + +In this step, the user distributes the models to the DCAE and +Policy subsystems of ONAP. + +After a model is uploaded to a VNF, the status icon of the VNF changes +to from "Design" to "Activated" in the ONAP Portal GUI. + +Open Loop Design +---------------- + +Create and distribute open control loops for managing VF faults and +performance after instantiation. + +With open loop control systems, the action(s) taken by the Policy do +not affect the output of the system. + +For information about creating policy using the Policy Designer, +see :ref:`Policy Design `. + + +.. |image0| image:: media/DesignModel.png + diff --git a/docs/guides/onap-user/control-loop/media/DesignModel.png b/docs/guides/onap-user/control-loop/media/DesignModel.png new file mode 100644 index 0000000000000000000000000000000000000000..a7cac4f88980b2b3008209a77dbfb283c84dda16 GIT binary patch literal 16235 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 Y3S*vjjK2t6qK6O@k`^rH*ZTfH004k@ga7~l literal 0 HcmV?d00001 -- 2.16.6