Skip to content

Instantly share code, notes, and snippets.

@notmyname
Created May 23, 2012 01:38
Show Gist options
  • Save notmyname/2772747 to your computer and use it in GitHub Desktop.
Save notmyname/2772747 to your computer and use it in GitHub Desktop.
easy_proxy_pu_eventlet.py
#! /usr/bin/python
import eventlet
eventlet.monkey_patch()
import httplib
import time
import uuid
import random
import hashlib
import sys
from urlparse import urlparse
import re
import collections
concurrency = 100
CONTAINERS = 1
OBJECTS = 100
def auth(soso, account, username, password):
if soso.split(':')[-1] == '443':
connection = httplib.HTTPSConnection(soso)
else:
connection = httplib.HTTPConnection(soso)
connection.request('GET','/v1/%s/auth'%account,
headers={'x-storage-user': username,
'x-storage-pass': password})
response = connection.getresponse()
response.read()
storage_url = response.getheader('x-storage-url')
auth_token = response.getheader('x-auth-token')
return storage_url,auth_token
def mosso_auth(url, account, apikey):
connection = httplib.HTTPSConnection(url)
connection.request('GET','/v1.0', headers={'x-auth-user': account,
'x-auth-key': apikey})
response = connection.getresponse()
response.read()
storage_url = response.getheader('x-storage-url')
auth_token = response.getheader('x-auth-token')
return storage_url,auth_token
soso = '0.0.0.0:443'
account = 'blah'
username = 'blah'
password = 'blah'
surl, AUTH_TOKEN = auth(soso, account, username, password)
if surl is None:
print >>sys.stderr, 'unauthorized'
sys.exit(1)
(scheme, netloc, path, params, query, frag) = urlparse(surl)
SSL = True if scheme == 'https' else False
match = re.match('([a-zA-Z0-9\-\.]+):?([0-9]{2,5})?', netloc)
if match:
(host, port) = match.groups()
else:
raise InvalidUrl('Invalid host and/or port: %s' % netloc)
sport = int(port) if port else (443 if SSL else 80)
spath = path.strip('/')
ACCT_NAME = spath.split('/')[1]
def run(cont_name=None):
requests = failed = 0
response_codes = collections.defaultdict(int)
if SSL:
conn = httplib.HTTPSConnection(host, sport)
else:
conn = httplib.HTTPConnection(host, sport)
for x in xrange(CONTAINERS):
# Creating Containers
if cont_name is None:
cont_name = 'alias_%s' % str(uuid.uuid4())
conn.request("PUT", "/%s/%s" % (spath, cont_name),
headers={"X-Auth-Token": AUTH_TOKEN})
response = conn.getresponse()
response.read()
stat = response.status
response_codes[stat] += 1
if stat < 300:
requests += 1
else:
failed += 1
names = []
for y in xrange(OBJECTS):
# Loading Objects
name = 'object_%s' % str(uuid.uuid4())
names.append(name)
body = 'x'
etag = hashlib.md5(body).hexdigest().lower()
conn.request("PUT", "/%s/%s/%s" % (spath, cont_name, name), body=body,
headers={"X-Auth-Token": AUTH_TOKEN, 'Etag': etag})
response = conn.getresponse()
response.read()
stat = response.status
response_codes[stat] += 1
if stat < 300:
requests += 1
else:
failed += 1
marker = OBJECTS / 3
for name in names[:marker]:
conn.request("DELETE", "/%s/%s/%s" % (spath, cont_name, name),
headers={"X-Auth-Token": AUTH_TOKEN})
response = conn.getresponse()
response.read()
stat = response.status
response_codes[stat] += 1
if stat < 300:
requests += 1
else:
failed += 1
for name in names[-marker:]:
conn.request("HEAD", "/%s/%s/%s" % (spath, cont_name, name),
headers={"X-Auth-Token": AUTH_TOKEN})
response = conn.getresponse()
response.read()
stat = response.status
response_codes[stat] += 1
if stat < 300:
requests += 1
else:
failed += 1
return requests, failed, response_codes
pool = eventlet.GreenPool(size=concurrency)
start = time.time()
results = [pool.spawn(run) for _ in xrange(concurrency)]
requests = failed = 0
codes = collections.defaultdict(int)
for r,f,c in (r.wait() for r in results):
requests += r
failed += f
for k,v in c.items():
codes[k] += v
print "Concurrency:", concurrency
print "Total:", requests
print "Average Rate:", requests / (time.time() - start), "per second"
print "Successful:", requests
print "Failed:", failed
print "Response Codes:"
for code, count in codes.items():
print " %s: %d" % (code, count)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment