diff --git a/docker-deps-down.sh b/docker-deps-down.sh index a8dbb17..8005279 100755 --- a/docker-deps-down.sh +++ b/docker-deps-down.sh @@ -1,5 +1,4 @@ # docker-deps-down.sh # Stop the docker containers that provide dev/test dependencies + docker stop test-lta-mongo -# docker stop test-lta-token -# docker stop test-lta-rest diff --git a/docker-deps-up.sh b/docker-deps-up.sh index 7da2d29..259a5ff 100755 --- a/docker-deps-up.sh +++ b/docker-deps-up.sh @@ -1,18 +1,11 @@ # docker-deps-up.sh # Run some docker containers to provide dev/test dependencies + +docker pull circleci/mongo:latest-ram + docker run \ --detach \ --name test-lta-mongo \ --network=host \ --rm \ - circleci/mongo:latest-ram & - -# docker run \ -# --env LTA_AUTH_AUDIENCE='lta' \ -# --env LTA_AUTH_OPENID_URL='' \ -# --env OTEL_EXPORTER_OTLP_ENDPOINT='localhost:4318' \ -# --env WIPACTEL_EXPORT_STDOUT='FALSE' \ -# --name test-lta-rest \ -# --network=host \ -# --rm \ -# wipac/lta:latest python3 -m lta.rest_server & + circleci/mongo:latest-ram diff --git a/lta/rest_server.py b/lta/rest_server.py index 3be5062..3b0e84b 100644 --- a/lta/rest_server.py +++ b/lta/rest_server.py @@ -9,11 +9,11 @@ import logging import os import sys -from typing import Any, Callable, cast, Dict, Optional +from typing import Any, cast, Dict, Optional from urllib.parse import quote_plus from uuid import uuid1 -from motor.motor_tornado import MotorClient, MotorDatabase # type: ignore +from motor.motor_tornado import MotorClient, MotorDatabase from prometheus_client import Counter, start_http_server import pymongo from pymongo import MongoClient @@ -817,13 +817,6 @@ def start(debug: bool = False) -> RestServer: async def main() -> None: - """Just loop forever while the REST server processes requests.""" - while True: - LOG.info("Sleeping for 60 seconds") - await asyncio.sleep(60) - - -def main_sync() -> None: """Configure logging and start a LTA DB service.""" # obtain our configuration from the environment config = from_environment(EXPECTED_CONFIG) @@ -838,8 +831,8 @@ def main_sync() -> None: start(debug=True) metrics_port = int(config["PROMETHEUS_METRICS_PORT"]) start_http_server(metrics_port) - asyncio.run(main()) + await asyncio.Event().wait() if __name__ == '__main__': - main_sync() + asyncio.run(main()) diff --git a/requirements-dev.txt b/requirements-dev.txt index 3a83cfe..c6acc1d 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -4,15 +4,11 @@ # # pip-compile --extra=dev --output-file=requirements-dev.txt # -backoff==2.2.1 - # via - # opentelemetry-exporter-otlp-proto-common - # opentelemetry-exporter-otlp-proto-http binpacking==1.5.2 # via lta (setup.py) cachetools==5.3.2 # via wipac-rest-tools -certifi==2023.11.17 +certifi==2024.2.2 # via requests cffi==1.16.0 # via cryptography @@ -30,31 +26,29 @@ colorama==0.4.6 # lta (setup.py) coloredlogs==15.0.1 # via wipac-telemetry -coverage[toml]==7.4.0 - # via - # coverage - # pytest-cov +coverage[toml]==7.4.3 + # via pytest-cov crayons==0.4.0 # via pycycle -cryptography==41.0.7 +cryptography==42.0.5 # via pyjwt deprecated==1.2.14 # via # opentelemetry-api # opentelemetry-exporter-otlp-proto-http -dnspython==2.4.2 +dnspython==2.6.1 # via pymongo exceptiongroup==1.2.0 # via pytest flake8==7.0.0 # via lta (setup.py) -future==0.18.3 +future==1.0.0 # via binpacking googleapis-common-protos==1.59.1 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-otlp-proto-http -grpcio==1.60.0 +grpcio==1.62.0 # via opentelemetry-exporter-jaeger-proto-grpc humanfriendly==10.0 # via coloredlogs @@ -68,7 +62,7 @@ iniconfig==2.0.0 # via pytest jinja2==3.1.3 # via click-completion -markupsafe==2.1.3 +markupsafe==2.1.5 # via jinja2 mccabe==0.7.0 # via flake8 @@ -78,7 +72,7 @@ mypy==1.8.0 # via lta (setup.py) mypy-extensions==1.0.0 # via mypy -opentelemetry-api==1.22.0 +opentelemetry-api==1.23.0 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-jaeger-thrift @@ -91,29 +85,29 @@ opentelemetry-exporter-jaeger-proto-grpc==1.21.0 # via opentelemetry-exporter-jaeger opentelemetry-exporter-jaeger-thrift==1.21.0 # via opentelemetry-exporter-jaeger -opentelemetry-exporter-otlp-proto-common==1.22.0 +opentelemetry-exporter-otlp-proto-common==1.23.0 # via opentelemetry-exporter-otlp-proto-http -opentelemetry-exporter-otlp-proto-http==1.22.0 +opentelemetry-exporter-otlp-proto-http==1.23.0 # via wipac-telemetry -opentelemetry-proto==1.22.0 +opentelemetry-proto==1.23.0 # via # opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-http -opentelemetry-sdk==1.22.0 +opentelemetry-sdk==1.23.0 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-jaeger-thrift # opentelemetry-exporter-otlp-proto-http # wipac-telemetry -opentelemetry-semantic-conventions==0.43b0 +opentelemetry-semantic-conventions==0.44b0 # via opentelemetry-sdk packaging==23.2 # via pytest -pluggy==1.3.0 +pluggy==1.4.0 # via pytest -prometheus-client==0.19.0 +prometheus-client==0.20.0 # via lta (setup.py) -protobuf==4.25.2 +protobuf==4.25.3 # via # googleapis-common-protos # opentelemetry-proto @@ -127,23 +121,21 @@ pycycle==0.0.8 pyflakes==3.2.0 # via flake8 pyjwt[crypto]==2.8.0 - # via - # pyjwt - # wipac-rest-tools -pymongo==4.6.1 + # via wipac-rest-tools +pymongo==4.6.2 # via # lta (setup.py) # motor pypng==0.20220715.0 # via qrcode -pytest==7.4.4 +pytest==8.0.1 # via # lta (setup.py) # pycycle # pytest-asyncio # pytest-cov # pytest-mock -pytest-asyncio==0.23.3 +pytest-asyncio==0.23.5 # via lta (setup.py) pytest-cov==4.1.0 # via lta (setup.py) @@ -177,7 +169,9 @@ tornado==6.4 # via # lta (setup.py) # wipac-rest-tools -types-requests==2.31.0.20240106 +types-colorama==0.4.15.20240205 + # via lta (setup.py) +types-requests==2.31.0.20240218 # via lta (setup.py) typing-extensions==4.9.0 # via @@ -186,12 +180,12 @@ typing-extensions==4.9.0 # qrcode # wipac-dev-tools # wipac-telemetry -urllib3==2.1.0 +urllib3==2.2.1 # via # requests # types-requests # wipac-rest-tools -wipac-dev-tools==1.8.2 +wipac-dev-tools==1.9.1 # via # lta (setup.py) # wipac-rest-tools diff --git a/requirements-monitoring.txt b/requirements-monitoring.txt index c387348..31315ef 100644 --- a/requirements-monitoring.txt +++ b/requirements-monitoring.txt @@ -4,7 +4,7 @@ # # pip-compile --extra=monitoring --output-file=requirements-monitoring.txt # -aiohttp==3.9.1 +aiohttp==3.9.3 # via elasticsearch aiosignal==1.3.1 # via aiohttp @@ -12,15 +12,11 @@ async-timeout==4.0.3 # via aiohttp attrs==23.2.0 # via aiohttp -backoff==2.2.1 - # via - # opentelemetry-exporter-otlp-proto-common - # opentelemetry-exporter-otlp-proto-http binpacking==1.5.2 # via lta (setup.py) cachetools==5.3.2 # via wipac-rest-tools -certifi==2023.11.17 +certifi==2024.2.2 # via # elasticsearch # requests @@ -32,29 +28,27 @@ colorama==0.4.6 # via lta (setup.py) coloredlogs==15.0.1 # via wipac-telemetry -cryptography==41.0.7 +cryptography==42.0.5 # via pyjwt deprecated==1.2.14 # via # opentelemetry-api # opentelemetry-exporter-otlp-proto-http -dnspython==2.4.2 +dnspython==2.6.1 # via pymongo elasticsearch[async]==7.9.1 - # via - # elasticsearch - # lta (setup.py) + # via lta (setup.py) frozenlist==1.4.1 # via # aiohttp # aiosignal -future==0.18.3 +future==1.0.0 # via binpacking googleapis-common-protos==1.59.1 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-otlp-proto-http -grpcio==1.60.0 +grpcio==1.62.0 # via opentelemetry-exporter-jaeger-proto-grpc humanfriendly==10.0 # via coloredlogs @@ -68,11 +62,11 @@ importlib-metadata==6.11.0 # via opentelemetry-api motor==3.3.2 # via lta (setup.py) -multidict==6.0.4 +multidict==6.0.5 # via # aiohttp # yarl -opentelemetry-api==1.22.0 +opentelemetry-api==1.23.0 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-jaeger-thrift @@ -85,25 +79,25 @@ opentelemetry-exporter-jaeger-proto-grpc==1.21.0 # via opentelemetry-exporter-jaeger opentelemetry-exporter-jaeger-thrift==1.21.0 # via opentelemetry-exporter-jaeger -opentelemetry-exporter-otlp-proto-common==1.22.0 +opentelemetry-exporter-otlp-proto-common==1.23.0 # via opentelemetry-exporter-otlp-proto-http -opentelemetry-exporter-otlp-proto-http==1.22.0 +opentelemetry-exporter-otlp-proto-http==1.23.0 # via wipac-telemetry -opentelemetry-proto==1.22.0 +opentelemetry-proto==1.23.0 # via # opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-http -opentelemetry-sdk==1.22.0 +opentelemetry-sdk==1.23.0 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-jaeger-thrift # opentelemetry-exporter-otlp-proto-http # wipac-telemetry -opentelemetry-semantic-conventions==0.43b0 +opentelemetry-semantic-conventions==0.44b0 # via opentelemetry-sdk -prometheus-client==0.19.0 +prometheus-client==0.20.0 # via lta (setup.py) -protobuf==4.25.2 +protobuf==4.25.3 # via # googleapis-common-protos # opentelemetry-proto @@ -111,10 +105,8 @@ protobuf==4.25.2 pycparser==2.21 # via cffi pyjwt[crypto]==2.8.0 - # via - # pyjwt - # wipac-rest-tools -pymongo==4.6.1 + # via wipac-rest-tools +pymongo==4.6.2 # via # lta (setup.py) # motor @@ -144,12 +136,12 @@ typing-extensions==4.9.0 # qrcode # wipac-dev-tools # wipac-telemetry -urllib3==2.1.0 +urllib3==2.2.1 # via # elasticsearch # requests # wipac-rest-tools -wipac-dev-tools==1.8.2 +wipac-dev-tools==1.9.1 # via # lta (setup.py) # wipac-rest-tools diff --git a/requirements.txt b/requirements.txt index a969c3b..0f680df 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,15 +4,11 @@ # # pip-compile --output-file=requirements.txt # -backoff==2.2.1 - # via - # opentelemetry-exporter-otlp-proto-common - # opentelemetry-exporter-otlp-proto-http binpacking==1.5.2 # via lta (setup.py) cachetools==5.3.2 # via wipac-rest-tools -certifi==2023.11.17 +certifi==2024.2.2 # via requests cffi==1.16.0 # via cryptography @@ -22,21 +18,21 @@ colorama==0.4.6 # via lta (setup.py) coloredlogs==15.0.1 # via wipac-telemetry -cryptography==41.0.7 +cryptography==42.0.5 # via pyjwt deprecated==1.2.14 # via # opentelemetry-api # opentelemetry-exporter-otlp-proto-http -dnspython==2.4.2 +dnspython==2.6.1 # via pymongo -future==0.18.3 +future==1.0.0 # via binpacking googleapis-common-protos==1.59.1 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-otlp-proto-http -grpcio==1.60.0 +grpcio==1.62.0 # via opentelemetry-exporter-jaeger-proto-grpc humanfriendly==10.0 # via coloredlogs @@ -48,7 +44,7 @@ importlib-metadata==6.11.0 # via opentelemetry-api motor==3.3.2 # via lta (setup.py) -opentelemetry-api==1.22.0 +opentelemetry-api==1.23.0 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-jaeger-thrift @@ -61,25 +57,25 @@ opentelemetry-exporter-jaeger-proto-grpc==1.21.0 # via opentelemetry-exporter-jaeger opentelemetry-exporter-jaeger-thrift==1.21.0 # via opentelemetry-exporter-jaeger -opentelemetry-exporter-otlp-proto-common==1.22.0 +opentelemetry-exporter-otlp-proto-common==1.23.0 # via opentelemetry-exporter-otlp-proto-http -opentelemetry-exporter-otlp-proto-http==1.22.0 +opentelemetry-exporter-otlp-proto-http==1.23.0 # via wipac-telemetry -opentelemetry-proto==1.22.0 +opentelemetry-proto==1.23.0 # via # opentelemetry-exporter-otlp-proto-common # opentelemetry-exporter-otlp-proto-http -opentelemetry-sdk==1.22.0 +opentelemetry-sdk==1.23.0 # via # opentelemetry-exporter-jaeger-proto-grpc # opentelemetry-exporter-jaeger-thrift # opentelemetry-exporter-otlp-proto-http # wipac-telemetry -opentelemetry-semantic-conventions==0.43b0 +opentelemetry-semantic-conventions==0.44b0 # via opentelemetry-sdk -prometheus-client==0.19.0 +prometheus-client==0.20.0 # via lta (setup.py) -protobuf==4.25.2 +protobuf==4.25.3 # via # googleapis-common-protos # opentelemetry-proto @@ -87,10 +83,8 @@ protobuf==4.25.2 pycparser==2.21 # via cffi pyjwt[crypto]==2.8.0 - # via - # pyjwt - # wipac-rest-tools -pymongo==4.6.1 + # via wipac-rest-tools +pymongo==4.6.2 # via # lta (setup.py) # motor @@ -120,11 +114,11 @@ typing-extensions==4.9.0 # qrcode # wipac-dev-tools # wipac-telemetry -urllib3==2.1.0 +urllib3==2.2.1 # via # requests # wipac-rest-tools -wipac-dev-tools==1.8.2 +wipac-dev-tools==1.9.1 # via # lta (setup.py) # wipac-rest-tools diff --git a/setup.cfg b/setup.cfg index 27c0f08..ffcffff 100644 --- a/setup.cfg +++ b/setup.cfg @@ -42,6 +42,7 @@ dev = pytest-cov pytest-mock requests + types-colorama types-requests monitoring = elasticsearch[async]<8 diff --git a/tests/test_rest_server.py b/tests/test_rest_server.py index fc630af..b8d5abb 100644 --- a/tests/test_rest_server.py +++ b/tests/test_rest_server.py @@ -7,6 +7,7 @@ import socket import tracemalloc from typing import Any, AsyncGenerator, Callable, cast, Dict, List +from unittest.mock import AsyncMock from urllib.parse import quote_plus from pymongo import MongoClient @@ -19,7 +20,7 @@ from rest_tools.utils import Auth from requests.exceptions import HTTPError -from lta.rest_server import boolify, main_sync, start, unique_id +from lta.rest_server import boolify, main, start, unique_id LtaCollection = Database[Dict[str, Any]] RestClientFactory = Callable[[str, float], RestClient] @@ -281,20 +282,22 @@ async def test_transfer_request_pop(rest: RestClientFactory) -> None: @pytest.mark.asyncio -async def test_script_main_sync(mocker: MockerFixture) -> None: +async def test_script_main(mocker: MockerFixture) -> None: """Ensure that main sets up logging, starts a server, and runs the event loop.""" - mock_root_logger = mocker.patch("logging.basicConfig") - mock_rest_server = mocker.patch("lta.rest_server.start") - mock_run = mocker.patch("asyncio.run") - mock_main = mocker.patch("lta.rest_server.main") - mock_shs = mocker.patch("lta.rest_server.start_http_server") - main_sync() - mock_shs.assert_called() - mock_main.assert_called() - mock_run.assert_called() - mock_rest_server.assert_called() - mock_root_logger.assert_called() - await mock_run.call_args.args[0] + mock_basicConfig = mocker.patch("logging.basicConfig") + mock_start = mocker.patch("lta.rest_server.start") + mock_start_http_server = mocker.patch("lta.rest_server.start_http_server") + mock_Event = AsyncMock(spec=asyncio.Event) + mock_asyncio_event = mocker.patch("asyncio.Event") + mock_asyncio_event.return_value = mock_Event + + await main() + + mock_Event.wait.assert_called() + mock_asyncio_event.assert_called() + mock_start_http_server.assert_called() + mock_start.assert_called() + mock_basicConfig.assert_called() @pytest.mark.asyncio