예제 #1
0
def extension(app):
    logger.info('Loading Redash_Iodide Extension for Dockerflow')
    dockerflow = Dockerflow(app,
                            db=db,
                            migrate=migrate,
                            redis=redis_connection)
    logger.info('Loaded Redash_Iodide Extension for Dockerflow')
    return dockerflow
예제 #2
0
def test_full_db_check(mocker):
    app = Flask("db-check")
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    db = SQLAlchemy(app)
    dockerflow = Dockerflow(app, db=db)
    assert "check_database_connected" in dockerflow.checks

    response = app.test_client().get("/__heartbeat__")
    assert response.status_code == 200
    assert json.loads(response.data.decode())["status"] == "ok"
예제 #3
0
def test_full_redis_check(mocker):
    app = Flask("redis-check")
    app.debug = True
    redis_store = FlaskRedis.from_custom_provider(FakeStrictRedis, app)
    dockerflow = Dockerflow(app, redis=redis_store)
    assert "check_redis_connected" in dockerflow.checks

    with app.test_client() as test_client:
        response = test_client.get("/__heartbeat__")
        assert response.status_code == 200
        assert json.loads(response.data.decode())["status"] == "ok"
def test_full_db_check(mocker):
    app = Flask('db-check')
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db = SQLAlchemy(app)
    dockerflow = Dockerflow(app, db=db)
    assert 'check_database_connected' in dockerflow.checks

    response = app.test_client().get('/__heartbeat__')
    assert response.status_code == 200
    assert json.loads(response.data.decode())['status'] == 'ok'
예제 #5
0
def test_full_redis_check_error(mocker):
    app = Flask("redis-check")
    redis_store = FlaskRedis.from_custom_provider(FakeStrictRedis, app)
    ping = mocker.patch.object(redis_store, "ping")
    ping.side_effect = redis.ConnectionError
    dockerflow = Dockerflow(app, redis=redis_store)
    assert "check_redis_connected" in dockerflow.checks

    with app.test_client() as test_client:
        response = test_client.get("/__heartbeat__")
        assert response.status_code == 500
        assert json.loads(response.data.decode())["status"] == "error"
예제 #6
0
def extension(app):
    logger.info("Loading Redash Extension for Dockerflow")
    try:
        dockerflow = Dockerflow(app,
                                db=db,
                                migrate=migrate,
                                redis=redis_connection)
    except AssertionError:
        pass
    else:
        logger.info("Loaded Redash Extension for Dockerflow")
        return dockerflow
예제 #7
0
def test_request_summary_exception(caplog, app):
    Dockerflow(app)

    with app.test_request_context("/", headers=headers):
        assert has_request_context()
        app.preprocess_request()
        app.handle_exception(ValueError("exception message"))
        response = Response("")
        response = app.process_response(response)
        for record in caplog.records:
            if record != "request.summary":
                continue
            assert_log_record(request, record, level=logging.ERROR, errno=500)
            assert record.getMessage() == "exception message"
예제 #8
0
def test_version_path(mocker, version_content):
    app = Flask("dockerflow")
    app.secret_key = "super sekrit"
    login_manager = LoginManager(app)
    login_manager.user_loader(load_user)
    custom_version_path = "/something/extra/ordinary"
    dockerflow = Dockerflow(app, version_path=custom_version_path)
    version_callback = mocker.patch.object(dockerflow,
                                           "_version_callback",
                                           return_value=version_content)
    with app.test_client() as test_client:
        response = test_client.get("/__version__")
        assert response.status_code == 200
        assert json.loads(response.data.decode()) == version_content
        version_callback.assert_called_with(custom_version_path)
예제 #9
0
def test_full_db_check_error(mocker):
    app = Flask("db-check")
    app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite://"
    app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
    db = SQLAlchemy(app)

    engine_connect = mocker.patch.object(db.engine, "connect")
    engine_connect.side_effect = SQLAlchemyError
    dockerflow = Dockerflow(app, db=db)
    assert "check_database_connected" in dockerflow.checks

    with app.test_client() as test_client:
        response = test_client.get("/__heartbeat__")
        assert response.status_code == 500
        assert json.loads(response.data.decode())["status"] == "error"
def test_full_db_check_error(mocker):
    app = Flask('db-check')
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite://'
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
    db = SQLAlchemy(app)

    engine_connect = mocker.patch.object(db.engine, 'connect')
    engine_connect.side_effect = SQLAlchemyError
    dockerflow = Dockerflow(app, db=db)
    assert 'check_database_connected' in dockerflow.checks

    with app.test_client() as test_client:
        response = test_client.get('/__heartbeat__')
        assert response.status_code == 500
        assert json.loads(response.data.decode())['status'] == 'error'
예제 #11
0
def test_instantiating(app):
    dockerflow = Dockerflow()
    assert "dockerflow.heartbeat" not in app.view_functions
    dockerflow.init_app(app)
    assert "dockerflow.heartbeat" in app.view_functions
예제 #12
0
def dockerflow(app):
    return Dockerflow(app)
예제 #13
0
# -*- coding: utf-8 -*-
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""
Provide API endpoint for Dockerflow
https://github.com/mozilla-services/Dockerflow
"""
import logging

from dockerflow.flask import Dockerflow

dockerflow = Dockerflow(version_path="/app")


def init_app(app):
    # Suppress heartbeat logs
    dockerflow.logger.setLevel(logging.ERROR)
    dockerflow.init_app(app)
    return dockerflow
예제 #14
0
from moztelemetry.histogram import Histogram
from moztelemetry.scalar import MissingScalarError, Scalar
from psycogreen.gevent import patch_psycopg
from psycopg2.pool import SimpleConnectionPool
from werkzeug.exceptions import MethodNotAllowed
from jose import jwt
from jose.jwt import JWTError

from aggregator import (
    COUNT_HISTOGRAM_LABELS, COUNT_HISTOGRAM_PREFIX, NUMERIC_SCALARS_PREFIX, SCALAR_MEASURE_MAP)
from db import get_db_connection_string, histogram_revision_map, _preparedb

pool = None
db_connection_string = get_db_connection_string(read_only=True)
app = Flask(__name__)
dockerflow = Dockerflow(app, version_path='/app')

app.config.from_pyfile('config.py')

CORS(app, resources=r'/*', allow_headers=['Authorization', 'Content-Type'])
cache = Cache(app, config={'CACHE_TYPE': app.config["CACHETYPE"]})
sslify = SSLify(app, permanent=True, skips=['__version__', '__heartbeat__', '__lbheartbeat__', 'status'])

patch_all()
patch_psycopg()
cache.clear()

# For caching - change this if after backfilling submission_date data
SUBMISSION_DATE_ETAG = 'submission_date_v1'
CLIENT_CACHE_SLACK_SECONDS = 3600
예제 #15
0
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.

import sys
from flask import Flask
from dockerflow.flask import Dockerflow
import optparse
from decouple import config
import importlib
import sentry_sdk
from sentry_sdk.integrations.flask import FlaskIntegration

app = Flask(__name__)
dockerflow = Dockerflow(app)

# Hook the application plugin and configure it
PLUGIN = config("TAAR_API_PLUGIN", default=None)

sentry_sdk.init(
    dsn=config("SENTRY_DSN", ''),
    integrations=[FlaskIntegration()],
)

# There should only be a single registered app for the taar-api
if PLUGIN is None:
    sys.stderr.write("No plugin is defined.\n")
    sys.exit(1)

# Load the function and configure the application
sys.stdout.write("Loading [{}]\n".format(PLUGIN))