Commit Graph
7334 Commits
Author SHA1 Message Date
Chris Hill-Scott 1f315b06e2 Revert "Revert "Merge pull request #2902 from alphagov/fix-imports""
This reverts commit b8fe7b8e61.
2020-06-26 14:10:21 +01:00
Chris Hill-Scott 3ffdb3093b Revert "Revert "Merge pull request #2887 from alphagov/cache-the-serialised-things""
This reverts commit 7e85e37e1d.
2020-06-26 14:10:12 +01:00
Chris Hill-Scott 6d52d733a4 Merge pull request #2903 from alphagov/revert-serialisation-changes
Revert serialisation changes
2020-06-26 14:07:58 +01:00
Chris Hill-Scott 59aba018bd Ensure rate limit is in serialised service
Once we start using the serialised service to power the `POST`
notifications endpoint it needs to include rate limit to do the rate
limit checks.
2020-06-26 13:46:32 +01:00
Chris Hill-Scott 7e85e37e1d Revert "Merge pull request #2887 from alphagov/cache-the-serialised-things"
This reverts commit b8c2c6b291, reversing
changes made to 351aca2c5a.
2020-06-26 13:42:44 +01:00
Chris Hill-Scott b8fe7b8e61 Revert "Merge pull request #2902 from alphagov/fix-imports"
This reverts commit e00c0355b6, reversing
changes made to 832b589980.
2020-06-26 13:42:22 +01:00
Chris Hill-Scott e00c0355b6 Merge pull request #2902 from alphagov/fix-imports
Fix circular import
2020-06-26 12:25:42 +01:00
Chris Hill-Scott 616523bf74 Fix circular import
We changed auth.py to import from app.serialised_models here:
https://github.com/alphagov/notifications-api/pull/2887/files#diff-77cbb1e03185c7319f0311371c438b0cR11

`serialised_models.py` imports from `templates_dao.py`

`templates_dao.py` imports from `users_dao.py`

`users_dao.py` imports from `errors.py`

`errors.py` imports from `auth.py` … and the circle is complete 💥

For some reason this caused the Celery workers to crash on startup, but
not the app. Which I guess is why the integration tests didn’t catch
this?
2020-06-26 10:20:32 +01:00
Chris Hill-Scott 832b589980 Merge pull request #2898 from alphagov/fix-log-line
remove whitespace from log line
2020-06-26 09:18:54 +01:00
Chris Hill-Scott b8c2c6b291 Merge pull request #2887 from alphagov/cache-the-serialised-things
Serialise and cache services and API keys
2020-06-26 09:18:45 +01:00
Rebecca Law 351aca2c5a Merge pull request #2897 from alphagov/get-rid-of-scheduled_for
Remove the use of schedule_for in post_notifications
2020-06-26 07:51:17 +01:00
Leo Hemsted 6318cd2a84 remove whitespace from log line
multi line strings don't handle indentation
2020-06-25 14:25:04 +01:00
Leo Hemsted 3af4974757 Merge pull request #2900 from alphagov/disable-statsd
disable statsd
2020-06-24 16:44:17 +01:00
Leo Hemsted bb05dcf221 disable statsd 2020-06-24 16:35:44 +01:00
Rebecca Law ce32e577b7 Remove the use of schedule_for in post_notifications.
Years ago we started to implement a way to schedule a notification. We hit a problem but we never came up with a good solution and the feature never made it back to the top of the priority list.

This PR removes the code for scheduled_for. There will be another PR to drop the scheduled_notifications table and remove the schedule_notifications service permission

Unfortunately, I don't think we can remove the `scheduled_for` attribute from the notification.serialized method because out clients might fail if something is missing. For now I have left it in but defaulted the value to None.
2020-06-24 14:54:40 +01:00
Chris Hill-Scott d108c644bc Merge pull request #2890 from alphagov/exclude-service-letter-contacts
Don’t return letter contact blocks in service JSON
2020-06-24 09:41:08 +01:00
Chris Hill-Scott d16d06fdef Cache serialised services in Redis
Same as we’re doing for templates.

This means avoiding a database call, even for services that don’t hit
our API so often.

They’ll still need to go to the database for the API keys, because we’re
not comfortable putting the API key secrets in Redis.

But once a service has got its keys from the database we commit the
transaction, so the connection can be freed up until we need it again to
insert the notification.
2020-06-24 08:52:12 +01:00
Chris Hill-Scott 6c0a4abd52 Serialise UUIDs to string
So that we can serialise them to JSON to store in Redis.
2020-06-24 08:51:54 +01:00
Chris Hill-Scott 6a9818b5fd Cache services and API keys in memory
Same as we’ve done for templates.

