.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. http://creativecommons.org/licenses/by/4.0

Installation
------------

.. contents::
    :depth: 3

The installation of ONAP Policy is **automated** by design and can be done via Docker as a standalone system.  
Various tools, including healthcheck, logs, and Swagger can be used to ensure proper operation.

ONAP Policy Framework: Standalone Quick Start
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
This procedure explains how build the ONAP Policy Framework and get it running in Docker as a standalone system. 
This procedure assumes that:

* You are using a *\*nix* operating system such as linux or macOS.
* You are using a directory called *git* off your home directory *(~/git)* for your git repositories
* Your local maven repository is in the location *~/.m2/repository*

The procedure documented here has been verified to work on a MacBook laptop running macOS Sierra Version 10.12.6 and a HP Z600 desktop running Ubuntu 16.04.3 LTS.


.. code-block:: bash
   :caption: Typical ONAP Policy Framework Clone Script
   :linenos:

    #!/usr/bin/env bash
    
    ## script name for output
    MOD_SCRIPT_NAME=`basename $0`
    
    ## the ONAP clone directory, defaults to "onap"
    clone_dir="onap"
    
    ## the ONAP repos to clone
    onap_repos="\
    oparent \
    ecompsdkos \
    policy/api \
    policy/common \
    policy/docker \
    policy/drools-applications \
    policy/drools-pdp \
    policy/engine \
    policy/gui \
    policy/pap \
    policy/pdp"
    
    ##
    ## Help screen and exit condition (i.e. too few arguments)
    ##
    Help()
    {
        echo ""
        echo "$MOD_SCRIPT_NAME - clones all required ONAP git repositories"
        echo ""
        echo "       Usage:  $MOD_SCRIPT_NAME [-options]"
        echo ""
        echo "       Options"
        echo "         -d          - the ONAP clone directory, defaults to '.'"
        echo "         -h          - this help screen"
        echo ""
        exit 255;
    }
    
    ##
    ## read command line
    ##
    while [ $# -gt 0 ]
    do
        case $1 in
            #-d ONAP clone directory
            -d)
                shift
                if [ -z "$1" ]; then
                    echo "$MOD_SCRIPT_NAME: no clone directory"
                    exit 1
                fi
                clone_dir=$1
                shift
            ;;
    
            #-h prints help and exists
            -h)
                Help;exit 0;;
    
            *)    echo "$MOD_SCRIPT_NAME: undefined CLI option - $1"; exit 255;;
        esac
    done
    
    if [ -f "$clone_dir" ]; then
        echo "$MOD_SCRIPT_NAME: requested clone directory '$clone_dir' exists as file"
        exit 2
    fi
    if [ -d "$clone_dir" ]; then
        echo "$MOD_SCRIPT_NAME: requested clone directory '$clone_dir' exists as directory"
        exit 2
    fi
    
    mkdir $clone_dir
    if [ $? != 0 ]
    then
        echo cannot clone ONAP repositories, could not create directory '"'$clone_dir'"'
        exit 3
    fi
    
    for repo in $onap_repos
    do
        repoDir=`dirname "$repo"`
        repoName=`basename "$repo"`
    
        if [ ! -z $dirName ]
        then
        mkdir "$clone_dir/$repoDir"
        if [ $? != 0 ]
        then
            echo cannot clone ONAP repositories, could not create directory '"'$clone_dir/repoDir'"'
            exit 4
        fi
        fi
    
        git clone https://gerrit.onap.org/r/${repo} $clone_dir/$repo
    done
    
    echo ONAP has been cloned into '"'$clone_dir'"'

Execution of the script above results in the following directory hierarchy in your *~/git* directory:

    *  ~/git/onap
    *  ~/git/onap/ecompsdkos
    *  ~/git/onap/oparent
    *  ~/git/onap/policy
    *  ~/git/onap/policy/api
    *  ~/git/onap/policy/common
    *  ~/git/onap/policy/docker
    *  ~/git/onap/policy/drools-applications
    *  ~/git/onap/policy/drools-pdp
    *  ~/git/onap/policy/engine
    *  ~/git/onap/policy/gui
    *  ~/git/onap/policy/pap
    *  ~/git/onap/policy/pdp    



Building ONAP
^^^^^^^^^^^^^

**Step 1.** Optionally, for a completely clean build, remove the ONAP built modules from your local repository.

    * rm -fr ~/.m2/repository/org/onap
    * rm -fr ~/.m2/repository/org/openecomp


**Step 2**. A pom such as the one below can be used to build all the ONAP policy modules and their dependencies. Create the *pom.xml* file in the directory *~/git/onap*.

