test: route S3 mock server messages through logger

The S3 mock server (introduced in 5a96549c) currently prints its status
messages directly to stdout, which can be distracting when reviewing test
results. For example:

```console
$ ./test.py --verbose --mode debug object_store/test_backup::test_simple_backup
Found 1 tests.
Starting S3 mock server on ('127.226.51.1', 2012)
================================================================================
[N/TOTAL]   SUITE    MODE   RESULT   TEST
------------------------------------------------------------------------------
[1/1]      object_store  debug  [ PASS ] object_store.test_backup.1 5.99s
Stopping S3 mock server
-------------------------
CPU utilization: 6.5%
```

Move these messages to use proper logging to give developers more control
over their visibility:

- Make logger parameter mandatory in MockS3Server constructor
- Route "Stopping S3 mock server" message through the provided logger
- Add --log-level option to the standalone mock server launcher

The message is now hidden:

```console
$ ./test.py --verbose --mode debug --save-log-on-success object_store/test_backup::test_simple_backup
Found 1 tests.
================================================================================
[N/TOTAL]   SUITE    MODE   RESULT   TEST
------------------------------------------------------------------------------

[1/1]      object_store  debug  [ PASS ] object_store.test_backup.1 6.25s
------------------------------------------------------------------------------
CPU utilization: 5.5%
```

Signed-off-by: Kefu Chai <kefu.chai@scylladb.com>

Closes scylladb/scylladb#21384
This commit is contained in:
Kefu Chai
2024-10-31 11:25:37 +08:00
committed by Pavel Emelyanov
parent 78ceaeabca
commit f8221b960f
2 changed files with 11 additions and 5 deletions

View File

@@ -182,7 +182,7 @@ class InjectingHandler(BaseHTTPRequestHandler):
# pytest kicks in. In addition, it is possible just to start this server using another script - `start_mock.py` to
# run it locally to provide mocking functionality for tests executed during development process
class MockS3Server:
def __init__(self, host, port, logger=None):
def __init__(self, host, port, logger):
self.req_states = LRUCache(10000)
handler = partial(InjectingHandler, self.req_states, logger)
self.server = ThreadingHTTPServer((host, port), handler)
@@ -191,20 +191,21 @@ class MockS3Server:
self.server.timeout = 10000
self.server.socket.settimeout(10000)
self.server.socket.listen(1000)
self.logger = logger
self.is_running = False
os.environ['MOCK_S3_SERVER_PORT'] = f'{port}'
os.environ['MOCK_S3_SERVER_HOST'] = host
async def start(self):
if not self.is_running:
print(f'Starting S3 mock server on {self.server.server_address}')
self.logger.info('Starting S3 mock server on %s', self.server.server_address)
loop = asyncio.get_running_loop()
self.server_thread = loop.run_in_executor(None, self.server.serve_forever)
self.is_running = True
async def stop(self):
if self.is_running:
print('Stopping S3 mock server')
self.logger.info('Stopping S3 mock server')
self.server.shutdown()
await self.server_thread
self.is_running = False
@@ -215,5 +216,5 @@ class MockS3Server:
while self.is_running:
await asyncio.sleep(1)
except Exception as e:
print(f"Server error: {e}")
self.logger.error("Server error: %s", e)
await self.stop()

View File

@@ -3,6 +3,7 @@ import asyncio
import sys
import signal
import argparse
import logging
from s3_server_mock import MockS3Server
@@ -10,8 +11,12 @@ async def run():
parser = argparse.ArgumentParser(description="Start S3 mock server")
parser.add_argument('--host', default='127.0.0.1')
parser.add_argument('--port', type=int, default=2012)
parser.add_argument('--log-level', default=logging.WARNING,
choices=logging.getLevelNamesMapping().keys(),
help="Set log level")
args = parser.parse_args()
server = MockS3Server(args.host, args.port)
logging.basicConfig(level=args.log_level)
server = MockS3Server(args.host, args.port, logging.getLogger('s3-server'))
print('Starting S3 mock server')
await server.start()