Merge pull request #3334 from alphagov/new-zendesk-form

Use the new Zendesk form for all tickets
This commit is contained in:
Katie Smith
2021-09-29 14:09:11 +01:00
committed by GitHub
8 changed files with 184 additions and 77 deletions

View File

@@ -1,6 +1,9 @@
from datetime import datetime
from flask import current_app
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from app import cbc_proxy_client, notify_celery, zendesk_client
from app.clients.cbc_proxy import CBCProxyRetryableException
@@ -142,11 +145,16 @@ def send_broadcast_event(broadcast_event_id):
'If this alert is not expected refer to the runbook for instructions.',
'https://docs.google.com/document/d/1J99yOlfp4nQz6et0w5oJVqi-KywtIXkxrEIyq_g2XUs',
])
zendesk_client.create_ticket(
subject="Live broadcast sent",
ticket = NotifySupportTicket(
subject='Live broadcast sent',
message=message,
ticket_type=zendesk_client.TYPE_INCIDENT,
ticket_type=NotifySupportTicket.TYPE_INCIDENT,
technical_ticket=True,
org_id=current_app.config['BROADCAST_ORGANISATION_ID'],
org_type='central',
service_id=str(broadcast_message.service_id)
)
zendesk_client.send_ticket_to_zendesk(ticket)
current_app.logger.error(message)
for provider in broadcast_event.service.get_available_broadcast_providers():

View File

@@ -2,6 +2,9 @@ from datetime import datetime, timedelta
import pytz
from flask import current_app
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from sqlalchemy import func
from sqlalchemy.exc import SQLAlchemyError
@@ -179,11 +182,15 @@ def raise_alert_if_letter_notifications_still_sending():
# Only send alerts in production
if current_app.config['NOTIFY_ENVIRONMENT'] in ['live', 'production', 'test']:
message += ". Resolve using https://github.com/alphagov/notifications-manuals/wiki/Support-Runbook#deal-with-letters-still-in-sending" # noqa
zendesk_client.create_ticket(
subject="[{}] Letters still sending".format(current_app.config['NOTIFY_ENVIRONMENT']),
ticket = NotifySupportTicket(
subject=f"[{current_app.config['NOTIFY_ENVIRONMENT']}] Letters still sending",
message=message,
ticket_type=zendesk_client.TYPE_INCIDENT
ticket_type=NotifySupportTicket.TYPE_INCIDENT,
technical_ticket=True,
ticket_categories=['notify_letters']
)
zendesk_client.send_ticket_to_zendesk(ticket)
else:
current_app.logger.info(message)
@@ -250,11 +257,14 @@ def letter_raise_alert_if_no_ack_file_for_zip():
if len(zip_file_set - ack_file_set) > 0:
if current_app.config['NOTIFY_ENVIRONMENT'] in ['live', 'production', 'test']:
zendesk_client.create_ticket(
ticket = NotifySupportTicket(
subject="Letter acknowledge error",
message=message,
ticket_type=zendesk_client.TYPE_INCIDENT
ticket_type=NotifySupportTicket.TYPE_INCIDENT,
technical_ticket=True,
ticket_categories=['notify_letters']
)
zendesk_client.send_ticket_to_zendesk(ticket)
current_app.logger.error(message)
if len(ack_file_set - zip_file_set) > 0:

View File

@@ -1,6 +1,9 @@
from datetime import datetime, timedelta
from flask import current_app
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from sqlalchemy import between
from sqlalchemy.exc import SQLAlchemyError
@@ -214,11 +217,14 @@ def check_if_letters_still_pending_virus_check():
Notifications: {}""".format(len(letters), sorted(letter_ids))
if current_app.config['NOTIFY_ENVIRONMENT'] in ['live', 'production', 'test']:
zendesk_client.create_ticket(
subject="[{}] Letters still pending virus check".format(current_app.config['NOTIFY_ENVIRONMENT']),
ticket = NotifySupportTicket(
subject=f"[{current_app.config['NOTIFY_ENVIRONMENT']}] Letters still pending virus check",
message=msg,
ticket_type=zendesk_client.TYPE_INCIDENT
ticket_type=NotifySupportTicket.TYPE_INCIDENT,
technical_ticket=True,
ticket_categories=['notify_letters']
)
zendesk_client.send_ticket_to_zendesk(ticket)
current_app.logger.error(msg)
@@ -233,11 +239,14 @@ def check_if_letters_still_in_created():
"#deal-with-Letters-still-in-created.".format(len(letters))
if current_app.config['NOTIFY_ENVIRONMENT'] in ['live', 'production', 'test']:
zendesk_client.create_ticket(
subject="[{}] Letters still in 'created' status".format(current_app.config['NOTIFY_ENVIRONMENT']),
ticket = NotifySupportTicket(
subject=f"[{current_app.config['NOTIFY_ENVIRONMENT']}] Letters still in 'created' status",
message=msg,
ticket_type=zendesk_client.TYPE_INCIDENT
ticket_type=NotifySupportTicket.TYPE_INCIDENT,
technical_ticket=True,
ticket_categories=['notify_letters']
)
zendesk_client.send_ticket_to_zendesk(ticket)
current_app.logger.error(msg)
@@ -292,13 +301,13 @@ def check_for_services_with_high_failure_rates_or_sending_to_tv_numbers():
if current_app.config['NOTIFY_ENVIRONMENT'] in ['live', 'production', 'test']:
message += ("\nYou can find instructions for this ticket in our manual:\n"
"https://github.com/alphagov/notifications-manuals/wiki/Support-Runbook#Deal-with-services-with-high-failure-rates-or-sending-sms-to-tv-numbers") # noqa
zendesk_client.create_ticket(
subject="[{}] High failure rates for sms spotted for services".format(
current_app.config['NOTIFY_ENVIRONMENT']
),
ticket = NotifySupportTicket(
subject=f"[{current_app.config['NOTIFY_ENVIRONMENT']}] High failure rates for sms spotted for services",
message=message,
ticket_type=zendesk_client.TYPE_INCIDENT
ticket_type=NotifySupportTicket.TYPE_INCIDENT,
technical_ticket=True
)
zendesk_client.send_ticket_to_zendesk(ticket)
@notify_celery.task(name='trigger-link-tests')

View File

@@ -38,7 +38,7 @@ notifications-python-client==6.0.2
# PaaS
awscli-cwlogs==1.4.6
git+https://github.com/alphagov/notifications-utils.git@46.0.0#egg=notifications-utils==46.0.0
git+https://github.com/alphagov/notifications-utils.git@46.1.0#egg=notifications-utils==46.1.0
# gds-metrics requires prometheseus 0.2.0, override that requirement as 0.7.1 brings significant performance gains
prometheus-client==0.10.1

View File

@@ -40,7 +40,7 @@ notifications-python-client==6.0.2
# PaaS
awscli-cwlogs==1.4.6
git+https://github.com/alphagov/notifications-utils.git@46.0.0#egg=notifications-utils==46.0.0
git+https://github.com/alphagov/notifications-utils.git@46.1.0#egg=notifications-utils==46.1.0
# gds-metrics requires prometheseus 0.2.0, override that requirement as 0.7.1 brings significant performance gains
prometheus-client==0.10.1
@@ -51,41 +51,40 @@ alembic==1.6.5
amqp==1.4.9
anyjson==0.3.3
attrs==21.2.0
awscli==1.20.8
awscli==1.20.46
bcrypt==3.2.0
billiard==3.3.0.23
bleach==3.3.0
blinker==1.4
boto==2.49.0
boto3==1.18.8
botocore==1.21.8
boto3==1.18.46
botocore==1.21.46
certifi==2021.5.30
charset-normalizer==2.0.3
charset-normalizer==2.0.6
click==8.0.1
colorama==0.4.3
dnspython==1.16.0
docutils==0.15.2
flask-redis==0.4.0
geojson==2.5.0
govuk-bank-holidays==0.9
greenlet==1.1.0
govuk-bank-holidays==0.10
greenlet==1.1.1
idna==3.2
Jinja2==3.0.1
jmespath==0.10.0
kombu==3.0.37
Mako==1.1.4
Mako==1.1.5
MarkupSafe==2.0.1
mistune==0.8.4
orderedset==2.0.3
packaging==21.0
phonenumbers==8.12.28
phonenumbers==8.12.31
pyasn1==0.4.8
pycparser==2.20
pyparsing==2.4.7
PyPDF2==1.26.0
pyrsistent==0.18.0
python-dateutil==2.8.2
python-editor==1.0.4
python-json-logger==2.0.2
pytz==2021.1
PyYAML==5.4.1
@@ -98,5 +97,5 @@ six==1.16.0
smartypants==2.0.1
soupsieve==2.2.1
statsd==3.3.0
urllib3==1.26.6
urllib3==1.26.7
webencodings==0.5.1

View File

@@ -3,7 +3,11 @@ from unittest.mock import ANY, Mock, call
import pytest
from celery.exceptions import Retry
from flask import current_app
from freezegun import freeze_time
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from app.celery.broadcast_message_tasks import (
BroadcastIntegrityError,
@@ -33,8 +37,10 @@ def test_send_broadcast_event_queues_up_for_active_providers(mocker, notify_api,
template = create_template(sample_broadcast_service, BROADCAST_TYPE)
broadcast_message = create_broadcast_message(template, status=BroadcastStatusType.BROADCASTING)
event = create_broadcast_event(broadcast_message)
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.broadcast_message_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
mock_send_broadcast_provider_message = mocker.patch(
'app.celery.broadcast_message_tasks.send_broadcast_provider_message',
)
@@ -48,7 +54,7 @@ def test_send_broadcast_event_queues_up_for_active_providers(mocker, notify_api,
]
# we're on test env so this isn't called
assert mock_create_ticket.called is False
assert mock_send_ticket_to_zendesk.called is False
def test_send_broadcast_event_only_sends_to_one_provider_if_set_on_service(
@@ -113,22 +119,36 @@ def test_send_broadcast_event_creates_zendesk(
areas={**area_data, 'simple_polygons': []},
)
event = create_broadcast_event(broadcast_message)
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.broadcast_message_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
mocker.patch('app.celery.broadcast_message_tasks.send_broadcast_provider_message')
with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'live'):
send_broadcast_event(event.id)
assert mock_create_ticket.call_count == 1
zendesk_args = mock_create_ticket.call_args[1]
assert zendesk_args['ticket_type'] == 'incident'
mock_create_ticket.assert_called_once_with(
ANY,
subject='Live broadcast sent',
message=ANY,
ticket_type='incident',
technical_ticket=True,
org_id=current_app.config['BROADCAST_ORGANISATION_ID'],
org_type='central',
service_id=str(sample_broadcast_service.id)
)
ticket_message = mock_create_ticket.call_args_list[0][1]['message']
assert str(broadcast_message.id) in zendesk_args['message']
assert 'channel severe' in zendesk_args['message']
assert f"areas {expected_message}" in zendesk_args['message']
assert str(broadcast_message.id) in ticket_message
assert 'channel severe' in ticket_message
assert f"areas {expected_message}" in ticket_message
# the start of the content from the broadcast template
assert "Dear Sir/Madam" in zendesk_args['message']
assert "Dear Sir/Madam" in ticket_message
mock_send_ticket_to_zendesk.assert_called_once()
def test_send_broadcast_event_doesnt_create_zendesk_when_cancelling(mocker, notify_api, sample_broadcast_service):
@@ -140,22 +160,26 @@ def test_send_broadcast_event_doesnt_create_zendesk_when_cancelling(mocker, noti
)
create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.ALERT)
cancel_event = create_broadcast_event(broadcast_message, message_type=BroadcastEventMessageType.CANCEL)
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.broadcast_message_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
mocker.patch('app.celery.broadcast_message_tasks.send_broadcast_provider_message')
with set_config(notify_api, 'NOTIFY_ENVIRONMENT', 'live'):
send_broadcast_event(cancel_event.id)
assert mock_create_ticket.called is False
assert mock_send_ticket_to_zendesk.called is False
def test_send_broadcast_event_doesnt_create_zendesk_on_staging(mocker, notify_api, sample_broadcast_service):
template = create_template(sample_broadcast_service, BROADCAST_TYPE)
broadcast_message = create_broadcast_message(template, status=BroadcastStatusType.BROADCASTING)
event = create_broadcast_event(broadcast_message)
mock_create_ticket = mocker.patch("app.celery.broadcast_message_tasks.zendesk_client.create_ticket")
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.broadcast_message_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
mock_send_broadcast_provider_message = mocker.patch(
'app.celery.broadcast_message_tasks.send_broadcast_provider_message',
)
@@ -164,7 +188,7 @@ def test_send_broadcast_event_doesnt_create_zendesk_on_staging(mocker, notify_ap
send_broadcast_event(event.id)
assert mock_send_broadcast_provider_message.apply_async.called is True
assert mock_create_ticket.called is False
assert mock_send_ticket_to_zendesk.called is False
@freeze_time('2020-08-01 12:00')

View File

@@ -1,11 +1,13 @@
from datetime import date, datetime, timedelta
from unittest.mock import call
from unittest.mock import ANY, call
import pytest
import pytz
from flask import current_app
from freezegun import freeze_time
from notifications_utils.clients.zendesk.zendesk_client import ZendeskClient
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from app.celery import nightly_tasks
from app.celery.nightly_tasks import (
@@ -232,34 +234,47 @@ def test_should_call_delete_inbound_sms(notify_api, mocker):
assert nightly_tasks.delete_inbound_sms_older_than_retention.call_count == 1
def test_create_ticket_if_letter_notifications_still_sending(mocker):
def test_create_ticket_if_letter_notifications_still_sending(notify_api, mocker):
mock_get_letters = mocker.patch(
"app.celery.nightly_tasks.get_letter_notifications_still_sending_when_they_shouldnt_be"
)
mock_get_letters.return_value = 1, date(2018, 1, 15)
mock_create_ticket = mocker.patch("app.celery.nightly_tasks.zendesk_client.create_ticket")
raise_alert_if_letter_notifications_still_sending()
mock_create_ticket.assert_called_once_with(
subject="[test] Letters still sending",
message="There are 1 letters in the 'sending' state from Monday 15 January. Resolve using https://github.com/alphagov/notifications-manuals/wiki/Support-Runbook#deal-with-letters-still-in-sending", # noqa
ticket_type=ZendeskClient.TYPE_INCIDENT
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.nightly_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
raise_alert_if_letter_notifications_still_sending()
mock_create_ticket.assert_called_once_with(
ANY,
subject='[test] Letters still sending',
message=(
"There are 1 letters in the 'sending' state from Monday 15 January. Resolve using "
"https://github.com/alphagov/notifications-manuals/wiki/Support-Runbook#deal-with-letters-still-in-sending"
),
ticket_type='incident',
technical_ticket=True,
ticket_categories=['notify_letters']
)
mock_send_ticket_to_zendesk.assert_called_once()
def test_dont_create_ticket_if_letter_notifications_not_still_sending(mocker):
def test_dont_create_ticket_if_letter_notifications_not_still_sending(notify_api, mocker):
mock_get_letters = mocker.patch(
"app.celery.nightly_tasks.get_letter_notifications_still_sending_when_they_shouldnt_be"
)
mock_get_letters.return_value = 0, None
mock_create_ticket = mocker.patch("app.celery.nightly_tasks.zendesk_client.create_ticket")
mock_send_ticket_to_zendesk = mocker.patch(
"app.celery.nightly_tasks.zendesk_client.send_ticket_to_zendesk",
autospec=True
)
raise_alert_if_letter_notifications_still_sending()
mock_create_ticket.assert_not_called()
mock_send_ticket_to_zendesk.assert_not_called()
@freeze_time("Thursday 17th January 2018 17:00")
@@ -359,7 +374,11 @@ def test_letter_raise_alert_if_no_ack_file_for_zip_does_not_raise_when_files_mat
@freeze_time('2018-01-11T23:00:00')
def test_letter_raise_alert_if_ack_files_not_match_zip_list(mocker, notify_db):
mock_file_list = mocker.patch("app.aws.s3.get_list_of_files_by_suffix", side_effect=mock_s3_get_list_diff)
mock_zendesk = mocker.patch("app.celery.nightly_tasks.zendesk_client.create_ticket")
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.nightly_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
letter_raise_alert_if_no_ack_file_for_zip()
@@ -372,11 +391,15 @@ def test_letter_raise_alert_if_ack_files_not_match_zip_list(mocker, notify_db):
current_app.config['LETTERS_PDF_BUCKET_NAME'],
datetime.utcnow().strftime('%Y-%m-%d') + '/zips_sent',
current_app.config['DVLA_RESPONSE_BUCKET_NAME'])
mock_zendesk.assert_called_once_with(
mock_create_ticket.assert_called_once_with(
ANY,
subject="Letter acknowledge error",
message=message,
ticket_type='incident'
ticket_type='incident',
technical_ticket=True,
ticket_categories=['notify_letters']
)
mock_send_ticket_to_zendesk.assert_called_once()
@freeze_time('2018-01-11T23:00:00')

View File

@@ -1,10 +1,13 @@
from collections import namedtuple
from datetime import datetime, timedelta
from unittest import mock
from unittest.mock import call
from unittest.mock import ANY, call
import pytest
from freezegun import freeze_time
from notifications_utils.clients.zendesk.zendesk_client import (
NotifySupportTicket,
)
from app.celery import scheduled_tasks
from app.celery.scheduled_tasks import (
@@ -364,7 +367,11 @@ def test_check_job_status_task_does_not_raise_error(sample_template):
@freeze_time("2019-05-30 14:00:00")
def test_check_if_letters_still_pending_virus_check(mocker, sample_letter_template):
mock_logger = mocker.patch('app.celery.tasks.current_app.logger.error')
mock_create_ticket = mocker.patch('app.celery.nightly_tasks.zendesk_client.create_ticket')
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.scheduled_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
create_notification(template=sample_letter_template,
status=NOTIFICATION_PENDING_VIRUS_CHECK,
@@ -391,17 +398,25 @@ def test_check_if_letters_still_pending_virus_check(mocker, sample_letter_templa
Notifications: {}""".format(id_references)
mock_logger.assert_called_once_with(message)
mock_create_ticket.assert_called_with(
message=message,
mock_create_ticket.assert_called_once_with(
ANY,
subject='[test] Letters still pending virus check',
ticket_type='incident'
message=message,
ticket_type='incident',
technical_ticket=True,
ticket_categories=['notify_letters']
)
mock_send_ticket_to_zendesk.assert_called_once()
@freeze_time("2019-05-30 14:00:00")
def test_check_if_letters_still_in_created_during_bst(mocker, sample_letter_template):
mock_logger = mocker.patch('app.celery.tasks.current_app.logger.error')
mock_create_ticket = mocker.patch('app.celery.nightly_tasks.zendesk_client.create_ticket')
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.scheduled_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
create_notification(template=sample_letter_template, created_at=datetime(2019, 5, 1, 12, 0))
create_notification(template=sample_letter_template, created_at=datetime(2019, 5, 29, 16, 29))
@@ -418,16 +433,24 @@ def test_check_if_letters_still_in_created_during_bst(mocker, sample_letter_temp
mock_logger.assert_called_once_with(message)
mock_create_ticket.assert_called_with(
ANY,
message=message,
subject="[test] Letters still in 'created' status",
ticket_type='incident'
ticket_type='incident',
technical_ticket=True,
ticket_categories=['notify_letters']
)
mock_send_ticket_to_zendesk.assert_called_once()
@freeze_time("2019-01-30 14:00:00")
def test_check_if_letters_still_in_created_during_utc(mocker, sample_letter_template):
mock_logger = mocker.patch('app.celery.tasks.current_app.logger.error')
mock_create_ticket = mocker.patch('app.celery.scheduled_tasks.zendesk_client.create_ticket')
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.scheduled_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
create_notification(template=sample_letter_template, created_at=datetime(2018, 12, 1, 12, 0))
create_notification(template=sample_letter_template, created_at=datetime(2019, 1, 29, 17, 29))
@@ -443,11 +466,15 @@ def test_check_if_letters_still_in_created_during_utc(mocker, sample_letter_temp
"https://github.com/alphagov/notifications-manuals/wiki/Support-Runbook#deal-with-Letters-still-in-created."
mock_logger.assert_called_once_with(message)
mock_create_ticket.assert_called_with(
mock_create_ticket.assert_called_once_with(
ANY,
message=message,
subject="[test] Letters still in 'created' status",
ticket_type='incident'
ticket_type='incident',
technical_ticket=True,
ticket_categories=['notify_letters']
)
mock_send_ticket_to_zendesk.assert_called_once()
@pytest.mark.parametrize('offset', (
@@ -582,7 +609,11 @@ def test_check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(
mocker, notify_db_session, failure_rates, sms_to_tv_numbers, expected_message
):
mock_logger = mocker.patch('app.celery.tasks.current_app.logger.warning')
mock_create_ticket = mocker.patch('app.celery.scheduled_tasks.zendesk_client.create_ticket')
mock_create_ticket = mocker.spy(NotifySupportTicket, '__init__')
mock_send_ticket_to_zendesk = mocker.patch(
'app.celery.scheduled_tasks.zendesk_client.send_ticket_to_zendesk',
autospec=True,
)
mock_failure_rates = mocker.patch(
'app.celery.scheduled_tasks.dao_find_services_with_high_failure_rates', return_value=failure_rates
)
@@ -598,10 +629,13 @@ def test_check_for_services_with_high_failure_rates_or_sending_to_tv_numbers(
assert mock_sms_to_tv_numbers.called
mock_logger.assert_called_once_with(expected_message)
mock_create_ticket.assert_called_with(
ANY,
message=expected_message + zendesk_actions,
subject="[test] High failure rates for sms spotted for services",
ticket_type='incident'
ticket_type='incident',
technical_ticket=True
)
mock_send_ticket_to_zendesk.assert_called_once()
def test_trigger_link_tests_calls_for_all_providers(