import os import random import string from uuid import uuid4 import numpy as np import pandas as pd from locust import HttpUser, between, constant, events, tag, task def get_project_id(client): with client.get('/api/projects', catch_response=True) as r: if r.status_code != 200: print(r.status_code) r.failure(r.status_code) else: project_list = r.json() print(project_list) ids = [p['id'] for p in project_list] if not ids: return return random.choice(ids) def signup(client): username = str(uuid4())[:8] response = client.get('/') csrftoken = response.cookies['csrftoken'] r = client.post( '/user/signup', {'email': f'{username}@heartex.com', 'password': 'password'}, headers={'X-CSRFToken': csrftoken}, catch_response=True, ) print(f'User {username} signup response: {r.status_code}') return username class Admin(HttpUser): weight = 1 wait_time = constant(10) def on_start(self): username = signup(self.client) with self.client.post( '/api/projects', json={ 'title': f"{username}'s project", 'label_config': '', }, catch_response=True, ) as r: if r.status_code != 201: r.failure(r.status_code) rdata = r.json() print('Get response: ', rdata) self.project_id = rdata['id'] print(f'Project {self.project_id} has been created by user {self.client}') self.import_data() @task def view_data_manager(self): self.client.get(f'/projects/{self.project_id}/data', name='projects//data') # @tag('import') # @task def import_data(self): self.client.post( '/api/projects/%i/import' % self.project_id, name='/api/projects//import', files={'csv': open('data.csv', 'rb')}, # headers={'content-type': 'multipart/form-data'}) ) class Annotator(HttpUser): weight = int(os.environ.get('LOCUST_USERS')) - 1 wait_time = between(1, 3) def on_start(self): signup(self.client) @tag('select project') @task(1) def select_project(self): self.project_id = get_project_id(self.client) @tag('labeling') @task(10) def do_labeling(self): if not hasattr(self, 'project_id') or not self.project_id: print('No projects yet...') return with self.client.get( f'/api/projects/{self.project_id}/next', name='/api/projects//next', catch_response=True ) as r: task = r.json() self.client.post( f'/api/tasks/{task["id"]}/annotations', name='/api/tasks//annotations', json={ 'result': [ { 'from_name': 'label', 'to_name': 'text', 'type': 'choices', 'value': {'choices': [random.choice(['1', '2'])]}, } ] }, ) def randomString(stringLength): """Generate a random string of fixed length""" letters = string.ascii_lowercase return ''.join(random.choice(letters) for i in range(stringLength)) @events.test_start.add_listener def on_test_start(environment, **kwargs): rows = int(os.environ.get('IMPORTED_TASKS', 50000)) print(f'Generating file with {rows} rows...') numbers = np.random.randint(low=0, high=100, size=(rows, 10)).tolist() columns = ['text'] + [f'col_{i}' for i in range(9)] pd.DataFrame(numbers, columns=columns).to_csv('data.csv')