For high volume services this should mean avoiding calls to external
services, either the database or Redis.

TTL is set to 2 seconds, so that’s the maximum time it will take for
revoking an API key or renaming a service to propagate.

Some of the tests created services with the same service ID. This
caused intermittent failures because the cache relies on unique service
IDs (like we have in the real world) to key itself.
2020-06-24 08:46:13 +01:00
Chris Hill-Scott 46dbcb7e36 Commit transactions as soon no longer needed
We think that holding open database transactions while we go and do
something else is causing us to have poor performance.

Because we’re not serialising everything as soon as we pull it out of
the database we can guarantee that we don’t need to go back to the
database again.

So let’s see if explicitly closing the transaction helps with
performance.
2020-06-23 16:00:41 +01:00
Chris Hill-Scott 320bca70f7 Serialise service, API keys and permissions
By serialising these straight away we can:
- not go back to the database later, potentially closing the connection
  sooner
- potentially cache the serialised data, meaning we don’t touch the
  database at all
2020-06-23 16:00:41 +01:00
Chris Hill-Scott d7b2cc6403 Merge pull request #2895 from alphagov/template-schema-cache
Ensure templates are cached with correct schema
2020-06-23 15:23:32 +01:00
Chris Hill-Scott 5ae3b0fc64 Ensure templates are cached with correct schema
For some reason our V1 get template response wraps the whole template in
a dictionary with one key, `'data'`:
https://github.com/alphagov/notifications-api/blob/0d990338893cd0e82e7415e424669f150297be0c/app/template/rest.py#L166

That means when the admin app caches the response it also caches it in
this format.

The API needs to do the same, otherwise it will be cacheing data with a
schema that the admin app isn’t expecting, and vice-versa.
2020-06-23 15:09:38 +01:00
Chris Hill-Scott 0d99033889 Merge pull request #2891 from alphagov/cache-serialised-template
Cache serialised template in Redis and in memory
2020-06-23 14:18:01 +01:00
Chris Hill-Scott af1b021dbe Add test for when template is found in Redis
Ensures that we’re not calling the dao method when it is
2020-06-23 14:01:20 +01:00
Chris Hill-Scott cb4b809131 Add extra assertion
To be crystal clear 💎
2020-06-23 13:48:55 +01:00
David McDonald a2753eafa9 Merge pull request #2894 from alphagov/turn-on-stub
Turn on email stub for load testing
2020-06-23 12:17:09 +01:00
Pea M. Tyczynska 75a7e9b7fd Merge pull request #2892 from alphagov/refactor-crown-dependency-check
Refactor crown dependency check
2020-06-23 11:19:17 +01:00
David McDonald 48abc8ffb5 Turn on email stub for load testing 2020-06-23 11:09:24 +01:00
Chris Hill-Scott 996800f90d Cache serialised template in Redis 2020-06-23 10:03:27 +01:00
Chris Hill-Scott 2f4470edca Serialise UUID to string not UUID object
We need to serialise the template to JSON to store it in Redis. Python’s
built in JSON serialiser doesn’t know what to do with a UUID object, so
we need to manually cast it to a string instead.
2020-06-23 10:03:27 +01:00
Chris Hill-Scott 87afc439fe Cache serialised template in memory 2020-06-23 10:03:26 +01:00
Chris Hill-Scott 3e209bcaac Merge pull request #2893 from alphagov/exclude-created-by
Exclude created_by_id from TemplateSchemaNoDetail
2020-06-23 10:02:03 +01:00
Chris Hill-Scott be86a16733 Exclude created_by_id from TemplateSchemaNoDetail
We were already excluding `created_by`, but in a different branch we
renamed the property on the schema to `created_by_id`:
https://github.com/alphagov/notifications-api/pull/2873/files#diff-691350bfe8029e08252edaad69e871b9R346-R348

We need to rename it in the exclude list to make sure that this
assertion still passes:
```
assert json_response['data'][0].keys() == {
    'folder',
    'id',
    'name',
    'template_type',
}
```
– https://github.com/alphagov/notifications-api/blob/14e7b6b87e4f525d1363a28e2b91882423d513b1/tests/app/template/test_rest.py#L555-L560
2020-06-23 09:39:11 +01:00
Chris Hill-Scott 14e7b6b87e Merge pull request #2880 from alphagov/serialise-less-stuff-templates
Exclude unneeded fields from all templates response
2020-06-23 09:07:30 +01:00
Pea Tyczynska 7a4f5a4bff Refactor crown dependency check 2020-06-22 18:14:22 +01:00
Chris Hill-Scott 14a17d675f Merge pull request #2873 from alphagov/serialise-template-immediately
Serialise template as soon as possible
2020-06-22 14:37:48 +01:00
Chris Hill-Scott 58a9862cd1 Avoid extra query when serialising Template created_by
It’s a UUID column, but by default Marshmallow wants to select the id
from the users table, not from the templates table, because the two
are foreign-keyed.

