oncall-engine/engine/common/tests
Joey Orlando 1df1b1eaa0
patch redis cluster multi-key operations (#3496)
# Which issue(s) this PR fixes

Related to https://github.com/grafana/oncall-private/issues/2363

Addresses this issue that arises when using
`cache.get_many`/`cache.set_many` operations with a Redis Cluster:
```python3
File "/usr/local/lib/python3.11/site-packages/redis/cluster.py", line 1006, in determine_slot
    raise RedisClusterException(
redis.exceptions.RedisClusterException: MGET - all keys must map to the same key slot
```

From the Redis Cluster
[docs](https://redis.io/docs/reference/cluster-spec/#hash-tags), this
can be addressed with this 👇 . Basically this will ensure that keys in
multi-key operations will resolve to the same hash slot (read: node):

> Hash tags
> There is an exception for the computation of the hash slot that is
used in order to implement hash tags. Hash tags are a way to ensure that
multiple keys are allocated in the same hash slot. This is used in order
to implement multi-key operations in Redis Cluster.
> 
> To implement hash tags, the hash slot for a key is computed in a
slightly different way in certain conditions. If the key contains a
"{...}" pattern only the substring between { and } is hashed in order to
obtain the hash slot. However since it is possible that there are
multiple occurrences of { or } the algorithm is well specified by the
following rules:
> 
> IF the key contains a { character.
> AND IF there is a } character to the right of {.
> AND IF there are one or more characters between the first occurrence
of { and the first occurrence of }.
> Then instead of hashing the key, only what is between the first
occurrence of { and the following first occurrence of } is hashed.

## Checklist

- [x] Unit, integration, and e2e (if applicable) tests updated
- [ ] Documentation added (or `pr:no public docs` PR label added if not
required)
- [ ] `CHANGELOG.md` updated (or `pr:no changelog` PR label added if not
required)
2023-12-04 13:08:57 -05:00
..
__init__.py World, meet OnCall! 2022-06-03 08:09:47 -06:00
test_apply_jinja_template.py Added preview and migration API endpoints for route migration from regex into jinja2 (#1715) 2023-04-18 02:53:53 +00:00
test_base64decode.py Jinja2 template helper filter b64decode (#3242) 2023-11-06 15:42:25 -05:00
test_cache.py patch redis cluster multi-key operations (#3496) 2023-12-04 13:08:57 -05:00
test_create_engine_url.py Use utility function to create URLs 2022-07-12 15:42:20 -06:00
test_custom_fields.py shift swap requests model + CRUD endpoints (#2597) 2023-07-21 19:35:19 +00:00
test_database.py Add utility function to get readonly db key if defined (#1264) 2023-02-01 12:07:32 +01:00
test_l10n.py add user locale field to mobile app user settings table + change going on call push notification text (#2131) 2023-06-14 12:19:58 -04:00
test_markup.py Fix cuddled list Markdown issue (#2488) 2023-07-11 09:14:52 +00:00
test_ordered_model.py Enable flake8-bugbear, fix issues (#3454) 2023-11-29 15:04:48 +00:00
test_recaptcha.py Add validation of hostname for recapctha (#1445) 2023-03-06 08:59:48 +00:00
test_regex_replace.py linting and fixed test 2022-07-14 20:06:24 +10:00
test_task_queue_assignment.py add create_slack_connector_async_v2 celery task to CELERY_TASK_ROUTES + remove deprecated celery tasks (#2946) 2023-09-01 13:40:58 +00:00
test_timezones.py shift swap requests model + CRUD endpoints (#2597) 2023-07-21 19:35:19 +00:00
test_urlize.py Fix warnings when running backend tests (#2079) 2023-06-06 18:38:00 +00:00
test_urlvalidator_without_tld.py use CustomURLValidator in custom_button (#1398) 2023-03-23 12:21:17 +00:00
test_viewset_actions.py Make viewset actions more consistent (#2120) 2023-06-07 12:10:53 +00:00