summaryrefslogtreecommitdiffstats
path: root/docs/pap
diff options
context:
space:
mode:
Diffstat (limited to 'docs/pap')
-rw-r--r--docs/pap/InternalPapPdp.rst428
-rw-r--r--docs/pap/images/PolicyImplPDPSubGroup.svg2
-rw-r--r--docs/pap/pap.rst139
-rw-r--r--docs/pap/response/consolidated-healthcheck-pap-resp.json48
-rw-r--r--docs/pap/response/deployed-policy-pap-resp.json38
-rw-r--r--docs/pap/response/pdp-statistics-pap-resp.json45
-rw-r--r--docs/pap/swagger/consolidated-healthcheck-pap.json101
-rw-r--r--docs/pap/swagger/deployed-policy-pap.json322
-rw-r--r--docs/pap/swagger/deployments-batch-pap.json4
-rw-r--r--docs/pap/swagger/group-delete-pap.json4
-rw-r--r--docs/pap/swagger/group-query-pap.json4
-rw-r--r--docs/pap/swagger/groups-batch-pap.json4
-rw-r--r--docs/pap/swagger/pdp-statistics-pap.json368
-rw-r--r--docs/pap/swagger/policy-deploy-pap.json4
-rw-r--r--docs/pap/swagger/policy-undeploy-pap.json6
-rw-r--r--docs/pap/swagger/state-change-pap.json4
16 files changed, 1477 insertions, 44 deletions
diff --git a/docs/pap/InternalPapPdp.rst b/docs/pap/InternalPapPdp.rst
new file mode 100644
index 00000000..998514af
--- /dev/null
+++ b/docs/pap/InternalPapPdp.rst
@@ -0,0 +1,428 @@
+.. This work is licensed under a
+.. Creative Commons Attribution 4.0 International License.
+.. http://creativecommons.org/licenses/by/4.0
+
+.. _pap-pdp-label:
+
+The Internal Policy Framework PAP-PDP API
+#########################################
+
+.. contents::
+ :depth: 3
+
+This page describes the API between the PAP and PDPs. The APIs in this section are implemented using `DMaaP
+API <https://wiki.onap.org/display/DW/DMaaP+API>`__ messaging. The APIs in this section are used for internal
+communication in the Policy Framework. The APIs are NOT supported for use by components outside the Policy Framework and
+are subject to revision and change at any time.
+
+There are four messages on the API:
+
+1. PDP_STATUS: PDP→PAP, used by PDPs to report to the PAP
+
+2. PDP_UPDATE: PAP→PDP, used by the PAP to update the policies running on PDPs, triggers a PDP_STATUS message with
+ the result of the PDP_UPDATE operation
+
+3. PDP_STATE_CHANGE: PAP→PDP, used by the PAP to change the state of PDPs, triggers a PDP_STATUS message with the result
+ of the PDP_STATE_CHANGE operation
+
+4. PDP_HEALTH_CHECK: PAP→PDP, used by the PAP to order a health check on PDPs, triggers a PDP_STATUS message with the
+ result of the PDP_HEALTH_CHECK operation
+
+The fields in the table below are valid on API calls:
+
+=============================== ======== ======== ======== ======= =====================================================
+**Field** **PDP **PDP **PDP **PDP **Comment**
+ STATUS** UPDATE** STATE HEALTH
+ CHANGE** CHECK**
+=============================== ======== ======== ======== ======= =====================================================
+(message_name) M M M M pdp_status, pdp_update, pdp_state_change, or
+ pdp_health_check
+name M M C C The name of the PDP, for state changes and health
+ checks, the PDP group and subgroup can be used to
+ specify the scope of the operation
+version M N/A N/A N/A The version of the PDP
+pdp_type M M N/A N/A The type of the PDP, currently xacml, drools, or apex
+state M N/A M N/A The administrative state of the PDP group: PASSIVE,
+ SAFE, TEST, ACTIVE, or TERMINATED
+healthy M N/A N/A N/A The result of the latest health check on the PDP:
+ HEALTHY/NOT_HEALTHY/TEST_IN_PROGRESS
+description O O N/A N/A The description of the PDP
+pdp_group O M C C The PDP group to which the PDP belongs, the PDP group
+ and subgroup can be used to specify the scope of the
+ operation
+pdp_subgroup O M C C The PDP subgroup to which the PDP belongs, the PDP
+ group and subgroup can be used to specify the scope
+ of the operation
+supported_policy_types M N/A N/A N/A A list of the policy types supported by the PDP
+policies O M N/A N/A The list of policies running on the PDP
+->(name) O M N/A N/A The name of a TOSCA policy running on the PDP
+->policy_type O M N/A N/A The TOSCA policy type of the policyWhen a PDP starts,
+ it commences periodic sending of *PDP_STATUS*
+ messages on DMaaP. The PAP receives these messages
+ and acts in whatever manner is appropriate.
+->policy_type_version O M N/A N/A The version of the TOSCA policy type of the policy
+->properties O M N/A N/A The properties of the policy for the XACML, Drools,
+ or APEX PDP for details
+instance M N/A N/A N/A The instance ID of the PDP running in a Kuberenetes
+ Pod
+deployment_instance_info M N/A N/A N/A Information on the node running the PDP
+properties O O N/A N/A Other properties specific to the PDP
+statistics M N/A N/A N/A Statistics on policy execution in the PDP
+->policy_download_count M N/A N/A N/A The number of policies downloaded into the PDP
+->policy_download_success_count M N/A N/A N/A The number of policies successfully downloaded into
+ the PDP
+->policy_download_fail_count M N/A N/A N/A The number of policies downloaded into the PDP where
+ the download failed
+->policy_executed_count M N/A N/A N/A The number of policy executions on the PDP
+->policy_executed_success_count M N/A N/A N/A The number of policy executions on the PDP that
+ completed successfully
+->policy_executed_fail_count M N/A N/A N/A The number of policy executions on the PDP that
+ failed
+response O N/A N/A N/A The response to the last operation that the PAP
+ executed on the PDP
+->response_to M N/A N/A N/A The PAP to PDP message to which this is a response
+->response_status M N/A N/A N/A SUCCESS or FAIL
+->response_message O N/A N/A N/A Message giving further information on the successful
+ or failed operation
+=============================== ======== ======== ======== ======= =====================================================
+
+YAML is used for illustrative purposes in the examples in this section. JSON (application/json) is used as the content
+type in the implementation of this API.
+
+1 PAP API for PDPs
+==================
+The purpose of this API is for PDPs to provide heartbeat, status, health, and statistical information to Policy
+Administration. There is a single *PDP_STATUS* message on this API. PDPs send this message to the PAP using the
+*POLICY_PDP_PAP* DMaaP topic. The PAP listens on this topic for messages.
+
+When a PDP starts, it commences periodic sending of *PDP_STATUS* messages on DMaaP. The PAP receives these messages and
+acts in whatever manner is appropriate. *PDP_UPDATE*, *PDP_STATE_CHANGE*, and *PDP_HEALTH_CHECK* operations trigger a
+*PDP_STATUS* message as a response.
+
+The *PDP_STATUS* message is used for PDP heartbeat monitoring. A PDP sends a *PDP_STATUS* message with a state of
+*TERMINATED* when it terminates normally. If a *PDP_STATUS* message is not received from a PDP periodically or in
+response to a pdp_update, pdp-state_change, or pdp_health_check message in a certain configurable time, then the PAP
+assumes the PDP has failed.
+
+A PDP may be preconfigured with its PDP group, PDP subgroup, and policies. If the PDP group, subgroup, or any policy
+sent to the PAP in a *PDP_STATUS* message is unknown to the PAP, the PAP locks the PDP in state PASSIVE.
+
+.. code-block:: yaml
+ :caption: PDP_STATUS message from an XACML PDP running control loop policies
+ :linenos:
+
+ pdp_status:
+ name: xacml_1
+ version: 1.2.3
+ pdp_type: xacml
+ state: active
+ healthy: true
+ description: XACML PDP running control loop policies
+ pdp_group: onap.pdpgroup.controlloop.operational
+ pdp_subgroup: xacml
+ supported_policy_types:
+ - onap.policies.controlloop.guard.FrequencyLimiter
+ - onap.policies.controlloop.guard.BlackList
+ - onap.policies.controlloop.guard.MinMax
+ policies:
+ - onap.policies.controlloop.guard.frequencylimiter.EastRegion:
+ policy_type: onap.policies.controlloop.guard.FrequencyLimiter
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ - onap.policies.controlloop.guard.blacklist.eastRegion:
+ policy_type: onap.policies.controlloop.guard.BlackList
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ - onap.policies.controlloop.guard.minmax.eastRegion:
+ policy_type: onap.policies.controlloop.guard.MinMax
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ instance: xacml_1
+ deployment_instance_info:
+ node_address: xacml_1_pod
+ # Other deployment instance info
+ statistics:
+ policy_download_count: 0
+ policy_download_success_count: 0
+ policy_download_fail_count: 0
+ policy_executed_count: 123
+ policy_executed_success_count: 122
+ policy_executed_fail_count: 1
+
+.. code-block:: yaml
+ :caption: PDP_STATUS message from a Drools PDP running control loop policies
+ :linenos:
+
+ pdp_status:
+ name: drools_2
+ version: 2.3.4
+ pdp_type: drools
+ state: safe
+ healthy: true
+ description: Drools PDP running control loop policies
+ pdp_group: onap.pdpgroup.controlloop.operational
+ pdp_subgroup: drools
+ supported_policy_types:
+ - onap.controllloop.operational.drools.vCPE
+ - onap.controllloop.operational.drools.vFW
+ policies:
+ - onap.controllloop.operational.drools.vcpe.EastRegion:
+ policy_type: onap.controllloop.operational.drools.vCPE
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ - onap.controllloop.operational.drools.vfw.EastRegion:
+ policy_type: onap.controllloop.operational.drools.vFW
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ instance: drools_2
+ deployment_instance_info:
+ node_address: drools_2_pod
+ # Other deployment instance info
+ statistics:
+ policy_download_count: 3
+ policy_download_success_count: 3
+ policy_download_fail_count: 0
+ policy_executed_count: 123
+ policy_executed_success_count: 122
+ policy_executed_fail_count: 1
+ response:
+ response_to: PDP_HEALTH_CHECK
+ response_status: SUCCESS
+
+.. code-block:: yaml
+ :caption: PDP_STATUS message from an APEX PDP running control loop policies
+ :linenos:
+
+ pdp_status:
+ name: drools_2
+ version: 2.3.4
+ pdp_type: drools
+ state: safe
+ healthy: true
+ description: Drools PDP running control loop policies
+ pdp_group: onap.pdpgroup.controlloop.operational
+ pdp_subgroup: drools
+ supported_policy_types:
+ - onap.controllloop.operational.drools.vCPE
+ - onap.controllloop.operational.drools.vFW
+ policies:
+ - onap.controllloop.operational.drools.vcpe.EastRegion:
+ policy_type: onap.controllloop.operational.drools.vCPE
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ - onap.controllloop.operational.drools.vfw.EastRegion:
+ policy_type: onap.controllloop.operational.drools.vFW
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ instance: drools_2
+ deployment_instance_info:
+ node_address: drools_2_pod
+ # Other deployment instance info
+ statistics:
+ policy_download_count: 3
+ policy_download_success_count: 3
+ policy_download_fail_count: 0
+ policy_executed_count: 123
+ policy_executed_success_count: 122
+ policy_executed_fail_count: 1
+ response:
+ response_to: PDP_HEALTH_CHECK
+ response_status: SUCCESS
+
+.. code-block:: yaml
+ :caption: PDP_STATUS message from an XACML PDP running monitoring policies
+ :linenos:
+
+ pdp_status:
+ name: xacml_1
+ version: 1.2.3
+ pdp_type: xacml
+ state: active
+ healthy: true
+ description: XACML PDP running monitoring policies
+ pdp_group: onap.pdpgroup.Monitoring
+ pdp_subgroup: xacml
+ supported_policy_types:
+ - onap.monitoring.cdap.tca.hi.lo.app
+ policies:
+ - onap.scaleout.tca:message
+ policy_type: onap.policies.monitoring.cdap.tca.hi.lo.app
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ instance: xacml_1
+ deployment_instance_info:
+ node_address: xacml_1_pod
+ # Other deployment instance info
+ statistics:
+ policy_download_count: 0
+ policy_download_success_count: 0
+ policy_download_fail_count: 0
+ policy_executed_count: 123
+ policy_executed_success_count: 122
+ policy_executed_fail_count: 1
+
+2 PDP API for PAPs
+==================
+
+The purpose of this API is for the PAP to load and update policies on PDPs and to change the state of PDPs. It also
+allows the PAP to order health checks to run on PDPs. The PAP sends *PDP_UPDATE*, *PDP_STATE_CHANGE*, and
+*PDP_HEALTH_CHECK* messages to PDPs using the *POLICY_PAP_PDP* DMaaP topic. PDPs listen on this topic for messages.
+
+The PAP can set the scope of *PDP_STATE_CHANGE* and *PDP_HEALTH_CHECK* messages:
+
+- PDP Group: If a PDP group is specified in a message, then the PDPs in that PDP group respond to the message and all
+ other PDPs ignore it.
+
+- PDP Group and subgroup: If a PDP group and subgroup are specified in a message, then only the PDPs of that subgroup
+ in the PDP group respond to the message and all other PDPs ignore it.
+
+- Single PDP: If the name of a PDP is specified in a message, then only that PDP responds to the message and all other
+ PDPs ignore it.
+
+Note: *PDP_UPDATE* messages must be issued individually to PDPs because the *PDP_UPDATE* operation can change the PDP
+group to which a PDP belongs.
+
+2.1 PDP Update
+--------------
+
+The *PDP_UPDATE* operation allows the PAP to modify the PDP group to which a PDP belongs and the policies in a PDP.
+
+The following examples illustrate how the operation is used.
+
+.. code-block:: yaml
+ :caption: PDP_UPDATE message to upgrade XACML PDP control loop policies to version 1.0.1
+ :linenos:
+
+ pdp_update:
+ name: xacml_1
+ pdp_type: xacml
+ description: XACML PDP running control loop policies, Upgraded
+ pdp_group: onap.pdpgroup.controlloop.operational
+ pdp_subgroup: xacml
+ policies:
+ - onap.policies.controlloop.guard.frequencylimiter.EastRegion:
+ policy_type: onap.policies.controlloop.guard.FrequencyLimiter
+ policy_type_version: 1.0.1
+ properties:
+ # Omitted for brevity
+ - onap.policies.controlloop.guard.blackList.EastRegion:
+ policy_type: onap.policies.controlloop.guard.BlackList
+ policy_type_version: 1.0.1
+ properties:
+ # Omitted for brevity
+ - onap.policies.controlloop.guard.minmax.EastRegion:
+ policy_type: onap.policies.controlloop.guard.MinMax
+ policy_type_version: 1.0.1
+ properties:
+ # Omitted for brevity
+
+.. code-block:: yaml
+ :caption: PDP_UPDATE message to a Drools PDP to add an extra control loop policy
+ :linenos:
+
+ pdp_update:
+ name: drools_2
+ pdp_type: drools
+ description: Drools PDP running control loop policies, extra policy added
+ pdp_group: onap.pdpgroup.controlloop.operational
+ pdp_subgroup: drools
+ policies:
+ - onap.controllloop.operational.drools.vcpe.EastRegion:
+ policy_type: onap.controllloop.operational.drools.vCPE
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ - onap.controllloop.operational.drools.vfw.EastRegion:
+ policy_type: onap.controllloop.operational.drools.vFW
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+ - onap.controllloop.operational.drools.vfw.WestRegion:
+ policy_type: onap.controllloop.operational.drools.vFW
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+
+.. code-block:: yaml
+ :caption: PDP_UPDATE message to an APEX PDP to remove a control loop policy
+ :linenos:
+
+ pdp_update:
+ name: apex_3
+ pdp_type: apex
+ description: APEX PDP updated to remove a control loop policy
+ pdp_group: onap.pdpgroup.controlloop.operational
+ pdp_subgroup: apex
+ policies:
+ - onap.controllloop.operational.apex.bbs.EastRegion:
+ policy_type: onap.controllloop.operational.apex.BBS
+ policy_type_version: 1.0.0
+ properties:
+ # Omitted for brevity
+
+2.2 PDP State Change
+--------------------
+
+The *PDP_STATE_CHANGE* operation allows the PAP to order state changes on PDPs in PDP groups and subgroups. The
+following examples illustrate how the operation is used.
+
+.. code-block:: yaml
+ :caption: Change the state of all control loop Drools PDPs to ACTIVE
+ :linenos:
+
+ pdp_state_change:
+ state: active
+ pdp_group: onap.pdpgroup.controlloop.Operational
+ pdp_subgroup: drools
+
+.. code-block:: yaml
+ :caption: Change the state of all monitoring PDPs to SAFE
+ :linenos:
+
+ pdp_state_change:
+ state: safe
+ pdp_group: onap.pdpgroup.Monitoring
+
+.. code-block:: yaml
+ :caption: Change the state of a single APEX PDP to TEST
+ :linenos:
+
+ pdp_state_change:
+ state: test
+ name: apex_3
+
+2.3 PDP Health Check
+--------------------
+
+The *PDP_HEALTH_CHECK* operation allows the PAP to order health checks on PDPs in PDP groups and subgroups. The
+following examples illustrate how the operation is used.
+
+.. code-block:: yaml
+ :caption: Perform a health check on all control loop Drools PDPs
+ :linenos:
+
+ pdp_health_check:
+ pdp_group: onap.pdpgroup.controlloop.Operational
+ pdp_subgroup: drools
+
+.. code-block:: yaml
+ :caption: perform a health check on all monitoring PDPs
+ :linenos:
+
+ pdp_health_check:
+ pdp_group: onap.pdpgroup.Monitoring
+
+.. code-block:: yaml
+ :caption: Perform a health check on a single APEX PDP
+ :linenos:
+
+ pdp_health_check:
+ name: apex_3
diff --git a/docs/pap/images/PolicyImplPDPSubGroup.svg b/docs/pap/images/PolicyImplPDPSubGroup.svg
new file mode 100644
index 00000000..8987ed22
--- /dev/null
+++ b/docs/pap/images/PolicyImplPDPSubGroup.svg
@@ -0,0 +1,2 @@
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<svg xmlns="http://www.w3.org/2000/svg" style="background-color: rgb(255, 255, 255);" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="761px" height="406px" viewBox="-0.5 -0.5 761 406" content="&lt;mxfile modified=&quot;2019-05-29T13:20:08.554Z&quot; host=&quot;wiki.onap.org&quot; agent=&quot;Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:67.0) Gecko/20100101 Firefox/67.0&quot; version=&quot;10.6.3&quot; etag=&quot;Rm5bP2sccrUGuJUsMc-9&quot; type=&quot;atlas&quot;&gt;&lt;mxAtlasLibraries/&gt;&lt;diagram id=&quot;37cad116-6517-64d4-de82-baa76c18656a&quot; name=&quot;Page-1&quot;&gt;5Vxbj5s6EP41eUwFmFses0m756hbaaWtdLZPFQlOsEpwZJxN0l9/bDAQsNnQDSGQtg8FX8b4m/E347HTEZhtDo/E2wbfsA/DkaH5hxGYjwxDBxOL/cNLjqLE0Ny0ZE2QL8qKghf0G4pCTZTukA/jUkOKcUjRtly4xFEEl7RU5hGC9+VmKxyWR916azGiVhS8LL0QSs3+Qz4N0lLXOmn9D0TrIBtZ10TNwlv+WhO8i8R4IwOskj9p9cbLZIn2ceD5eH9SBD6PwIxgTNOnzWEGQw5uBlva70tNbf7dBEa0SQcz7fDmhTsx9ef58yObwFZ8Hz1mmCSzgryfNgIP+wBR+LL1lrx2z8yAlQV0E7I3nT2+QUIRw3MaonXEyijmDWJK8C84wyEmiUzw4PK/rEb+bjEVLggeTorEPB4h3kBKjqyJqB3rpgBVWN1YWOG+0KCe4R6caA9kVucJq1nnsgvk2IMATw2kpQLyZbcYKpagjKWhKcDUFGBOWsDSvnMsG0LptgClI0Ep4bcuUG0yz5x0vUV4yqHvzN8oz9+S5+8opm+2MH1XZUnj18tsaIXC8MRWGLkby6XKinx7YVu20oqcGnRrUdTLGGavJxjaKmprAcPJ8DHsAKVMITdeaVaZaYC81FwFAFYbAOgSANxOpre3k1w1jRebUXV+nS023bgfFG9HWTq4AxS7wEkZ/t9PpKXrHYZaurwFuIUHqCBgyqvuah5AGbeP5z1YdVYNwH30AHLIPlgUb+gB1JH/sFDsACdTXrPTpAFDK+btIj7AiNu/HbJxHxB7WPOHkqNI69hgeTXrQna8Mw0gR9zbQKUUHKLl8d/NNlQLqWgrDrwtf4wwhefVFad5Rebl6tyRJ95CuOLjxUwUitbfed18bMsa9y3o+qZK466xAHaNxi9cNqo8FrgSh5sNEgYw8qc8x5roIeJ68L04SNaQXlYAg4AcX8XaSl5+8JdPFn89IPqatWPPaY1hqcCdOHPNcd4DN8Y7shTfJ0yaemQNadnMoZ/lfc8vOesdiAkMPYreytliFe5ihGeM2AcXbhpU/AtwrLKMdD6iW6E+WVKeOskkGRVJKQySpMQQ8ok3sw2ZUy+xDaX+W1B/ll7qia71iVtW0Ec1LYV21vU0Led8vic0zkg/JfaI0STvQGOJ0nmzM6yuoTj3DLsI8VniFVcjI+hE8F9J+xX9ThoeX7RB+5mMW9G+08K6z0K+Eu9PesUFY6usYtf9GBfYFSZwr8YElpzVm34sGkyWPI8kv+4WkESQwvhE0KJoWZE8h9sQHzdc80rBedmi3ajRHRh7jIFWCRuNT00DR6vekBsziJxKaoNB9HoG0boIHDP77wuB1BylXUogFRfSIn8oz8XjfHfoxSeM0IwQnrEfN6cCKTgR4omi29++75QoRFfkvZQxiNkGgyhSETWu5j0/k6RY45qOZ3wUgw5RlDgmitkKCCBpxxQGZwm6WT5JHOdp8y6yENaVshCpl8j9yek2tPAtP4RvudCZmApn0rMsRN3FjD/fmlb8SXWP26I/kXMQM8z0icMnjLcyuw/2NptRjeashlQM2rg3Y8kJgNnTz+mWfbsK4sGeGEonFK4to6y85uZeDnK2aMogP+484t83ysyZqLYmyoPZNnCW97AShNc+mJUOFB1p/te6A2cb0vR7coHL/mNLut2Boq2+UjIsFLvAqUEe4OqLTa9cgzOAgm+udQ3CVm55+3D5KNfNAK5B2OrLJINE8Yaspb5MMiwUu8BJsa14+jknGIfxfcdibtPfdYAWUJZ3Fd37huopqqFKk1/LN2QxXv+uJeW6GYBvcNRXzQeJ4u18g6PeFwwLxS5wkiP/bzhCFJPkqsLdZJyA9PPJhhknvY1dqiNHzWdQHqwLBpVbAB2nQxw5su7cC4NKwrjDdIijDol7sJHPFTME59HfX1Y2R7F9nNhr8dv99Hij+B8SwOf/AQ==&lt;/diagram&gt;&lt;/mxfile&gt;"><defs/><g><rect x="160" y="95" width="120" height="310" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(190.5,102.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 60px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDPGroup</div></div></foreignObject><text x="30" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDPGroup</text></switch></g><rect x="170" y="305" width="100" height="90" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(179.5,312.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDPSubGroup</div></div></foreignObject><text x="41" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDPSubGroup</text></switch></g><rect x="170" y="125" width="100" height="80" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(179.5,132.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDPSubGroup</div></div></foreignObject><text x="41" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDPSubGroup</text></switch></g><rect x="190" y="165" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(201.5,173.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-X</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-X</text></switch></g><rect x="180" y="155" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(191.5,163.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-X</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-X</text></switch></g><rect x="195" y="355" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(206.5,363.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-A</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-A</text></switch></g><rect x="185" y="345" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(196.5,353.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-A</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-A</text></switch></g><rect x="175" y="335" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(186.5,343.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-A</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-A</text></switch></g><rect x="170" y="215" width="100" height="80" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(179.5,222.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDPSubGroup</div></div></foreignObject><text x="41" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDPSubGroup</text></switch></g><rect x="200" y="260" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(210.5,268.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 39px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-D</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-D</text></switch></g><rect x="190" y="250" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(200.5,258.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 39px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-D</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-D</text></switch></g><rect x="180" y="240" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(190.5,248.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 39px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-D</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-D</text></switch></g><path d="M 310 95 L 426 95 L 440 109 L 440 145 L 310 145 L 310 95 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><path d="M 426 95 L 426 109 L 440 109" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(312.5,96.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="126" height="41" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 126px; white-space: normal; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">All PDPs in a <i>PDPSubGroup</i> run the same <i>PolicyImpl</i></div></div></foreignObject><text x="63" y="27" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 270 145 L 310 120" fill="none" stroke="#97d077" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 120 243 L 180 255" fill="none" stroke="#97d077" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 320 195 L 426 195 L 440 209 L 440 245 L 320 245 L 320 195 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><path d="M 426 195 L 426 209 L 440 209" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(322.5,196.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="116" height="41" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 116px; white-space: normal; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">The PDP running its<i> PolicyImpl</i> is the unit of scaling</div></div></foreignObject><text x="58" y="27" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 240 263 L 320 220" fill="none" stroke="#97d077" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 0 97.5 L 122 97.5 L 130 105.5 L 130 152.5 L 0 152.5 L 0 97.5 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><path d="M 122 97.5 L 122 105.5 L 130 105.5" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(2.5,99.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="126" height="41" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 126px; white-space: normal; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">A <i>PDPSubGroup</i> is a Kubernetes <b><i>Deployment</i></b></div></div></foreignObject><text x="63" y="27" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 170 145 L 130 125" fill="none" stroke="#97d077" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><path d="M 0 220 L 106 220 L 120 234 L 120 265 L 0 265 L 0 220 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><path d="M 106 220 L 106 234 L 120 234" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(2.5,221.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="116" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 116px; white-space: normal; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDPs run as Kubernets <b><i>Pods</i></b><i><br /></i></div></div></foreignObject><text x="58" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 155 0 L 281 0 L 285 4 L 285 50 L 155 50 L 155 0 Z" fill="#d5e8d4" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><path d="M 281 0 L 281 4 L 285 4" fill="none" stroke="#82b366" stroke-miterlimit="10" pointer-events="none"/><g transform="translate(157.5,1.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="126" height="41" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 126px; white-space: normal; overflow-wrap: normal;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">A <i>PDPGroup</i> groups <i>PDPSubGroup</i> entities together</div></div></foreignObject><text x="63" y="27" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">[Not supported by viewer]</text></switch></g><path d="M 220 95 L 188 50" fill="none" stroke="#97d077" stroke-miterlimit="10" stroke-dasharray="3 3" pointer-events="none"/><rect x="500" y="50" width="120" height="340" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(525.5,57.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="68" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 69px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">ControlLoop<br />PDPGroup</div></div></foreignObject><text x="34" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">ControlLoop&lt;br&gt;PDPGroup</text></switch></g><rect x="510" y="286" width="100" height="98" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(519.5,293.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">CL_Apex<br />PDPSubGroup</div></div></foreignObject><text x="41" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">CL_Apex&lt;br&gt;PDPSubGroup</text></switch></g><rect x="510" y="89.5" width="100" height="88" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(519.5,97.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">CL_Guard<br />PDPSubGroup</div></div></foreignObject><text x="41" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">CL_Guard&lt;br&gt;PDPSubGroup</text></switch></g><rect x="530" y="137" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(541.5,145.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-X</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-X</text></switch></g><rect x="520" y="127" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(531.5,135.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-X</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-X</text></switch></g><rect x="535" y="343.5" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(546.5,352.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-A</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-A</text></switch></g><rect x="525" y="333.5" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(536.5,342.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-A</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-A</text></switch></g><rect x="515" y="323.5" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(526.5,332.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-A</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-A</text></switch></g><rect x="510" y="185" width="100" height="93" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(519.5,192.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">CL_Drools<br />PDPSubGroup</div></div></foreignObject><text x="41" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">CL_Drools&lt;br&gt;PDPSubGroup</text></switch></g><rect x="540" y="242.5" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(550.5,251.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 39px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-D</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-D</text></switch></g><rect x="530" y="232.5" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(540.5,241.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 39px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-D</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-D</text></switch></g><rect x="520" y="222.5" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(530.5,231.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="38" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 39px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-D</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-D</text></switch></g><rect x="640" y="50" width="120" height="140" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(670.5,57.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="59" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 60px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Monitoring<br />PDPGroup</div></div></foreignObject><text x="30" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Monitoring&lt;br&gt;PDPGroup</text></switch></g><rect x="650" y="89.5" width="100" height="88" fill="#ffffff" stroke="#b8b8b8" pointer-events="none"/><g transform="translate(659.5,97.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="81" height="27" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 82px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">Monitoring<br />PDPSubGroup</div></div></foreignObject><text x="41" y="20" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">Monitoring&lt;br&gt;PDPSubGroup</text></switch></g><rect x="670" y="137" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(681.5,145.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-X</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-X</text></switch></g><rect x="660" y="127" width="60" height="30" fill="#fff2cc" stroke="#d6b656" pointer-events="none"/><g transform="translate(671.5,135.5)"><switch><foreignObject style="overflow:visible;" pointer-events="all" width="37" height="12" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"><div xmlns="http://www.w3.org/1999/xhtml" style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(0, 0, 0); line-height: 1.2; vertical-align: top; width: 38px; white-space: nowrap; overflow-wrap: normal; text-align: center;"><div xmlns="http://www.w3.org/1999/xhtml" style="display:inline-block;text-align:inherit;text-decoration:inherit;">PDP-X</div></div></foreignObject><text x="19" y="12" fill="#000000" text-anchor="middle" font-size="12px" font-family="Helvetica">PDP-X</text></switch></g></g></svg> \ No newline at end of file
diff --git a/docs/pap/pap.rst b/docs/pap/pap.rst
index bca9334f..21b5b42b 100644
--- a/docs/pap/pap.rst
+++ b/docs/pap/pap.rst
@@ -9,29 +9,78 @@ Policy Administration Point (PAP) Architecture
.. contents::
:depth: 3
-The PAP keeps track of PDPs, supporting the deployment of PDP groups and the deployment of a *policy set* across those
-PDP groups. Policies are created using the Policy API, but are deployed via the PAP.
+.. toctree::
+ InternalPapPdp.rst
-A PAP is stateless in a RESTful sense, using the database (persistent storage) to track PDPs and the deployment of
-policies to those PDPs. In short, policy management on PDPs is the responsibility of PAPs; management of policy sets or
-policies by any other manner is not permitted.
+The Policy Administration Point (PAP) keeps track of PDPs, supporting the deployment of PDP groups and the deployment
+of policies across those PDP groups. Policies are created using the Policy API, but are deployed via the PAP.
+
+The PAP is stateless in a RESTful sense, using the database (persistent storage) to track PDPs and the deployment of
+policies to those PDPs. In short, policy management on PDPs is the responsibility of PAP; management of policies by
+any other manner is not permitted.
Because the PDP is the main unit of scalability in the Policy Framework, the framework is designed to allow PDPs in a
PDP group to arbitrarily appear and disappear and for policy consistency across all PDPs in a PDP group to be easily
maintained. The PAP is responsible for controlling the state across the PDPs in a PDP group. The PAP interacts with the
-Policy database and transfers policy sets to PDPs.
-
-There are a number of rules for PDP group and PDP state management:
-
-1. Only one version of a PDP group may be ACTIVE at any time
-
-2. If a PDP group with a certain version is ACTIVE and a later version of the same PDP group is activated, then the
- system upgrades the PDP group
-
-3. If a PDP group with a certain version is ACTIVE and an earlier version of the same PDP group is activated, then the
- system downgrades the PDP group
-
-4. There is no restriction on the number of PASSIVE versions of a PDP group that can exist in the system
+policy database and transfers policies to PDPs.
+
+The unit of execution and scaling in the Policy Framework is a *PolicyImpl* entity. A *PolicyImpl* entity runs on a PDP.
+As is explained above, a *PolicyImpl* entity is a *PolicyTypeImpl* implementation parameterized with a TOSCA *Policy*.
+
+.. image:: images/PolicyImplPDPSubGroup.svg
+
+In order to achieve horizontal scalability, we group the PDPs running instances of a given *PolicyImpl* entity logically
+together into a *PDPSubGroup*. The number of PDPs in a *PDPSubGroup* can then be scaled up and down using Kubernetes. In
+other words, all PDPs in a subgroup run the same *PolicyImpl*, that is the same policy template implementation (in
+XACML, Drools, or APEX) with the same parameters.
+
+The figure above shows the layout of *PDPGroup* and *PDPSubGroup* entities. The figure shows examples of PDP groups for
+Control Loop and Monitoring policies on the right.
+
+The health of PDPs is monitored by the PAP in order to alert operations teams managing policies. The PAP manages the life
+cycle of policies running on PDPs.
+
+The table below shows the deployment methods in which *PolicyImpl* entities can be deployed to PDP Subgroups.
+
+========== =========================================== ============================== ==================================
+**Method** **Description** **Advantages** **Disadvantages**
+========== =========================================== ============================== ==================================
+Cold The *PolicyImpl* (*PolicyTypeImpl* and No run time configuration Very restrictive, no run time
+ TOSCA *Policy*) are predeployed on the PDP. required and run time configuration of PDPs is possible.
+ PDP is fully configured and ready to administration is simple.
+ execute when started.
+
+ PDPs register with the PAP when they
+ start, providing the *pdpGroup* they
+ have been preconfigured with.
+
+Warm The *PolicyTypeImpl* entity is predeployed The configuration, parameters, Administration and management is
+ on the PDP. A TOSCA *Policy* may be loaded and PDP group of PDPs may be required. The configuration and
+ at startup. The PDP may be configured or changed at run time by loading life cycle of the TOSCA policies
+ reconfigured with a new or updated TOSCA or updating a TOSCA *Policy* can change at run time and must be
+ *Policy* at run time. into the PDP. administered and managed.
+
+ PDPs register with the PAP when they start, Support TOSCA *Policy* entity
+ providing the *pdpGroup* they have been life cycle managgement is
+ predeployed with if any. The PAP may update supported, allowing features
+ the TOSCA *Policy* on a PDP at any time such as *PolicyImpl* Safe Mode
+ after registration. and *PolicyImpl* retirement.
+
+Hot The *PolicyImpl* (*PolicyTypeImpl* and The policy logic, rules, Administration and management is
+ TOSCA *Policy*) are deployed at run time. configuration, parameters, and more complex. The *PolicyImpl*
+ The *PolicyImpl* (*PolicyTypeImpl* and PDP group of PDPs may be itself and its configuration and
+ TOSCA *Policy*) may be loaded at startup. changed at run time by loading life cycle as well as the life
+ The PDP may be configured or reconfigured or updating a TOSCA *Policy* cycle of the TOSCA policies can
+ with a new or updated *PolicyTypeImpl* and *PolicyTypeImpl* into the change at run time and must be
+ and/or TOSCA *Policy* at run time. PDP. administered and managed.
+
+ PDPs register with the PAP when they Lifecycle management of TOSCA
+ start, providing the *pdpGroup* they have *Policy* entities and
+ been preconfigured with if any. The PAP may *PolicyTypeImpl* entites is
+ update the TOSCA *Policy* and supported, allowing features
+ *PolicyTypeImpl* on a PDP at any time after such as *PolicyImpl* Safe Mode
+ registration and *PolicyImpl* retirement.
+========== =========================================== ============================== ==================================
1 APIs
@@ -59,13 +108,17 @@ PAP supports the operations listed in the following table, via its REST API:
:widths: 25,70
"Health check", "Queries the health of the PAP"
+ "Consolidated healthcheck", "Queries the health of all policy components"
"Statistics", "Queries various statistics"
"PDP state change", "Changes the state of all PDPs in a PDP Group"
"PDP Group create/update", "Creates/updates PDP Groups"
"PDP Group delete", "Deletes a PDP Group"
"PDP Group query", "Queries all PDP Groups"
+ "Deployment update", "Deploy/undeploy one or more policies in specified PdpGroups"
"Deploy policy", "Deploys one or more policies to the PDPs"
"Undeploy policy", "Undeploys a policy from the PDPs"
+ "Policy deployment status", "Queries the status of all deployed policies"
+ "PDP statistics", "Queries the statistics of PDPs"
1.2 DMaaP API
-------------
@@ -124,6 +177,18 @@ Here is a sample response:
.. literalinclude:: response/health-check-pap-resp.json
:language: json
+.. swaggerv2doc:: swagger/consolidated-healthcheck-pap.json
+
+This operation performs a health check of all policy components. The response
+contains the health check result of each component. The consolidated health check
+is reported as healthy only if all the components are healthy, otherwise the
+"healthy" flag is marked as false.
+
+Here is a sample response:
+
+.. literalinclude:: response/consolidated-healthcheck-pap-resp.json
+ :language: json
+
.. swaggerv2doc:: swagger/statistics-pap.json
This operation allows statistics for PDP groups, PDP subgroups, and individual PDPs to be retrieved.
@@ -223,20 +288,36 @@ This operation allows policies to be undeployed from PDP groups.
.. note::
Due to current limitations, a fully qualified policy version must always be specified.
-
-3 Future Features
-=================
-3.1 Order Health Check on PDPs
-==============================
+.. swaggerv2doc:: swagger/deployed-policy-pap.json
-This operation will allow a PDP group health check to be ordered on PDP groups and on individual PDPs. The operation
-will return a HTTP status code of *202: Accepted* if the health check request has been accepted by the PAP. The PAP will
-then order execution of the health check on the PDPs.
+This operation allows the deployed policies to be listed together with their respective deployment status.
+The result can be filtered based on policy name & version.
+
+Here is a sample response:
+
+.. literalinclude:: response/deployed-policy-pap-resp.json
+ :language: json
+
+.. swaggerv2doc:: swagger/pdp-statistics-pap.json
+
+This operation allows the PDP statistics to be retrieved for all registered PDPs.
+The result can be filtered based on PDP group, PDP subgroup & PDP instance.
+
+Here is a sample response:
+
+.. literalinclude:: response/pdp-statistics-pap-resp.json
+ :language: json
+
+
+3 Future Features
+=================
-As health checks may be long lived operations, Health checks will be scheduled for execution by this operation. Users
-will check the result of a health check test by issuing a PDP Group Query operation and checking the *healthy* field of
-PDPs.
+3.1 Disable policies in PDP
+===========================
+This operation will allow disabling individual policies running in PDP engine. It is mainly beneficial
+in scenarios where network operators/administrators want to disable a particular policy in PDP engine
+for a period of time due to a failure in the system or for scheduled maintenance.
End of Document
diff --git a/docs/pap/response/consolidated-healthcheck-pap-resp.json b/docs/pap/response/consolidated-healthcheck-pap-resp.json
new file mode 100644
index 00000000..6155bb30
--- /dev/null
+++ b/docs/pap/response/consolidated-healthcheck-pap-resp.json
@@ -0,0 +1,48 @@
+{
+ "pdps": {
+ "xacml": [
+ {
+ "instanceId": "dev-policy-xacml-pdp-5b6697c845-9j8lb",
+ "pdpState": "ACTIVE",
+ "healthy": "HEALTHY"
+ }
+ ],
+ "drools": [
+ {
+ "instanceId": "dev-drools-0",
+ "pdpState": "ACTIVE",
+ "healthy": "HEALTHY"
+ }
+ ],
+ "apex": [
+ {
+ "instanceId": "dev-policy-apex-pdp-0",
+ "pdpState": "ACTIVE",
+ "healthy": "HEALTHY",
+ "message": "Pdp Heartbeat"
+ }
+ ]
+ },
+ "healthy": true,
+ "api": {
+ "name": "Policy API",
+ "url": "https://dev-policy-api-7fb479754f-7nr5s:6969/policy/api/v1/healthcheck",
+ "healthy": true,
+ "code": 200,
+ "message": "alive"
+ },
+ "distribution": {
+ "name": "Policy SSD",
+ "url": "https://dev-policy-distribution-84854cd6c7-zn8vh:6969/healthcheck",
+ "healthy": true,
+ "code": 200,
+ "message": "alive"
+ },
+ "pap": {
+ "name": "Policy PAP",
+ "url": "https://dev-pap-79fd8f78d4-hwx7j:6969/policy/pap/v1/healthcheck",
+ "healthy": true,
+ "code": 200,
+ "message": "alive"
+ }
+} \ No newline at end of file
diff --git a/docs/pap/response/deployed-policy-pap-resp.json b/docs/pap/response/deployed-policy-pap-resp.json
new file mode 100644
index 00000000..fa768a1b
--- /dev/null
+++ b/docs/pap/response/deployed-policy-pap-resp.json
@@ -0,0 +1,38 @@
+[
+ {
+ "policy-type": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+ "policy-type-version": "1.0.0",
+ "policy-id": "MICROSERVICE_vFW_CDS_Service_v2_0_app_1_0_0_I95",
+ "policy-version": "1.0.0",
+ "success-count": 1,
+ "failure-count": 0,
+ "incomplete-count": 0
+ },
+ {
+ "policy-type": "onap.policies.controlloop.Operational",
+ "policy-type-version": "1.0.0",
+ "policy-id": "OPERATIONAL_vFW_CDS_Service_v2_0_OperationalPolicyLegacy_1_0_0_Ly6",
+ "policy-version": "1.0.0",
+ "success-count": 1,
+ "failure-count": 0,
+ "incomplete-count": 0
+ },
+ {
+ "policy-type": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+ "policy-type-version": "1.0.0",
+ "policy-id": "MICROSERVICE_vFW_CDS_Service_v2_0_app_1_0_0_WNX",
+ "policy-version": "1.0.0",
+ "success-count": 1,
+ "failure-count": 0,
+ "incomplete-count": 0
+ },
+ {
+ "policy-type": "onap.policies.controlloop.operational.common.Drools",
+ "policy-type-version": "1.0.0",
+ "policy-id": "OPERATIONAL_vFW_CDS_Service_v2_0_Drools_1_0_0_6SN",
+ "policy-version": "1.0.0",
+ "success-count": 1,
+ "failure-count": 0,
+ "incomplete-count": 0
+ }
+] \ No newline at end of file
diff --git a/docs/pap/response/pdp-statistics-pap-resp.json b/docs/pap/response/pdp-statistics-pap-resp.json
new file mode 100644
index 00000000..77b03444
--- /dev/null
+++ b/docs/pap/response/pdp-statistics-pap-resp.json
@@ -0,0 +1,45 @@
+{
+ "defaultGroup": {
+ "apex": [
+ {
+ "pdpInstanceId": "dev-policy-apex-pdp-0",
+ "timeStamp": "Apr 29, 2020, 6:15:29 PM",
+ "pdpGroupName": "defaultGroup",
+ "pdpSubGroupName": "apex",
+ "policyDeployCount": 0,
+ "policyDeploySuccessCount": 0,
+ "policyDeployFailCount": 0,
+ "policyExecutedCount": 0,
+ "policyExecutedSuccessCount": 0,
+ "policyExecutedFailCount": 0,
+ "engineStats": []
+ },
+ {
+ "pdpInstanceId": "dev-policy-apex-pdp-0",
+ "timeStamp": "Apr 29, 2020, 6:17:29 PM",
+ "pdpGroupName": "defaultGroup",
+ "pdpSubGroupName": "apex",
+ "policyDeployCount": 0,
+ "policyDeploySuccessCount": 0,
+ "policyDeployFailCount": 0,
+ "policyExecutedCount": 0,
+ "policyExecutedSuccessCount": 0,
+ "policyExecutedFailCount": 0,
+ "engineStats": []
+ },
+ {
+ "pdpInstanceId": "dev-policy-apex-pdp-0",
+ "timeStamp": "Apr 29, 2020, 6:19:29 PM",
+ "pdpGroupName": "defaultGroup",
+ "pdpSubGroupName": "apex",
+ "policyDeployCount": 0,
+ "policyDeploySuccessCount": 0,
+ "policyDeployFailCount": 0,
+ "policyExecutedCount": 0,
+ "policyExecutedSuccessCount": 0,
+ "policyExecutedFailCount": 0,
+ "engineStats": []
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/docs/pap/swagger/consolidated-healthcheck-pap.json b/docs/pap/swagger/consolidated-healthcheck-pap.json
new file mode 100644
index 00000000..2044bc8a
--- /dev/null
+++ b/docs/pap/swagger/consolidated-healthcheck-pap.json
@@ -0,0 +1,101 @@
+{
+ "swagger": "2.0",
+ "basePath": "/",
+ "tags": [
+ {
+ "name": "Consolidated Healthcheck"
+ }
+ ],
+ "schemes": [
+ "http",
+ "https"
+ ],
+ "consumes": [
+ "application/json",
+ "application/yaml"
+ ],
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "paths": {
+ "/policy/pap/v1/components/healthcheck": {
+ "get": {
+ "tags": [
+ "Consolidated Healthcheck"
+ ],
+ "summary": "Returns health status of all policy components, including PAP, API, Distribution, and PDPs",
+ "description": "Queries health status of all policy components, returning all policy components health status",
+ "operationId": "policyComponentsHealthCheck",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Frankfurt"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "basicAuth": {
+ "description": "",
+ "type": "basic"
+ }
+ }
+} \ No newline at end of file
diff --git a/docs/pap/swagger/deployed-policy-pap.json b/docs/pap/swagger/deployed-policy-pap.json
new file mode 100644
index 00000000..09280c7b
--- /dev/null
+++ b/docs/pap/swagger/deployed-policy-pap.json
@@ -0,0 +1,322 @@
+{
+ "swagger": "2.0",
+ "basePath": "/",
+ "tags": [
+ {
+ "name": "Policy Deployment Status"
+ }
+ ],
+ "schemes": [
+ "http",
+ "https"
+ ],
+ "consumes": [
+ "application/json",
+ "application/yaml"
+ ],
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "paths": {
+ "/policy/pap/v1/policies/deployed": {
+ "get": {
+ "tags": [
+ "Policy Deployment Status"
+ ],
+ "summary": "Queries status of all deployed policies",
+ "description": "Queries status of all deployed policies, returning success and failure counts of the PDPs",
+ "operationId": "queryAllDeployedPolicies",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PolicyStatus"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ },
+ "/policy/pap/v1/policies/deployed/{name}": {
+ "get": {
+ "tags": [
+ "Policy Deployment Status"
+ ],
+ "summary": "Queries status of specific deployed policies",
+ "description": "Queries status of specific deployed policies, returning success and failure counts of the PDPs",
+ "operationId": "queryDeployedPolicies",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "name",
+ "in": "path",
+ "description": "Policy Id",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/PolicyStatus"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ },
+ "/policy/pap/v1/policies/deployed/{name}/{version}": {
+ "get": {
+ "tags": [
+ "Policy Deployment Status"
+ ],
+ "summary": "Queries status of a specific deployed policy",
+ "description": "Queries status of a specific deployed policy, returning success and failure counts of the PDPs",
+ "operationId": "queryDeployedPolicy",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "name",
+ "in": "path",
+ "description": "Policy Id",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "version",
+ "in": "path",
+ "description": "Policy Version",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "$ref": "#/definitions/PolicyStatus"
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "basicAuth": {
+ "description": "",
+ "type": "basic"
+ }
+ },
+ "definitions": {
+ "ToscaPolicyIdentifier": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "ToscaPolicyTypeIdentifier": {
+ "type": "object",
+ "properties": {
+ "name": {
+ "type": "string"
+ },
+ "version": {
+ "type": "string"
+ }
+ }
+ },
+ "PolicyStatus": {
+ "type": "object",
+ "properties": {
+ "policyTypeId": {
+ "type": "string"
+ },
+ "policyTypeVersion": {
+ "type": "string"
+ },
+ "policyId": {
+ "type": "string"
+ },
+ "policyVersion": {
+ "type": "string"
+ },
+ "successCount": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "failureCount": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "incompleteCount": {
+ "type": "integer",
+ "format": "int32"
+ },
+ "policy": {
+ "$ref": "#/definitions/ToscaPolicyIdentifier"
+ },
+ "policyType": {
+ "$ref": "#/definitions/ToscaPolicyTypeIdentifier"
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/docs/pap/swagger/deployments-batch-pap.json b/docs/pap/swagger/deployments-batch-pap.json
index 58289fb9..29d96941 100644
--- a/docs/pap/swagger/deployments-batch-pap.json
+++ b/docs/pap/swagger/deployments-batch-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "DeploymentsUpdate"
+ "name" : "Deployments Update"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json", "application/yaml" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps/deployments/batch" : {
"post" : {
- "tags" : [ "DeploymentsUpdate" ],
+ "tags" : [ "Deployments Update" ],
"summary" : "Updates policy deployments within specific PDP groups",
"description" : "Updates policy deployments within specific PDP groups, returning optional error details",
"operationId" : "updateGroupPolicies",
diff --git a/docs/pap/swagger/group-delete-pap.json b/docs/pap/swagger/group-delete-pap.json
index e670b5db..4b5c217c 100644
--- a/docs/pap/swagger/group-delete-pap.json
+++ b/docs/pap/swagger/group-delete-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "PdpGroupDelete"
+ "name" : "PdpGroup Delete"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps/groups/{name}" : {
"delete" : {
- "tags" : [ "PdpGroupDelete" ],
+ "tags" : [ "PdpGroup Delete" ],
"summary" : "Delete PDP Group",
"description" : "Deletes a PDP Group, returning optional error details",
"operationId" : "deleteGroup",
diff --git a/docs/pap/swagger/group-query-pap.json b/docs/pap/swagger/group-query-pap.json
index 959ecc3c..b31515c8 100644
--- a/docs/pap/swagger/group-query-pap.json
+++ b/docs/pap/swagger/group-query-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "PdpGroupQuery"
+ "name" : "PdpGroup Query"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps" : {
"get" : {
- "tags" : [ "PdpGroupQuery" ],
+ "tags" : [ "PdpGroup Query" ],
"summary" : "Query details of all PDP groups",
"description" : "Queries details of all PDP groups, returning all group details",
"operationId" : "queryGroupDetails",
diff --git a/docs/pap/swagger/groups-batch-pap.json b/docs/pap/swagger/groups-batch-pap.json
index 8a1899e3..2d02e998 100644
--- a/docs/pap/swagger/groups-batch-pap.json
+++ b/docs/pap/swagger/groups-batch-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "PdpGroupUpdate"
+ "name" : "PdpGroup Create/Update"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json", "application/yaml" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps/groups/batch" : {
"post" : {
- "tags" : [ "PdpGroupUpdate" ],
+ "tags" : [ "PdpGroup Create/Update" ],
"summary" : "Create or update PDP Groups",
"description" : "Create or update one or more PDP Groups, returning optional error details",
"operationId" : "createOrUpdateGroups",
diff --git a/docs/pap/swagger/pdp-statistics-pap.json b/docs/pap/swagger/pdp-statistics-pap.json
new file mode 100644
index 00000000..7b652adb
--- /dev/null
+++ b/docs/pap/swagger/pdp-statistics-pap.json
@@ -0,0 +1,368 @@
+{
+ "swagger": "2.0",
+ "basePath": "/",
+ "tags": [
+ {
+ "name": "PDP Statistics"
+ }
+ ],
+ "schemes": [
+ "http",
+ "https"
+ ],
+ "consumes": [
+ "application/json",
+ "application/yaml"
+ ],
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "paths": {
+ "/policy/pap/v1/pdps/statistics": {
+ "get": {
+ "tags": [
+ "PDP Statistics"
+ ],
+ "summary": "Fetch statistics for all PDP Groups and subgroups in the system",
+ "description": "Returns for all PDP Groups and subgroups statistics of the Policy Administration component",
+ "operationId": "pdpStatistics",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ },
+ "/policy/pap/v1/pdps/statistics/{group}": {
+ "get": {
+ "tags": [
+ "PDP Statistics"
+ ],
+ "summary": "Fetch current statistics for given PDP Group",
+ "description": "Returns statistics for given PDP Group of the Policy Administration component",
+ "operationId": "pdpGroupStatistics",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ },
+ {
+ "name": "group",
+ "in": "path",
+ "description": "PDP Group Name",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ },
+ "/policy/pap/v1/pdps/statistics/{group}/{type}": {
+ "get": {
+ "tags": [
+ "PDP Statistics"
+ ],
+ "summary": "Fetch statistics for the specified subgroup",
+ "description": "Returns statistics for the specified subgroup of the Policy Administration component",
+ "operationId": "pdpSubGroupStatistics",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ },
+ {
+ "name": "group",
+ "in": "path",
+ "description": "PDP Group Name",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "type",
+ "in": "path",
+ "description": "PDP SubGroup type",
+ "required": true,
+ "type": "string"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ },
+ "/policy/pap/v1/pdps/statistics/{group}/{type}/{pdp}": {
+ "get": {
+ "tags": [
+ "PDP Statistics"
+ ],
+ "summary": "Fetch statistics for the specified pdp",
+ "description": "Returns statistics for the specified pdp of the Policy Administration component",
+ "operationId": "pdpInstanceStatistics",
+ "produces": [
+ "application/json",
+ "application/yaml"
+ ],
+ "parameters": [
+ {
+ "name": "X-ONAP-RequestID",
+ "in": "header",
+ "description": "RequestID for http transaction",
+ "required": false,
+ "type": "string",
+ "format": "uuid"
+ },
+ {
+ "name": "group",
+ "in": "path",
+ "description": "PDP Group Name",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "type",
+ "in": "path",
+ "description": "PDP SubGroup type",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "pdp",
+ "in": "path",
+ "description": "PDP Instance name",
+ "required": true,
+ "type": "string"
+ },
+ {
+ "name": "recordCount",
+ "in": "query",
+ "description": "Record Count",
+ "required": false,
+ "type": "integer",
+ "default": 0,
+ "format": "int32"
+ }
+ ],
+ "responses": {
+ "200": {
+ "description": "successful operation",
+ "headers": {
+ "X-MinorVersion": {
+ "type": "string",
+ "description": "Used to request or communicate a MINOR version back from the client to the server, and from the server back to the client"
+ },
+ "X-PatchVersion": {
+ "type": "string",
+ "description": "Used only to communicate a PATCH version in a response for troubleshooting purposes only, and will not be provided by the client on request"
+ },
+ "X-LatestVersion": {
+ "type": "string",
+ "description": "Used only to communicate an API's latest version"
+ },
+ "X-ONAP-RequestID": {
+ "type": "string",
+ "format": "uuid",
+ "description": "Used to track REST transactions for logging purpose"
+ }
+ },
+ "schema": {
+ "type": "object",
+ "additionalProperties": {
+ "type": "object"
+ }
+ }
+ },
+ "401": {
+ "description": "Authentication Error"
+ },
+ "403": {
+ "description": "Authorization Error"
+ },
+ "500": {
+ "description": "Internal Server Error"
+ }
+ },
+ "security": [
+ {
+ "basicAuth": []
+ }
+ ],
+ "x-interface info": {
+ "api-version": "1.0.0",
+ "last-mod-release": "Dublin"
+ }
+ }
+ }
+ },
+ "securityDefinitions": {
+ "basicAuth": {
+ "description": "",
+ "type": "basic"
+ }
+ }
+} \ No newline at end of file
diff --git a/docs/pap/swagger/policy-deploy-pap.json b/docs/pap/swagger/policy-deploy-pap.json
index a6d49346..0fc1a9e7 100644
--- a/docs/pap/swagger/policy-deploy-pap.json
+++ b/docs/pap/swagger/policy-deploy-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "PdpPolicyDeploy"
+ "name" : "Deploy Policy"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps/policies" : {
"post" : {
- "tags" : [ "PdpPolicyDeploy" ],
+ "tags" : [ "Deploy Policy" ],
"summary" : "Deploy or update PDP Policies",
"description" : "Deploys or updates PDP Policies, returning optional error details",
"operationId" : "deployPolicies",
diff --git a/docs/pap/swagger/policy-undeploy-pap.json b/docs/pap/swagger/policy-undeploy-pap.json
index 4235b04e..7ba66141 100644
--- a/docs/pap/swagger/policy-undeploy-pap.json
+++ b/docs/pap/swagger/policy-undeploy-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "PdpPolicyUndeploy"
+ "name" : "Undeploy Policy"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps/policies/{name}" : {
"delete" : {
- "tags" : [ "PdpPolicyUndeploy" ],
+ "tags" : [ "Undeploy Policy" ],
"summary" : "Undeploy a PDP Policy from PDPs",
"description" : "Undeploys the latest version of a policy from the PDPs, returning optional error details",
"operationId" : "deletePolicy",
@@ -76,7 +76,7 @@
},
"/policy/pap/v1/pdps/policies/{name}/versions/{version}" : {
"delete" : {
- "tags" : [ "PdpPolicyUndeploy" ],
+ "tags" : [ "Undeploy Policy" ],
"summary" : "Undeploy version of a PDP Policy from PDPs",
"description" : "Undeploys a specific version of a policy from the PDPs, returning optional error details",
"operationId" : "deletePolicyVersion",
diff --git a/docs/pap/swagger/state-change-pap.json b/docs/pap/swagger/state-change-pap.json
index 16ef6360..d5ca9a08 100644
--- a/docs/pap/swagger/state-change-pap.json
+++ b/docs/pap/swagger/state-change-pap.json
@@ -2,7 +2,7 @@
"swagger" : "2.0",
"basePath" : "/",
"tags" : [ {
- "name" : "PdpGroupStateChange"
+ "name" : "PdpGroup State Change"
} ],
"schemes" : [ "http", "https" ],
"consumes" : [ "application/json" ],
@@ -10,7 +10,7 @@
"paths" : {
"/policy/pap/v1/pdps/groups/{name}" : {
"put" : {
- "tags" : [ "PdpGroupStateChange" ],
+ "tags" : [ "PdpGroup State Change" ],
"summary" : "Change state of a PDP Group",
"description" : "Changes state of PDP Group, returning optional error details",
"operationId" : "changeGroupState",