.. This work is licensed under a Creative Commons Attribution 4.0 International License.

.. _onap-operations-manager-project:

ONAP Operations Manager Project
###############################

.. contents::
   :depth: 3
..

Introduction
============

The ONAP Operations Manager (OOM) is responsible for life-cycle
management of the ONAP platform itself; components such as MSO, SDNC,
etc. It is not responsible for the management of services, VNFs or
infrastructure instantiated by ONAP or used by ONAP to host such
services or VNFs. OOM uses the open-source Kubernetes container
management system as a means to manage the Docker containers that
compose ONAP where the containers are hosted either directly on
bare-metal servers or on VMs hosted by a 3rd party management system.
OOM ensures that ONAP is easily deployable and maintainable throughout
its life cycle while using hardware resources efficiently. 

Quick Start Guide
=================

Pre-requisites
--------------

* Your Kubernetes environment must be available. For more information see, `ONAP on Kubernetes <https://wiki.onap.org/display/DW/ONAP+on+Kubernetes>`__.
* Deployment artifacts are customized for your location.

**Step 1**

Review and optionally change configuration parameters:

Setup the `/oom/kubernetes/config/onap-parameters.yaml <https://gerrit.onap.org/r/gitweb?p=oom.git;a=blob;f=kubernetes/config/onap-parameters.yaml;h=7ddaf4d4c3dccf2fad515265f0da9c31ec0e64b1;hb=refs/heads/master>`__ file with key-value pairs specific to your OpenStack environment.

OR

There is a `sample <https://gerrit.onap.org/r/gitweb?p=oom.git;a=blob;f=kubernetes/config/onap-parameters-sample.yaml;h=3a74beddbbf7f9f9ec8e5a6abaecb7cb238bd519;hb=refs/heads/master>`__ that may help you out or even be usable directly if you don't intend to actually use OpenStack resources.

**Step 2**

In-order to be able to support multiple ONAP instances within a single kubernetes environment, a configuration set is required. To do this, execute the `createConfig.sh <https://gerrit.onap.org/r/gitweb?p=oom.git;a=blob;f=kubernetes/config/createConfig.sh;h=f226ccae47ca6de15c1da49be4b8b6de974895ed;hb=refs/heads/master>`__ script::

  oom/kubernetes/config/createConfig.sh -n onap
  
Where:

* onap' refers to the name of the instance. This serves as the Namespace prefix for each deployed ONAP component (for example, onap-mso).

**Step 3**

The bash script `createAll.bash <https://gerrit.onap.org/r/gitweb?p=oom.git;a=blob;f=kubernetes/oneclick/createAll.bash;h=5e5f2dc76ea7739452e757282e750638b4e3e1de;hb=refs/heads/master>`__ is used to create an ONAP deployment with kubernetes. It has two primary functions:

* Creating the namespaces used to encapsulate the ONAP components, and
* Creating the services, pods and containers within each of these namespaces that provide the core functionality of ONAP.

Before you execute the createAll.bash. script, pod config-init (`pod-config-init.yaml <https://gerrit.onap.org/r/gitweb?p=oom.git;a=blob;f=kubernetes/config/pod-config-init.yaml;h=b1285ce21d61815c082f6d6aa3c43d00561811c7;hb=refs/heads/master>`__) may need editing to match your environment and deployment into the default namespace.

To deploy the containers and create your ONAP system, execute the following command::
  
  oom/kubernetes/oneclick/createAll.bash -n onap
  
Additional information on usage of createAll.bash
-------------------------------------------------

Namespaces provide isolation between ONAP components as ONAP release 1.0 contains duplicate application (for example, mariadb) and port usage.

As such createAll.bash requires the user to enter a namespace prefix string that can be used to separate multiple deployments of onap. The result will be set of 10 namespaces (for example, onap-sdc, onap-aai, onap-mso, onap-message-router, onap-robot, onap-vid, onap-sdnc, onap-portal, onap-policy, onap-appc) being created within the kubernetes environment.

Deploying multiple ONAP instances within the same Kubernetes cluster
--------------------------------------------------------------------

To deploy multiple ONAP instances, you must specify the number of Instances you would like to create in a Kubernetes cluster using createAllbash.

This is currently required due to the use of NodePort ranges. NodePorts allow external IP:Port access to containers that are running inside a Kubernetes cluster.

To create multiple instances of an ONAP deployment in the cluster, use the following commands::
  
  oom/kubernetes/config/createConfig.sh -n onap
  
  oom/kubernetes/oneclick/createAll.bash -n onap -i 2
  
Where:

* 'onap' refers to the name of the instance.
* ‘i 2’ refers to the number of instances of an ONAP deployment in the cluster.

To delete a deployed instance
-----------------------------

To delete a deployed instance, use the following command::
  
  oom/kubernetes/oneclick/deleteAll.bash -n onap
  
**Note**: Deleting the runtime containers does not remove the configuration created in step 2.

For more information on OOM project documentation, refer to `Quick Start Guide on Wiki  <https://wiki.onap.org/display/DW/ONAP+Operations+Manager+Project#ONAPOperationsManagerProject-QuickStartGuide>`__.

Demo Video
----------

If you'd like to see the installation of ONAP by OOM take a look at this
short video demonstration by Mike Elliott: 

.. raw:: html

   <video controls src="_static/OOM_Demo.mp4"></video>


OOM Architecture and Technical Details
======================================

OOM uses the \ `Kubernetes  <http://kubernetes.io/>`__\ container
management system to orchestrate the life cycle of the ONAP
infrastructure components.  If you'd like to learn more about how this
works or develop the deployment specifications for a project not already
managed by OOM look here: \ `OOM User
Guide <http://onap.readthedocs.io/en/latest/submodules/oom.git/docs/OOM%20User%20Guide/oom_user_guide.html>`__.


Links to Further Information
============================

-  Configuration data for all of the ONAP sub-projects is distributed by
   OOM.  For more information on how this is done see: \ `OOM
   Configuration Management <https://wiki.onap.org/display/DW/OOM+Configuration+Management>`__.
