From 0034970114b753de36bc8147354843d2bdeace24 Mon Sep 17 00:00:00 2001 From: Vladyslav Fenchak Date: Wed, 30 Mar 2022 18:37:01 +0200 Subject: [PATCH 1/4] ISSUE #78 --- .../api_gateway/discovery/database/client.py | 16 ++----- .../test_discovery/dataset.py | 20 ++++++++ .../test_views/test_microservice.py | 47 ++++++++++++++++--- 3 files changed, 65 insertions(+), 18 deletions(-) create mode 100644 tests/test_api_gateway/test_discovery/dataset.py diff --git a/minos/api_gateway/discovery/database/client.py b/minos/api_gateway/discovery/database/client.py index 952d11b..4113331 100644 --- a/minos/api_gateway/discovery/database/client.py +++ b/minos/api_gateway/discovery/database/client.py @@ -16,6 +16,7 @@ class OrdersMinosApiRouter(MinosApiRouter): import logging from typing import ( Any, + Optional ) import aioredis @@ -41,17 +42,14 @@ class MinosRedisClient: __slots__ = "address", "port", "password", "redis" - def __init__(self, config: MinosConfig, pool_size: int = 50): + def __init__(self, config: MinosConfig, pool_size: Optional[int] = None): """Perform initial configuration and connection to Redis""" address = config.discovery.database.host port = config.discovery.database.port password = config.discovery.database.password - pool = aioredis.ConnectionPool.from_url( - f"redis://{address}:{port}", password=password, max_connections=pool_size - ) - self.redis = aioredis.Redis(connection_pool=pool) + self.redis = aioredis.from_url(f"redis://{address}:{port}", password=password, max_connections=pool_size) async def get_data(self, key: str) -> str: """Get redis value by key""" @@ -78,13 +76,7 @@ async def get_all(self) -> list: return data async def set_data(self, key: str, data: dict): - async with self.redis as r: - await r.set(key, json.dumps(data)) - await r.save() - - async def update_data(self): # pragma: no cover - """Update specific value""" - pass + await self.redis.set(key, json.dumps(data)) async def delete_data(self, key: str): deleted_elements = await self.redis.delete(key) diff --git a/tests/test_api_gateway/test_discovery/dataset.py b/tests/test_api_gateway/test_discovery/dataset.py new file mode 100644 index 0000000..6ef6b34 --- /dev/null +++ b/tests/test_api_gateway/test_discovery/dataset.py @@ -0,0 +1,20 @@ +import random +import socket +import struct +from uuid import uuid4 + + +def generate_random_microservice_names(quantity: int): + random_names = [f"test_endpoint_{str(uuid4())}" for x in range(quantity)] + + return random_names + + +def generate_record(name): + ip = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) + port = random.randint(1, 9999) + + record = {"address": f"{ip}", "port": port, + "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]]} + + return record diff --git a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py index 623b957..5023c9a 100644 --- a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py +++ b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py @@ -1,14 +1,17 @@ +import asyncio + from aiohttp.test_utils import ( AioHTTPTestCase, unittest_run_loop, ) - +import time from minos.api_gateway.common import ( MinosConfig, ) from minos.api_gateway.discovery import ( DiscoveryService, ) +from tests.test_api_gateway.test_discovery.dataset import generate_record, generate_random_microservice_names from tests.utils import ( BASE_PATH, ) @@ -37,13 +40,45 @@ async def test_post(self): self.assertEqual(201, response.status) - async def test_bulk_post(self): - name = "test_name" - body = {"address": "1.1.1.1", "port": 1, "endpoints": [["GET", "test_endpoint_1"], ["POST", "test_endpoint_2"]]} + async def test_bulk_update(self): + names = generate_random_microservice_names(50) - response = await self.client.post(f"/microservices/{name}", json=body) + tasks = list() + # Create new records + for name in names: + body = generate_record(name) + tasks.append(self.client.post(f"/microservices/{name}", json=body)) - self.assertEqual(201, response.status) + results = await asyncio.gather(*tasks) + + for result in results: + self.assertEqual(201, result.status) + + # Update existing records + expected = list() + tasks = list() + for name in names: + body = generate_record(name) + expected.append({"name": name, "path": f"/microservices/{name}", "body": body}) + tasks.append(self.client.post(f"/microservices/{name}", json=body)) + + results = await asyncio.gather(*tasks) + + for result in results: + self.assertEqual(201, result.status) + + # Check updated records are correct + for record in expected: + response = await self.client.get( + f"/microservices?verb={record['body']['endpoints'][0][0]}&path={record['body']['endpoints'][0][1]}") + + self.assertEqual(200, response.status) + + body = await response.json() + + self.assertEqual(record['body']['address'], body["address"]) + self.assertEqual(record['body']['port'], int(body["port"])) + self.assertEqual(record['name'], body["name"]) @unittest_run_loop async def test_post_missing_param(self): From 930e016089c823532b86efe79f69581351c7afc2 Mon Sep 17 00:00:00 2001 From: Vladyslav Fenchak Date: Wed, 30 Mar 2022 21:30:46 +0200 Subject: [PATCH 2/4] ISSUE #78 --- .../test_discovery/dataset.py | 11 +++++ .../test_views/test_microservice.py | 40 ++++++++++++++++++- 2 files changed, 49 insertions(+), 2 deletions(-) diff --git a/tests/test_api_gateway/test_discovery/dataset.py b/tests/test_api_gateway/test_discovery/dataset.py index 6ef6b34..71c44ce 100644 --- a/tests/test_api_gateway/test_discovery/dataset.py +++ b/tests/test_api_gateway/test_discovery/dataset.py @@ -18,3 +18,14 @@ def generate_record(name): "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]]} return record + + +def generate_record_old(x): + ip = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) + port = random.randint(1, 9999) + name = f"microservice_{x}" + + record = {"address": f"{ip}", "port": port, + "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]]} + + return name, record diff --git a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py index 5023c9a..34629c2 100644 --- a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py +++ b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py @@ -4,14 +4,14 @@ AioHTTPTestCase, unittest_run_loop, ) -import time from minos.api_gateway.common import ( MinosConfig, ) from minos.api_gateway.discovery import ( DiscoveryService, ) -from tests.test_api_gateway.test_discovery.dataset import generate_record, generate_random_microservice_names +from tests.test_api_gateway.test_discovery.dataset import generate_record, generate_random_microservice_names, \ + generate_record_old from tests.utils import ( BASE_PATH, ) @@ -80,6 +80,42 @@ async def test_bulk_update(self): self.assertEqual(record['body']['port'], int(body["port"])) self.assertEqual(record['name'], body["name"]) + async def test_bulk_update_2(self): + expected = list() + tasks = list() + # Create new records + for x in range(50): + name, body = generate_record_old(x) + tasks.append(self.client.post(f"/microservices/{name}", json=body)) + + results = await asyncio.gather(*tasks) + + for result in results: + self.assertEqual(201, result.status) + + tasks = list() + for x in range(50): + name, body = generate_record_old(x) + expected.append({"name": name, "path": f"/microservices/{name}", "body": body}) + tasks.append(self.client.post(f"/microservices/{name}", json=body)) + + results = await asyncio.gather(*tasks) + + for result in results: + self.assertEqual(201, result.status) + + for record in expected: + response = await self.client.get( + f"/microservices?verb={record['body']['endpoints'][0][0]}&path={record['body']['endpoints'][0][1]}") + + self.assertEqual(200, response.status) + + body = await response.json() + + self.assertEqual(record['body']['address'], body["address"]) + self.assertEqual(int(record['body']['port']), int(body["port"])) + self.assertEqual(record['name'], body["name"]) + @unittest_run_loop async def test_post_missing_param(self): name = "test_name" From d866eea50e15d5cb2e9750dc22680e1cb33ba013 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 30 Mar 2022 19:31:33 +0000 Subject: [PATCH 3/4] Restyled by black --- .../api_gateway/discovery/database/client.py | 13 ++----- .../test_discovery/dataset.py | 18 ++++++---- .../test_views/test_microservice.py | 35 +++++++++---------- 3 files changed, 32 insertions(+), 34 deletions(-) diff --git a/minos/api_gateway/discovery/database/client.py b/minos/api_gateway/discovery/database/client.py index 4113331..0284218 100644 --- a/minos/api_gateway/discovery/database/client.py +++ b/minos/api_gateway/discovery/database/client.py @@ -14,19 +14,12 @@ class OrdersMinosApiRouter(MinosApiRouter): import json import logging -from typing import ( - Any, - Optional -) +from typing import Any, Optional import aioredis -from minos.api_gateway.common import ( - MinosConfig, -) -from minos.api_gateway.discovery.domain.microservice import ( - MICROSERVICE_KEY_PREFIX, -) +from minos.api_gateway.common import MinosConfig +from minos.api_gateway.discovery.domain.microservice import MICROSERVICE_KEY_PREFIX log = logging.getLogger(__name__) diff --git a/tests/test_api_gateway/test_discovery/dataset.py b/tests/test_api_gateway/test_discovery/dataset.py index 71c44ce..e3a84c1 100644 --- a/tests/test_api_gateway/test_discovery/dataset.py +++ b/tests/test_api_gateway/test_discovery/dataset.py @@ -11,21 +11,27 @@ def generate_random_microservice_names(quantity: int): def generate_record(name): - ip = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) + ip = socket.inet_ntoa(struct.pack(">I", random.randint(1, 0xFFFFFFFF))) port = random.randint(1, 9999) - record = {"address": f"{ip}", "port": port, - "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]]} + record = { + "address": f"{ip}", + "port": port, + "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]], + } return record def generate_record_old(x): - ip = socket.inet_ntoa(struct.pack('>I', random.randint(1, 0xffffffff))) + ip = socket.inet_ntoa(struct.pack(">I", random.randint(1, 0xFFFFFFFF))) port = random.randint(1, 9999) name = f"microservice_{x}" - record = {"address": f"{ip}", "port": port, - "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]]} + record = { + "address": f"{ip}", + "port": port, + "endpoints": [["GET", f"test_endpoint_{name}"], ["POST", f"test_endpoint_{name}"]], + } return name, record diff --git a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py index 34629c2..d705054 100644 --- a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py +++ b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py @@ -4,17 +4,14 @@ AioHTTPTestCase, unittest_run_loop, ) -from minos.api_gateway.common import ( - MinosConfig, -) -from minos.api_gateway.discovery import ( - DiscoveryService, -) -from tests.test_api_gateway.test_discovery.dataset import generate_record, generate_random_microservice_names, \ - generate_record_old -from tests.utils import ( - BASE_PATH, +from minos.api_gateway.common import MinosConfig +from minos.api_gateway.discovery import DiscoveryService +from tests.test_api_gateway.test_discovery.dataset import ( + generate_record, + generate_random_microservice_names, + generate_record_old, ) +from tests.utils import BASE_PATH class TestMicroserviceEndpoints(AioHTTPTestCase): @@ -70,15 +67,16 @@ async def test_bulk_update(self): # Check updated records are correct for record in expected: response = await self.client.get( - f"/microservices?verb={record['body']['endpoints'][0][0]}&path={record['body']['endpoints'][0][1]}") + f"/microservices?verb={record['body']['endpoints'][0][0]}&path={record['body']['endpoints'][0][1]}" + ) self.assertEqual(200, response.status) body = await response.json() - self.assertEqual(record['body']['address'], body["address"]) - self.assertEqual(record['body']['port'], int(body["port"])) - self.assertEqual(record['name'], body["name"]) + self.assertEqual(record["body"]["address"], body["address"]) + self.assertEqual(record["body"]["port"], int(body["port"])) + self.assertEqual(record["name"], body["name"]) async def test_bulk_update_2(self): expected = list() @@ -106,15 +104,16 @@ async def test_bulk_update_2(self): for record in expected: response = await self.client.get( - f"/microservices?verb={record['body']['endpoints'][0][0]}&path={record['body']['endpoints'][0][1]}") + f"/microservices?verb={record['body']['endpoints'][0][0]}&path={record['body']['endpoints'][0][1]}" + ) self.assertEqual(200, response.status) body = await response.json() - self.assertEqual(record['body']['address'], body["address"]) - self.assertEqual(int(record['body']['port']), int(body["port"])) - self.assertEqual(record['name'], body["name"]) + self.assertEqual(record["body"]["address"], body["address"]) + self.assertEqual(int(record["body"]["port"]), int(body["port"])) + self.assertEqual(record["name"], body["name"]) @unittest_run_loop async def test_post_missing_param(self): From af91b8d8b4d427f3fe58e500f21f0bc93a69a0d4 Mon Sep 17 00:00:00 2001 From: "Restyled.io" Date: Wed, 30 Mar 2022 19:31:38 +0000 Subject: [PATCH 4/4] Restyled by isort --- minos/api_gateway/discovery/database/client.py | 13 ++++++++++--- tests/test_api_gateway/test_discovery/dataset.py | 4 +++- .../test_views/test_microservice.py | 15 +++++++++++---- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/minos/api_gateway/discovery/database/client.py b/minos/api_gateway/discovery/database/client.py index 0284218..932fac1 100644 --- a/minos/api_gateway/discovery/database/client.py +++ b/minos/api_gateway/discovery/database/client.py @@ -14,12 +14,19 @@ class OrdersMinosApiRouter(MinosApiRouter): import json import logging -from typing import Any, Optional +from typing import ( + Any, + Optional, +) import aioredis -from minos.api_gateway.common import MinosConfig -from minos.api_gateway.discovery.domain.microservice import MICROSERVICE_KEY_PREFIX +from minos.api_gateway.common import ( + MinosConfig, +) +from minos.api_gateway.discovery.domain.microservice import ( + MICROSERVICE_KEY_PREFIX, +) log = logging.getLogger(__name__) diff --git a/tests/test_api_gateway/test_discovery/dataset.py b/tests/test_api_gateway/test_discovery/dataset.py index e3a84c1..448aeab 100644 --- a/tests/test_api_gateway/test_discovery/dataset.py +++ b/tests/test_api_gateway/test_discovery/dataset.py @@ -1,7 +1,9 @@ import random import socket import struct -from uuid import uuid4 +from uuid import ( + uuid4, +) def generate_random_microservice_names(quantity: int): diff --git a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py index d705054..501b671 100644 --- a/tests/test_api_gateway/test_discovery/test_views/test_microservice.py +++ b/tests/test_api_gateway/test_discovery/test_views/test_microservice.py @@ -4,14 +4,21 @@ AioHTTPTestCase, unittest_run_loop, ) -from minos.api_gateway.common import MinosConfig -from minos.api_gateway.discovery import DiscoveryService + +from minos.api_gateway.common import ( + MinosConfig, +) +from minos.api_gateway.discovery import ( + DiscoveryService, +) from tests.test_api_gateway.test_discovery.dataset import ( - generate_record, generate_random_microservice_names, + generate_record, generate_record_old, ) -from tests.utils import BASE_PATH +from tests.utils import ( + BASE_PATH, +) class TestMicroserviceEndpoints(AioHTTPTestCase):