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
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"
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'
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"
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
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"
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)
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'
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
def dockerflow(app): return Dockerflow(app)
# -*- 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
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
# 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))