Skip to content

Commit 9746922

Browse files
authored
RedisLite -> FakeRedis (Netflix#9327)
* Upgrade dependencies to support Python 3.10 * Upgrade dependencies to support Python 3.10 * Python 3.10 in Pre-commit * Python 3.10 in Pre-commit try 2 * Arm support: Switch Redislite with Fakeredis * Arm support: Switch Redislite with Fakeredis * fix lint
1 parent 9d152c4 commit 9746922

File tree

18 files changed

+85
-157
lines changed

18 files changed

+85
-157
lines changed

.isort.cfg

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[settings]
22
known_first_party=consoleme,consoleme_ecs_cdk
3-
known_third_party = aiozipkin,asgiref,atlassian,aws_cdk,bcrypt,billiard,bleach,boto3,botocore,celery,cfnresponse,click,click_log,cloudaux,cryptography,dateutil,deepdiff,distutils,elasticsearch,email_validator,furl,git,google,googleapiclient,jsonschema,jwt,logmatic,marshmallow,mock,mockredis,moto,nacl,nested_stacks,okta_jwt,onelogin,pandas,parliament,password_strength,pkg_resources,policy_sentry,policyuniverse,pydantic,pytest,pytz,questionary,redis,redislite,requests,retrying,ruamel,sentry_sdk,setuptools,simplejson,tenacity,tornado,ujson,uvloop,validate_email,yaml
3+
known_third_party = aiozipkin,asgiref,atlassian,aws_cdk,bcrypt,billiard,bleach,boto3,botocore,celery,cfnresponse,click,click_log,cloudaux,cryptography,dateutil,deepdiff,distutils,elasticsearch,email_validator,fakeredis,furl,git,google,googleapiclient,jsonschema,jwt,logmatic,marshmallow,mock,mockredis,moto,nacl,nested_stacks,okta_jwt,onelogin,pandas,parliament,password_strength,pkg_resources,policy_sentry,policyuniverse,pydantic,pytest,pytz,questionary,redis,requests,retrying,ruamel,sentry_sdk,setuptools,simplejson,tenacity,tornado,ujson,uvloop,validate_email,yaml
44
multi_line_output=3
55
include_trailing_comma=True
66
balanced_wrapping=True

Dockerfile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# Dockerfile should instantiate AWS Project with configurable plugins
2-
FROM python:3.8
2+
FROM python:3.10
33
MAINTAINER Netflix Security
44
WORKDIR /apps/consoleme
55
# NODE_OPTIONS meeded to increase memory size of Node for the `yarn build` step. The Monaco Editor

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![Python 3.8](https://img.shields.io/badge/python-3.8-blue.svg)](https://www.python.org/downloads/release/python-386/)
1+
[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3105/)
22
[![Discord](https://img.shields.io/discord/730908778299523072?label=Discord&logo=discord&style=flat-square)](https://discord.gg/nQVpNGGkYu)
33

44
# ConsoleMe

consoleme/celery_tasks/celery_tasks.py

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
from __future__ import absolute_import
1111

1212
import json # We use a separate SetEncoder here so we cannot use ujson
13-
import os
1413
import sys
1514
import time
1615
from datetime import datetime, timedelta
@@ -117,25 +116,13 @@ def on_configure(self) -> None:
117116
),
118117
backend=config.get(
119118
f"celery.backend.{config.region}",
120-
config.get("celery.broker.global", "redis://127.0.0.1:6379/2"),
119+
config.get("celery.backend.global"),
121120
),
122121
)
123122

124-
if config.get("redis.use_redislite"):
125-
import tempfile
126-
127-
import redislite
128-
129-
redislite_db_path = os.path.join(
130-
config.get("redis.redislite.db_path", tempfile.NamedTemporaryFile().name)
131-
)
132-
redislite_client = redislite.Redis(redislite_db_path)
133-
redislite_socket_path = f"redis+socket://{redislite_client.socket_file}"
134-
app = Celery(
135-
"tasks",
136-
broker=f"{redislite_socket_path}?virtual_host=1",
137-
backend=f"{redislite_socket_path}?virtual_host=2",
138-
)
123+
broker_transport_options = config.get("celery.broker_transport_options")
124+
if broker_transport_options:
125+
app.conf.update({"broker_transport_options": dict(broker_transport_options)})
139126

140127
app.conf.result_expires = config.get("celery.result_expires", 60)
141128
app.conf.worker_prefetch_multiplier = config.get("celery.worker_prefetch_multiplier", 4)

consoleme/config/config.py

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -156,24 +156,6 @@ def __set_flag_on_main_exit(self):
156156
# Main thread exited, signal to other threads
157157
main_exit_flag.set()
158158

159-
def purge_redislite_cache(self):
160-
"""
161-
Purges redislite cache in primary DB periodically. This will force a cache refresh, and it is
162-
convenient for cases where you cannot securely run shared Redis (ie: AWS AppRunner)
163-
"""
164-
if not self.get("redis.use_redislite"):
165-
return
166-
from consoleme.lib.redis import RedisHandler
167-
168-
red = RedisHandler().redis_sync()
169-
while threading.main_thread().is_alive():
170-
red.flushdb()
171-
# Wait till main exit flag is set OR a fixed timeout
172-
if main_exit_flag.wait(
173-
timeout=self.get("redis.purge_redislite_cache_interval", 1800)
174-
):
175-
break
176-
177159
async def merge_extended_paths(self, extends, dir_path):
178160
for s in extends:
179161
extend_config = {}
@@ -243,10 +225,6 @@ async def load_config(
243225
if allow_start_background_threads:
244226
Timer(0, self.__set_flag_on_main_exit, ()).start()
245227

246-
if allow_start_background_threads and self.get("redis.use_redislite"):
247-
t = Timer(1, self.purge_redislite_cache, ())
248-
t.start()
249-
250228
if allow_start_background_threads and self.get("config.load_from_dynamo", True):
251229
t = Timer(2, self.load_config_from_dynamo_bg_thread, ())
252230
t.start()
@@ -361,8 +339,6 @@ def set_logging_levels(self):
361339
"spectator.HttpClient": "WARNING",
362340
"spectator.Registry": "WARNING",
363341
"urllib3": "ERROR",
364-
"redislite.client": "WARNING",
365-
"redislite.configuration": "WARNING",
366342
}
367343
for logger, level in self.get("logging_levels", default_logging_levels).items():
368344
logging.getLogger(logger).setLevel(level)

consoleme/default_plugins/plugins/celery_tasks/celery_tasks.py

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
55
"""
66
import json
7-
import os
87
from datetime import timedelta
98

109
from asgiref.sync import async_to_sync
@@ -26,31 +25,15 @@
2625
),
2726
backend=config.get(
2827
f"celery.backend.{config.region}",
29-
config.get("celery.broker.global", "redis://127.0.0.1:6379/2"),
28+
config.get("celery.backend.global"),
3029
),
3130
)
3231

33-
if config.get("redis.use_redislite"):
34-
import tempfile
35-
36-
import redislite
37-
38-
redislite_db_path = os.path.join(
39-
config.get("redis.redislite.db_path", tempfile.NamedTemporaryFile().name)
40-
)
41-
redislite_client = redislite.Redis(redislite_db_path)
42-
redislite_socket_path = f"redis+socket://{redislite_client.socket_file}"
43-
app = Celery(
44-
"tasks",
45-
broker=f"{redislite_socket_path}?virtual_host=1",
46-
backend=f"{redislite_socket_path}?virtual_host=2",
47-
)
48-
4932
app.conf.result_expires = config.get("celery.result_expires", 60)
5033
app.conf.worker_prefetch_multiplier = config.get("celery.worker_prefetch_multiplier", 4)
5134
app.conf.task_acks_late = config.get("celery.task_acks_late", True)
5235

53-
if config.get("celery.purge") and not config.get("redis.use_redislite"):
36+
if config.get("celery.purge"):
5437
# Useful to clear celery queue in development
5538
with Timeout(seconds=5, error_message="Timeout: Are you sure Redis is running?"):
5639
app.control.purge()

consoleme/lib/plugins.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@ def get_plugin_by_name(plugin_name: str) -> Any:
2727
if plugin_name == "default_config":
2828
initial_exception_message = (
2929
f"Could not find the specified plugin: {plugin_name}. "
30-
"Please install it with `pip install -e default_plugins` "
31-
"from the ConsoleMe directory. "
30+
"Please install it with `pip install -e consoleme/default_plugins` "
31+
"from the ConsoleMe base directory. "
3232
)
3333

3434
exception_message = (

consoleme/lib/redis.py

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import os
21
import sys
32
import threading
43
import time
@@ -13,14 +12,6 @@
1312
from consoleme.config import config
1413
from consoleme.lib.plugins import get_plugin_by_name
1514

16-
if config.get("redis.use_redislite"):
17-
import tempfile
18-
19-
import redislite
20-
21-
if not config.get("redis.redis_lite.db_path"):
22-
default_redislite_db_path = tempfile.NamedTemporaryFile().name
23-
2415
region = config.region
2516
log = config.get_logger()
2617
stats = get_plugin_by_name(config.get("plugins.metrics", "default_metrics"))()
@@ -371,11 +362,6 @@ def __init__(
371362
self.enabled = False
372363

373364
async def redis(self, db: int = 0) -> Redis:
374-
if config.get("redis.use_redislite"):
375-
REDIS_DB_PATH = os.path.join(
376-
config.get("redis.redislite.db_path", default_redislite_db_path)
377-
)
378-
return redislite.StrictRedis(REDIS_DB_PATH, decode_responses=True)
379365
self.red = await sync_to_async(ConsoleMeRedis)(
380366
host=self.host,
381367
port=self.port,
@@ -386,11 +372,6 @@ async def redis(self, db: int = 0) -> Redis:
386372
return self.red
387373

388374
def redis_sync(self, db: int = 0) -> Redis:
389-
if config.get("redis.use_redislite"):
390-
REDIS_DB_PATH = os.path.join(
391-
config.get("redis.redislite.db_path", default_redislite_db_path)
392-
)
393-
return redislite.StrictRedis(REDIS_DB_PATH, decode_responses=True)
394375
self.red = ConsoleMeRedis(
395376
host=self.host,
396377
port=self.port,

example_config/example_config_test.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,12 @@ celery:
4141
enabled: true
4242
cache_cloudtrail_denies:
4343
enabled: true
44+
broker:
45+
global: filesystem://.pytest_cache/0
46+
broker_transport_options:
47+
data_folder_in: .pytest_cache/celery_data_folder_in
48+
data_folder_out: .pytest_cache/celery_data_folder_out
49+
data_folder_processed: .pytest_cache/celery_data_folder_processed
4450
event_bridge:
4551
detect_role_changes_and_update_cache:
4652
queue_arn: arn:aws:sqs:{region}:123456789012:consoleme-cloudtrail-role-events-test

requirements-test.in

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@ bandit
44
black
55
coverage
66
docker # Required by moto
7+
fakeredis
78
flake8
89
flake8-docstrings
910
flake8-import-order
10-
mock<4 # Mock 4 breaks a bunch of unit tests
11+
mock
1112
mockredispy
1213
moto
1314
mypy
@@ -20,7 +21,6 @@ pytest-mock
2021
pytest-timeout
2122
pytest-tornado
2223
pytest-xdist
23-
redislite
2424
readme_renderer
2525
tornado
2626
tox

0 commit comments

Comments
 (0)