Skip to content
This repository has been archived by the owner on Dec 5, 2023. It is now read-only.

Commit

Permalink
Merge pull request #6 from microservices-demo/update-load-test
Browse files Browse the repository at this point in the history
Update load test
  • Loading branch information
pidster committed Jan 5, 2017
2 parents c7e918e + 6246967 commit da3b12c
Show file tree
Hide file tree
Showing 4 changed files with 133 additions and 52 deletions.
25 changes: 25 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
language: generic
sudo: required
services:
- docker

install: true

env:
- GROUP=weaveworksdemos COMMIT=$TRAVIS_COMMIT TAG=$TRAVIS_TAG REPO=load-test;

script:
- set -e
- curl -o docker-compose.yml -sSL https://raw.githubusercontent.com/microservices-demo/microservices-demo/master/deploy/docker-compose/docker-compose.yml
- docker-compose -f docker-compose.yml up -d
- docker build -t weaveworksdemos/load-test .
- docker run --rm -t weaveworksdemos/load-test -d 120 -h edge-router -c 3 -r 500

after_success:
- set -e;
- if [ -z "$DOCKER_PASS" ] ; then
echo "This is a build triggered by an external PR. Skipping docker push.";
exit 0;
fi;
- docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS;
- ./push.sh
90 changes: 45 additions & 45 deletions locustfile.py
Original file line number Diff line number Diff line change
@@ -1,37 +1,44 @@
from faker import Faker
from locust import HttpLocust, TaskSet, task
from random import randint, choice
from time import sleep

import base64
import json


def register(l):
_user = getattr(l, 'user', getattr(l.parent, 'user', Faker().simple_profile()))
_password = getattr(l, 'password', getattr(l.parent, 'password', Faker().password()))
details = {
"username": l.user.get('username'),
"first_name": l.user.get('name').split(' ')[0],
"last_name": l.user.get('name').split(' ')[1],
"email": l.user.get('mail'),
"password": l.password
"username": _user.get('username'),
"first_name": _user.get('name').split(' ')[0],
"last_name": _user.get('name').split(' ')[1],
"email": _user.get('mail'),
"password": _password
}
return l.client.post("/register", json=details)
response = l.client.post("/register", json=details)
return response

def login(l):
_user = getattr(l, 'user', getattr(l.parent, 'user', Faker().simple_profile()))
_password = getattr(l, 'password', getattr(l.parent, 'password', Faker().password()))
users = l.client.get("/customers").json().get("_embedded", {}).get("customer", [])
user = [user for user in users if user.get('username') == l.user.get('username')]
user = [user for user in users if user.get('username') == _user.get('username')]
if not user:
register(l)

base64string = base64.encodestring('%s:%s' % (l.user.get('username'), l.password)).replace('\n', '')
return l.client.get("/login", headers={"Authorization":"Basic %s" % base64string})
base64string = base64.encodestring('%s:%s' % (_user.get('username'), _password)).replace('\n', '')
response = l.client.get("/login", headers={"Authorization":"Basic %s" % base64string})
return response

def create_card(l):
data = {
"longNum": Faker().credit_card_number(),
"expires": Faker().credit_card_expire(start="now", end="+10y", date_format="%m/%y"),
"ccv": Faker().credit_card_security_code()
}
return l.client.post("/cards", json=data)
response = l.client.post("/cards", json=data)
return response

def create_address(l):
data = {
Expand All @@ -41,7 +48,8 @@ def create_address(l):
"postcode": Faker().postcode(),
"country": Faker().country()
}
return l.client.post("/addresses", json=data)
response = l.client.post("/addresses", json=data)
return response


'''
Expand Down Expand Up @@ -72,8 +80,7 @@ class ItemPage(TaskSet):

@task(10)
def item(self):
response = self.client.get("/catalogue")
catalogue = response.json()
catalogue = self.client.get("/catalogue").json()
self.client.get("/detail.html?id={}".format(choice(catalogue).get('id')))

@task(5)
Expand Down Expand Up @@ -107,16 +114,18 @@ def delete_item(self):

@task(5)
def checkout(self):
if self.client.cookies.get("logged_in"):
create_card(self)
create_address(self)
with self.client.post("/orders", catch_response=True) as response:
if response.status_code == 406:
# Check if the cost was too high
items = self.client.get("/cart").json()
total = sum([item.get("unitPrice", 0) * item.get("quantity", 0) for item in items])
if total > 100:
response.success()
if not self.client.cookies.get("logged_in"):
login(self)
create_card(self)
create_address(self)

with self.client.post("/orders", catch_response=True) as response:
if response.status_code == 406:
# Check if the cost was too high
items = self.client.get("/cart").json()
total = sum([item.get("unitPrice", 0) * item.get("quantity", 0) for item in items])
if total > 100:
response.success()

@task(5)
def stop(self):
Expand Down Expand Up @@ -170,17 +179,16 @@ def delete_cart(self):

@task
def delete_cart_item(self):
response = self.post_cart()
body_json = json.loads(response.request.body)
self.client.delete("/cart/{}".format(body_json.get('id')))
item_id = self.post_cart()
self.client.delete("/cart/{}".format(item_id))

@task
def post_cart(self):
catalogue = self.client.get("/catalogue").json()
category_item = choice(catalogue)
item_id = category_item["id"]
return self.client.post("/cart", json={"id": item_id, "quantity": randint(1, 100)})

item_id = category_item.get("id")
self.client.post("/cart", json={"id": item_id, "quantity": randint(1, 100)})
return item_id

'''
Catalogue related API tasks
Expand Down Expand Up @@ -214,18 +222,16 @@ def get_tags(self):
POST /orders
'''
class OrdersTasks(TaskSet):
user = Faker().simple_profile()
password = Faker().password()

@task
def get_orders(self):
login(self)
self.post_orders()
self.client.get('/orders')

@task
def post_orders(self):
login(self)
if not self.client.cookies.get("logged_in"):
login(self)
create_card(self)
create_address(self)

Expand Down Expand Up @@ -257,8 +263,6 @@ def post_orders(self):
POST /login
'''
class UsersTasks(TaskSet):
user = Faker().simple_profile()
password = Faker().password()