Adding the property explicity like this forces it to select from the
`created_by_id` column, but still serialises it to the `created_by`
field to avoid any breaking change.
2020-06-22 14:07:43 +01:00
Chris Hill-Scott 718f8ccad0 Remove content and subject from get all templates
Content and subject are user-submitted so are effectively unbounded in
size. And we’re serialising them for every template when sending the
list of templates to the admin app.

For the service with the most templates this results in a 1.3Mb blob of
JSON going over the wire, and being cached in Redis.

And then the admin app completely ignores these fields, because it does
show template content until you’ve clicked into a single template.

This commit adds a new query parameter, `detailed`, that the admin app
can set to `False`. When it does only the fields needed to render the
`/templates` page are returned.

This is done with a new parameter so as not to break the V1 API.
Although I looked in Kibana and it doesn’t seem like anyone external is
using this endpoint we’ve come this far without breaking the API so…
2020-06-22 13:08:41 +01:00
Chris Hill-Scott 8d61c1ef4b Add description of SerialisedModel 2020-06-22 10:20:54 +01:00
Chris Hill-Scott 5a2f2a9ec2 Rename JSONModel to SerialisedModel 2/2
This class doesn’t actually wrap JSON, it wraps serialised data.

So this name feels better.
2020-06-22 10:20:53 +01:00
Chris Hill-Scott e6b7e0e16c Rename JSONModel to SerialisedModel 1/2
This class doesn’t actually wrap JSON, it wraps serialised data.

So this name feels better.

This commit only renames the file for an easier diff.
2020-06-22 10:20:53 +01:00
Chris Hill-Scott 608812d314 Don’t store the underlying dict
This will give us smaller objects to cache, and forces us to be explicit
about which properties we’re using.
2020-06-22 10:20:52 +01:00
Chris Hill-Scott ad2328fc05 Serialise template immediately after fetching
This commit changes the code in post notification endpoint to handle a
serialised template (ie a `dict`) rather than a database object.

This is the first step towards being able to cache the template and not
hit the database on every request.

There should be no functional changes here, it’s just refactoring.

There are some changes to the tests where the signature of functions
has changed.

Importing of the template schema has to be done at a function level,
otherwise Marshmallow gets weird.

This commit also copies the `JSONModel` class from the admin app, which
turns serialised data (a dict made from JSON) into an object on which
certain predefined properties are allowed.

This means we can still do the caching of serialised data, without
having to change too much of the code in the app, or make it ugly by
sprinkling dict lookups everywhere.

We’re not copying all of JSONModel from the admin app, just the bits we
need. We don’t need to compare or hash these objects, they’re just used
for lookups. And redefining `__getattribute__` scares Leo.
2020-06-22 10:20:51 +01:00
Chris Hill-Scott 0d2060fcfa Don’t return letter contact blocks in service JSON
The admin app doesn’t use them:
https://github.com/alphagov/notifications-admin/search?q=letter_contact_block&unscoped_q=letter_contact_block

Instead it requests them separately when needed:
https://github.com/alphagov/notifications-admin/blob/2f1e8b104b0f8c76e14ba0d0159d0fcaf95a7046/app/models/service.py#L349-L351

Removing this from the response means one fewer database query.
2020-06-22 10:16:30 +01:00
Pea M. Tyczynska dcc407efea Merge pull request #2878 from alphagov/uk-prefix
Make sure people without international sms permission can send to crown dependencies
2020-06-19 16:58:48 +01:00
Pea Tyczynska ef9f3c1e5f Make sure we check if a service can send to number harmoniously
We were checking this separately in two places in the code. Now
we will have this logic in one place, in validators.

Also pull in utils version that recognises crown depenency numbers
as international.
2020-06-19 15:59:15 +01:00
Pea Tyczynska b0bb0b9780 Make sure people without international sms permission can send to crown dependencies 2020-06-19 15:58:22 +01:00
Katie Smith 9e7b84bda2 Merge pull request #2864 from alphagov/postage-constraints-3
Drop postage constraints
2020-06-19 15:48:38 +01:00
Katie Smith ab956c9eb3 Update JSON schema postage validation for new values 2020-06-19 15:36:10 +01:00