| .. This work is licensed under a Creative Commons Attribution 4.0 International License. |
| .. http://creativecommons.org/licenses/by/4.0 |
| |
| .. _pdpd-engine-label: |
| |
| PDP-D Engine |
| ############ |
| |
| .. contents:: |
| :depth: 2 |
| |
| Overview |
| ======== |
| |
| The PDP-D Core Engine provides an infrastructure and services for `drools <https://www.drools.org/>`__ based applications |
| in the context of Policies and ONAP. |
| |
| A PDP-D supports applications by means of *controllers*. A *controller* is a named |
| grouping of resources. These typically include references to communication endpoints, |
| maven artifact coordinates, and *coders* for message mapping. |
| |
| *Controllers* use *communication endpoints* to interact |
| with remote networked entities typically using messaging (dmaap or ueb), |
| or http. |
| |
| PDP-D Engine capabilities can be extended via *features*. Integration with other |
| Policy Framework components (API, PAP, and PDP-X) is through one of them (*feature-lifecycle*). |
| |
| The PDP-D Engine infrastructure provides mechanisms for data migration, diagnostics, and application management. |
| |
| Software |
| ======== |
| |
| Source Code repositories |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The PDP-D software is mainly located in the `policy/drools repository <https://git.onap.org/policy/drools-pdp>`__ with the *communication endpoints* software residing in the `policy/common repository <https://git.onap.org/policy/common>`__ and Tosca policy models in the `policy/models repository <https://git.onap.org/policy/models>`__. |
| |
| Docker Image |
| ~~~~~~~~~~~~ |
| |
| Check the *drools-pdp* `released versions <https://wiki.onap.org/display/DW/Policy+Framework+Project%3A+Component+Versions>`__ page for the latest versions. |
| At the time of this writing *1.6.3* is the latest version. |
| |
| .. code-block:: bash |
| |
| docker pull onap/policy-drools:1.6.3 |
| |
| A container instantiated from this image will run under the non-priviledged *policy* account. |
| |
| The PDP-D root directory is located at the */opt/app/policy* directory (or *$POLICY_HOME*), with the |
| exception of the *$HOME/.m2* which contains the local maven repository. |
| The PDP-D configuration resides in the following directories: |
| |
| - **/opt/app/policy/config**: (*$POLICY_HOME/config* or *$POLICY_CONFIG*) contains *engine*, *controllers*, and *endpoint* configuration. |
| - **/home/policy/.m2**: (*$HOME/.m2*) maven repository configuration. |
| - **/opt/app/policy/etc/**: (*$POLICY_HOME/etc*) miscellaneous configuration such as certificate stores. |
| |
| The following command can be used to explore the directory layout. |
| |
| .. code-block:: bash |
| |
| docker run --rm -it nexus3.onap.org:10001/onap/policy-drools:1.6.3 -- bash |
| |
| Communication Endpoints |
| ======================= |
| |
| PDP-D supports the following networked infrastructures. This is also referred to as |
| *communication infrastructures* in the source code. |
| |
| - DMaaP |
| - UEB |
| - NOOP |
| - Http Servers |
| - Http Clients |
| |
| The source code is located at |
| `the policy-endpoints module <https://git.onap.org/policy/common/tree/policy-endpoints>`__ |
| in the *policy/commons* repository. |
| |
| These network resources are *named* and typically have a *global* scope, therefore typically visible to |
| the PDP-D engine (for administration purposes), application *controllers*, |
| and *features*. |
| |
| DMaaP, UEB, and NOOP are message-based communication infrastructures, hence the terminology of |
| source and sinks, to denote their directionality into or out of the *controller*, respectively. |
| |
| An endpoint can either be *managed* or *unmanaged*. The default for an endpoint is to be *managed*, |
| meaning that they are globally accessible by name, and managed by the PDP-D engine. |
| *Unmanaged* topics are used when neither global visibility, or centralized PDP-D management is desired. |
| The software that uses *unmanaged* topics is responsible for their lifecycle management. |
| |
| DMaaP Endpoints |
| ~~~~~~~~~~~~~~~ |
| |
| These are messaging enpoints that use DMaaP as the communication infrastructure. |
| |
| Typically, a *managed* endpoint configuration is stored in the *<topic-name>-topic.properties* files. |
| |
| For example, the |
| `DCAE_TOPIC-topic.properties <https://git.onap.org/policy/drools-applications/tree/controlloop/common/feature-controlloop-management/src/main/feature/config/DCAE_TOPIC-topic.properties>`__ is defined as |
| |
| .. code-block:: bash |
| |
| dmaap.source.topics=DCAE_TOPIC |
| |
| dmaap.source.topics.DCAE_TOPIC.effectiveTopic=${env:DCAE_TOPIC} |
| dmaap.source.topics.DCAE_TOPIC.servers=${env:DMAAP_SERVERS} |
| dmaap.source.topics.DCAE_TOPIC.consumerGroup=${env:DCAE_CONSUMER_GROUP} |
| dmaap.source.topics.DCAE_TOPIC.https=true |
| |
| In this example, the generic name of the *source* endpoint |
| is *DCAE_TOPIC*. This is known as the *canonical* name. |
| The actual *topic* used in communication exchanges in a physical lab is contained |
| in the *$DCAE_TOPIC* environment variable. This environment variable is usually |
| set up by *devops* on a per installation basis to meet the needs of each |
| lab spec. |
| |
| In the previous example, *DCAE_TOPIC* is a source-only topic. |
| |
| Sink topics are similarly specified but indicating that are sink endpoints |
| from the perspective of the *controller*. For example, the *APPC-CL* topic |
| is configured as |
| |
| .. code-block:: bash |
| |
| dmaap.source.topics=APPC-CL |
| dmaap.sink.topics=APPC-CL |
| |
| dmaap.source.topics.APPC-CL.servers=${env:DMAAP_SERVERS} |
| dmaap.source.topics.APPC-CL.https=true |
| |
| dmaap.sink.topics.APPC-CL.servers=${env:DMAAP_SERVERS} |
| dmaap.sink.topics.APPC-CL.https=true |
| |
| Although not shown in these examples, additional configuration options are available such as *user name*, |
| *password*, *security keys*, *consumer group* and *consumer instance*. |
| |
| UEB Endpoints |
| ~~~~~~~~~~~~~ |
| |
| Similary, UEB endpoints are messaging endpoints, similar to the DMaaP ones. |
| |
| For example, the |
| `DCAE_TOPIC-topic.properties <https://git.onap.org/policy/drools-applications/tree/controlloop/common/feature-controlloop-management/src/main/feature/config/DCAE_TOPIC-topic.properties>`__ can be converted to an *UEB* one, by replacing the |
| *dmaap* prefix with *ueb*. For example: |
| |
| .. code-block:: bash |
| |
| ueb.source.topics=DCAE_TOPIC |
| |
| ueb.source.topics.DCAE_TOPIC.effectiveTopic=${env:DCAE_TOPIC} |
| ueb.source.topics.DCAE_TOPIC.servers=${env:DMAAP_SERVERS} |
| ueb.source.topics.DCAE_TOPIC.consumerGroup=${env:DCAE_CONSUMER_GROUP} |
| ueb.source.topics.DCAE_TOPIC.https=true |
| |
| NOOP Endpoints |
| ~~~~~~~~~~~~~~ |
| |
| NOOP (no-operation) endpoints are messaging endpoints that don't have any network attachments. |
| They are used for testing convenience. |
| To convert the |
| `DCAE_TOPIC-topic.properties <https://git.onap.org/policy/drools-applications/tree/controlloop/common/feature-controlloop-management/src/main/feature/config/DCAE_TOPIC-topic.properties>`__ to a *NOOP* endpoint, simply replace the *dmaap* prefix with *noop*: |
| |
| .. code-block:: bash |
| |
| noop.source.topics=DCAE_TOPIC |
| noop.source.topics.DCAE_TOPIC.effectiveTopic=${env:DCAE_TOPIC} |
| |
| HTTP Clients |
| ~~~~~~~~~~~~ |
| |
| HTTP Clients are typically stored in files following the naming convention: *<name>-http-client.properties* convention. |
| One such example is |
| the `AAI HTTP Client <https://git.onap.org/policy/drools-applications/tree/controlloop/common/feature-controlloop-management/src/main/feature/config/AAI-http-client.properties>`__: |
| |
| .. code-block:: bash |
| |
| http.client.services=AAI |
| |
| http.client.services.AAI.managed=true |
| http.client.services.AAI.https=true |
| http.client.services.AAI.host=${envd:AAI_HOST} |
| http.client.services.AAI.port=${envd:AAI_PORT} |
| http.client.services.AAI.userName=${envd:AAI_USERNAME} |
| http.client.services.AAI.password=${envd:AAI_PASSWORD} |
| http.client.services.AAI.contextUriPath=${envd:AAI_CONTEXT_URI} |
| |
| HTTP Servers |
| ~~~~~~~~~~~~ |
| |
| HTTP Servers are stored in files that follow a similar naming convention *<name>-http-server.properties*. |
| The following is an example of a server named *CONFIG*, getting most of its configuration from |
| environment variables. |
| |
| .. code-block:: bash |
| |
| http.server.services=CONFIG |
| |
| http.server.services.CONFIG.host=${envd:TELEMETRY_HOST} |
| http.server.services.CONFIG.port=7777 |
| http.server.services.CONFIG.userName=${envd:TELEMETRY_USER} |
| http.server.services.CONFIG.password=${envd:TELEMETRY_PASSWORD} |
| http.server.services.CONFIG.restPackages=org.onap.policy.drools.server.restful |
| http.server.services.CONFIG.managed=false |
| http.server.services.CONFIG.swagger=true |
| http.server.services.CONFIG.https=true |
| http.server.services.CONFIG.aaf=${envd:AAF:false} |
| |
| *Endpoints* configuration resides in the *$POLICY_HOME/config* (or *$POLICY_CONFIG*) directory in a container. |
| |
| Controllers |
| =========== |
| |
| *Controllers* are the means for the PDP-D to run *applications*. Controllers are |
| defined in *<name>-controller.properties* files. |
| |
| For example, see the |
| `usecases controller configuration <https://git.onap.org/policy/drools-applications/tree/controlloop/common/feature-controlloop-usecases/src/main/feature/config/usecases-controller.properties>`__. |
| |
| This configuration file has two sections: *a)* application maven coordinates, and *b)* endpoint references and coders. |
| |
| Maven Coordinates |
| ~~~~~~~~~~~~~~~~~ |
| |
| The coordinates section (*rules*) points to the *controller-usecases* *kjar* artifact. |
| It is the *brain* of the control loop application. |
| |
| .. code-block:: bash |
| |
| controller.name=usecases |
| |
| rules.groupId=${project.groupId} |
| rules.artifactId=controller-usecases |
| rules.version=${project.version} |
| ..... |
| |
| This *kjar* contains the |
| `usecases DRL <https://git.onap.org/policy/drools-applications/tree/controlloop/common/controller-usecases/src/main/resources/usecases.drl>`__ file (there may be more than one DRL file included). |
| |
| .. code-block:: bash |
| |
| ... |
| rule "NEW.TOSCA.POLICY" |
| when |
| $policy : ToscaPolicy() |
| then |
| |
| ... |
| |
| ControlLoopParams params = ControlLoopUtils.toControlLoopParams($policy); |
| if (params != null) { |
| insert(params); |
| } |
| end |
| ... |
| |
| The DRL in conjuction with the dependent java libraries in the kjar |
| `pom <https://git.onap.org/policy/drools-applications/tree/controlloop/common/controller-usecases/pom.xml>`__ |
| realizes the application's function. For intance, it realizes the |
| vFirewall, vCPE, and vDNS use cases in ONAP. |
| |
| .. code-block:: bash |
| |
| .. |
| <dependency> |
| <groupId>org.onap.policy.models.policy-models-interactions.model-actors</groupId> |
| <artifactId>actor.appclcm</artifactId> |
| <version>${policy.models.version}</version> |
| <scope>provided</scope> |
| </dependency> |
| ... |
| |
| Endpoints References and Coders |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The *usecases-controller.properties* configuration also contains a mix of |
| source (of incoming controller traffic) and sink (of outgoing controller traffic) |
| configuration. This configuration also contains specific |
| filtering and mapping rules for incoming and outgoing dmaap messages |
| known as *coders*. |
| |
| .. code-block:: bash |
| |
| ... |
| dmaap.source.topics=DCAE_TOPIC,APPC-CL,APPC-LCM-WRITE,SDNR-CL-RSP |
| dmaap.sink.topics=APPC-CL,APPC-LCM-READ,POLICY-CL-MGT,SDNR-CL,DCAE_CL_RSP |
| |
| |
| dmaap.source.topics.APPC-LCM-WRITE.events=org.onap.policy.appclcm.AppcLcmDmaapWrapper |
| dmaap.source.topics.APPC-LCM-WRITE.events.org.onap.policy.appclcm.AppcLcmDmaapWrapper.filter=[?($.type == 'response')] |
| dmaap.source.topics.APPC-LCM-WRITE.events.custom.gson=org.onap.policy.appclcm.util.Serialization,gson |
| |
| dmaap.sink.topics.APPC-CL.events=org.onap.policy.appc.Request |
| dmaap.sink.topics.APPC-CL.events.custom.gson=org.onap.policy.appc.util.Serialization,gsonPretty |
| ... |
| |
| In this example, the *coders* specify that incoming messages over the DMaaP endpoint |
| reference *APPC-LCM-WRITE*, that have a field called *type* under the root JSON object with |
| value *response* are allowed into the *controller* application. In this case, the incoming |
| message is converted into an object (fact) of type *org.onap.policy.appclcm.AppcLcmDmaapWrapper*. |
| The *coder* has attached a custom implementation provided by the *application* with class |
| *org.onap.policy.appclcm.util.Serialization*. Note that the *coder* filter is expressed in JSONPath notation. |
| |
| Note that not all the communication endpoint references need to be explicitly referenced within the |
| *controller* configuration file. For example, *Http clients* do not. |
| The reasons are historical, as the PDP-D was initially intended to only communicate |
| through messaging-based protocols such as UEB or DMaaP in asynchronous unidirectional mode. |
| The introduction of *Http* with synchronous bi-directional communication with remote endpoints made |
| it more convenient for the application to manage each network exchange. |
| |
| *Controllers* configuration resides in the *$POLICY_HOME/config* (or *$POLICY_CONFIG*) directory in a container. |
| |
| Other Configuration Files |
| ~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| There are other types of configuration files that *controllers* can use, for example *.environment* files |
| that provides a means to share data across applications. The |
| `controlloop.properties.environment <https://git.onap.org/policy/drools-applications/tree/controlloop/common/feature-controlloop-management/src/main/feature/config/controlloop.properties.environment>`__ is one such example. |
| |
| |
| Tosca Policies |
| ============== |
| |
| PDP-D supports Tosca Policies through the *feature-lifecycle*. The *PDP-D* receives its policy set |
| from the *PAP*. A policy conforms to its Policy Type specification. |
| Policy Types and policy creation is done by the *API* component. |
| Policy deployments are orchestrated by the *PAP*. |
| |
| All communication between *PAP* and PDP-D is over the DMaaP *POLICY-PDP-PAP* topic. |
| |
| Native Policy Types |
| ~~~~~~~~~~~~~~~~~~~ |
| |
| The PDP-D Engine supports two (native) Tosca policy types by means of the *lifecycle* |
| feature: |
| |
| - *onap.policies.native.drools.Controller* |
| - *onap.policies.native.drools.Artifact* |
| |
| These types can be used to dynamically deploy or undeploy application *controllers*, |
| assign policy types, and upgrade or downgrade their attached maven artifact versions. |
| |
| For instance, an |
| `example native controller <https://git.onap.org/policy/drools-pdp/tree/feature-lifecycle/src/test/resources/tosca-policy-native-controller-example.json>`__ policy is shown below. |
| |
| .. code-block:: bash |
| |
| { |
| "tosca_definitions_version": "tosca_simple_yaml_1_0_0", |
| "topology_template": { |
| "policies": [ |
| { |
| "example.controller": { |
| "type": "onap.policies.native.drools.Controller", |
| "type_version": "1.0.0", |
| "version": "1.0.0", |
| "name": "example.controller", |
| "metadata": { |
| "policy-id": "example.controller" |
| }, |
| "properties": { |
| "controllerName": "lifecycle", |
| "sourceTopics": [ |
| { |
| "topicName": "DCAE_TOPIC", |
| "events": [ |
| { |
| "eventClass": "java.util.HashMap", |
| "eventFilter": "[?($.closedLoopEventStatus == 'ONSET')]" |
| }, |
| { |
| "eventClass": "java.util.HashMap", |
| "eventFilter": "[?($.closedLoopEventStatus == 'ABATED')]" |
| } |
| ] |
| } |
| ], |
| "sinkTopics": [ |
| { |
| "topicName": "APPC-CL", |
| "events": [ |
| { |
| "eventClass": "java.util.HashMap", |
| "eventFilter": "[?($.CommonHeader && $.Status)]" |
| } |
| ] |
| } |
| ], |
| "customConfig": { |
| "field1" : "value1" |
| } |
| } |
| } |
| } |
| ] |
| } |
| } |
| |
| The actual application coordinates are provided with a policy of type onap.policies.native.drools.Artifact, |
| see the `example native artifact <https://git.onap.org/policy/drools-pdp/tree/feature-lifecycle/src/test/resources/tosca-policy-native-artifact-example.json>`__ |
| |
| .. code-block:: bash |
| |
| { |
| "tosca_definitions_version": "tosca_simple_yaml_1_0_0", |
| "topology_template": { |
| "policies": [ |
| { |
| "example.artifact": { |
| "type": "onap.policies.native.drools.Artifact", |
| "type_version": "1.0.0", |
| "version": "1.0.0", |
| "name": "example.artifact", |
| "metadata": { |
| "policy-id": "example.artifact" |
| }, |
| "properties": { |
| "rulesArtifact": { |
| "groupId": "org.onap.policy.drools.test", |
| "artifactId": "lifecycle", |
| "version": "1.0.0" |
| }, |
| "controller": { |
| "name": "lifecycle" |
| } |
| } |
| } |
| } |
| ] |
| } |
| } |
| |
| Operational Policy Types |
| ~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The PDP-D also recognizes Tosca Operational Policies, although it needs an |
| application *controller* that understands them to execute them. These are: |
| |
| - *onap.policies.controlloop.operational.common.Drools* |
| - *onap.policies.controlloop.Operational* |
| |
| A minimum of one application *controller* that supports these capabilities |
| must be installed in order to honor the *operational policy types*. |
| One such controller is the *usecases* controller residing in the |
| `policy/drools-applications <https://git.onap.org/policy/drools-applications>`__ |
| repository. |
| |
| Controller Policy Type Support |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Note that a *controller* may support other policy types. A controller may declare them |
| explicitly in a native *onap.policies.native.drools.Controller* policy. |
| |
| .. code-block:: bash |
| |
| "customConfig": { |
| "controller.policy.types" : "policy.type.A" |
| } |
| |
| The *controller* application could declare its supported policy types in the *kjar*. |
| For example, the *usecases controller* packages this information in the |
| `kmodule.xml <https://git.onap.org/policy/drools-applications/tree/controlloop/common/controller-usecases/src/main/resources/META-INF/kmodule.xml>`__. One advantage of this approach is that the PDP-D would only |
| commit to execute policies against these policy types if a supporting controller is up and running. |
| |
| .. code-block:: bash |
| |
| <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule"> |
| <kbase name="onap.policies.controlloop.operational.common.Drools" default="false" equalsBehavior="equality"/> |
| <kbase name="onap.policies.controlloop.Operational" equalsBehavior="equality" |
| packages="org.onap.policy.controlloop" includes="onap.policies.controlloop.operational.common.Drools"> |
| <ksession name="usecases"/> |
| </kbase> |
| </kmodule> |
| |
| Software Architecture |
| ====================== |
| |
| PDP-D is divided into 2 layers: |
| |
| - core (`policy-core <https://git.onap.org/policy/drools-pdp/tree/policy-core>`__) |
| - management (`policy-management <https://git.onap.org/policy/drools-pdp/tree/policy-management>`__) |
| |
| Core Layer |
| ~~~~~~~~~~ |
| |
| The core layer directly interfaces with the *drools* libraries with 2 main abstractions: |
| |
| * `PolicyContainer <https://git.onap.org/policy/drools-pdp/tree/policy-core/src/main/java/org/onap/policy/drools/core/PolicyContainer.java>`__, and |
| * `PolicySession <https://git.onap.org/policy/drools-pdp/tree/policy-core/src/main/java/org/onap/policy/drools/core/PolicySession.java>`__. |
| |
| Policy Container and Sessions |
| """"""""""""""""""""""""""""" |
| |
| The *PolicyContainer* abstracts the drools *KieContainer*, while a *PolicySession* abstracts a drools *KieSession*. |
| PDP-D uses stateful sessions in active mode (*fireUntilHalt*) (please visit the `drools <https://www.drools.org/>`__ |
| website for additional documentation). |
| |
| Management Layer |
| ~~~~~~~~~~~~~~~~ |
| |
| The management layer manages the PDP-D and builds on top of the *core* capabilities. |
| |
| PolicyEngine |
| """""""""""" |
| |
| The PDP-D `PolicyEngine <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/system/PolicyEngine.java>`__ is the top abstraction and abstracts away the PDP-D and all the |
| resources it holds. The reader looking at the source code can start looking at this component |
| in a top-down fashion. Note that the *PolicyEngine* abstraction should not be confused with the |
| sofware in the *policy/engine* repository, there is no relationship whatsoever other than in the naming. |
| |
| The *PolicyEngine* represents the PDP-D, holds all PDP-D resources, and orchestrates activities among those. |
| |
| The *PolicyEngine* manages applications via the `PolicyController <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/system/PolicyController.java>`__ abstractions in the base code. The |
| relationship between the *PolicyEngine* and *PolicyController* is one to many. |
| |
| The *PolicyEngine* holds other global resources such as a *thread pool*, *policies validator*, *telemetry* server, |
| and *unmanaged* topics for administration purposes. |
| |
| The *PolicyEngine* has interception points that allow |
| `*features* <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/features/PolicyEngineFeatureApi.java>`__ |
| to observe and alter the default *PolicyEngine* behavior. |
| |
| The *PolicyEngine* implements the `*Startable* <https://git.onap.org/policy/common/tree/capabilities/src/main/java/org/onap/policy/common/capabilities/Startable.java>`__ and `*Lockable* <https://git.onap.org/policy/common/tree/capabilities/src/main/java/org/onap/policy/common/capabilities/Lockable.java>`__ interfaces. These operations |
| have a cascading effect on the resources the *PolicyEngine* holds, as it is the top level entity, thus |
| affecting *controllers* and *endpoints*. These capabilities are intended to be used for extensions, |
| for example active/standby multi-node capabilities. This programmability is |
| exposed via the *telemetry* API, and *feature* hooks. |
| |
| Configuration |
| ^^^^^^^^^^^^^ |
| |
| *PolicyEngine* related configuration is located in the |
| `engine.properties <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/server/config/engine.properties>`__, |
| and `engine-system.properties <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/server/config/engine.properties>`__. |
| |
| The *engine* configuration files reside in the *$POLICY_CONFIG* directory. |
| |
| PolicyController |
| """""""""""""""" |
| |
| A *PolicyController* represents an application. Each *PolicyController* has an instance of a |
| `DroolsController <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/system/PolicyController.java>`__. The *PolicyController* provides the means to group application specific resources |
| into a single unit. Such resources include the application's *maven coordinates*, *endpoint references*, and *coders*. |
| |
| A *PolicyController* uses a |
| `DroolsController <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/controller/DroolsController.java>`__ to interface with the *core* layer (*PolicyContainer* and *PolicySession*). |
| |
| The relationship between the *PolicyController* and the *DroolsController* is one-to-one. |
| The *DroolsController* currently supports 2 implementations, the |
| `MavenDroolsController <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/controller/internal/MavenDroolsController.java>`__, and the |
| `NullDroolsController <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/controller/internal/NullDroolsController.java>`__. |
| The *DroolsController*'s polymorphic behavior depends on whether a maven artifact is attached to the controller or not. |
| |
| Configuration |
| ^^^^^^^^^^^^^ |
| |
| The *controllers* configuration resides in the *$POLICY_CONFIG* directory. |
| |
| Programmability |
| ~~~~~~~~~~~~~~~ |
| |
| PDP-D is programmable through: |
| |
| - Features and Event Listeners. |
| - Maven-Drools applications. |
| |
| Using Features and Listeners |
| """""""""""""""""""""""""""" |
| |
| Features hook into the interception points provided by the the *PDP-D* main entities. |
| |
| *Endpoint Listeners*, see `here <https://git.onap.org/policy/common/tree/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/event/comm/TopicListener.java>`__ |
| and `here <https://git.onap.org/policy/common/tree/policy-endpoints/src/main/java/org/onap/policy/common/endpoints/listeners>`__, can be used in conjuction with features for additional capabilities. |
| |
| Using Maven-Drools applications |
| """"""""""""""""""""""""""""""" |
| |
| Maven-based drools applications can run any arbitrary functionality structured with rules and java logic. |
| |
| Recommended Flow |
| """""""""""""""" |
| |
| Whenever possible it is suggested that PDP-D related operations flow through the |
| *PolicyEngine* downwards in a top-down manner. This imposed order implies that |
| all the feature hooks are always invoked in a deterministic fashion. It is also |
| a good mechanism to safeguard against deadlocks. |
| |
| Telemetry Extensions |
| """""""""""""""""""" |
| |
| It is recommended to *features* (extensions) to offer a diagnostics REST API |
| to integrate with the telemetry API. This is done by placing JAX-RS files under |
| the package *org.onap.policy.drools.server.restful*. The root context path |
| for all the telemetry services is */policy/pdp/engine*. |
| |
| Features |
| ======== |
| |
| *Features* is an extension mechanism for the PDP-D functionality. |
| Features can be toggled on and off. |
| A feature is composed of: |
| |
| - Java libraries. |
| - Scripts and configuration files. |
| |
| Java Extensions |
| ~~~~~~~~~~~~~~~ |
| |
| Additional functionality can be provided in the form of java libraries that hook into the |
| *PolicyEngine*, *PolicyController*, *DroolsController*, and *PolicySession* interception |
| points to observe or alter the PDP-D logic. |
| |
| See the Feature APIs available in the |
| `management <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/java/org/onap/policy/drools/features>`__ |
| and |
| `core <https://git.onap.org/policy/drools-pdp/tree/policy-core/src/main/java/org/onap/policy/drools/core/PolicySessionFeatureApi.java>`__ layers. |
| |
| The convention used for naming these extension modules are *api-<name>* for interfaces, |
| and *feature-<name>* for the actual java extensions. |
| |
| Configuration Items |
| ~~~~~~~~~~~~~~~~~~~ |
| |
| Installation items such as scripts, SQL, maven artifacts, and configuration files. |
| |
| The reader can refer to the `policy/drools-pdp repository <https://git.onap.org/policy/drools-pdp>`__ |
| and the <https://git.onap.org/policy/drools-applications>`__ repository for miscellaneous feature |
| implementations. |
| |
| Layout |
| """""" |
| |
| A feature is packaged in a *feature-<name>.zip* and has this internal layout: |
| |
| .. code-block:: bash |
| |
| # ####################################################################################### |
| # Features Directory Layout: |
| # |
| # $POLICY_HOME/ |
| # L─ features/ |
| # L─ <feature-name>*/ |
| #    L─ [config]/ |
| #    |  L─ <config-file>+ |
| #    L─ [bin]/ |
| #    |  L─ <bin-file>+ |
| #    L─ lib/ |
| #    | L─ [dependencies]/ |
| #    | | L─ <dependent-jar>+ |
| #    │ L─ feature/ |
| #    │ L─ <feature-jar> |
| #    L─ [db]/ |
| #    │  L─ <db-name>/+ |
| #    │ L─ sql/ |
| #    │ L─ <sql-scripts>* |
| #    L─ [artifacts]/ |
| #     L─ <artifact>+ |
| #    L─ [install] |
| #     L─ [enable] |
| #     L─ [disable] |
| #     L─ [other-directories-or-files] |
| # |
| # notes: [] = optional , * = 0 or more , + = 1 or more |
| # <feature-name> directory without "feature-" prefix. |
| # [config] feature configuration directory that contains all configuration |
| # needed for this features |
| # [config]/<config-file> preferably named with "feature-<feature-name>" prefix to |
| # precisely match it against the exact features, source code, and |
| # associated wiki page for configuration details. |
| # [bin] feature bin directory that contains helper scripts for this feature |
| # [bin]/<executable-file> preferably named with "feature-<feature-name>" prefix. |
| # lib jar libraries needed by this features |
| # lib/[dependencies] 3rd party jar dependencies not provided by base installation |
| # of pdp-d that are necessary for <feature-name> to operate |
| # correctly. |
| # lib/feature the single feature jar that implements the feature. |
| # [db] database directory, if the feature contains sql. |
| # [db]/<db-name> database to which underlying sql scripts should be applied. |
| # ideally, <db-name> = <feature-name> so it is easily to associate |
| # the db data with a feature itself. In addition, since a feature is |
| # a somewhat independent isolated unit of functionality,the <db-name> |
| # database ideally isolates all its data. |
| # [db]/<db-name>/sql directory with all the sql scripts. |
| # [db]/<db-name>/sql/<sql-scripts> for this feature, sql |
| # upgrade scripts should be suffixed with ".upgrade.sql" |
| # and downgrade scripts should be suffixed with ".downgrade.sql" |
| # [artifacts] maven artifacts to be deployed in a maven repository. |
| # [artifacts]/<artifact> maven artifact with identifiable maven coordinates embedded |
| # in the artifact. |
| # [install] custom installation directory where custom enable or disable scripts |
| # and other free form data is included to be used for the enable and |
| # and disable scripts. |
| # [install]/[enable] enable script executed when the enable operation is invoked in |
| # the feature. |
| # [install]/[disable] disable script executed when the disable operation is invoked in |
| # the feature. |
| # [install]/[other-directories-or-files] other executables, or data that can be used |
| # by the feature for any of its operations. The content is determined |
| # by the feature designer. |
| # ######################################################################################## |
| |
| The `features <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/server-gen/bin/features>`__ |
| is the tool used for administration purposes: |
| |
| .. code-block:: bash |
| |
| Usage: features status |
| Get enabled/disabled status on all features |
| features enable <feature> ... |
| Enable the specified feature |
| features disable <feature> ... |
| Disable the specified feature |
| features install [ <feature> | <file-name> ] ... |
| Install the specified feature |
| features uninstall <feature> ... |
| Uninstall the specified feature |
| |
| Features available in the Docker image |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| The only enabled feature in the *onap/policy-drools* image is: |
| |
| - **lifecycle**: enables the lifecycle capability to integrate with the Policy Framework components. |
| |
| The following features are included in the image but disabled. |
| |
| - **distributed locking**: distributed resource locking. |
| - **healthcheck**: basic PDP-D Engine healthcheck. |
| |
| Healthcheck |
| """"""""""" |
| |
| The Healthcheck feature provides reports used to verify the health of *PolicyEngine.manager* in addition to the construction, operation, and deconstruction of HTTP server/client objects. |
| |
| When enabled, the feature takes as input a properties file named "*feature-healtcheck.properties*. |
| This file should contain configuration properties necessary for the construction of HTTP client and server objects. |
| |
| Upon initialization, the feature first constructs HTTP server and client objects using the properties |
| from its properties file. A healthCheck operation is then triggered. The logic of the healthCheck verifies |
| that *PolicyEngine.manager* is alive, and iteratively tests each HTTP server object by sending HTTP GET |
| requests using its respective client object. If a server returns a "200 OK" message, it is marked as "healthy" |
| in its individual report. Any other return code results in an "unhealthy" report. |
| |
| After the testing of the server objects has completed, the feature returns a single consolidated report. |
| |
| Lifecycle |
| """"""""" |
| |
| The "lifecycle" feature enables a PDP-D to work with the architectural framework introduced in the |
| Dublin release. |
| |
| The lifecycle feature maintains three states: TERMINATED, PASSIVE, and ACTIVE. |
| The PAP interacts with the lifecycle feature to put a PDP-D in PASSIVE or ACTIVE states. |
| The PASSIVE state allows for Tosca Operational policies to be deployed. |
| Policy execution is enabled when the PDP-D transitions to the ACTIVE state. |
| |
| This feature can coexist side by side with the legacy mode of operation that pre-dates the Dublin release. |
| |
| Distributed Locking |
| """"""""""""""""""" |
| |
| The Distributed Locking Feature provides locking of resources across a pool of PDP-D hosts. |
| The list of locks is maintained in a database, where each record includes a resource identifier, |
| an owner identifier, and an expiration time. Typically, a drools application will unlock the resource |
| when it's operation completes. However, if it fails to do so, then the resource will be automatically |
| released when the lock expires, thus preventing a resource from becoming permanently locked. |
| |
| Other features |
| ~~~~~~~~~~~~~~ |
| |
| The following features have been contributed to the *policy/drools-pdp* but are either |
| unnecessary or have not been thoroughly tested: |
| |
| .. toctree:: |
| :maxdepth: 1 |
| |
| feature_activestdbymgmt.rst |
| feature_controllerlogging.rst |
| feature_eelf.rst |
| feature_mdcfilters.rst |
| feature_pooling.rst |
| feature_sesspersist.rst |
| feature_statemgmt.rst |
| feature_testtransaction.rst |
| feature_nolocking.rst |
| |
| Data Migration |
| ============== |
| |
| PDP-D data is migrated across releases with the |
| `db-migrator <https://git.onap.org/policy/drools-pdp/tree/policy-management/src/main/server-gen/bin/db-migrator>`__. |
| |
| The migration occurs when different release data is detected. *db-migrator* will look under the |
| *$POLICY_HOME/etc/db/migration* for databases and SQL scripts to migrate. |
| |
| .. code-block:: bash |
| |
| $POLICY_HOME/etc/db/migration/<schema-name>/sql/<sql-file> |
| |
| where *<sql-file>* is of the form: |
| |
| .. code-block:: bash |
| |
| <VERSION>-<pdp|feature-name>[-description](.upgrade|.downgrade).sql |
| |
| The db-migrator tool syntax is |
| |
| .. code-block:: bash |
| |
| syntax: db-migrator |
| -s <schema-name> |
| [-b <migration-dir>] |
| [-f <from-version>] |
| [-t <target-version>] |
| -o <operations> |
| |
| where <operations>=upgrade|downgrade|auto|version|erase|report |
| |
| Configuration Options: |
| -s|--schema|--database: schema to operate on ('ALL' to apply on all) |
| -b|--basedir: overrides base DB migration directory |
| -f|--from: overrides current release version for operations |
| -t|--target: overrides target release to upgrade/downgrade |
| |
| Operations: |
| upgrade: upgrade operation |
| downgrade: performs a downgrade operation |
| auto: autonomous operation, determines upgrade or downgrade |
| version: returns current version, and in conjunction if '-f' sets the current version |
| erase: erase all data related <schema> (use with care) |
| report: migration detailed report on an schema |
| ok: is the migration status valid |
| |
| See the |
| `feature-distributed-locking sql directory <https://git.onap.org/policy/drools-pdp/tree/feature-distributed-locking/src/main/feature/db/pooling/sql>`__ |
| for an example of upgrade/downgrade scripts. |
| |
| The following command will provide a report on the upgrade or downgrade activies: |
| |
| .. code-block:: bash |
| |
| db-migrator -s ALL -o report |
| |
| For example in the official guilin delivery: |
| |
| .. code-block:: bash |
| |
| policy@dev-drools-0:/tmp/policy-install$ db-migrator -s ALL -o report |
| +---------+---------+ |
| | name | version | |
| +---------+---------+ |
| | pooling | 1811 | |
| +---------+---------+ |
| +-------------------------------------+-----------+---------+---------------------+ |
| | script | operation | success | atTime | |
| +-------------------------------------+-----------+---------+---------------------+ |
| | 1804-distributedlocking.upgrade.sql | upgrade | 1 | 2020-05-22 19:33:09 | |
| | 1811-distributedlocking.upgrade.sql | upgrade | 1 | 2020-05-22 19:33:09 | |
| +-------------------------------------+-----------+---------+---------------------+ |
| |
| In order to use the *db-migrator* tool, the system must be configured with a database. |
| |
| .. code-block:: bash |
| |
| SQL_HOST=mariadb |
| |
| Maven Repositories |
| ================== |
| |
| The drools libraries in the PDP-D uses maven to fetch rules artifacts and software dependencies. |
| |
| The default *settings.xml* file specifies the repositories to search. This configuration |
| can be overriden with a custom copy that would sit in a mounted configuration |
| directory. See an example of the OOM override |
| `settings.xml <https://git.onap.org/oom/tree/kubernetes/policy/charts/drools/resources/configmaps/settings.xml>`__. |
| |
| The default ONAP installation of the *control loop* child image *onap/policy-pdpd-cl:1.6.4* is *OFFLINE*. |
| In this configuration, the *rules* artifact and the *dependencies* retrieves all the artifacts from the local |
| maven repository. Of course, this requires that the maven dependencies are preloaded in the local |
| repository for it to work. |
| |
| An offline configuration requires two items: |
| |
| - *OFFLINE* environment variable set to true. |
| - override *settings.xml* customization, see |
| `settings.xml <https://git.onap.org/oom/tree/kubernetes/policy/charts/drools/resources/configmaps/settings.xml>`__. |
| |
| The default mode in the *onap/policy-drools:1.6.3* is ONLINE instead. |
| |
| In *ONLINE* mode, the *controller* initialization can take a significant amount of time. |
| |
| The Policy ONAP installation includes a *nexus* repository component that can be used to host any arbitrary |
| artifacts that an PDP-D application may require. |
| The following environment variables configure its location: |
| |
| .. code-block:: bash |
| |
| SNAPSHOT_REPOSITORY_ID=policy-nexus-snapshots |
| SNAPSHOT_REPOSITORY_URL=http://nexus:8080/nexus/content/repositories/snapshots/ |
| RELEASE_REPOSITORY_ID=policy-nexus-releases |
| RELEASE_REPOSITORY_URL=http://nexus:8080/nexus/content/repositories/releases/ |
| REPOSITORY_OFFLINE=false |
| |
| The *deploy-artifact* tool is used to deploy artifacts to the local or remote maven repositories. |
| It also allows for dependencies to be installed locally. The *features* tool invokes it when artifacts are |
| to be deployed as part of a feature. The tool can be useful for developers to test a new application |
| in a container. |
| |
| .. code-block:: bash |
| |
| syntax: deploy-artifact |
| [-f|-l|-d] |
| -s <custom-settings> |
| -a <artifact> |
| |
| Options: |
| -f|--file-repo: deploy in the file repository |
| -l|--local-repo: install in the local repository |
| -d|--dependencies: install dependencies in the local repository |
| -s|--settings: custom settings.xml |
| -a|--artifact: file artifact (jar or pom) to deploy and/or install |
| |
| AAF |
| === |
| |
| Policy can talk to AAF for authorization requests. To enable AAF set |
| the following environment variables: |
| |
| .. code-block:: bash |
| |
| AAF=true |
| AAF_NAMESPACE=org.onap.policy |
| AAF_HOST=aaf-locate.onap |
| |
| By default AAF is disabled. |
| |
| Policy Tool |
| =========== |
| |
| The *policy* tool can be used to stop, start, and provide status on the PDP-D. |
| |
| .. code-block:: bash |
| |
| syntax: policy [--debug] status|start|stop |
| |
| The *status* option provides generic status of the system. |
| |
| .. code-block:: bash |
| |
| [drools-pdp-controllers] |
| L []: Policy Management (pid 408) is running |
| 0 cron jobs installed. |
| |
| [features] |
| name version status |
| ---- ------- ------ |
| healthcheck 1.6.3 enabled |
| distributed-locking 1.6.3 enabled |
| lifecycle 1.6.3 enabled |
| controlloop-management 1.6.4 enabled |
| controlloop-utils 1.6.4 enabled |
| controlloop-trans 1.6.4 enabled |
| controlloop-usecases 1.6.4 enabled |
| |
| [migration] |
| pooling: OK @ 1811 |
| |
| It contains 3 sections: |
| |
| - *PDP-D* running status |
| - *features* applied |
| - Data migration status on a per database basis. |
| |
| The *start* and *stop* commands are useful for developers testing functionality on a docker container instance. |
| |
| Telemetry Shell |
| =============== |
| |
| *PDP-D* offers an ample set of REST APIs to debug, introspect, and change state on a running PDP-D. This is known as the |
| *telemetry* API. The *telemetry* shell wraps these APIs for shell-like access using |
| `http-prompt <http://http-prompt.com/>`__. |
| |
| .. code-block:: bash |
| |
| policy@dev-drools-0:~$ telemetry |
| Version: 1.0.0 |
| https://localhost:9696/policy/pdp/engine> get controllers |
| HTTP/1.1 200 OK |
| Content-Length: 13 |
| Content-Type: application/json |
| Date: Thu, 04 Jun 2020 01:07:38 GMT |
| Server: Jetty(9.4.24.v20191120) |
| |
| [ |
| "usecases" |
| ] |
| |
| https://localhost:9696/policy/pdp/engine> exit |
| Goodbye! |
| policy@dev-drools-0:~$ |
| |
| |
| Other tools |
| =========== |
| |
| Refer to the *$POLICY_HOME/bin/* directory for additional tooling. |
| |
| PDP-D Docker Container Configuration |
| ==================================== |
| |
| Both the PDP-D *onap/policy-drools* and *onap/policy-pdpd-cl* images can be used without other components. |
| |
| There are 2 types of configuration data provided to the container: |
| |
| 1. environment variables. |
| 2. configuration files and shell scripts. |
| |
| Environment variables |
| ~~~~~~~~~~~~~~~~~~~~~ |
| |
| As it was shown in the *controller* and *endpoint* sections, PDP-D configuration can rely |
| on environment variables. In a container environment, these variables are set up by the user |
| in the host environment. |
| |
| Configuration Files and Shell Scripts |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| PDP-D is very flexible in its configuration. |
| |
| The following file types are recognized when mounted under */tmp/policy-install/config*. |
| |
| These are the configuration items that can reside externally and override the default configuration: |
| |
| - **settings.xml** if working with external nexus repositories. |
| - **standalone-settings.xml** if an external *policy* nexus repository is not available. |
| - ***.conf** files containing environment variables. This is an alternative to use environment variables, |
| as these files will be sourced in before the PDP-D starts. |
| - **features*.zip** to load any arbitrary feature not present in the image. |
| - ***.pre.sh** scripts that will be executed before the PDP-D starts. |
| - ***.post.sh** scripts that will be executed after the PDP-D starts. |
| - **policy-keystore** to override the default PDP-D java keystore. |
| - **policy-truststore** to override the default PDP-D java truststore. |
| - **aaf-cadi.keyfile** to override the default AAF CADI Key generated by AAF. |
| - ***.properties** to override or add any properties file for the PDP-D, this includes *controller*, *endpoint*, |
| *engine* or *system* configurations. |
| - **logback*.xml** to override the default logging configuration. |
| - ***.xml** to override other .xml configuration that may be used for example by an *application*. |
| - ***.json** *json* configuration that may be used by an *application*. |
| |
| |
| Running PDP-D with a single container |
| ===================================== |
| |
| Environment File |
| ~~~~~~~~~~~~~~~~ |
| |
| First create an environment file (in this example *env.conf*) to configure the PDP-D. |
| |
| .. code-block:: bash |
| |
| # SYSTEM software configuration |
| |
| POLICY_HOME=/opt/app/policy |
| POLICY_LOGS=/var/log/onap/policy/pdpd |
| KEYSTORE_PASSWD=Pol1cy_0nap |
| TRUSTSTORE_PASSWD=Pol1cy_0nap |
| |
| # Telemetry credentials |
| |
| TELEMETRY_PORT=9696 |
| TELEMETRY_HOST=0.0.0.0 |
| TELEMETRY_USER=demo@people.osaaf.org |
| TELEMETRY_PASSWORD=demo123456! |
| |
| # nexus repository |
| |
| SNAPSHOT_REPOSITORY_ID= |
| SNAPSHOT_REPOSITORY_URL= |
| RELEASE_REPOSITORY_ID= |
| RELEASE_REPOSITORY_URL= |
| REPOSITORY_USERNAME= |
| REPOSITORY_PASSWORD= |
| REPOSITORY_OFFLINE=true |
| |
| # Relational (SQL) DB access |
| |
| SQL_HOST= |
| SQL_USER= |
| SQL_PASSWORD= |
| |
| # AAF |
| |
| AAF=false |
| AAF_NAMESPACE=org.onap.policy |
| AAF_HOST=aaf.api.simpledemo.onap.org |
| |
| # PDP-D DMaaP configuration channel |
| |
| PDPD_CONFIGURATION_TOPIC=PDPD-CONFIGURATION |
| PDPD_CONFIGURATION_API_KEY= |
| PDPD_CONFIGURATION_API_SECRET= |
| PDPD_CONFIGURATION_CONSUMER_GROUP= |
| PDPD_CONFIGURATION_CONSUMER_INSTANCE= |
| PDPD_CONFIGURATION_PARTITION_KEY= |
| |
| # PAP-PDP configuration channel |
| |
| POLICY_PDP_PAP_TOPIC=POLICY-PDP-PAP |
| POLICY_PDP_PAP_API_KEY= |
| POLICY_PDP_PAP_API_SECRET= |
| |
| # DMaaP |
| |
| DMAAP_SERVERS=localhost |
| |
| Note that *SQL_HOST*, and *REPOSITORY* are empty, so the PDP-D does not attempt |
| to integrate with those components. |
| |
| Configuration |
| ~~~~~~~~~~~~~ |
| |
| In order to avoid the noise in the logs that relate to dmaap configuration, a startup script (*noop.pre.sh*) is added |
| to convert *dmaap* endpoints to *noop* in the host directory to be mounted. |
| |
| noop.pre.sh |
| """"""""""" |
| |
| .. code-block:: bash |
| |
| #!/bin/bash -x |
| |
| sed -i "s/^dmaap/noop/g" $POLICY_HOME/config/*.properties |
| |
| |
| active.post.sh |
| """""""""""""" |
| |
| To put the controller directly in active mode at initialization, place an *active.post.sh* script under the |
| mounted host directory: |
| |
| .. code-block:: bash |
| |
| #!/bin/bash -x |
| |
| bash -c "http --verify=no -a ${TELEMETRY_USER}:${TELEMETRY_PASSWORD} PUT https://localhost:9696/policy/pdp/engine/lifecycle/state/ACTIVE" |
| |
| Bring up the PDP-D |
| ~~~~~~~~~~~~~~~~~~ |
| |
| .. code-block:: bash |
| |
| docker run --rm -p 9696:9696 -v ${PWD}/config:/tmp/policy-install/config --env-file ${PWD}/env/env.conf -it --name PDPD -h pdpd nexus3.onap.org:10001/onap/policy-drools:1.6.3 |
| |
| To run the container in detached mode, add the *-d* flag. |
| |
| Note that in this command, we are opening the *9696* telemetry API port to the outside world, the config directory |
| (where the *noop.pre.sh* customization script resides) is mounted as /tmp/policy-install/config, |
| and the customization environment variables (*env/env.conf*) are passed into the container. |
| |
| To open a shell into the PDP-D: |
| |
| .. code-block:: bash |
| |
| docker exec -it pdp-d bash |
| |
| Once in the container, run tools such as *telemetry*, *db-migrator*, *policy* to look at the system state: |
| |
| To run the *telemetry shell* and other tools from the host: |
| |
| .. code-block:: bash |
| |
| docker exec -it PDPD bash -c "/opt/app/policy/bin/telemetry" |
| docker exec -it PDPD bash -c "/opt/app/policy/bin/policy status" |
| docker exec -it PDPD bash -c "/opt/app/policy/bin/db-migrator -s ALL -o report" |
| |
| Controlled instantiation of the PDP-D |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| Sometimes a developer may want to start and stop the PDP-D manually: |
| |
| .. code-block:: bash |
| |
| # start a bash |
| |
| docker run --rm -p 9696:9696 -v ${PWD}/config:/tmp/policy-install/config --env-file ${PWD}/env/env.conf -it --name PDPD -h pdpd nexus3.onap.org:10001/onap/policy-drools:1.6.3 bash |
| |
| # use this command to start policy applying host customizations from /tmp/policy-install/config |
| |
| pdpd-entrypoint.sh vmboot |
| |
| # or use this command to start policy without host customization |
| |
| policy start |
| |
| # at any time use the following command to stop the PDP-D |
| |
| policy stop |
| |
| # and this command to start the PDP-D back again |
| |
| policy start |
| |
| Running PDP-D with nexus and mariadb |
| ==================================== |
| |
| *docker-compose* can be used to test the PDP-D with other components. This is an example configuration |
| that brings up *nexus*, *mariadb* and the PDP-D (*docker-compose-pdp.yml*) |
| |
| docker-compose-pdp.yml |
| ~~~~~~~~~~~~~~~~~~~~~~ |
| |
| .. code-block:: bash |
| |
| version: '3' |
| services: |
| mariadb: |
| image: mariadb:10.2.25 |
| container_name: mariadb |
| hostname: mariadb |
| command: ['--lower-case-table-names=1', '--wait_timeout=28800'] |
| env_file: |
| - ${PWD}/db/db.conf |
| volumes: |
| - ${PWD}/db:/docker-entrypoint-initdb.d |
| ports: |
| - "3306:3306" |
| nexus: |
| image: sonatype/nexus:2.14.8-01 |
| container_name: nexus |
| hostname: nexus |
| ports: |
| - "8081:8081" |
| drools: |
| image: nexus3.onap.org:10001/onap/policy-drools:1.6.3 |
| container_name: drools |
| depends_on: |
| - mariadb |
| - nexus |
| hostname: drools |
| ports: |
| - "9696:9696" |
| volumes: |
| - ${PWD}/config:/tmp/policy-install/config |
| env_file: |
| - ${PWD}/env/env.conf |
| |
| with *${PWD}/db/db.conf*: |
| |
| db.conf |
| ~~~~~~~ |
| |
| .. code-block:: bash |
| |
| MYSQL_ROOT_PASSWORD=secret |
| MYSQL_USER=policy_user |
| MYSQL_PASSWORD=policy_user |
| |
| and *${PWD}/db/db.sh*: |
| |
| db.sh |
| ~~~~~ |
| |
| .. code-block:: bash |
| |
| for db in support onap_sdk log migration operationshistory10 pooling policyadmin operationshistory |
| do |
| mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" --execute "CREATE DATABASE IF NOT EXISTS ${db};" |
| mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" --execute "GRANT ALL PRIVILEGES ON \`${db}\`.* TO '${MYSQL_USER}'@'%' ;" |
| done |
| |
| mysql -uroot -p"${MYSQL_ROOT_PASSWORD}" --execute "FLUSH PRIVILEGES;" |
| |
| env.conf |
| ~~~~~~~~ |
| |
| The environment file *env/env.conf* for *PDP-D* can be set up with appropriate variables to point to the *nexus* instance |
| and the *mariadb* database: |
| |
| .. code-block:: bash |
| |
| # SYSTEM software configuration |
| |
| POLICY_HOME=/opt/app/policy |
| POLICY_LOGS=/var/log/onap/policy/pdpd |
| KEYSTORE_PASSWD=Pol1cy_0nap |
| TRUSTSTORE_PASSWD=Pol1cy_0nap |
| |
| # Telemetry credentials |
| |
| TELEMETRY_PORT=9696 |
| TELEMETRY_HOST=0.0.0.0 |
| TELEMETRY_USER=demo@people.osaaf.org |
| TELEMETRY_PASSWORD=demo123456! |
| |
| # nexus repository |
| |
| SNAPSHOT_REPOSITORY_ID=policy-nexus-snapshots |
| SNAPSHOT_REPOSITORY_URL=http://nexus:8081/nexus/content/repositories/snapshots/ |
| RELEASE_REPOSITORY_ID=policy-nexus-releases |
| RELEASE_REPOSITORY_URL=http://nexus:8081/nexus/content/repositories/releases/ |
| REPOSITORY_USERNAME=admin |
| REPOSITORY_PASSWORD=admin123 |
| REPOSITORY_OFFLINE=false |
| |
| MVN_SNAPSHOT_REPO_URL=https://nexus.onap.org/content/repositories/snapshots/ |
| MVN_RELEASE_REPO_URL=https://nexus.onap.org/content/repositories/releases/ |
| |
| # Relational (SQL) DB access |
| |
| SQL_HOST=mariadb |
| SQL_USER=policy_user |
| SQL_PASSWORD=policy_user |
| |
| # AAF |
| |
| AAF=false |
| AAF_NAMESPACE=org.onap.policy |
| AAF_HOST=aaf.api.simpledemo.onap.org |
| |
| # PDP-D DMaaP configuration channel |
| |
| PDPD_CONFIGURATION_TOPIC=PDPD-CONFIGURATION |
| PDPD_CONFIGURATION_API_KEY= |
| PDPD_CONFIGURATION_API_SECRET= |
| PDPD_CONFIGURATION_CONSUMER_GROUP= |
| PDPD_CONFIGURATION_CONSUMER_INSTANCE= |
| PDPD_CONFIGURATION_PARTITION_KEY= |
| |
| # PAP-PDP configuration channel |
| |
| POLICY_PDP_PAP_TOPIC=POLICY-PDP-PAP |
| POLICY_PDP_PAP_API_KEY= |
| POLICY_PDP_PAP_API_SECRET= |
| |
| # DMaaP |
| |
| DMAAP_SERVERS=localhost |
| |
| prepare.pre.sh |
| ~~~~~~~~~~~~~~ |
| |
| A pre-start script *config/prepare.pres.sh"can be added the custom config directory |
| to prepare the PDP-D to activate the distributed-locking feature (using the database) |
| and to use "noop" topics instead of *dmaap* topics: |
| |
| .. code-block:: bash |
| |
| #!/bin/bash |
| |
| bash -c "/opt/app/policy/bin/features enable distributed-locking" |
| sed -i "s/^dmaap/noop/g" $POLICY_HOME/config/*.properties |
| |
| active.post.sh |
| ~~~~~~~~~~~~~~ |
| |
| A post-start script *config/active.post.sh* can place PDP-D in *active* mode at initialization: |
| |
| .. code-block:: bash |
| |
| bash -c "http --verify=no -a ${TELEMETRY_USER}:${TELEMETRY_PASSWORD} PUT https://localhost:9696/policy/pdp/engine/lifecycle/state/ACTIVE" |
| |
| Bring up the PDP-D, nexus, and mariadb |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| |
| To bring up the containers: |
| |
| .. code-block:: bash |
| |
| docker-compose -f docker-compose-pdpd.yaml up -d |
| |
| To take it down: |
| |
| .. code-block:: bash |
| |
| docker-compose -f docker-compose-pdpd.yaml down -v |
| |
| Other examples |
| ~~~~~~~~~~~~~~ |
| |
| The reader can also look at the `integration/csit repository <https://git.onap.org/integration/csit>`__. |
| More specifically, these directories have examples of other PDP-D configurations: |
| |
| * `plans <https://git.onap.org/integration/csit/tree/plans/policy/drools-pdp>`__: startup scripts. |
| * `scripts <https://git.onap.org/integration/csit/tree/scripts/policy/docker-compose-drools.yml>`__: docker-compose related files. |
| * `plans <https://git.onap.org/integration/csit/tree/tests/policy/drools-pdp>`__: test plan. |
| |
| Configuring the PDP-D in an OOM Kubernetes installation |
| ======================================================= |
| |
| The `PDP-D OOM chart <https://git.onap.org/oom/tree/kubernetes/policy/charts/drools>`__ can be |
| customized at the following locations: |
| |
| * `values.yaml <https://git.onap.org/oom/tree/kubernetes/policy/charts/drools/values.yaml>`__: custom values for your installation. |
| * `configmaps <https://git.onap.org/oom/tree/kubernetes/policy/charts/drools/resources/configmaps>`__: place in this directory any configuration extensions or overrides to customize the PDP-D that does not contain sensitive information. |
| * `secrets <https://git.onap.org/oom/tree/kubernetes/policy/charts/drools/resources/secrets>`__: place in this directory any configuration extensions or overrides to customize the PDP-D that does contain sensitive information. |
| |
| The same customization techniques described in the docker sections for PDP-D, fully apply here, by placing the corresponding |
| files or scripts in these two directories. |
| |
| Additional information |
| ====================== |
| |
| For additional information, please see the |
| `Drools PDP Development and Testing (In Depth) <https://wiki.onap.org/display/DW/2020+Frankfurt+Tutorials>`__ page. |