Skip to content

Commit 5676a57

Browse files
authored
Merge branch 'main' into 33_pre-commit-hook
2 parents 0f15d3b + 25dad16 commit 5676a57

File tree

13 files changed

+309
-39
lines changed

13 files changed

+309
-39
lines changed

.flake8

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[flake8]
2+
max-line-length = 120
3+
extend-ignore = E203, E402
4+
exclude =
5+
.git,
6+
__pycache__
7+
per-file-ignores =
8+
__init__.py: F401, F403, W391

.github/workflows/flake8.yml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: Flake8 check (style check)
2+
3+
on: [push]
4+
5+
jobs:
6+
flake8-lint:
7+
runs-on: ubuntu-latest
8+
name: Linters
9+
steps:
10+
- name: Check out source repository
11+
uses: actions/checkout@v4
12+
- name: Set up Python environment
13+
uses: actions/setup-python@v5
14+
with:
15+
python-version: "3.10"
16+
cache: "pip"
17+
- name: flake8 Lint
18+
uses: py-actions/flake8@v2
19+
with:
20+
path: "src"

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# qemu-riscv-cluster
22

3+
![Flake8 Status](https://img.shields.io/github/actions/workflow/status/moevm/qemu-riscv-cluster/.github/workflows/flake8.yml?branch=main&label=Flake8%20Check)
4+
35
## Project structure
46
-- This repository contains gRPC client and scripts to build and deploy workers in the RISC-V VM.
57

examples/simple_grpc/client.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@
22
import sum_pb2
33
import sum_pb2_grpc
44

5+
56
def run():
67
channel = grpc.insecure_channel('localhost:50051')
78
stub = sum_pb2_grpc.SumServiceStub(channel)
8-
9+
910
response = stub.Sum(sum_pb2.SumRequest(a=22, b=2332))
1011
print(f"The result of the addition: {response.result}")
1112

13+
1214
if __name__ == '__main__':
1315
run()

examples/simple_grpc/server.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import sum_pb2_grpc
55

66
SERVER_PORT = 50051
7+
8+
79
class SumService(sum_pb2_grpc.SumServiceServicer):
810
def Sum(self, request, context):
911
result = request.a + request.b
1012
return sum_pb2.SumResponse(result=result)
11-
13+
14+
1215
def serve():
1316
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
1417
sum_pb2_grpc.add_SumServiceServicer_to_server(SumService(), server)
@@ -17,5 +20,6 @@ def serve():
1720
print(f"The server is running on the port {SERVER_PORT}")
1821
server.wait_for_termination()
1922

23+
2024
if __name__ == '__main__':
2125
serve()

src/client/client.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import grpc
22
from dotenv import load_dotenv
33
import os
4-
from typing import Optional
54
from src.utils.payload_generator import PayloadGenerator
65
from src.protobuf import file_service_pb2
76
from src.protobuf import file_service_pb2_grpc
87

98
load_dotenv(os.path.join(os.path.dirname(__file__), "..", "..", "env", ".grpc.env"))
109

1110

11+
1212
class FileClient:
1313
def __init__(self):
1414
self.host: str = os.environ["GRPC_CLIENT_HOST"]
@@ -21,6 +21,7 @@ def __init__(self):
2121
]
2222

2323
self.channel: grpc.Channel = grpc.insecure_channel(f"{self.host}:{self.port}", options=options)
24+
2425
self.stub: file_service_pb2_grpc.FileServiceStub = file_service_pb2_grpc.FileServiceStub(self.channel)
2526

2627
def upload_and_validate(self, file_path: str, file_type: str) -> file_service_pb2.FileResponse:

src/server_tests/payload_generator_server.py

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,13 @@
33
import traceback
44
from concurrent import futures
55
from dotenv import load_dotenv
6-
from typing import Set, Optional
6+
from typing import Set
77
from src.protobuf import file_service_pb2
88
from src.protobuf import file_service_pb2_grpc
99

1010
load_dotenv(os.path.join(os.path.dirname(__file__), '..', '..', 'env', '.grpc.env'))
11-
AVAILABLE_CHARACTERS="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !?.,\n"
11+
AVAILABLE_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 !?.,\n"
12+
1213

1314
class FileValidator:
1415
@staticmethod
@@ -23,7 +24,7 @@ def validate_text(content: bytes, charset: Set[str]) -> bool:
2324
`charset: Set[str]` - A set of valid characters.
2425
2526
Output data:
26-
27+
2728
`bool` - True if the content is valid, otherwise False.
2829
"""
2930
try:
@@ -47,11 +48,13 @@ def validate_binary(content: bytes) -> bool:
4748
"""
4849
return True
4950

