.. This work is licensed under a Creative Commons Attribution 4.0 International License.
.. SPDX-License-Identifier: CC-BY-4.0
.. Copyright (C) 2020 AT&T Intellectual Property

RIC Alarm API
=============

Overview
--------

The xapp python framework provides an alarm feature in the python
subpackage `ricxappframe.alarm`.  This subpackage defines objects and
methods for creating, raising and clearing alarms.

The alarm feature reuses the `ricxappframe.rmr` subpackage for
transporting alarm messages. That in turn requires the RMR
shared-object library to be available in a system directory that is
searched by default, usually something like /usr/local/lib.

The alarm feature opens a direct connection to the alarm manager
using the RMR library's wormhole feature, taking the host name and
port number from environment variables defined as the constants
`ALARM_MGR_SERVICE_NAME_ENV` and `ALARM_MGR_SERVICE_PORT_ENV` in
the `ricxappframe.alarm.alarm` module. The message type is set to
constant `RIC_ALARM_UPDATE` in the `ricxappframe.alarm.alarm` module,
currently 110.

The complete API for the Alarm feature appears below.


Example Usage
-------------

Alarms are created, raised and cleared using an `AlarmManager` as
shown below. The manager requires an RMR context at creation time.

.. code-block:: python

    from ricxappframe.alarm import alarm
    from ricxappframe.rmr import rmr

    rmr_context = rmr.rmr_init(b"4562", rmr.RMR_MAX_RCV_BYTES, 0x00)
    alarm_mgr = alarm.AlarmManager(rmr_context, "managed-object-id", "application-id")
    alarm3 = alarm_mgr.create_alarm(3, alarm.AlarmSeverity.DEFAULT, "identifying", "additional")
    success = alarm_mgr.raise_alarm(alarm3)



Alarm API
---------

.. automodule:: ricxappframe.alarm.alarm
    :members:


Alarm Messages
--------------

Alarm messages conform to the following JSON schema.

.. literalinclude:: ../ricxappframe/alarm/alarm-schema.json
  :language: JSON
