forked from stewartshea/demo-sandbox-acme-fitness
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathloadgenerator.yaml
83 lines (83 loc) · 7.86 KB
/
loadgenerator.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
---
apiVersion: v1
kind: Service
metadata:
name: loadgenerator
labels:
app: acmefit
service: loadgenerator
spec:
ports:
- name: http-loadgenerator
protocol: TCP
port: 8089
selector:
app: acmefit
service: loadgenerator
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: loadgenerator
labels:
app: acmefit
service: loadgenerator
spec:
selector:
matchLabels:
app: acmefit
service: loadgenerator
strategy:
type: Recreate
replicas: 1
template:
metadata:
labels:
app: acmefit
service: loadgenerator
spec:
containers:
- image: locustio/locust:latest
imagePullPolicy: "Always"
name: loadgenerator
env: []
ports:
- containerPort: 8089
name: loadgenerator
resources:
requests:
memory: "64Mi"
cpu: "10m"
limits:
memory: "512Mi"
cpu: "500m"
# command: ["/bin/sh"]
# args: ["-c", "sleep 5000"]
command:
- "locust"
args:
- "-f"
- "/data/locustfile.py"
- "--headless"
- "-u"
- "100"
- "-r"
- "5"
# - "--run-time"
# - "1h"
- "--host=http://acme-fitness.sandbox.runwhen.com"
volumeMounts:
- mountPath: "/data"
name: "acmefit-loadgenerator-data"
volumes:
- name: acmefit-loadgenerator-data
configMap:
name: locustfile
defaultMode: 0777
---
apiVersion: v1
kind: ConfigMap
metadata:
name: locustfile
data:
locustfile.py: "# This program will generate traffic for ACME Fitness Shop App. It simulates both Authenticated and Guest user scenarios. You can run this program either from Command line or from\n# the web based UI. Refer to the \"locust\" documentation for further information. \nfrom time import sleep\nfrom locust import HttpUser, task, SequentialTaskSet, between\nimport random\nimport logging\n\n# List of users (pre-loaded into ACME Fitness shop)\nusers = [\"eric\", \"phoebe\", \"dwight\", \"han\", \"elaine\", \"walter\"]\n\n# GuestUserBrowsing simulates traffic for a Guest User (Not logged in)\nclass UserBrowsing(SequentialTaskSet):\n def on_start(self):\n self.getProducts()\n def listCatalogItems(self):\n products = []\n response = self.client.get(\"/products\")\n if response.ok:\n items = response.json()[\"data\"]\n for item in items:\n products.append(item[\"id\"])\n return products\n def getProductDetails(self, id):\n \"\"\"Get details of a specific product\"\"\"\n details = {}\n response = self.client.get(\"/products/\"+id)\n if response.ok:\n details = response.json()[\"data\"]\n logging.debug(\"getProductDetails: \" + str(details))\n return details\n def getProductImages(self,id):\n \"\"\"Gets all three image URLs for a product\"\"\"\n details = self.getProductDetails(id)\n if details:\n for x in range(1, 4):\n self.client.get(details[\"imageUrl\"+str(x)])\n def getProductName(self, id):\n name = \"\"\n details = self.getProductDetails(id)\n if details:\n name = details[\"name\"]\n logging.debug(\"NAME: \"+name+ \" for id: \"+id)\n return name\n\n @task\n def getProducts(self):\n logging.debug(\"User - Get Products\")\n self.client.get(\"/products\")\n @task(2)\n def getProduct(self):\n \"\"\"Get details of a specific product\"\"\"\n logging.debug(\"User - Get a product\")\n products = self.listCatalogItems()\n id = random.choice(products)\n response = self.client.get(\"/products/\"+ id)\n if response.ok:\n product = response.json()\n logging.debug(\"Product info - \" + str(product))\n @task\n def getImages(self):\n \"\"\"Get images of a random product\"\"\"\n logging.debug(\"User - Get images of random product\")\n products = self.listCatalogItems()\n id = random.choice(products)\n self.getProductImages(id)\n @task(2)\n def index(self):\n self.client.get(\"/\")\n\n# AuthUserBrowsing simulates traffic for Authenticated Users (Logged in)\nclass AuthUserBrowsing(UserBrowsing):\n \"\"\"\n AuthUserBrowsing extends the base UserBrowsing class as an authenticated user \n interacting with the cart and making orders\n \"\"\"\n Order_Info = { \"userid\":\"8888\",\n \"firstname\":\"Eric\",\n \"lastname\": \"Cartman\",\n \"address\":{\n \"street\":\"20 Riding Lane Av\",\n \"city\":\"San Francisco\",\n \"zip\":\"10201\",\n \"state\": \"CA\",\n \"country\":\"USA\"},\n \"email\":\"[email protected]\",\n \"delivery\":\"UPS/FEDEX\",\n \"card\":{\n \"type\":\"amex/visa/mastercard/bahubali\",\n \"number\":\"349834797981\", \n \"expMonth\":\"12\",\n \"expYear\": \"2022\",\n \"ccv\":\"123\"\n },\n \"cart\":[\n {\"id\":\"1234\", \"description\":\"redpants\", \"quantity\":\"1\", \"price\":\"4\"},\n {\"id\":\"5678\", \"description\":\"bluepants\", \"quantity\":\"1\", \"price\":\"4\"}\n ],\n \"total\":\"100\"}\n\n def on_start(self):\n self.login()\n\n def login(self):\n \"\"\"Login a random user\"\"\"\n user = random.choice(users)\n headers = {\"Content-Type\": \"application/json\"} # Explicitly setting the Content-Type header\n logging.warning(\"Auth User - Login user \" + user)\n response = self.client.post(\"/login/\", json={\"username\": user, \"password\": \"vmware1!\"}, headers=headers)\n if response.ok:\n body = response.json()\n # Safely access the 'token' key, considering it might not be present\n token = body.get(\"access_token\")\n if token:\n self.user.token = token # Assuming you meant to store the token here\n logging.warning(\"Successfully logged in\")\n else:\n logging.warning(\"Token not found in login response\")\n # Handle cases where token is missing - perhaps by setting a flag or retrying login\n else:\n logging.warning(f\"Login failed for user {user}, status code {response.status_code}\")\n\n @task\n def checkout(self):\n if not self.user.userid:\n logging.warning(\"Not logged in, skipping 'Add to Checkout'\")\n self.login()\n headers = {\"Content-Type\": \"application/json\"} # Explicitly setting the Content-Type header\n userCart = self.client.get(\"/cart/items/\" + self.user.userid).json()\n order = self.client.post(\"/order/add/\"+ self.user.userid, json=self.Order_Info, headers=headers)\n logging.warning(f\"Posting order\")\n return\n headers = {\"Content-Type\": \"application/json\"} # Explicitly setting the Content-Type header\n userCart = self.client.get(\"/cart/items/\" + self.user.userid).json()\n order = self.client.post(\"/order/add/\"+ self.user.userid, json=self.Order_Info, headers=headers)\n logging.warning(f\"Posting order\")\nclass UserBehavior(SequentialTaskSet):\n tasks = [AuthUserBrowsing]\nclass WebSiteUser(HttpUser):\n sleep(3) # Sleep on start of a user incase the target app isn't completely accessible yet.\n tasks = [UserBehavior]\n userid = \"\"\n wait_time = between(0.25, 0.5)\n"