diff --git a/CHANGELOG b/CHANGELOG index a4499bb..796adf9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -6,7 +6,7 @@ This document describes changes between each past release. 0.20.0 (unreleased) ------------------- -- No changes yet. +- Remove loads v1 loadtests. 0.19.2 (2016-01-07) diff --git a/Makefile b/Makefile index b7bc3b1..45456d9 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ NODE_LOCAL_BIN=./node_modules/.bin test: lint cover-mocha spaceleft .PHONY: travis -travis: lint separate-tests loadtests-check +travis: lint separate-tests separate-tests: @env NODE_ENV=test ./node_modules/mocha/bin/mocha test/* --reporter spec -ig websocket @@ -52,12 +52,6 @@ spaceleft: runserver: @env NODE_ENV=${NODE_ENV} node loop/index.js -loadtests-check: - @env NODE_ENV=loadtest node loop/index.js & PID=$$!; \ - sleep 1 && cd loadtests && \ - make test SERVER_URL=http://127.0.0.1:5000; \ - EXIT_CODE=$$?; kill $$PID; exit $$EXIT_CODE - .PHONY: circus circus: circusd circus/loop-server.ini diff --git a/README.md b/README.md index af12f3c..5943f5a 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,12 @@ value is high enough or you will get EMFILE errors: ulimit -S -n 2048 ``` +## How do I run the loadtests? + +The loadtests are in the +[ailoads-loop](https://github.com/mozilla-services/ailoads-loop) +repository. + ## Where do I report bugs? You should report bugs/issues or feature requests via [the loop-server bugzilla diff --git a/loadtests/Makefile b/loadtests/Makefile deleted file mode 100644 index 619a102..0000000 --- a/loadtests/Makefile +++ /dev/null @@ -1,64 +0,0 @@ -SERVER_URL = https://loop.stage.mozaws.net/ -SIMPLE_PUSH_URL = https://loop-webapp.stage.mozaws.net/ - -# Hackety-hack around OSX system python bustage. -# The need for this should go away with a future osx/xcode update. -ARCHFLAGS = -Wno-error=unused-command-line-argument-hard-error-in-future -# On OSX 10.11, clang now uses c11 as default. Specify c99 so gevent can build. -CFLAGS = '-std=c99' -INSTALL = ARCHFLAGS=$(ARCHFLAGS) CFLAGS=$(CFLAGS) ./venv/bin/pip install -SHELL = /bin/bash - -.PHONY: install clean bench megabench - -# Build virtualenv, to ensure we have all the dependencies. -./venv/.env.install: - virtualenv ./venv - $(INSTALL) pexpect >> loadtest.log && \ - $(INSTALL) configparser==3.5.0b2 >> loadtest.log && \ - $(INSTALL) gevent >> loadtest.log && \ - $(INSTALL) git+git://github.com/mozilla-services/loads.git >> loadtest.log && \ - $(INSTALL) git+git://github.com/mozilla-services/requests-hawk.git >> loadtest.log && \ - $(INSTALL) PyFxA >> loadtest.log && \ - wget https://pypi.python.org/packages/source/b/backports.functools_lru_cache/backports.functools_lru_cache-1.0.3.tar.gz >> loadtest.log &&\ - tar -xvzf backports.functools_lru_cache-1.0.3.tar.gz >> loadtest.log &&\ - pushd backports.functools_lru_cache-1.0.3 &&\ - ../venv/bin/python setup.py install >> loadtest.log &&\ - popd &&\ - rm backports.functools_lru_cache-1.0.3.tar.gz >> loadtest.log &&\ - rm -fr backports.functools_lru_cache-1.0.3 >> loadtest.log &&\ - rm loadtest.log && touch $@ || cat loadtest.log - -install: ./venv/.env.install - -# Clean all the things installed by `make build`. -clean: - rm -rf ./venv loadtest/*.pyc - -# Run a single test from the venv machine, for sanity-checking. -test: install - SIMPLE_PUSH_URL=$(SIMPLE_PUSH_URL) ./venv/bin/loads-runner --config=./config/test.ini --server-url=$(SERVER_URL) loadtest.TestLoop.test_smoke - SIMPLE_PUSH_URL=$(SIMPLE_PUSH_URL) ./venv/bin/loads-runner --config=./config/test.ini --server-url=$(SERVER_URL) loadtest.TestLoop.test_http_calls - SIMPLE_PUSH_URL=$(SIMPLE_PUSH_URL) ./venv/bin/loads-runner --config=./config/test.ini --server-url=$(SERVER_URL) loadtest.TestLoop.test_websockets - -# Run a bench of 20 concurrent users. -bench: - SIMPLE_PUSH_URL=$(SIMPLE_PUSH_URL) ./venv/bin/loads-runner --config=./config/bench.ini --server-url=$(SERVER_URL) loadtest.TestLoop.test_all - -# Run a much bigger bench, by submitting to broker in AWS. -megabench: - ./venv/bin/loads-runner --config=./config/megabench.ini --user-id=$(USER) --server-url=$(SERVER_URL) loadtest.TestLoop.test_http_calls& - ./venv/bin/loads-runner --config=./config/megabench.ini --user-id=$(USER) --server-url=$(SERVER_URL) loadtest.TestLoop._test_websockets_basic_scenario - -smoke: - ./venv/bin/loads-runner --config=./config/smoke.ini --user-id=$(USER) --server-url=$(SERVER_URL) loadtest.TestLoop.test_all - -# Purge any currently-running loadtest runs. -purge: - ./venv/bin/loads-runner --config=./config/megabench.ini --purge-broker - -attach: - ./venv/bin/loads-runner --config=./config/megabench.ini --attach - -travis: - loads-runner --config=./config/test.ini --server-url=$(SERVER_URL) loadtest.TestLoop.test_all diff --git a/loadtests/config/bench.ini b/loadtests/config/bench.ini deleted file mode 100644 index 1472421..0000000 --- a/loadtests/config/bench.ini +++ /dev/null @@ -1,5 +0,0 @@ -[loads] -users = 20 -duration = 300 -no-dns-resolve = true -include_file = loadtest/*.py diff --git a/loadtests/config/megabench.ini b/loadtests/config/megabench.ini deleted file mode 100644 index 1413188..0000000 --- a/loadtests/config/megabench.ini +++ /dev/null @@ -1,13 +0,0 @@ -[loads] -users = 20 -duration = 1800 -include_file = loadtest -agents = 5 -detach = true -observer = irc -ssh = ubuntu@loads.services.mozilla.com -python-dep = PyFxA - requests-hawk - six -no-dns-resolve = true -broker = tcp://172.31.44.86:7780 diff --git a/loadtests/config/smoke.ini b/loadtests/config/smoke.ini deleted file mode 100644 index 4b04206..0000000 --- a/loadtests/config/smoke.ini +++ /dev/null @@ -1,15 +0,0 @@ -[loads] -users = 10 -duration = 60 -include_file = loadtest -agents = 5 -detach = true -observer = irc -ssh = ubuntu@loads.services.mozilla.com -python-dep = PyFxA - requests-hawk - six -no-dns-resolve = true -broker = tcp://172.31.44.86:7780 -fxa-url = https://api.accounts.firefox.com -fxa-client-id = 5882386c6d801776 diff --git a/loadtests/config/test.ini b/loadtests/config/test.ini deleted file mode 100644 index 2beeeaf..0000000 --- a/loadtests/config/test.ini +++ /dev/null @@ -1,5 +0,0 @@ -[loads] -hits = 1 -users = 1 -no-dns-resolve = true -include_file = loadtest/*.py diff --git a/loadtests/loadtest/__init__.py b/loadtests/loadtest/__init__.py deleted file mode 100644 index 5f8a1d3..0000000 --- a/loadtests/loadtest/__init__.py +++ /dev/null @@ -1,63 +0,0 @@ -from gevent import monkey -monkey.patch_all() - -from .calls import TestCallsMixin -from .rooms import TestRoomsMixin -from .websocket import TestWebsocketMixin - -from loads.case import TestCase -import os -DEFAULT_SIMPLE_PUSH_URL = "https://call.stage.mozaws.net/" - - -class TestLoop(TestCallsMixin, TestRoomsMixin, TestWebsocketMixin, TestCase): - def __init__(self, *args, **kwargs): - super(TestLoop, self).__init__(*args, **kwargs) - r = self.session.get(self.server_url) - self.base_url = r.request.url.rstrip('/') - self.simple_push_url = os.getenv("SIMPLE_PUSH_URL", - DEFAULT_SIMPLE_PUSH_URL) - # Only create the restmail account once. - self.auth = self.get_auth() - - def setUp(self): - self.wss = [] - - def tearDown(self): - for ws in self.wss: - ws.close() - # XXX this is missing in ws4py - ws._th.join() - if ws.sock: - ws.sock.close() - - def test_all(self): - self.test_smoke() - self.test_http_calls() - self._test_websockets_basic_scenario() - - def test_http_calls(self): - self.setupCall() - self.setupRoom() - self.test_401_with_stale_timestamp() - - def test_websockets(self): - self._test_websockets_basic_scenario() - self._test_websockets_supervisory_timeout() - self._test_websockets_connection_timeout() - self._test_websockets_ringing_timeout() - - def test_smoke(self): - resp = self.session.get( - self.base_url + '/__heartbeat__', - headers={'Content-Type': 'application/json'} - ) - self.assertEquals(200, resp.status_code, - "Heartbeat returned a %s" % resp.status_code) - - def _get_json(self, resp): - try: - return resp.json() - except Exception: - print resp.text - raise diff --git a/loadtests/loadtest/calls.py b/loadtests/loadtest/calls.py deleted file mode 100644 index e0887a3..0000000 --- a/loadtests/loadtest/calls.py +++ /dev/null @@ -1,127 +0,0 @@ -import json -import os -import uuid -from six.moves.urllib.parse import urlparse -from requests_hawk import HawkAuth - -from fxa.core import Client -from fxa.tests.utils import TestEmailAccount -from fxa.plugins.requests import FxABrowserIDAuth - -# XXX Using the same fxa as the dev server, as the staging setup isn't working -# for me. -DEFAULT_FXA_URL = "https://api.accounts.firefox.com/v1" - - -class TestCallsMixin(object): - def setupCall(self): - self.register(auth=self.auth) - call_data = self.initiate_call() - calls = self.list_pending_calls() - return call_data, calls - - def get_auth(self): - self.account_server_url = os.getenv("FXA_URL", DEFAULT_FXA_URL) - random_user = uuid.uuid4().hex - self.user_email = "loop-%s@restmail.net" % random_user - acct = TestEmailAccount(self.user_email) - client = Client(self.account_server_url) - fxa_session = client.create_account(self.user_email, - password=random_user) - - def is_verify_email(m): - return "x-verify-code" in m["headers"] - - message = acct.wait_for_email(is_verify_email) - fxa_session.verify_email_code(message["headers"]["x-verify-code"]) - - url = urlparse(self.base_url) - audience = "%s://%s" % (url.scheme, url.hostname) - - return FxABrowserIDAuth( - self.user_email, - password=random_user, - audience=audience, - server_url=self.account_server_url) - - def register(self, data=None, auth=None): - if data is None: - data = {'simple_push_url': self.simple_push_url} - - resp = self.session.post( - self.base_url + '/registration', - data=json.dumps(data), - auth=auth, - headers={'Content-Type': 'application/json'}) - self.assertEquals(200, resp.status_code, - "Registration failed: %s" % resp.content) - - try: - self.hawk_auth = HawkAuth( - hawk_session=resp.headers['hawk-session-token'], - server_url=self.server_url) - except KeyError: - print resp - raise - else: - self.incr_counter("register") - return self.hawk_auth - - def initiate_call(self): - # This happens when not authenticated. - resp = self.session.post( - self.base_url + '/calls', - data=json.dumps({'calleeId': self.user_email, - 'callType': 'audio-video'}), - headers={'Content-Type': 'application/json'}, - auth=self.hawk_auth - ) - self.assertEquals(resp.status_code, 200, - "Call Initialization failed: %s" % resp.content) - self.incr_counter("initiate-call") - - return self._get_json(resp) - - def list_pending_calls(self): - resp = self.session.get( - self.base_url + '/calls?version=200', - auth=self.hawk_auth) - self.assertEquals(resp.status_code, 200, - "List calls failed: %s" % resp.content) - self.incr_counter("list-pending-calls") - data = self._get_json(resp) - return data['calls'] - - def revoke_token(self, token): - # You don't need to be authenticated to revoke a token. - resp = self.session.delete(self.base_url + '/call-url/%s' % token) - self.assertEquals(resp.status_code, 204, - "Revoke call-url token failed: %s" % resp.content) - self.incr_counter("revoke_token") - - def test_401_with_stale_timestamp(self): - data = {'simple_push_url': self.simple_push_url} - resp = self.session.post( - self.base_url + '/registration', - data=json.dumps(data), - headers={'Content-Type': 'application/json'}) - self.assertEquals(200, resp.status_code, - "Registration failed: %s" % resp.content) - - try: - hawk_auth = HawkAuth( - hawk_session=resp.headers['hawk-session-token'], - server_url=self.server_url, _timestamp=1431698847) - except KeyError: - print resp - raise - else: - resp = self.session.post( - self.base_url + '/registration', - data=json.dumps({'simple_push_url': self.simple_push_url}), - headers={'Content-Type': 'application/json'}, - auth=hawk_auth - ) - self.assertEquals(resp.status_code, 401, - "Staled timestamp verification failed.") - self.incr_counter("stale-timestamp-verification") diff --git a/loadtests/loadtest/rooms.py b/loadtests/loadtest/rooms.py deleted file mode 100644 index 5c380c1..0000000 --- a/loadtests/loadtest/rooms.py +++ /dev/null @@ -1,140 +0,0 @@ -import json -import os -import random -from base64 import b64encode -from six.moves import range - -MAX_NUMBER_OF_PEOPLE_JOINING = 5 # Pick a randint between 1 and this value. -PERCENTAGE_OF_REFRESH = 50 -PERCENTAGE_OF_MANUAL_LEAVE = 60 -PERCENTAGE_OF_MANUAL_ROOM_DELETE = 80 -PERCENTAGE_OF_ROOM_CONTEXT = 75 - - -class TestRoomsMixin(object): - def setupRoom(self): - self.register({ - "simplePushURLs": { - "calls": self.simple_push_url, - "rooms": self.simple_push_url - } - }) - room_token = self.create_room() - num_participants = random.randint(1, MAX_NUMBER_OF_PEOPLE_JOINING) - self.incr_counter("num-participants-%d" % num_participants) - - self.join_room(room_token, self.hawk_room_owner) - - for x in range(num_participants - 1): - participant_hawk_auth = self.register() - self.join_room(room_token, participant_hawk_auth) - - if random.randint(0, 100) < PERCENTAGE_OF_REFRESH: - self.refresh_room_presence(room_token, participant_hawk_auth) - - if random.randint(0, 100) < PERCENTAGE_OF_MANUAL_LEAVE: - self.leave_room(room_token, participant_hawk_auth) - - self.leave_room(room_token, self.hawk_room_owner) - - if random.randint(0, 100) < PERCENTAGE_OF_MANUAL_ROOM_DELETE: - self.delete_room(room_token) - - def create_room(self): - self.hawk_room_owner = self.hawk_auth - data = { - "roomName": "UX Discussion", - "expiresIn": 1, - "roomOwner": "Alexis", - "maxSize": MAX_NUMBER_OF_PEOPLE_JOINING - } - - if random.randint(0, 100) < PERCENTAGE_OF_ROOM_CONTEXT: - del data['roomName'] - data['context'] = { - "value": b64encode(os.urandom(1024)).decode('utf-8'), - "alg": "AES-GCM", - "wrappedKey": b64encode(os.urandom(16)).decode('utf-8') - } - self.incr_counter("room-with-context") - - - resp = self.session.post( - self.base_url + '/rooms', - data=json.dumps(data), - headers={'Content-Type': 'application/json'}, - auth=self.hawk_room_owner - ) - self.assertEquals(201, resp.status_code, - "Room Creation failed with code %s: %s" % ( - resp.status_code, resp.content)) - self.incr_counter("create-room") - data = self._get_json(resp) - return data.get('roomToken') - - def delete_room(self, room_token): - resp = self.session.delete( - self.base_url + '/rooms/%s' % room_token, - headers={'Content-Type': 'application/json'}, - auth=self.hawk_room_owner - ) - self.assertEquals(204, resp.status_code, - "Room deletion failed with code %s: %s" % ( - resp.status_code, resp.content)) - self.incr_counter("delete-room") - - def join_room(self, room_token, hawk_auth=None): - if not hawk_auth: - hawk_auth = self.hawk_auth - - resp = self.session.post( - self.base_url + '/rooms/%s' % room_token, - data=json.dumps({ - "action": "join", - "displayName": "Adam", - "clientMaxSize": MAX_NUMBER_OF_PEOPLE_JOINING - }), - headers={'Content-Type': 'application/json'}, - auth=hawk_auth - ) - - self.assertEquals(200, resp.status_code, - "Participant Creation failed with code %s: %s" % ( - resp.status_code, resp.content)) - self.incr_counter("join-room") - - def refresh_room_presence(self, room_token, hawk_auth=None): - if not hawk_auth: - hawk_auth = self.hawk_auth - - resp = self.session.post( - self.base_url + '/rooms/%s' % room_token, - data=json.dumps({ - "action": "refresh" - }), - headers={'Content-Type': 'application/json'}, - auth=hawk_auth - ) - - self.assertEquals(200, resp.status_code, - "Participant refresh failed with code %s: %s" % ( - resp.status_code, resp.content)) - self.incr_counter("refresh-room-presence") - - def leave_room(self, room_token, hawk_auth=None): - if not hawk_auth: - hawk_auth = self.hawk_auth - - resp = self.session.post( - self.base_url + '/rooms/%s' % room_token, - data=json.dumps({ - "action": "leave" - }), - headers={'Content-Type': 'application/json'}, - auth=hawk_auth - ) - - self.assertEquals(204, resp.status_code, - "Room leave failed with code %s: %s" % ( - resp.status_code, resp.content)) - self.incr_counter("leave-room") diff --git a/loadtests/loadtest/websocket.py b/loadtests/loadtest/websocket.py deleted file mode 100644 index 341a19b..0000000 --- a/loadtests/loadtest/websocket.py +++ /dev/null @@ -1,259 +0,0 @@ -import gevent -import json - -from loads.case import TestCase - - -class TestWebsocketMixin(object): - def _send_ws_message(self, ws, **msg): - return ws.send(json.dumps(msg)) - - def create_ws(self, *args, **kw): - ws = TestCase.create_ws(self, *args, **kw) - self.wss.append(ws) - return ws - - def _test_websockets_basic_scenario(self): - call_data, calls = self.setupCall() - progress_url = call_data['progressURL'] - caller_websocket_token = call_data['websocketToken'] - callee_websocket_token = calls[0]['websocketToken'] - call_id = call_data['callId'] - caller_alerts = [] - callee_alerts = [] - - self.connected = False - - def _handle_callee(message_data): - self.incr_counter("websocket-basic-callee-messages") - message = json.loads(message_data.data) - callee_alerts.append(message) - state = message.get('state') - messageType = message.get('messageType') - - if messageType == "progress" and state == "alerting": - self._send_ws_message( - callee_ws, - messageType="action", - event="accept") - caller_ws.receive() - - elif messageType == "progress" and state == "half-connected": - self._send_ws_message( - callee_ws, - messageType="action", - event="media-up") - callee_ws.receive() - - elif messageType == "progress" and state == "connected": - self.connected = True - - def _handle_caller(message_data): - self.incr_counter("websocket-basic-caller-messages") - message = json.loads(message_data.data) - caller_alerts.append(message) - state = message.get('state') - messageType = message.get('messageType') - - if messageType == "hello" and state == "init": - # This is the first message, Ask the second party to connect. - self._send_ws_message( - callee_ws, - messageType='hello', - auth=callee_websocket_token, - callId=call_id) - callee_ws.receive() - - elif messageType == "progress" and state == "connecting": - self._send_ws_message( - caller_ws, - messageType="action", - event="media-up") - callee_ws.receive() - - elif messageType == "progress" and state == "half-connected": - caller_ws.receive() - - elif messageType == "progress" and state == "connected": - self.connected = True - - # let's connect to the web socket until it gets closed - callee_ws = self.create_ws(progress_url, callback=_handle_callee) - caller_ws = self.create_ws(progress_url, callback=_handle_caller) - - self._send_ws_message( - caller_ws, - messageType='hello', - auth=caller_websocket_token, - callId=call_id) - - while not self.connected: - gevent.sleep(.5) - - def _test_websockets_supervisory_timeout(self): - """ - The client waits until the supervisory timeout is triggered. - Supervisory timeout means no-one connected the websocket on the other - side. - - """ - call_data, calls = self.setupCall() - progress_url = call_data['progressURL'] - caller_websocket_token = call_data['websocketToken'] - callee_websocket_token = calls[0]['websocketToken'] - call_id = call_data['callId'] - caller_alerts = [] - callee_alerts = [] - - self.terminated = False - - def _handle_caller(message_data): - self.incr_counter("websocket-supervisory-caller-messages") - message = json.loads(message_data.data) - caller_alerts.append(message) - state = message.get('state') - messageType = message.get('messageType') - reason = message.get("reason") - - if messageType == "hello" and state == "init": - # This is the first message, Ask the second party to connect. - pass - - elif messageType == "progress" and state == "terminated": - if reason == "timeout": - self.terminated = True - else: - self.fail("Reason is not timeout: %s" % reason) - - caller_ws = self.create_ws(progress_url, callback=_handle_caller) - - self._send_ws_message( - caller_ws, - messageType='hello', - auth=caller_websocket_token, - callId=call_id) - - while not self.terminated: - gevent.sleep(.5) - - def _test_websockets_ringing_timeout(self): - """ - When the server connected with both caller and callee, the callee - devices should stop ringing after some time. - - """ - call_data, calls = self.setupCall() - progress_url = call_data['progressURL'] - caller_websocket_token = call_data['websocketToken'] - callee_websocket_token = calls[0]['websocketToken'] - call_id = call_data['callId'] - caller_alerts = [] - callee_alerts = [] - - self.terminated = False - - def _handle_callee(message_data): - self.incr_counter("websocket-ringing-callee-messages") - - def _handle_caller(message_data): - self.incr_counter("websocket-ringing-caller-messages") - message = json.loads(message_data.data) - caller_alerts.append(message) - state = message.get('state') - messageType = message.get('messageType') - reason = message.get("reason") - - if messageType == "hello" and state == "init": - # This is the first message, Ask the second party to connect. - self._send_ws_message( - callee_ws, - messageType='hello', - auth=callee_websocket_token, - callId=call_id) - - elif messageType == "progress" and state == "terminated": - if reason == "timeout": - self.terminated = True - else: - self.fail("Reason is not timeout: %s" % reason) - - callee_ws = self.create_ws(progress_url, callback=_handle_callee) - caller_ws = self.create_ws(progress_url, callback=_handle_caller) - - self._send_ws_message( - caller_ws, - messageType='hello', - auth=caller_websocket_token, - callId=call_id) - - while not self.terminated: - gevent.sleep(.5) - - def _test_websockets_connection_timeout(self): - """ - When the callee answered but media-up isn't sent by both parties, the - server should close the connection after some time. - - """ - call_data, calls = self.setupCall() - progress_url = call_data['progressURL'] - caller_websocket_token = call_data['websocketToken'] - callee_websocket_token = calls[0]['websocketToken'] - call_id = call_data['callId'] - caller_alerts = [] - callee_alerts = [] - - self.terminated = False - - def _handle_callee(message_data): - message = json.loads(message_data.data) - caller_alerts.append(message) - state = message.get('state') - messageType = message.get('messageType') - reason = message.get("reason") - - if messageType == "progress" and state == "alerting": - self._send_ws_message( - callee_ws, - messageType="action", - event="accept") - callee_ws.receive() - - elif messageType == "progress" and state == "connecting": - self._send_ws_message( - callee_ws, - messageType="action", - event="media-up") - callee_ws.receive() - - elif messageType == "progress" and state == "terminated": - if reason == "timeout": - self.terminated = True - else: - self.fail("Reason is not timeout: %s" % reason) - - def _handle_caller(message_data): - message = json.loads(message_data.data) - caller_alerts.append(message) - state = message.get('state') - messageType = message.get('messageType') - - if messageType == "hello" and state == "init": - # This is the first message, Ask the second party to connect. - self._send_ws_message( - callee_ws, - messageType='hello', - auth=callee_websocket_token, - callId=call_id) - - callee_ws = self.create_ws(progress_url, callback=_handle_callee) - caller_ws = self.create_ws(progress_url, callback=_handle_caller) - - self._send_ws_message( - caller_ws, - messageType='hello', - auth=caller_websocket_token, - callId=call_id) - - while not self.terminated: - gevent.sleep(.5) diff --git a/loadtests/requirements.txt b/loadtests/requirements.txt deleted file mode 100644 index fa64aa3..0000000 --- a/loadtests/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -gevent -six -git+git://github.com/mozilla-services/loads.git -git+git://github.com/mozilla-services/requests-hawk.git