Created
May 23, 2012 01:38
-
-
Save notmyname/2772747 to your computer and use it in GitHub Desktop.
easy_proxy_pu_eventlet.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /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