@task
def get_customer_id(self):
Expand Down Expand Up @@ -309,20 +313,17 @@ def post_cards(self):

@task
def delete_customer(self):
response = self.post_register()
customer = response.json()
customer = self.post_register().json()
self.client.delete('/customers/{}'.format(customer.get('id')))

@task
def delete_addresses(self):
response = self.post_register()
customer = response.json()
customer = self.post_register().json()
self.client.delete('/addresses/{}'.format(customer.get('id')))

@task
def delete_cards(self):
response = self.post_register()
customer = response.json()
customer = self.post_register().json()
self.client.delete('/cards/{}'.format(customer.get('id')))

@task
Expand All @@ -333,8 +334,6 @@ def post_register(self):

@task
def post_login(self):
self.user = Faker().simple_profile()
self.password = Faker().password()
login(self)


Expand All @@ -343,7 +342,8 @@ def post_login(self):
'''
class APITasks(TaskSet):
tasks = [CartTasks, CatalogueTasks, OrdersTasks, UsersTasks]

user = Faker().simple_profile()
password = Faker().password()

'''
Describe tasks that result in an error
Expand Down
55 changes: 55 additions & 0 deletions push.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#!/usr/bin/env bash

set -ev

if [[ -z "$GROUP" ]] ; then
echo "Cannot find GROUP env var"
exit 1
fi

if [[ -z "$COMMIT" ]] ; then
echo "Cannot find COMMIT env var"
exit 1
fi

push() {
DOCKER_PUSH=1;
while [ $DOCKER_PUSH -gt 0 ] ; do
echo "Pushing $1";
docker push $1;
DOCKER_PUSH=$(echo $?);
if [[ "$DOCKER_PUSH" -gt 0 ]] ; then
echo "Docker push failed with exit code $DOCKER_PUSH";
fi;
done;
}

tag_and_push_all() {
if [[ -z "$1" ]] ; then
echo "Please pass the tag"
exit 1
else
TAG=$1
fi
for m in ./docker/*/; do
REPO=${GROUP}/$(basename $m)
if [[ "$COMMIT" != "$TAG" ]]; then
docker tag ${REPO}:${COMMIT} ${REPO}:${TAG}
fi
push "$REPO:$TAG";
done;
}

# Always push commit
tag_and_push_all $COMMIT

# Push snapshot when in master
if [ "$TRAVIS_BRANCH" == "master" ]; then
tag_and_push_all snapshot
fi;

# Push tag and latest when tagged
if [ -n "$TRAVIS_TAG" ]; then
tag_and_push_all ${TRAVIS_TAG}
tag_and_push_all latest
fi;
15 changes: 8 additions & 7 deletions runLocust.sh
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,6 @@ do_check() {
exit 0
fi

# check if host is running
STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${TARGET_HOST})
if [ $STATUS -ne 200 ]; then
echo "${TARGET_HOST} is not accessible"
exit 0
fi

# check locust file is present
if [ -n "${LOCUST_FILE:+1}" ]; then
echo "Locust file: $LOCUST_FILE"
Expand All @@ -44,6 +37,14 @@ do_check() {

do_exec() {
sleep $INITIAL_DELAY

# check if host is running
STATUS=$(curl -s -o /dev/null -w "%{http_code}" ${TARGET_HOST})
if [ $STATUS -ne 200 ]; then
echo "${TARGET_HOST} is not accessible"
exit 0
fi

echo "Will run $LOCUST_FILE against $TARGET_HOST. Spawning $CLIENTS clients and $REQUESTS total requests."
locust --host=http://$TARGET_HOST -f $LOCUST_FILE --clients=$CLIENTS --hatch-rate=5 --num-request=$REQUESTS --no-web --only-summary
echo "done"
Expand Down

0 comments on commit da3b12c

Please sign in to comment.