Source code for rpymostat.engine.api.v1.status

"""
The latest version of this package is available at:
<http://github.com/jantman/RPyMostat>

##################################################################################
Copyright 2016 Jason Antman <jason@jasonantman.com> <http://www.jasonantman.com>

    This file is part of RPyMostat, also known as RPyMostat.

    RPyMostat is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    RPyMostat is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with RPyMostat.  If not, see <http://www.gnu.org/licenses/>.

The Copyright and Authors attributions contained herein may not be removed or
otherwise altered, except to add the Author attribution of a contributor to
this work. (Additional Terms pursuant to Section 7b of the AGPL v3)
##################################################################################
While not legally required, I sincerely request that anyone who finds
bugs please submit them at <https://github.com/jantman/RPyMostat> or
to me via email, and that you send any contributions or improvements
either as a pull request on GitHub, or to me via email.
##################################################################################

AUTHORS:
Jason Antman <jason@jasonantman.com> <http://www.jasonantman.com>
##################################################################################
"""

import abc  # noqa
import logging
import json

from twisted.internet.defer import inlineCallbacks, returnValue

from rpymostat.engine.site_hierarchy import SiteHierarchy
from rpymostat.db import get_collection, COLL_SENSORS

logger = logging.getLogger(__name__)


[docs]class Status(SiteHierarchy): """ Manages the v1/status portion of the API. """ prefix_part = 'status'
[docs] def setup_routes(self): """Setup routes for subparts of the hierarchy.""" self.add_route(self.status)
@inlineCallbacks
[docs] def status(self, _self, request): """ Report on application and dependency status. This serves :http:get:`/v1/status` :param _self: another reference to ``self`` sent by Klein :param request: the Request :type request: instance of :class:`twisted.web.server.Request` <HTTPAPI> Return application status information (mainly dependent services). Served by :py:meth:`.status`. **Example request**: .. sourcecode:: http GET /v1/status HTTP/1.1 Host: example.com **Example Response**: .. sourcecode:: http HTTP/1.1 200 OK Content-Type: application/json { "status": true, "dependencies": { "mongodb": true } } :statuscode 200: operational :statuscode 503: non-operational """ status = {'dependencies': {}} is_ok = True try: coll = get_collection(self.dbconn, COLL_SENSORS) yield coll.find(limit=1) status['dependencies']['mongodb'] = True except: logger.error('DB connection test failed', exc_info=1) status['dependencies']['mongodb'] = False is_ok = False status['status'] = is_ok request.responseHeaders.addRawHeader( b"content-type", b"application/json" ) resp = json.dumps(status, sort_keys=True) if is_ok: request.setResponseCode(200) else: request.setResponseCode(503) returnValue(resp)