Skip to content

Commit 1dc4c20

Browse files
authored
Merge pull request #37 from cloudblue/contrib_locust
Add contrib package for locust
2 parents 91ed4d6 + 56abfbb commit 1dc4c20

7 files changed

Lines changed: 74 additions & 8 deletions

File tree

connect/client/contrib/__init__.py

Whitespace-only changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
from locust import events
2+
3+
from connect.client.contrib.locust.user import ConnectHttpUser # noqa
4+
5+
6+
@events.init_command_line_parser.add_listener
7+
def _(parser):
8+
parser.add_argument('--connect-api-key', default='', help='Connect Api Key')
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import time
2+
3+
from locust import HttpUser
4+
5+
from requests import RequestException
6+
7+
from connect.client import ConnectClient
8+
9+
10+
class _LocustConnectClient(ConnectClient):
11+
def __init__(self, base_url, request_event, user, *args, **kwargs):
12+
self.base_url = base_url
13+
self.request_event = request_event
14+
self.user = user
15+
16+
super().__init__(
17+
kwargs['connect_api_key'],
18+
self.base_url,
19+
use_specs=False,
20+
max_retries=0,
21+
timeout=(5, 120),
22+
)
23+
24+
def _execute_http_call(self, method, url, kwargs):
25+
start_time = time.perf_counter()
26+
exc = None
27+
try:
28+
super()._execute_http_call(method, url, kwargs)
29+
except RequestException as e:
30+
exc = e
31+
32+
response = self.response.history and self.response.history[0] or self.response
33+
request_meta = {
34+
'request_type': method,
35+
'response_time': (time.perf_counter() - start_time) * 1000,
36+
'name': response.request.path_url,
37+
'context': {},
38+
'response': self.response,
39+
'exception': exc,
40+
'response_length': len(self.response.content or b''),
41+
}
42+
43+
self.request_event.fire(**request_meta)
44+
45+
46+
class ConnectHttpUser(HttpUser):
47+
abstract = True
48+
49+
def __init__(self, *args, **kwargs):
50+
super().__init__(*args, **kwargs)
51+
52+
self.client = _LocustConnectClient(
53+
self.host,
54+
request_event=self.environment.events.request,
55+
user=self,
56+
connect_api_key=self.environment.parsed_options.connect_api_key,
57+
)

pyproject.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,8 @@ omit = [
8686
"*/settings/*",
8787
"*/manage.py",
8888
"*/wsgi.py",
89-
"*/urls.py"
89+
"*/urls.py",
90+
"connect/client/contrib/*"
9091
]
9192

9293
exclude_lines = [

sonar-project.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ sonar.language=py
77
sonar.sources=connect
88
sonar.tests=tests
99
sonar.inclusions=connect/**
10-
sonar.exclusions=tests/**
10+
sonar.exclusions=connect/client/contrib/**,tests/**
1111

1212
sonar.python.coverage.reportPaths=./coverage.xml

tests/async_client/test_fluent.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,9 @@ async def test_execute_validate_with_specs(async_mocker):
114114
mocked_specs = async_mocker.MagicMock()
115115
mocked_specs.exists.return_value = False
116116

117-
async_mocker.patch('connect.client.fluent.OpenAPISpecs', return_value=mocked_specs)
118-
119-
c = AsyncConnectClient('API_KEY')
117+
c = AsyncConnectClient('API_KEY', use_specs=False)
118+
c.specs = mocked_specs
119+
c._use_specs = True
120120
with pytest.raises(ClientError) as cv:
121121
await c.execute('GET', 'resources')
122122

tests/client/test_fluent.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,9 +180,9 @@ def test_execute_validate_with_specs(mocker):
180180
mocked_specs = mocker.MagicMock()
181181
mocked_specs.exists.return_value = False
182182

183-
mocked_specs = mocker.patch('connect.client.fluent.OpenAPISpecs', return_value=mocked_specs)
184-
185-
c = ConnectClient('API_KEY')
183+
c = ConnectClient('API_KEY', use_specs=False)
184+
c.specs = mocked_specs
185+
c._use_specs = True
186186
with pytest.raises(ClientError) as cv:
187187
c.execute('GET', 'resources')
188188

0 commit comments

Comments
 (0)