diff --git a/app/__init__.py b/app/__init__.py index f6228bd60..fbb31d3e9 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -1,9 +1,10 @@ import uuid import os -from flask import request, url_for +from flask import request, url_for, g from flask import Flask, _request_ctx_stack from flask.ext.sqlalchemy import SQLAlchemy from flask_marshmallow import Marshmallow +from monotonic import monotonic from werkzeug.local import LocalProxy from notifications_utils import logging from app.celery.celery import NotifyCelery @@ -11,6 +12,7 @@ from app.clients import Clients from app.clients.sms.mmg import MMGClient from app.clients.sms.twilio import TwilioClient from app.clients.sms.firetext import FiretextClient +from app.clients.sms.loadtesting import LoadtestingClient from app.clients.email.aws_ses import AwsSesClient from app.encryption import Encryption @@ -22,6 +24,7 @@ ma = Marshmallow() notify_celery = NotifyCelery() twilio_client = TwilioClient() firetext_client = FiretextClient() +loadtest_client = LoadtestingClient() mmg_client = MMGClient() aws_ses_client = AwsSesClient() encryption = Encryption() @@ -46,11 +49,12 @@ def create_app(app_name=None): logging.init_app(application) twilio_client.init_app(application) firetext_client.init_app(application) + loadtest_client.init_app(application) mmg_client.init_app(application.config) aws_ses_client.init_app(application.config['AWS_REGION']) notify_celery.init_app(application) encryption.init_app(application) - clients.init_app(sms_clients=[firetext_client, mmg_client], email_clients=[aws_ses_client]) + clients.init_app(sms_clients=[firetext_client, mmg_client, loadtest_client], email_clients=[aws_ses_client]) from app.service.rest import service as service_blueprint from app.user.rest import user as user_blueprint @@ -99,6 +103,10 @@ def init_app(app): if error: return error + @app.before_request + def record_start_time(): + g.start = monotonic() + @app.after_request def after_request(response): response.headers.add('Access-Control-Allow-Origin', '*') diff --git a/app/clients/sms/loadtesting.py b/app/clients/sms/loadtesting.py new file mode 100644 index 000000000..755578a86 --- /dev/null +++ b/app/clients/sms/loadtesting.py @@ -0,0 +1,18 @@ +import logging +from app.clients.sms.firetext import ( + FiretextClient +) + +logger = logging.getLogger(__name__) + + +class LoadtestingClient(FiretextClient): + ''' + Loadtest sms client. + ''' + + def init_app(self, config, *args, **kwargs): + super(FiretextClient, self).__init__(*args, **kwargs) + self.api_key = config.config.get('LOADTESTING_API_KEY') + self.from_number = config.config.get('LOADTESTING_NUMBER') + self.name = 'loadtesting' diff --git a/config.py b/config.py index 938887e9a..6ebed4c64 100644 --- a/config.py +++ b/config.py @@ -82,6 +82,8 @@ class Config(object): TWILIO_NUMBER = os.getenv('TWILIO_NUMBER') FIRETEXT_NUMBER = os.getenv('FIRETEXT_NUMBER') FIRETEXT_API_KEY = os.getenv("FIRETEXT_API_KEY") + LOADTESTING_NUMBER = os.getenv('LOADTESTING_NUMBER') + LOADTESTING_API_KEY = os.getenv("LOADTESTING_API_KEY") CSV_UPLOAD_BUCKET_NAME = 'local-notifications-csv-upload' NOTIFICATIONS_ALERT = 5 # five mins diff --git a/environment_test.sh b/environment_test.sh index a4276d4c4..f07f9bccf 100644 --- a/environment_test.sh +++ b/environment_test.sh @@ -19,4 +19,6 @@ export FIRETEXT_API_KEY="Firetext" export FIRETEXT_NUMBER="Firetext" export NOTIFY_EMAIL_DOMAIN="test.notify.com" export MMG_API_KEY='mmg-secret-key' -export MMG_FROM_NUMBER='test' \ No newline at end of file +export MMG_FROM_NUMBER='test' +export LOADTESTING_API_KEY="loadtesting" +export LOADTESTING_NUMBER="loadtesting" diff --git a/migrations/versions/0013_add_loadtest_client.py b/migrations/versions/0013_add_loadtest_client.py new file mode 100644 index 000000000..669b6e286 --- /dev/null +++ b/migrations/versions/0013_add_loadtest_client.py @@ -0,0 +1,27 @@ +"""empty message + +Revision ID: 0013_add_loadtest_client +Revises: 0012_complete_provider_details +Create Date: 2016-05-05 09:14:29.328841 + +""" + +# revision identifiers, used by Alembic. +revision = '0013_add_loadtest_client' +down_revision = '0012_complete_provider_details' + +import uuid + +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import postgresql + +def upgrade(): + + op.execute( + "INSERT INTO provider_details (id, display_name, identifier, priority, notification_type, active) values ('{}', 'Loadtesting', 'loadtesting', 30, 'sms', true)".format(str(uuid.uuid4())) + ) + + +def downgrade(): + op.drop_table('provider_details') diff --git a/requirements.txt b/requirements.txt index 971ad3cd4..50ded66b5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -22,4 +22,4 @@ monotonic==0.3 git+https://github.com/alphagov/notifications-python-client.git@1.0.0#egg=notifications-python-client==1.0.0 -git+https://github.com/alphagov/notifications-utils.git@5.2.0#egg=notifications-utils==5.2.0 +git+https://github.com/alphagov/notifications-utils.git@5.2.3#egg=notifications-utils==5.2.3 diff --git a/tests/app/dao/test_provider_details_dao.py b/tests/app/dao/test_provider_details_dao.py index cb63fa400..471632ebf 100644 --- a/tests/app/dao/test_provider_details_dao.py +++ b/tests/app/dao/test_provider_details_dao.py @@ -7,11 +7,11 @@ from app.dao.provider_details_dao import ( def test_can_get_all_providers(notify_db, notify_db_session): - assert len(get_provider_details()) == 3 + assert len(get_provider_details()) == 4 def test_can_get_sms_providers(notify_db, notify_db_session): - assert len(get_provider_details_by_notification_type('sms')) == 2 + assert len(get_provider_details_by_notification_type('sms')) == 3 types = [provider.notification_type for provider in get_provider_details_by_notification_type('sms')] assert all('sms' == notification_type for notification_type in types) @@ -21,6 +21,7 @@ def test_can_get_sms_providers_in_order(notify_db, notify_db_session): assert providers[0].identifier == "mmg" assert providers[1].identifier == "firetext" + assert providers[2].identifier == "loadtesting" def test_can_get_email_providers_in_order(notify_db, notify_db_session): diff --git a/tests/app/provider_details/test_rest.py b/tests/app/provider_details/test_rest.py index 2cfcf3979..13aa8a03f 100644 --- a/tests/app/provider_details/test_rest.py +++ b/tests/app/provider_details/test_rest.py @@ -12,11 +12,12 @@ def test_get_provider_details_in_type_and_identifier_order(notify_db, notify_db_ ) assert response.status_code == 200 json_resp = json.loads(response.get_data(as_text=True))['provider_details'] - assert len(json_resp) == 3 + assert len(json_resp) == 4 assert json_resp[0]['identifier'] == 'ses' assert json_resp[1]['identifier'] == 'mmg' assert json_resp[2]['identifier'] == 'firetext' + assert json_resp[3]['identifier'] == 'loadtesting' def test_get_provider_details_by_id(notify_db, notify_db_session, notify_api):