Skip to content

Commit c23dea5

Browse files
authored
Merge pull request #2666 from andrewbaldwin44/bugfix/2657
Update User Classes in Distributed Mode
2 parents a214363 + 9d20b91 commit c23dea5

File tree

4 files changed

+74
-0
lines changed

4 files changed

+74
-0
lines changed

Diff for: locust/env.py

+3
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,9 @@ def create_web_ui(
198198
return self.web_ui
199199

200200
def update_user_class(self, user_settings):
201+
if isinstance(self.runner, MasterRunner):
202+
self.runner.send_message("update_user_class", user_settings)
203+
201204
user_class_name = user_settings.get("user_class_name")
202205
user_class = self.available_user_classes[user_class_name]
203206
user_tasks = self.available_user_tasks[user_class_name]

Diff for: locust/runners.py

+2
Original file line numberDiff line numberDiff line change
@@ -1395,6 +1395,8 @@ def worker(self) -> NoReturn:
13951395
self.reset_connection()
13961396
elif msg.type == "heartbeat":
13971397
self.last_heartbeat_timestamp = time.time()
1398+
elif msg.type == "update_user_class":
1399+
self.environment.update_user_class(msg.data)
13981400
elif msg.type in self.custom_messages:
13991401
logger.debug("Received %s message from master" % msg.type)
14001402
listener, concurrent = self.custom_messages[msg.type]

Diff for: locust/test/test_env.py

+40
Original file line numberDiff line numberDiff line change
@@ -241,3 +241,43 @@ def my_task(self):
241241
environment.available_user_classes["User1"].json(),
242242
{"host": "http://localhost", "tasks": ["my_task_2"], "fixed_count": 0, "weight": 1},
243243
)
244+
245+
def test_distributed_update_user_class(self):
246+
class MyUser1(User):
247+
@task
248+
def my_task(self):
249+
pass
250+
251+
@task
252+
def my_task_2(self):
253+
pass
254+
255+
class MyUser2(User):
256+
@task
257+
def my_task(self):
258+
pass
259+
260+
master_env = Environment(
261+
user_classes=[MyUser1, MyUser2],
262+
available_user_classes={"User1": MyUser1, "User2": MyUser2},
263+
available_user_tasks={"User1": MyUser1.tasks, "User2": MyUser2.tasks},
264+
)
265+
master = master_env.create_master_runner("*", 0)
266+
267+
worker_env = Environment(
268+
user_classes=[MyUser1, MyUser2],
269+
available_user_classes={"User1": MyUser1, "User2": MyUser2},
270+
available_user_tasks={"User1": MyUser1.tasks, "User2": MyUser2.tasks},
271+
)
272+
worker = worker_env.create_worker_runner("127.0.0.1", master.server.port)
273+
274+
master_env.update_user_class({"user_class_name": "User1", "host": "http://localhost", "tasks": ["my_task_2"]})
275+
276+
self.assertEqual(
277+
master_env.available_user_classes["User1"].json(),
278+
{"host": "http://localhost", "tasks": ["my_task_2"], "fixed_count": 0, "weight": 1},
279+
)
280+
self.assertEqual(
281+
worker_env.available_user_classes["User1"].json(),
282+
{"host": "http://localhost", "tasks": ["my_task_2"], "fixed_count": 0, "weight": 1},
283+
)

Diff for: locust/test/test_web.py

+29
Original file line numberDiff line numberDiff line change
@@ -1351,3 +1351,32 @@ def test_html_stats_report(self):
13511351
self.assertTrue(d("#root"))
13521352
self.assertIn('"locustfile": "locust.py"', str(d))
13531353
self.assertIn('"host": "http://localhost"', str(d))
1354+
1355+
def test_update_user(self):
1356+
class MyUser1(User):
1357+
@task
1358+
def my_task(self):
1359+
pass
1360+
1361+
@task
1362+
def my_task_2(self):
1363+
pass
1364+
1365+
class MyUser2(User):
1366+
@task
1367+
def my_task(self):
1368+
pass
1369+
1370+
self.environment.user_classes = [MyUser1, MyUser2]
1371+
self.environment.available_user_classes = {"User1": MyUser1, "User2": MyUser2}
1372+
self.environment.available_user_tasks = {"User1": MyUser1.tasks, "User2": MyUser2.tasks}
1373+
1374+
requests.post(
1375+
"http://127.0.0.1:%i/user" % self.web_port,
1376+
json={"user_class_name": "User1", "host": "http://localhost", "tasks": ["my_task_2"]},
1377+
)
1378+
1379+
self.assertEqual(
1380+
self.environment.available_user_classes["User1"].json(),
1381+
{"host": "http://localhost", "tasks": ["my_task_2"], "fixed_count": 0, "weight": 1},
1382+
)

0 commit comments

Comments
 (0)