diff --git a/README.md b/README.md index 84a65db87513741d4f9e00fba9afedcdbefc103d..6479408687ac93782ed68328e8e8761772716f24 100644 --- a/README.md +++ b/README.md @@ -1,74 +1,13 @@ # BRIAN Dashboard Manager -## Overview +The BRIAN Dashboard Manager is used +provision Organizations and Dashboards in Grafana for BRIAN. -This module is used to provision Organizations and Dashboards in Grafana for BRIAN. -It implements a Flask-based webservice used only to trigger the provisioning process. - -The dashboards are generated from a list of interfaces obtained from Inventory Provider. - -Jinja templates are populated with data from these interfaces to render Dashboard JSON definitions sent to the Grafana API. - -Grafana API-related code lives in the `grafana` package. - -The `brian_dashboard_manager/grafana/provision.py` file is responsible for the entire provisioning lifecycle. - -Grafana API endpoints have wrapper functions in one file for relevant parts of the API, e.g. `brian_dashboard_manager/grafana/dashboard.py` for the dashboard API functions. - -Another example is `brian_dashboard_manager/grafana/organization.py` for the organization API functions. - -Some of the provisioned dashboards are not generated but are just static JSON files. These are put in the `brian_dashboard_manager/dashboards` directory. The same can be done for JSON datasource definitions in the `datasources` directory. - -The `brian_dashboard_manager/templating` package contains the code and Jinja templates used to render dashboard JSON. Most dashboards reuse the same templates, with the exception of NREN-specific dashboards, which has its own template. - -Of note is the `templating/helpers.py` file, which has all of the predicates and helper functions used to group interfaces together and generate the necessary data for the dashboard templates. -The `templating/render.py` has functions for rendering of the various Jinja templates from the given data. - -## Configuration - -This app allows specification of a few -example configuration parameters. These -parameters should stored in a file formatted -similarly to `config.json.example`, and the name -of this file should be stored in the environment -variable `CONFIG_FILENAME` when running the service. - -## Running this module - -This module has been tested in the following execution environments: - -- As an embedded Flask application. - For example, the application could be launched as follows: +Documentation can be generated by running sphinx: ```bash -$ export FLASK_APP=/path/to/brian_dashboard_manager/app.py -$ export CONFIG_FILENAME=/path/to/config.json -$ flask run +sphinx-build -M html docs/source docs/build ``` -- As a `gunicorn` wsgi service. - - Details of `gunicorn` configuration can be found in the brian_dashboard_manager Puppet repository. - -## Protocol Specification - -The following resources can be requested from the webservice. - -### resources -Any non-empty responses are JSON formatted messages. - -## /update - -This resource is used to trigger the provisioning to Grafana. -It responds to the request immediately after starting the provisioning process. - -```json -{ - "$schema": "http://json-schema.org/draft-07/schema#", - "type": "object", - "properties": { - "message": { - "type": "string" - } - } -} -``` +The documents should be viewable in the +workspace of the most recent [Jenkins job](https://jenkins.geant.org/job/brian-dashboard-manager/ws/docs/build/html/index.html). diff --git a/brian_dashboard_manager/grafana/__init__.py b/brian_dashboard_manager/grafana/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..2857b60e672b4fb57365c24d006693d532167a21 100644 --- a/brian_dashboard_manager/grafana/__init__.py +++ b/brian_dashboard_manager/grafana/__init__.py @@ -0,0 +1,23 @@ +""" +Grafana module +=============== + +Grafana API-related code. + +Provisioning +--------------- +.. automodule:: brian_dashboard_manager.grafana.provision + + +Grafana API +------------- +.. automodule:: brian_dashboard_manager.grafana.dashboard + + +Organizations +---------------- +.. automodule:: brian_dashboard_manager.grafana.organization + + + +""" \ No newline at end of file diff --git a/brian_dashboard_manager/grafana/dashboard.py b/brian_dashboard_manager/grafana/dashboard.py index 19c1fee56a16c75aa97aca48bb6bdbec43fc50c7..7763af5941be0281dab11ec00955a7d09fdaa906 100644 --- a/brian_dashboard_manager/grafana/dashboard.py +++ b/brian_dashboard_manager/grafana/dashboard.py @@ -1,3 +1,6 @@ +""" +Grafana Dashhboard API endpoints wrapper functions. +""" import logging import os import json diff --git a/brian_dashboard_manager/grafana/organization.py b/brian_dashboard_manager/grafana/organization.py index 4c01096f279801cbbbe7730cd0281a28c112c746..d075660ea874aec41a559abe3b40786dad8d948d 100644 --- a/brian_dashboard_manager/grafana/organization.py +++ b/brian_dashboard_manager/grafana/organization.py @@ -1,3 +1,7 @@ +""" +Grafana Organization management helpers. + +""" import random import string import logging diff --git a/brian_dashboard_manager/grafana/provision.py b/brian_dashboard_manager/grafana/provision.py index 90eae8885608bf52e9ad553356d0252ec612ce0e..bdb0e29bd093a7f527160fcbe8ab35e709d33e8b 100644 --- a/brian_dashboard_manager/grafana/provision.py +++ b/brian_dashboard_manager/grafana/provision.py @@ -1,3 +1,7 @@ +""" +This module is responsible for the +entire provisioning lifecycle. +""" import logging import time from concurrent.futures import ProcessPoolExecutor, ThreadPoolExecutor diff --git a/brian_dashboard_manager/routes/update.py b/brian_dashboard_manager/routes/update.py index 681c8679fd366fef2ecd856a695aca24d39a207a..c5d83901dc557920824207f5fdba2324976be1b0 100644 --- a/brian_dashboard_manager/routes/update.py +++ b/brian_dashboard_manager/routes/update.py @@ -6,6 +6,16 @@ from brian_dashboard_manager import CONFIG_KEY routes = Blueprint("update", __name__) +UPDATE_RESPONSE_SCHEMA = { + '$schema': 'http://json-schema.org/draft-07/schema#', + 'type': 'object', + 'properties': { + 'message': { + 'type': 'string' + } + } +} + @routes.after_request def after_request(resp): @@ -14,6 +24,19 @@ def after_request(resp): @routes.route('/', methods=['GET']) def update(): + """ + This resource is used to trigger the provisioning to Grafana. + + It responds to the request immediately after starting the provisioning process. + + + The response will be formatted according to the following schema: + + .. asjson:: + brian_dashboard_manager.routes.update.UPDATE_RESPONSE_SCHEMA + + :return: json + """ executor = ThreadPoolExecutor(max_workers=1) executor.submit(provision, current_app.config[CONFIG_KEY]) return {'data': {'message': 'Provisioning dashboards!'}} diff --git a/brian_dashboard_manager/templating/__init__.py b/brian_dashboard_manager/templating/__init__.py index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..b13a000774e83ec3acb2f270b27eb01d4921a4ff 100644 --- a/brian_dashboard_manager/templating/__init__.py +++ b/brian_dashboard_manager/templating/__init__.py @@ -0,0 +1,26 @@ +""" +Code and +Jinja templates used to render dashboard JSON. +Most dashboards reuse the +same templates, with the exception of +NREN-specific dashboards, which has +its own template. + + +Templates +----------- +Some of the provisioned dashboards are not generated but are just static +JSON files. These are put in the `brian_dashboard_manager/dashboards` directory. +The same can be done for JSON datasource definitions in the `datasources` directory. + + +Helpers +--------- +.. automodule:: brian_dashboard_manager.templating.helpers + + +Rendering +--------- +.. automodule:: brian_dashboard_manager.templating.render + +""" diff --git a/brian_dashboard_manager/templating/helpers.py b/brian_dashboard_manager/templating/helpers.py index 1171c9fc88c0f39837382a46aeb6c7e575698555..fea1a1f194874aefc3968fb662c43020351666fd 100644 --- a/brian_dashboard_manager/templating/helpers.py +++ b/brian_dashboard_manager/templating/helpers.py @@ -1,3 +1,8 @@ +""" +Predicates +and helper functions used to group interfaces together and generate the +necessary data for the dashboard templates. +""" import re import logging import json diff --git a/brian_dashboard_manager/templating/render.py b/brian_dashboard_manager/templating/render.py index dede30c87a9d9869551a1680e183e73a2060d1e4..2aa06bf9258275ffc8dd239e0003588bcd7e1a40 100644 --- a/brian_dashboard_manager/templating/render.py +++ b/brian_dashboard_manager/templating/render.py @@ -1,3 +1,7 @@ +""" +Methods for rendering of the +various Jinja templates from the given data. +""" import os import json import jinja2 diff --git a/docs/source/configuration.rst b/docs/source/configuration.rst new file mode 100644 index 0000000000000000000000000000000000000000..5f35ebc14879888fe5692152ae72176b34f0f25a --- /dev/null +++ b/docs/source/configuration.rst @@ -0,0 +1,32 @@ + +Configuration and Running +========================= + +Configuration +------------- + +This app allows specification of a few +example configuration parameters. These +parameters should stored in a file formatted +similarly to `config.json.example`, and the name +of this file should be stored in the environment +variable `CONFIG_FILENAME` when running the service. + +Running this module +--------------------- + +This module has been tested in the following execution environments: + +* As an embedded Flask application. + For example, the application could be launched as follows: + +.. code-block:: python + + export FLASK_APP=/path/to/brian_dashboard_manager/app.py + export CONFIG_FILENAME=/path/to/config.json + flask run + +* As a `gunicorn` wsgi service. + + * Details of `gunicorn` configuration can be found in the + brian_dashboard_manager Puppet repository. \ No newline at end of file diff --git a/docs/source/index.rst b/docs/source/index.rst index 6e0e3cd62a7a7f1f15a8859baa43742430e83d1b..97444a54aef7962b68d0cc7ec16d4ccf7d46fad0 100644 --- a/docs/source/index.rst +++ b/docs/source/index.rst @@ -3,18 +3,18 @@ You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. -Welcome to BRIAN Dashboard Manager's documentation! -=================================================== -.. toctree:: - :maxdepth: 2 - :caption: Contents: +Inventory Provider +================== +The BRIAN Dashboard Manager is used +provision Organizations and Dashboards in Grafana for BRIAN. -Indices and tables -================== +.. toctree:: + :maxdepth: 3 + :caption: Contents: -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` + configuration + overview + protocol diff --git a/docs/source/overview.rst b/docs/source/overview.rst new file mode 100644 index 0000000000000000000000000000000000000000..063ba7ee1154fa4fcdb8dd5a5af1140b9961b305 --- /dev/null +++ b/docs/source/overview.rst @@ -0,0 +1,14 @@ + +Overview +========================= + +This module is used to provision Organizations and Dashboards inGrafana for BRIAN. + +The dashboards are generated from a list of interfaces obtained from Inventory Provider. + +Jinja templates are populated with data from these interfaces to render +Dashboard JSON definitions sent to the Grafana API. + +.. automodule:: brian_dashboard_manager.grafana + +.. automodule:: brian_dashboard_manager.templating diff --git a/docs/source/protocol.rst b/docs/source/protocol.rst new file mode 100644 index 0000000000000000000000000000000000000000..bb1ebfdf9b9b4cce9e5c1b8fcc0875325e192086 --- /dev/null +++ b/docs/source/protocol.rst @@ -0,0 +1,19 @@ + +Protocol +========================= + + +This module implements a Flask-based webservice used only to +trigger the provisioning process. + +The following resources can be requested from the webservice. + +resources +----------- +Any non-empty responses are JSON formatted messages. + + +/update +********* + +.. autofunction:: brian_dashboard_manager.routes.update.update