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

.. _master_index:

Open Network Automation Platform
================================

Open Network Automation Platform (ONAP) is an open source project hosted by
the Linux Foundation.

ONAP provides a comprehensive platform for real-time, policy-driven service
orchestration and automation. ONAP enables service providers and developers
to rapidly automate the instantiation and configuration of physical and
virtual network functions and to support complete life cycle management
activities. By unifying the resources of open source members, ONAP enables
the acceleration of the development of a vibrant ecosystem around a globally
shared architecture and the implementation of network automation faster than
any product could on its own.

Please find some guidance here on the content of ONAP documentation:

 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | Main documentation areas                                                        | Description                                                                                   |
 +=================================================================================+===============================================================================================+
 | :ref:`Release Notes <release-notes>`                                            | The Release Notes besides providing the basic information on the main release, also           |
 |                                                                                 | presents link to the release information of each, specific ONAP component.                    |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`ONAP Overview <overview>`                                                 | ONAP Overview provides generic and high-level guidance on the mission and main                |
 |                                                                                 | functionalities of ONAP. Basic guidelines on license details, limitations and                 |
 |                                                                                 | security references support understanding the solution.                                       |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`ONAP Architecture <ONAP-architecture>`                                    | The ONAP architecture and its functional elements are described in details                    |
 |                                                                                 | here. We can learn how the two main frameworks, namely the Design-time                        |
 |                                                                                 | framework and the Run-time framework cooperate and how the Microservices,                     |
 |                                                                                 | Common services and the ONAP Portal support the certain functions.                            |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`ONAP components and functionalities <doc_onap-developer_guide_projects>`  | The ONAP components and functionalities are described in details here.                        |
 |                                                                                 | We can learn what functionalities ONAP provides and how the certain components in ONAP        |
 |                                                                                 | operate together.                                                                             |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`Setting Up ONAP <installing-onap>`                                        | Installation guidelines and requirements help the very first set up of an                     |
 |                                                                                 | ONAP environment. The ONAP Operations Manager Cloud setup Guide and the                       |
 |                                                                                 | ONAP Operations Manager Quick Start Guide support the deployment and installation activities. |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`Developer Guides <ONAP_developer_guides>`                                 | Developers contributing to the ONAP development can find crucial information                  |
 |                                                                                 | in the Developer Guides. The reader can search among the developers’ topics                   |
 |                                                                                 | in alphabetical order.                                                                        |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`User Guides <user-guides>`                                                | The User Guides provide details on the ONAP portal, which portal integrates                   |
 |                                                                                 | numerous different ONAP applications at one place. Platform operations are                    |
 |                                                                                 | supported with ONAP Operations Quick Start Guide and with an ONAP Operations                  |
 |                                                                                 | User Guide. The instantiation and the management of resources and the services                |
 |                                                                                 | are supported with a Service Design Guide and with guidelines on Service Deployment.          |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+
 | :ref:`VNF/PNF Requirements and Guidelines <vnf_pnf_reqs>`                       | Harmonized VNF and PNF requirements and reduced customization of onboarding VNFs              |
 |                                                                                 | and PNFs can accelerate the optimal usage of this ONAP environment. The guidelines            |
 |                                                                                 | on VNF/PNF requirements facilitates synchronized and aligned activities for all participants. |
 +---------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------+



.. toctree::
   :maxdepth: 1
   :hidden:

   Home <self>
   release/index
   guides/overview/index
   guides/onap-developer/architecture/index
   guides/onap-developer/developing/index
   guides/onap-developer/settingup/index
   guides/onap-developer/index
   guides/onap-user/index
   guides/onap-provider/index
