.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
.. Copyright (C) 2019 highstreet technologies and others

OAM Operation and Maintenance Overview
======================================

The O-RAN SC OAM project provides administrative and operator
functions for O-RAN components, such as Near-Realtime-RAN-Intelligent-Controller,
O-RAN Centralized Unit, O-RAN Distributed Unit and O-RAN Radio Unit.

The project follows the specifications for the `O1 interface <https://www.o-ran.org/specifications>`_
as provided by O-RAN Working Group 1 (new 10).

The O-RAN-SC OAM project adds features and functions to the OpenDaylight-based ONAP
controller 'CCSDK/SDNC'. It is built on the Common Controller Framework
to control and to manage O-RAN ManagedElements and O-RAN ManagedFunctions.

.. figure:: ./_static/o-ran-architecture.png
   :alt: SDN-R in ONAP

   SDN-R in ONAP


Project Resources
-----------------
The project uses the following Linux Foundation resources:

* The source code is maintained in this Gerrit:
    `<https://gerrit.o-ran-sc.org/r/admin/repos/oam>`_

* The build (CI) jobs are in this Jenkins:
    `<https://jenkins.o-ran-sc.org/view/oam/>`_

* Issues are tracked in this Jira:
    `<https://jira.o-ran-sc.org/projects/OAM/issues>`_

* Project information is available in this Wiki:
    `<https://wiki.o-ran-sc.org/display/OAM/Operations+and+Maintenance>`_


Scope
-----

According to the `O-RAN-OAM-Architecture document <https://www.o-ran.org/specifications>`_
all ManagedElements (ME) (near-real-time-RIC, O-CU-CP, O-CU-UP, O-DU and O-RU)
implement the O1-interface.

The O-RAN-OAM-interface specification defines

- a NetConf-Server for Configuration Management (CM) and
- a http-client for Fault Management (FM), Performance Management (PM) and other
  events on each Management-Service-Provider (MnS-Provider) running on the
  ManagedElement.

THe O-RAN-SC-OAM project provides reference implementation according to the
O-RAN OAM documents. In addition it provides a lightweight MnS-Consumer for
development and module test purposes. The assumption is that the projects
for the ManagedElements can concentrate on the more important user-plane.

Each project requires its own OAM repository to address the specific needs
of the ManagedFunction.

The following O-RAN specifications are considered during implementations:

+------------------------------------------+---------------------------------------------------------+----------------------+
| Workgroup                                | Specification                                           | Version              |
+==========================================+=========================================================+======================+
| WG1 - Use Cases and Overall Architecture | O-RAN Architecture Description                          | 3.0 - November 2020  |
+                                          +---------------------------------------------------------+----------------------+
|                                          | O-RAN Operations and Maintenance Architecture           | 4.0 - November 2020  |
+                                          +---------------------------------------------------------+----------------------+
|                                          | O-RAN Operations and Maintenance Interface              | 4.0 - November 2020  |
+                                          +---------------------------------------------------------+----------------------+
|                                          | O-RAN Information Model and Data Models Specification   | November 2020        |
+------------------------------------------+---------------------------------------------------------+----------------------+
| WG4 - The Open Fronthaul Interfaces      | O-RAN Open Fronthaul Conformance Test Specification     | 2.00 - November 2020 |
+                                          +---------------------------------------------------------+----------------------+
|                                          | O-RAN Management Plane Specification                    | 5.0 - November 2020  |
+                                          +---------------------------------------------------------+----------------------+
|                                          | O-RAN Management Plane Specification - YANG Models      | 5.0 - November 2020  |
+------------------------------------------+---------------------------------------------------------+----------------------+
| TIFG - Test & Integration Focus Group    | O-RAN End-to-End System Testing Framework Specification | 1.0 - July 2020      |
+------------------------------------------+---------------------------------------------------------+----------------------+