.. code-block:: xml 
   :caption: Typical pom.xml to build the ONAP Policy Framework
   :linenos:

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

      <modelVersion>4.0.0</modelVersion>
      <groupId>org.onap</groupId>
      <artifactId>onap-policy_standalone</artifactId>
      <version>1.0.0-SNAPSHOT</version>
      <packaging>pom</packaging>
      <name>${project.artifactId}</name>
      <inceptionYear>2017</inceptionYear>
      <organization>
        <name>ONAP</name>
      </organization>
    
      <profiles>
        <profile>
          <id>policy-dependencies</id>
          <activation>
        <property>
              <name>policyDeps</name>
        </property>
          </activation>
          <modules>
        <module>oparent</module>
        <module>ecompsdkos/ecomp-sdk</module>
          </modules>
        </profile>
        <profile>
          <id>policy</id>
          <activation>
        <activeByDefault>true</activeByDefault>
          </activation>
          <modules>
        <module>oparent</module>
        <module>ecompsdkos/ecomp-sdk</module>
        <module>policy</module>
          </modules>
        </profile>
      </profiles>
    </project>
    


**Step 3**.  A pom such as the one below can be used to build the ONAP Policy Framework modules. Create the *pom.xml* file in the directory *~/git/onap/policy*

.. code-block:: xml 
   :caption: Typical pom.xml to build the ONAP Policy Framework Policy Modules
   :linenos:

    <project xmlns="http://maven.apache.org/POM/4.0.0" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

        <modelVersion>4.0.0</modelVersion>
        <groupId>org.onap</groupId>
        <artifactId>onap-policy</artifactId>
        <version>1.0.0-SNAPSHOT</version>
        <packaging>pom</packaging>
        <name>${project.artifactId}</name>
        <inceptionYear>2017</inceptionYear>
        <organization>
            <name>ONAP</name>
        </organization>
    
        <modules>
            <module>common</module>
            <module>engine</module>
            <module>pdp</module>
            <module>pap</module>
            <module>drools-pdp</module>
            <module>drools-applications</module>
            <module>api</module>
            <module>gui</module>
            <module>docker</module>
        </modules>
    </project>

**Step 4**. The build cannot currently find the *org.onap.oparent:version-check-maven-plugin* plugin so, for now, comment that plugin out in the POMs *policy/drools-pdp/pom.xml* and *policy/drools-applications/pom.xml*.

**Step 5**. Build the ONAP dependencies that are required for the ONAP policy framework and which must be built first to be available to the ONAP Policy Framework proper.

    * cd ~/git/onap
    * mvn clean install -DpolicyDeps 

**Step 6**. You can now build the ONAP framework

   *  On *Ubuntu*, just build the Policy Framework tests and all

        - cd ~/git/onap
        - mvn clean install 

   *  On *macOS*, you must build build the ONAP framework with tests turned off first. Then rebuild the framework with tests turned on and all tests will pass. Note: The reason for this behaviour will be explored later. 
    
        - cd ~/git/onap
        - mvn clean install -DskipTests
        - mvn install
 

Building the ONAP Policy Framework Docker Images
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
The instructions here are based on the instructions in the file *~/git/onap/policy/docker/README*.

**Step 1.** Prepare the Docker packages. This will pull the installation zip files needed for building the policy-pe and policy-drools Docker images into the target directory. It will not actually build the docker images; the additional steps below must be followed to actually build the Docker images.

    * cd ~/git/onap/policy/docker
    * mvn prepare-package

**Step 2**. Copy the files under *policy-pe* to *target/policy-pe*.

    * cp policy-pe/* target/policy-pe

**Step 3**. Copy the files under *policy-drools* to *target/policy-drools*.

    * cp policy-drools/* target/policy-drools

**Step 4**. Run the *docker build* command on the following directories in the order below. 
Note that on some systems you may have to run the *docker* command as root or using *sudo*.

    * docker build -t onap/policy/policy-os     policy-os
    * docker build -t onap/policy/policy-db     policy-db
    * docker build -t onap/policy/policy-nexus  policy-nexus
    * docker build -t onap/policy/policy-base   policy-base
    * docker build -t onap/policy/policy-pe     target/policy-pe
    * docker build -t onap/policy/policy-drools target/policy-drools

Starting the ONAP Policy Framework Docker Images
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
In order to run the containers, you can use *docker-compose*. This uses the *docker-compose.yml* yaml file to bring up the ONAP Policy Framework.

**Step 1.** Make the file *config/drools/drools-tweaks.sh* executable

    * chmod +x config/drools/drools-tweaks.sh

**Step 2**. Set the IP address to use to be an IP address of a suitable interface on your machine. Save the IP address into the file *config/pe/ip_addr.txt*.

**Step 3**. Set the environment variable *MTU* to be a suitable MTU size for the application.

    * export MTU=9126

**Step 4**. Run the system using *docker-compose*. Note that on some systems you may have to run the *docker-compose* command as root or using *sudo*. Note that this command takes a number of minutes to execute on a laptop or desktop computer.

    * docker-compose up


Installation Complete
^^^^^^^^^^^^^^^^^^^^^

**You now have a full standalone ONAP Policy framework up and running!**


.. _Standalone Quick Start : https://wiki.onap.org/display/DW/ONAP+Policy+Framework%3A+Standalone+Quick+Start



End of Document