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

Offered APIs
============

**SNMPTRAP** supports the Simple Network Management Protocol (SNMP)
standard.  It is a well documented and pervasive protocol,
used in all networks worldwide.

As an API offering, the only way to interact with **SNMPTRAP** is
to send traps that conform to the industry standard specification
(RFC1215 - available at https://tools.ietf.org/html/rfc1215 ) to a
running instance.  To accomplish this, you may:

1. Configure SNMP agents to send native traps to a SNMPTRAP instance.
   In SNMP agent configurations, this is usually accomplished by
   setting the "trap target" or "snmp manager" to the IP address
   of the running VM/container hosting SNMPTRAP.

2. Mimic a SNMP trap using various freely available utilities.  Two
   examples are provided below, be sure to change the target
   ("localhost") and port ("162") to applicable values in your
   environment.

Net-SNMP
--------

.. code-block:: bash

   snmptrap -d -v 1 -c public ${to_ip_address}:${to_portt} .1.3.6.1.4.1.99999 localhost 6 1 '55' .1.11.12.13.14.15  s "test trap"

.. note::

   This will display some "read_config_store open failure" errors;
   they can be ignored, the trap has successfully been sent to the
   specified destination.

pysnmp
------

.. code-block:: python

        from pysnmp.hlapi import *
        from pysnmp import debug
        
        # debug.setLogger(debug.Debug('msgproc'))
        
        errorIndication, errorStatus, errorIndex, varbinds = next(sendNotification(SnmpEngine(),
             CommunityData('not_public'),
             UdpTransportTarget(('localhost', 162)),
             ContextData(),
             'trap',
             [ObjectType(ObjectIdentity('.1.3.6.1.4.1.999.1'), OctetString('test trap - ignore')),
              ObjectType(ObjectIdentity('.1.3.6.1.4.1.999.2'), OctetString('ONAP pytest trap'))])
        )
        
        if errorIndication:
            print(errorIndication)
        else:
            print("successfully sent first trap example, number %d" % i)