51+
5052
class FileService(file_service_pb2_grpc.FileServiceServicer):
5153
def __init__(self, text_charset: str) -> None:
5254
self.text_charset: Set[str] = set(text_charset)
53-
54-
def UploadFile(self, request: file_service_pb2.FileRequest, context: grpc.ServicerContext) -> file_service_pb2.FileResponse:
55+
56+
def UploadFile(self, request: file_service_pb2.FileRequest,
57+
context: grpc.ServicerContext) -> file_service_pb2.FileResponse:
5558
"""
5659
Processes a request to upload a file.
5760
@@ -62,7 +65,7 @@ def UploadFile(self, request: file_service_pb2.FileRequest, context: grpc.Servic
6265
`context: grpc.ServicerContext` - The gRPC Context
6366
6467
Output data:
65-
68+
6669
`file_service_pb2.FileResponse` - The response with the validation result.
6770
"""
6871
try:
@@ -73,7 +76,7 @@ def UploadFile(self, request: file_service_pb2.FileRequest, context: grpc.Servic
7376
is_valid = FileValidator.validate_text(request.content, self.text_charset)
7477
elif request.file_type == "binary":
7578
is_valid = FileValidator.validate_binary(request.content)
76-
79+
7780
return file_service_pb2.FileResponse(
7881
size=actual_size,
7982
is_valid=is_valid,
@@ -86,6 +89,7 @@ def UploadFile(self, request: file_service_pb2.FileRequest, context: grpc.Servic
8689
context.set_details(f"Error: {e}")
8790
return file_service_pb2.FileResponse()
8891

92+
8993
def serve():
9094
"""
9195
Starts the gRPC server.
@@ -95,23 +99,24 @@ def serve():
9599
host = os.environ['GRPC_SERVER_HOST']
96100

97101
options = [
98-
('grpc.max_receive_message_length', max_message_length),
99-
('grpc.max_send_message_length', max_message_length),
102+
('grpc.max_receive_message_length', max_message_length),
103+
('grpc.max_send_message_length', max_message_length),
100104
]
101-
105+
102106
server = grpc.server(
103107
futures.ThreadPoolExecutor(max_workers=10),
104108
options=options
105109
)
106-
110+
107111
file_service_pb2_grpc.add_FileServiceServicer_to_server(
108-
FileService(text_charset=AVAILABLE_CHARACTERS),
112+
FileService(text_charset=AVAILABLE_CHARACTERS),
109113
server
110114
)
111115
server.add_insecure_port(f'{host}:{port}')
112116
server.start()
113117
print(f"Server started on port {port}")
114118
server.wait_for_termination()
115119

120+
116121
if __name__ == '__main__':
117-
serve()
122+
serve()

src/utils/payload_generator.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import uuid
44
from typing import Optional, Literal
55

6+
67
class PayloadGenerator:
78
"""
89
This class is a payload generator.
@@ -18,7 +19,7 @@ def __init__(
1819
):
1920
if unit not in ("B", "KB", "MB"):
2021
raise ValueError("Invalid unit of measurement. Allowed: 'B', 'KB', 'MB'")
21-
22+
2223
multipliers = {
2324
"B": 1,
2425
"KB": 1024,
@@ -86,7 +87,7 @@ def _generate_text(self, path: str):
8687
"""text data generation"""
8788
charset = self.text_charset
8889
buffer_size = 128 * 1024
89-
90+
9091
with open(path, 'w', encoding='utf-8') as f:
9192
remaining = self.file_size
9293
buffer = []
@@ -100,11 +101,11 @@ def _generate_text(self, path: str):
100101
if len(encoded) > remaining:
101102
encoded = encoded[:remaining]
102103
chunk = encoded.decode('utf-8', errors='ignore')
103-
104+
104105
buffer.append(chunk)
105106
current_buffer_size += len(encoded)
106107
remaining -= len(encoded)
107-
108+
108109
if current_buffer_size >= buffer_size:
109110
f.write(''.join(buffer))
110111
buffer = []
@@ -114,4 +115,4 @@ def _generate_text(self, path: str):
114115
f.write(''.join(buffer))
115116

116117
def get_charset(self):
117-
return self.text_charset
118+
return self.text_charset

tests/conftest.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,23 +10,25 @@
1010

1111
from src.client.client import FileClient
1212

13+
1314
@pytest.fixture(scope="module")
1415
def grpc_server():
1516
controller_path = os.path.join(
1617
os.path.dirname(__file__), '..', 'src', 'server_tests', 'payload_generator_server.py'
1718
)
1819
env = os.environ.copy()
1920
env["PYTHONPATH"] = os.pathsep.join(sys.path)
20-
21+
2122
server_process = subprocess.Popen(
2223
['python3', controller_path],
2324
env=env
2425
)
25-
time.sleep(2)
26+
time.sleep(2)
2627
yield
2728
server_process.terminate()
2829

30+
2931
@pytest.fixture(scope="module")
3032
def grpc_client():
3133
client = FileClient()
32-
return client
34+
return client
Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
1-
import subprocess
2-
import time
31
import pytest
4-
import grpc
5-
import sys
62
import os
7-
83
from src.utils.payload_generator import PayloadGenerator
94

5+
106
@pytest.mark.integration
117
def test_text_file_upload(tmpdir, grpc_server, grpc_client):
128
text_size = 10
139
file_path = os.path.join(tmpdir, "test_text_file.txt")
14-
10+
1511
generator = PayloadGenerator(size=text_size, file_type="text", unit="MB")
1612
generated_path = generator.generate(path=file_path)
1713
response = grpc_client.upload_and_validate(generated_path, "text")
@@ -20,15 +16,16 @@ def test_text_file_upload(tmpdir, grpc_server, grpc_client):
2016
assert response.is_valid is True
2117
assert response.message == "Validation successful"
2218

19+
2320
@pytest.mark.integration
2421
def test_binary_file_upload(tmpdir, grpc_server, grpc_client):
2522
binary_size = 2048
2623
file_path = os.path.join(tmpdir, "test_binary_file.bin")
27-
24+
2825
generator = PayloadGenerator(size=binary_size, file_type="binary")
2926
generated_path = generator.generate(path=file_path)
3027
response = grpc_client.upload_and_validate(generated_path, "binary")
3128

3229
assert response.size == binary_size
3330
assert response.is_valid is True
34-
assert response.message == "Validation successful"
31+
assert response.message == "Validation successful"

0 commit comments

Comments
 (0)