cloud-run-cloud-spanner/locustfile.py (47 lines of code) (raw):
from locust import HttpUser, task, events
from locust.exception import RescheduleTask
import string
import json
import random
import requests
import os
import google.oauth2.id_token
import google.auth.transport.requests
request = google.auth.transport.requests.Request()
# Generate user load with 3:1 reads to write
class UserLoad(HttpUser):
def on_start(self):
self.getValidUsernames()
def getIdToken(self):
global target_audience, id_token
target_audience = self.host
id_token = google.oauth2.id_token.fetch_id_token(request, target_audience)
def getValidUsernames(self):
self.getIdToken()
headers = {"Authorization": f"Bearer {id_token}",
"Content-Type": "application/json"}
r = requests.get(f"{target_audience}/users", headers=headers)
global users
users = json.loads(r.text)
def generateUsername(self):
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=15))
def generateEmail(self):
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=10) + ['@'] +
random.choices(['gmail', 'yahoo', 'microsoft']) + ['.com'])
@task
def createUser(self):
# id_token = google.oauth2.id_token.fetch_id_token(request, target_audience)
headers = {"Authorization": f"Bearer {id_token}",
"Content-Type": "application/json"}
data = {"username": self.generateUsername(), "email": self.generateEmail()}
with self.client.post("/user", data=json.dumps(data), headers=headers, catch_response=True) as response:
if response.status_code == 401:
self.getIdToken()
raise RescheduleTask()
@task(3)
def readUser(self):
# id_token = google.oauth2.id_token.fetch_id_token(request, target_audience)
username = users[random.randint(0, len(users)-1)]['username']
headers = {"Authorization": f"Bearer {id_token}",
"Content-Type": "application/json"}
with self.client.get(f"/user/{username}", headers=headers, catch_response=True) as response:
if response.status_code == 401:
self.getIdToken()
raise RescheduleTask()