.. _sanet_rest_api:
####################################################################################
Sanet Rest Api
####################################################################################
.. contents:: Contenuti
:depth: 4
************************************************************************
Introduzione
************************************************************************
Il modulo *rest_api* permette di effettuare interrogazioni sullo stato di Sanet una API REST basata su protocollo HTTP.
.. important:: Questo modulo **non e' attivo di default**.
************************************************************************
Installazione
************************************************************************
Abilitazione il modulo
========================================================================
Per abilitare il modulo, inserire nel file:
::
{{SANET_INSTALL_DIR}}/conf/settings.py
la seguente riga:
::
if 'rest_api' not in INSTALLED_APPS: INSTALLED_APPS.append('rest_api')
.. _rest-api-settings:
Configurazione principale
========================================================================
Per utilizzare le REST API e' necessario definire un *token* di autenticazione
che deve essere specificato in tutte le richieste.
Il *token* e' una stringa di caratteri lunga a piacere.
Per personalizzare il token di autenticazione (il default è una chiave casuale), inserire la seguente riga nel file di configurazione di Sanet:
::
REST_API_AUTH_COOKIE = " ... "
Esempi:
::
REST_API_AUTH_COOKIE = "*!@!)@#5dc(*@NJ#$(108123-181@->?]"
REST_API_AUTH_COOKIE = "thisismysecrettoken"
.. warning:: il token di autenticazione deve essere **univoco** per installazione.
************************************************************************
API REST
************************************************************************
Formato delle richieste
========================================================================
URL Base
------------------------------------------------------------------------
La URL base per le richieste e':
::
https://........./rest_api/ [ ? ]
Passaggio parametri (GET)
------------------------------------------------------------------------
Le richieste possono prevedere un numero variabili di parametri passati in GET nella URL della richiesta.
Parametri principali
~~~~~~~~~~~~~~~~~~~~~~
Questi sono i parametri GET che sono validi per qualunque URL:
+------------------+--------------+----------------------------------------------------------------------------------------------------------------------------+
| Nome parametro | Obbligatorio | Descrizione |
+==================+==============+============================================================================================================================+
| sanet3auth | Si | Stinga contenente il token di sicurezza valido. Deve essere uguale al parametro di configurazione REST_API_AUTH_COOKIE |
+------------------+--------------+----------------------------------------------------------------------------------------------------------------------------+
| tenantid | | Serve a specificare il tenant sul quale effettuare la ricerca. |
| | | Se non specificato viene utilizzato il tenant primary. |
+------------------+--------------+----------------------------------------------------------------------------------------------------------------------------+
| username | | Serve a filtrare la ricerca in base alla visibilità dell'utente specificato. |
+------------------+--------------+----------------------------------------------------------------------------------------------------------------------------+
Parametri opzionali
~~~~~~~~~~~~~~~~~~~~~~
E' possibile passare in GET un numero arbitrario di parametri opzionali.
::
https://.........../rest_api/.... ? & & ....
La semantica dei parametri dipende da quale API viene richiamata.
Formato delle risposte
========================================================================
.. _json_standard:
Risposte con successo
-----------------------------------
In caso di successo, le risposte vengono inviate al cliente con una risposta HTTP con codice 200.
Il contentuto della response HTTP (l'output della richiesta) sono dei dati codificati in *formato JSON*,
I dati della risposta sono strutturati sempre con questa struttura:
::
{
"elapsed_time": ,
"operation" : ,
"result" :
}
In base al tipo di interrogazione effettuata possono essere aggiunti più o meno campi.
Risposte di errore
-----------------------------------
In caso di errori o anomalie, le risposte vengono inviate al cliente con una risposta HTTP con codice di errore coerente con il tipo di segnalazione.
Il contentuo della *reponse HTTP* sara' stringa contente il messaggio di errore in formato intelleggibile.
.. _rest_api-get-params-filters:
Parametri per filtrare/ordinare/limitare
========================================================================
Filtri sul valori dei campi
-----------------------------------------------
Molte delle API (url) che restituiscono un elenco di elementi possono ricevere in GET un numero arbitrario di *filtri*.
Esempio:
::
https://.........../rest_api/.... ?name="ciccio"
Un *filtro* e' una stringa di caratteri con la seguente sintassi:
::
=
La parte *filter def* "codifica" il tipo di filtro.
La parte *value* codifica il/i valore/i su cui filtrare.
Questi sono i tipi di valori ammesi per un filtro:
* null
* Il valore verra' considerato come il valore booleano corrispondente.
::
=null
* true | false
* Il valore verra' considerato come il valore booleano corrispondente.
::
=true
::
=false
* un stringa di numeri interi
* Il valore verra' considerato come l'intero corrispente
::
=22
* una stringa di caratteri compatibile con un numero in virgola mobile
* Il valore verra' considerato un numero float
::
=3.14
* una stringa alfanumerica racchiusa tra doppi apici (")
* Il valore verra' considerato come una stringa di caratteri, doppi apici esclusi.
::
="Hello world"
* una lista di valori
* Una sequenza dei tipi precenti racchiusa tra parentisi quadre ([]) e separata da virgola (,)
::
=[10,20,30,40]
=["UP","DOWN"]
* una stringa alfanumerica senza doppi apici (caso speciale)
* Il valore verra' considerato come una stringa di caratteri
* Valido solo per filtri semplici il cui valore non contiene spazi
::
=Hello
E' possibile specificare valori speciali per alcuni campi. Si veda :ref:`rest_api-params-special-values`.
Nome dei campi nei filtri
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
I filtri sui campi hanno la seguente sintassi:
::
=
Esempio:
::
cluster=null
is_primary=true
name="localhost"
name=localhost (caso speciale)
Nome dei *custom field* nei filtri
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Se il "campo" su cui si vuole filtrare e' un *custom field*, il *field* deve essere indicato cosi'
::
.=
.. warning: i filtri sui *custom field* trattano i valori dei custom field come *stringhe* (anche se il *tipo* di un *customfield* e' diverso da *str*)
Esempio: Supponendo di avere un customfield *telephone* del customgroup *inventory-data*, un filtro potrebbe essere:
::
custom-group inventory-data
field telephone type str long-name "Telephone" description "Telephone number" order 0
field serial type num long-name "Serial" description "Serial" order 0
exit
Il filtro da specificare sui campi potrebbe essere:
::
inventory-data.telephone="0516318342"
inventory-data.serial="12345"
Filtri di confronto
~~~~~~~~~~~~~~~~~~~~~~~~
Hanno la seguente sintassi:
::
__=
Dove *field* e' il nome di un campo (o del *customfield*) indica il tipo di confronto:
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| OP | SEMANTICA |
+=============+======================================================================================================================================+
| gt | > |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| gte | >= |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| lt | < |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| lge | <= |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| isnull | true|false verifica che il valore non sia "null" |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| contains | Il campo contiene la stringa specificata |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| icontains | Il campo contiene la stringa specificata (case insensitive) |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| in | Il campo rientra tra i valori specificati nella lista |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
| range | Il campo rientra tra i valori compresi nel range specificato della lista di due elementi espressa con (es. [10,30]). |
+-------------+--------------------------------------------------------------------------------------------------------------------------------------+
Esempi su campi normali:
::
status__gte=10
status__lt=33
status__isnull=true
status__in=["UP","DN"]
timestamp__range=[1582022058,1582194858]
Esempi su *customfield*:
::
inventory-data.telephone__contains="0516318342"
inventory-data.telephone__isnull=true
inventory-data.telephone__isnull=false
Filtri di join
~~~~~~~~~~~~~~~~~~~
Alcuni oggetti hanno delle relazioni con altri oggeti attraverso *foreign key*.
E' possibile "seguire" la catena di join specificando il nome delle foreignkey e utilizzano il doppio underscore (__) per filtrare sul campo dell'entita' in join
::
__ [ __ ] [__]=
Esempio:
::
cluster__isnull=false Filtra tutti gli elementi che hanno la foreign key "cluster" valorizzata.
cluster__name=c1 Filtra tutti gli elementi che hanno la foreign key "cluster" che referenzia l'oggetto cluster "c1".
elementtemplate__telement__name=server-linux Filtra tutti gli elementi che referenziano un template "server-linux".
.. important:: Per utilizzare questo tipo di filtri bisogna conoscere lo schema ER del database di Sanet.
Limite sui risultati
--------------------------
E' possibili limitare il numero di risultati aggiungendo il parametro '_limit'.
Esempio:
::
https://.........../rest_api/events?_limit=10
Ordinamento dei risultati
--------------------------
Con il parametro '_order' e' possibile specificare su quale/i campi ordinare i risultati.
La sintassi e':
::
_order=[,/sanet/rest_api/nodes
Esempio:
::
http:///sanet/rest_api/nodes?sanet3auth=12345
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sui nodi filtrati, nel campo **result**.
::
{
'elapsed_time': 0.005944013595581055,
'operation': u'fetch_all_node',
'result': [
{
'cluster_distinguisher': None,
'cluster_element_id': None,
'cluster_id': None,
'cluster_instance': None,
'cluster_instance_time': None,
'cluster_role': 0,
'cluster_xform': None,
'description': u'',
'dft_timeout': 1,
'dns6_name': None,
'dns_name': None,
'effective_ip': u'127.0.0.1',
'ip4_mgt': None,
'ip6_mgt': None,
'is_abstract': False,
'kind': 1,
'name': u'localhost',
'parent_id': None,
'path': u'localhost',
'snmp_community': u'public',
'snmp_port': 161,
'snmp_v3_authdata': None,
'snmp_version': 2,
'tenant_id': u'16d3c6af68a84588a70d446a4d30d540',
'timezone': u'Europe/Rome',
'use_ipv4': True,
'uuid': u'23ca1860edbd4711822edb319717c616'
}
]
}
Info su un nodo
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere infomazioni su un nodo specifico, la url da interrogare è una delle seguenti:
::
https:///rest_api/node/
Esempio:
::
https:///rest_api/node/localhost?sanet3auth=12345
**INPUT**
Nessuno.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con un dizionario, contenente informazioni sul nodo richiesto, nel campo **result**.
::
{
'elapsed_time': 0.010519027709960938,
'operation': 'get_node_info',
'result': {
'cluster_distinguisher': None,
'cluster_element_id': None,
'cluster_id': None,
'cluster_instance': None,
'cluster_instance_time': None,
'cluster_role': 0,
'cluster_xform': None,
'description': u'',
'dft_timeout': 1,
'dns6_name': None,
'dns_name': None,
'effective_ip': u'127.0.0.1',
'ip4_mgt': None,
'ip6_mgt': None,
'is_abstract': False,
'kind': 1,
'name': u'localhost',
'parent_id': None,
'path': u'localhost',
'snmp_community': u'public',
'snmp_port': 161,
'snmp_v3_authdata': None,
'snmp_version': 2,
'tenant_id': u'16d3c6af68a84588a70d446a4d30d540',
'timezone': u'Europe/Rome',
'use_ipv4': True,
'uuid': u'23ca1860edbd4711822edb319717c616'
}
}
Cambiamenti di stato primary condition
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere la lista dei cambiamenti di stato della condition primary di uno specifico nodo, la url da interrogare è la seguente:
::
https:///rest_api/node//get_primary_condition_status_change[?ts_start=&ts_end=]
Esempio
::
https:///rest_api/node/localhost/get_primary_condition_status_change?sanet3auth=12345
**INPUT**
Parametri opzionali da fornire in GET sono **ts_start** e **ts_end**. Se non valorizzati, vengono valutati i dati delle ultime otto ore.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con nel campo **result** una lista di tuple
::
(ts_start, ts_end, status)
Alla risposta vengono aggiunti anche i seguenti campi:
* *element_name*: nome del nodo
* *element_uuid*: uuid del nodo
* *element_path*: path del nodo
* *condition_path*: path della condition
**Esempi**
Esempi di richieste:
::
https:///rest_api/node/localhost/get_primary_condition_status_change?sanet3auth=12345
https:///rest_api/node/localhost/get_primary_condition_status_change?sanet3auth=12345&ts_start=1473142136&ts_end=1473170936
https:///rest_api/node/9401493b9e5844e0b0a4baf757fa5404/get_primary_condition_status_change?sanet3auth=12345
https:///rest_api/node/9401493b9e5844e0b0a4baf757fa5404/get_primary_condition_status_change?sanet3auth=12345&ts_start=1473142136&ts_end=1473170936
Output:
::
{
'condition_path': u'localhost;;icmp-reachability;reach',
'elapsed_time': 0.020576000213623047,
'element_name': u'localhost',
'element_path': u'localhost',
'element_uuid': u'23ca1860edbd4711822edb319717c616',
'operation': 'get_primary_condition_status_change',
'result': [
(1501132183, 1501160983, 100)
]
}
Interfacce
========================================================================
Lista interfacce
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere una lista di tutte le interfacce, la url da interrogare è la seguente:
::
https:///rest_api/interfaces
Esempio:
::
https:///rest_api/interfaces?sanet3auth=12345
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sulle interfacce filtrate, nel campo **result**.
Esempio di risposta:
::
{
'elapsed_time': 0.008428812026977539,
'operation': u'fetch_all_interface',
'result': [
{
'backbone': False,
'cluster_distinguisher': None,
'cluster_id': None,
'cluster_instance': None,
'cluster_role': 0,
'cluster_xform': None,
'description': u'',
'distinguisher': u'eth0',
'ifindex': u'2',
'is_abstract': False,
'kind': 2,
'name': u'eth0',
'parent_id': u'23ca1860edbd4711822edb319717c616',
'path': u'localhost:eth0',
'uuid': u'08fec5c2500c47d18e97eee7947a38e7',
'xform': u"byRegexpUnique(1.3.6.1.2.1.2.2.1.2@, '^'+re_escape($distinguisher)+'$')"
}
]
}
Info interfaccia
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere infomazioni su una interfaccia specifica, la url da interrogare è una delle seguenti:
::
https:///rest_api/interface/
https:///rest_api/interface//rest_api/interface/08fec5c2500c47d18e97eee7947a38e7/get_interface_info
**INPUT**
Nessuno.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con un dizionario, contenente informazioni sull'interfaccia richiesta, nel campo **result**.
Esempio di risposta:
::
{
'elapsed_time': 0.006204843521118164,
'operation': 'get_interface_info',
'result': {
'backbone': False,
'cluster_distinguisher': None,
'cluster_id': None,
'cluster_instance': None,
'cluster_role': 0,
'cluster_xform': None,
'description': u'',
'distinguisher': u'eth0',
'ifindex': u'2',
'is_abstract': False,
'kind': 2,
'name': u'eth0',
'parent_id': u'23ca1860edbd4711822edb319717c616',
'path': u'localhost:eth0',
'uuid': u'08fec5c2500c47d18e97eee7947a38e7',
'xform': u"byRegexpUnique(1.3.6.1.2.1.2.2.1.2@, '^'+re_escape($distinguisher)+'$')"
}
}
Traffico interfaccia
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere informazioni sul traffico di un'interfaccia specifica, la url da chiamare è la seguente:
::
http:///rest_api/interface//get_traffic[?ts_start=&ts_end=]
Esempio:
::
http:///rest_api/interface/08fec5c2500c47d18e97eee7947a38e7/get_traffic?sanet3auth=12345
**INPUT**
Parametri opzionali da fornire in GET sono **ts_start** e **ts_end**. Se non valorizzati, vengono valutati i dati delle ultime otto ore.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con i seguenti campi aggiuntivi:
* *element_name*: nome dell'interfaccia
* *element_uuid*: uuid dell'interfaccia
* *element_path*: path dell'interfaccia
e un dizionario nel campo **result** contenente le seguenti chiavi:
* *out_max*: traffico in uscita massimo
* *out_avg*: traffico in uscita medio
* *in_max*: traffico in entrata massimo
* *in_avg*: traffico in entrata medio
Esempi:
::
https:///rest_api/interface/foo:eth0/get_traffic?sanet3auth=12345
https:///rest_api/interface/foo:eth0/get_traffic?sanet3auth=12345&ts_start=1473142136&ts_end=1473170936
https:///rest_api/interface/1b85b8c803c74d699adcce914af7d0c9/get_traffic?sanet3auth=12345
https:///rest_api/interface/1b85b8c803c74d699adcce914af7d0c9/get_traffic?sanet3auth=12345&ts_start=1473142136&ts_end=1473170936
Esempio di output:
::
{
'elapsed_time': 0.011709928512573242,
'element_name': u'eth0',
'element_path': u'localhost:eth0',
'element_uuid': u'08fec5c2500c47d18e97eee7947a38e7',
'operation': 'get_traffic',
'result':
{
'in_avg': 221.68289183222956,
'in_max': 15201.112582781458,
'out_avg': 30.25014716703459,
'out_max': 2074.2958057395144
}
}
Storage
========================================================================
Lista storage
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere una lista di tutti gli storage, la url da interrogare è la seguente:
::
https:///rest_api/storages
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sugli storage filtrati, nel campo **result**.
Servizi
========================================================================
Lista servizi
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere una lista di tutti i servizi, la url da interrogare è la seguente:
::
https:///rest_api/services
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sui servizi filtrati, nel campo **result**.
Device
========================================================================
Lista device
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere una lista di tutti i device, la url da interrogare è la seguente:
::
https:///rest_api/devices
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sui device filtrati, nel campo **result**.
Condition
========================================================================
Lista condition
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere una lista di tutte le condition, la url da interrogare è la seguente:
::
https:///rest_api/conditions
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sulle condition filtrate, nel campo **result**.
::
{u'elapsed_time': 0.0059909820556640625,
u'operation': u'fetch_all_condition',
u'result': [{u'datagroup_id': u'a84d8b2b82914a538bc495ce2cdd7d9a',
u'dependson_id': None,
u'expr': u'$var == 1',
u'lastdone': 1500138760,
u'max_tries': 1,
u'mtime': 1500138438,
u'name': u'check',
u'path': u'localhost;;dgpassive;check',
u'primary': False,
u'priority': 0,
u'status': 10,
u'statuschange_action': None,
u'statuslast': 40,
u'statuslastchange': 1500138760,
u'title': u'Controllo passivo',
u'tries': 1,
u'uncheckable_fallback': None,
u'uuid': u'333095c2f8884b45a1dc0af1e6985bca'},
{u'datagroup_id': u'a43d7d53c36149f09809cc32b31f6771',
u'dependson_id': None,
u'expr': u"1.3.6.1.2.1.1.6.0@ == 'this is a test'",
u'lastdone': 1500139617,
u'max_tries': 1,
u'mtime': 1500139613,
u'name': u'check',
u'path': u'localhost;;test-trap-regexp;check',
u'primary': False,
u'priority': 0,
u'status': 10,
u'statuschange_action': None,
u'statuslast': 10,
u'statuslastchange': 1500139617,
u'title': u'Simple condition',
u'tries': 0,
u'uncheckable_fallback': None,
u'uuid': u'5ad5e373451d4ea5b31c38a940e78ac2'},
{u'datagroup_id': u'ab43c217e32d49068d4aa55c5c262035',
u'dependson_id': None,
u'expr': u"1.3.6.1.2.1.1.6.0@ == 'this is a test'",
u'lastdone': 1500139617,
u'max_tries': 1,
u'mtime': 1500139613,
u'name': u'check',
u'path': u'localhost;;test-trap;check',
u'primary': False,
u'priority': 0,
u'status': 10,
u'statuschange_action': None,
u'statuslast': 10,
u'statuslastchange': 1500139617,
u'title': u'Simple condition',
u'tries': 0,
u'uncheckable_fallback': None,
u'uuid': u'97f2f82c827d44868d08794baf5d3e65'}]}
Esempi
~~~~~~~~~
* Tutte le condition che contengono "localhost" nel path:
::
https:///rest_api/conditions ? sanet3auth=.... & path__contains=localhost
* Tutte le condition con status "DOWN" ("DN" o 10)
::
https:///rest_api/conditions ? sanet3auth=.... & status=DN
https:///rest_api/conditions ? sanet3auth=.... & status=10
* Tutte le condition appartenente al nodo localhost
::
https:///rest_api/conditions ? sanet3auth=.... & element__name=localhost
Datasource
========================================================================
Lista datasource
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere una lista di tutti i datasource, la URL da interrogare è la seguente:
::
https:///rest_api/datasources
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con una lista di dizionari, contenenti informazioni sui datasource filtrati, nel campo **result**.
Valore massimo datasource
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere il valore massimo di uno specifico datasource in un arco temporale, la url da interrogare è la seguente:
::
https:///rest_api/datasource//get_max_value
**INPUT**
Parametri opzionali da fornire in GET sono
* **ts_start**
* **ts_end**
* **timespec**
Se *ts_start* e *ts_end* non vengono valorizzati, saranno valutati i dati delle ultime otto ore.
Il parametro *timespec* permette di specificare, secondo la sintassi usanta in entables (:ref:`entables-matches-times`), fasce temporali all'interno dell'intervallo [ts_start, ts_end].
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con i seguenti campi aggiuntivi:
* *element_name*: nome dell'elemento
* *element_uuid*: uuid dell'elemento
* *datasource_path*: path del datasource
* *datasource_name*: nome del datasource
* *datasource_uuid*: uuid del datasource
e il valore richiesto nel campo *result*.
Valore medio datasource
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere il valore medio di uno specifico datasource in un arco temporale, la url da interrogare è la seguente:
::
https:///rest_api/datasource//get_avg_value
**INPUT**
Parametri opzionali da fornire in GET sono
* **ts_start**
* **ts_end**
* **timespec**
Se *ts_start* e *ts_end* non vengono valorizzati, saranno valutati i dati delle ultime otto ore.
Il parametro *timespec* permette di specificare, secondo la sintassi usanta in entables (:ref:`entables-matches-times`), fasce temporali all'interno dell'intervallo [ts_start, ts_end].
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con i seguenti campi aggiuntivi:
* *element_name*: nome dell'elemento
* *element_uuid*: uuid dell'elemento
* *datasource_path*: path del datasource
* *datasource_name*: nome del datasource
* *datasource_uuid*: uuid del datasource
e il valore richiesto nel campo *result*.
Valore minimo datasource
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere il valore minimo di uno specifico datasource in un arco temporale, la url da interrogare è la seguente:
::
https:///rest_api/datasource//get_min_value
**INPUT**
Parametri opzionali da fornire in GET sono
* **ts_start**
* **ts_end**
* **timespec**
Se *ts_start* e *ts_end* non vengono valorizzati, saranno valutati i dati delle ultime otto ore.
Il paraemtro *timespec* permette di specificare, secondo la sintassi usanta in entables (:ref:`entables-matches-times`), fasce temporali all'interno dell'intervallo [ts_start, ts_end].
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con i seguenti campi aggiuntivi:
* *element_name*: nome dell'elemento
* *element_uuid*: uuid dell'elemento
* *datasource_path*: path del datasource
* *datasource_name*: nome del datasource
* *datasource_uuid*: uuid del datasource
e il valore richiesto nel campo *result*.
Somma di datasource
------------------------------------------------------------------------
**DESCRIZIONE**
Per ricevere statistiche (minimo, massimo, media) della somma di datasource in un arco temporale, la url da interrogare è la seguente:
::
https:///rest_api/datasource/sum
**INPUT**
Parametri obbligatori da fornire in GET sono
* **uuids_or_paths** : elenco di uuid o path, separati da virgola, dei datasource che si vogliono sommare
Parametri opzionali da fornire in GET sono
* **ts_start**
* **ts_end**
Se *ts_start* e *ts_end* non vengono valorizzati, saranno valutati i dati delle ultime otto ore.
**OUTPUT**
Come risposta si riceverà il json standard :ref:`json_standard` con i seguenti campi aggiuntivi:
* *datasource_uuids_paths*: elenco di uuid o path dei datasource recuperati
e con i seguenti dati nel campo *result*.
* *series*: la serie completa con la somma dei datasource
* *max*: picco massimo della serie in *series*
* *ts_max*: timestamp relativo al picco massimo
* *min*: picco minimo della serie in *series*
* *ts_min*: timestamp relativo al picco massimo
* *avg*: media della serie in *series*
Nel caso in cui si verificasse un errore, nel campo *errors* sara' presente una descrizione del problema.
.. note:: Nel caso in cui uno o piu' datasource, per qualsiasi motivo, non dovessero essere recuperati l'API si comportera' nel seguente modo':
* nel campo *errors* verranno indicati quali sono i datasource non recueprati;
* nel campo *result* verrano riportati i dati degli eventuali datasource rimanenti e correttamente trovati.
Tag
========================================================================
Elenco dei tagtree
------------------------------------------------------------------------
**DESCRIZIONE**
Per avere l'elenco dei *tagtree* bisogna utilizzare la seguente URL:
::
https:///rest_api/tagtrees
Esempio:
::
https:///rest_api/tagtrees?sanet3auth=12345
**INPUT**
Nessuno.
**OUTPUT**
Come risposta si riceverà il JSON standard :ref:`json_standard`.
Il campo *result* della risposta contiene una lista di dizionari (chiave/valore) con gli attributi di tutti i *tagtree* selezionati.
Esempio:
::
{'elapsed_time': 0.002173900604248047,
'operation': u'fetch_all_tagtree',
'result': [{'name': u'geo2',
'path': u'geo2:',
'uuid': u'f364154bab32441094c4208f024f040a'},
{'name': u'111',
'path': u'111:',
'uuid': u'bc54391b09334acea89597d49056ad8a'},
{'name': u'geo',
'path': u'geo:',
'uuid': u'63e7a2b9b243409a97a231b1ae35a73f'},
{'name': u'prova_tagging',
'path': u'prova_tagging:',
'uuid': u'68d3e1a3f2554c02acd2e8247313546f'},
{'name': u'tagtree1',
'path': u'tagtree1:',
'uuid': u'326d13e3c51f41afae2c61f79012e59b'},
{'name': u'tree1',
'path': u'tree1:',
'uuid': u'd201a37ca9db4ca298d3a854f8ca1e78'},
{'name': u'tree12',
'path': u'tree12:',
'uuid': u'865b09a66a804098b003895307a87607'},
{'name': u'tree13',
'path': u'tree13:',
'uuid': u'9c3c3286493643bdb07ae2b1683640d1'},
{'name': u'tree1b',
'path': u'tree1b:',
'uuid': u'7111510021ea46a49823d05e038815c4'},
{'name': u'tree1c',
'path': u'tree1c:',
'uuid': u'0b626627b2744958bea22da7c29bef67'},
{'name': u'xxx',
'path': u'xxx:',
'uuid': u'6ebee2af0d8c4f968fb9f9edd68f76b4'},
{'name': u'yyy',
'path': u'yyy:',
'uuid': u'c4a9ee0c543f4a8894066eb2d61f7ee3'},
{'name': u'zzz',
'path': u'zzz:',
'uuid': u'fc1364a9c73d41059860661f8408f092'},
{'name': u'tag2',
'path': u'tag2:',
'uuid': u'ade885ce11144a419afe6bd1d38cd422'}]}
Elenco dei tag
------------------------------------------------------------------------
**DESCRIZIONE**
Per avere l'elenco dei *tagtree* bisogna utilizzare la seguente URL:
::
https:///rest_api/tags
**INPUT**
Nessuno
**OUTPUT**
Come risposta si riceverà il JSON standard :ref:`json_standard`.
Il campo *result* della risposta contiene una lista di dizionari (chiave/valore) con gli attributi di tutti i *tag* selezionati.
Esempio:
::
{'elapsed_time': 0.00951695442199707,
'operation': u'fetch_all_tag',
'result': [{'icon': None,
'mtime': 1500153752,
'name': u'Geografico',
'parent_id': None,
'path': u'geo:/Geografico',
'tree_id': u'63e7a2b9b243409a97a231b1ae35a73f',
'uuid': u'422ce2179631474eb34a27cff467102a'}]}
Ultimo valore dei datasource contenuti in un tag
------------------------------------------------------------------------
**DESCRIZIONE**
Elabora tutti i datasource del tag (e sottotag) e restituisce l'ultimo valore registrato.
::
http:///sanet/rest_api/tag//datasources/get_last_value?
Esempio:
::
http:///sanet/rest_api/tag/422ce2179631474eb34a27cff467102a/datasources/get_last_value?sanet3auth=12345&sum_by=name
**INPUT**
Questi sono i parametri in Get:
* tag (stringa)
UUID o PATH del tag da elaborare.
* sum_by (stringa)
Indica se sommare i valori dei datasource elabrorati e in che modo.
I valori ammessi sono:
* "by-name" : Somma i valori dei datasource raggruppando per nome del datasource
* "no" : Restituisce informazioni sull'ultimo valore per tutti i datasource elaborati.
Facoltativo: Si
**OUTPUT**
Restituisce un messaggio nel formato:
::
{
'elapsed_time':
,
'errors' :
,
'data' :
}
Il contentuto/formato del campo *data* dipende dal valore specificato dai parametri in input.
Quando *sum_series* valore *"no"*, il campo *data* contiene un elenco di tuple:
::
Quando *sum_series* valore *"by-name"*,il campo *data* contiene un elenco di tuple:
::
< datasource name , total >
**Esempi**
Esempio: Chiamata senza parametro *sum_by*
::
{'elapsed_time': 0.022342920303344727,
'errors': '9 datasources not loaded',
'operation': 'get_last_value',
'result': [(u'23ca1860edbd4711822edb319717c616',
u'localhost',
u'82fe0ef593ea46d39f912344868613b5',
u'root',
u'0a0685b44c154d998d23b4e387f717db',
u'used',
u'localhost:root;;storage;used',
None),
(u'23ca1860edbd4711822edb319717c616',
u'localhost',
u'82fe0ef593ea46d39f912344868613b5',
u'root',
u'f4d23572b18a446292eee43e240b69fd',
u'installed',
u'localhost:root;;storage;installed',
None),
(u'23ca1860edbd4711822edb319717c616',
u'localhost',
u'08fec5c2500c47d18e97eee7947a38e7',
u'eth0',
u'48d9aec8ec194cec9813e6c4502eda0a',
u'out',
u'localhost:eth0;;iface-traffic;out',
None)]}
Esempio: Chiamata senza parametro *sum_by=name*
::
{'elapsed_time': 0.027868032455444336,
'errors': '9 datasources not loaded',
'operation': 'get_last_value',
'result': [
(u'installed', 122341423131),
(u'used', 12345345)]}
Valori mensili dell'anno precedente dei datasource contenuti in un tag
------------------------------------------------------------------------
**DESCRIZIONE**
Elabora tutti i datasource del tag (e sottotag) e restituisce il valore registrato all'inizio di ogni mese dell'anno.
::
http:///sanet/rest_api/tag//datasources/get_last_year_values?
Esempio:
::
http:///sanet/rest_api/tag/geo:/Geografico/datasources/get_last_year_values?sanet3auth=12345
http:///sanet/rest_api/tag/422ce2179631474eb34a27cff467102a/datasources/get_last_year_values?sanet3auth=12345
**INPUT**
Questi sono i parametri all'interno della URL:
* (stringa)
UUID o PATH del tag da elaborare.
Questi sono i parametri in GET:
* valid_time_window (intero)
In presenza di valori *nulli* registrati, numero di secondi di tolleranza entro il quale cercare il prima volore valido.
Se non vengono trovati valori non *nulli* all'interno del periodo di tolleranza, il valore registrato per quel meso sara' None.
**OUTPUT**
Restituisce un messaggio nel formato:
::
{
'elapsed_time':
,
'errors' :
,
'result' :
}
Quando *sum_series* valore *"no"*, il campo *data* contiene un elenco di tuple:
::
**Esempi**
::
{'elapsed_time': 0.014796972274780273,
'errors': '0 datasources not loaded',
'operation': 'get_last_year_values',
'result': [('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-01-01', 1451602800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-02-01', 1454281200.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-03-01', 1456786800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-04-01', 1459461600.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-05-01', 1462053600.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-06-01', 1464732000.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-07-01', 1467324000.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-08-01', 1470002400.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-09-01', 1472680800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-10-01', 1475272800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-11-01', 1477954800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'ccd306b551a94e9ca67673d7a96f89fb', 'in', 'localhost:eth0;;iface-traffic;in', '2016-12-01', 1480546800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-01-01', 1451602800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-02-01', 1454281200.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-03-01', 1456786800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-04-01', 1459461600.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-05-01', 1462053600.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-06-01', 1464732000.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-07-01', 1467324000.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-08-01', 1470002400.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-09-01', 1472680800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-10-01', 1475272800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-11-01', 1477954800.0, None),
('79b977c52f6e4c84aa496ba942ba70d8', 'localhost', 'ec6e4cb188b64ebcbce204d14380de4d', 'eth0', 'a66f9268b838471d98d5b579ad4f9c0c', 'out', 'localhost:eth0;;iface-traffic;out', '2016-12-01', 1480546800.0, None)]}
Allarmi
========================================================================
Allarmi in corso
------------------------------------------------------------------------
**DESCRIZIONE**
Per avere l'elenco dei allarmi (corrispondenti a condition down) bisogna utilizzare la seguente URL:
::
https:///rest_api/alarm/current
**INPUT**
Sono previsti i seguenti parametri
* priority_level (stringa)
Se specificato, vengono restituiti solo gli allarmi con priority che ricade nel range del priority_level indicato.
**OUTPUT**
Come risposta si riceverà il JSON standard :ref:`json_standard`.
Il campo *result* della risposta contiene una lista di dizionari (chiave/valore) con gli attributi di tutti i *allarmi* selezionati.
::
{
"elapsed_time": ,
"operation" : ,
"result" : [
{ ... },
{ ... },
{ ... },
{ ... },
{ ... },
]
}
La struttura dati per ogni allarme contiene informazioni su:
* elemento associato all'allarme.
* la condition associata all'allarme.
* la variazione di stato che ha generato l'allarme.
* informazioni sui tag associati all'elemento e condition dell'allarme.
Esempo di dati di un singolo allarme:
::
{
"uuid" : "7eb499dd9fb54f0a87afd351d0c4ce56" *identificativo univoco dell'allarme*
"ts" : 1511001368, *timestamp UTC**di generazione dell'allarme*
"element": {
"uuid" : "e173f52135b845a5bf1792e33ad508ac" *identificativo univoco dell'elemento associato all'allarme*
"path" : "dm10lx03:rootfs", *identificativo univoco mnemonico dell'elemento associato all'allarme*
"name" : "rootfs", *nome dell'elemento*
"description": "Root FS", *descrizione**dell'elemento*
"type" : 3, *tipo dell'elemento (1=nodo,2=interfaccia,3=storage,4=service,5=device)*
"parent_id" : "a12937d61c874890914182b6d25ebbb8", *identificativo dell'elemento padre (l'uuid del nodo)*
"parent_name": "dm10lx03", *identificativo univoco dell'elemento padre (il nome del nodo)*
},
"condition": {
"uuid" : "050db78a671e48358ca266a92e9c9682" *identificativo univoco della condition che ha generato l'allarme*
"path" : "dm10lx03:rootfs;storage;storage;check-storageperc", *identificativo mnemonico*
"name" : "check-storageperc", *nome della **condition*
"description" : "Check occupazione filesystem root", *descrizione**della condition*
"classification" : "system.storage.usage", *classificazione della **condition*
"priority" : 60, *importanza/priorita' associata alla **condition*
"priority_level" : "medium", *classe di importanza/priorita' associata alla **condition*
"statuslastchange": 1511001368, *timestamp ***UTC**della *variazione di stato precedente della **condition*
},
"result": { *risultati del check*
"status" : 10, *stato della verifica della condition*
"laststatus": 20, *stato precedente*
},
"info": { *informazioni dell'elemento*
"ip4s" : ['10.0.25.201'],
},
"mail": {
"subject": ".....",
"body": "....."
}
"tags": [ *opt. **classificazioni/tag assegnati alla condizione o all'elemento associati all'allarme*
"dmh:/DMH/Sistemi Critici/3.Labs"
],
"cluster": { ***opt. *cluster al quale l'elemento e' associato*
"name" : ['VMWare-Produzione'],
},
"meta": { ****opt. *informazioni addizionali dell'elemento*
"referenti" : [ *referenti associati all'elemento*
'Sergio Rizzi ',
'Tiziano Fogli '
]
},
}
Log
========================================================================
Elenco dei log
------------------------------------------------------------------------
**DESCRIZIONE**
Per avere l'elenco dei *tagtree* bisogna utilizzare la seguente URL:
::
https:///rest_api/events
Esempio:
::
https:///rest_api/events?sanet3auth=12345
.. _warning: Il limite di deafult (modificabile con il parametro _limit) e' di 100 eventi.
**INPUT**
Accetta in input un numero arbitrario di filtri. Si rimanda alla sezione: :ref:`rest_api-get-params-filters`.
**OUTPUT**
Come risposta si riceverà il JSON standard :ref:`json_standard`.
Il campo *result* della risposta contiene una lista di dizionari (chiave/valore) con gli attributi di tutti gli *eventi* selezionati.