Revision 770dba12
b/snf-astakos-app/astakos/test/stress.py | ||
---|---|---|
35 | 35 |
# or implied, of GRNET S.A. |
36 | 36 |
|
37 | 37 |
import os |
38 |
import sys |
|
39 | 38 |
from optparse import OptionParser |
40 | 39 |
from time import sleep |
41 | 40 |
import threading |
... | ... | |
47 | 46 |
os.environ['SYNNEFO_SETTINGS_DIR'] = path + '/settings' |
48 | 47 |
os.environ['DJANGO_SETTINGS_MODULE'] = 'synnefo.settings' |
49 | 48 |
|
49 |
from astakos.im.models import AstakosUser |
|
50 | 50 |
from astakos.im.functions import get_chain_of_application_id |
51 |
from astakos.im import quotas |
|
51 | 52 |
from views import submit, approve, join, leave |
52 | 53 |
from snf_django.lib.db.transaction import commit_on_success_strict |
54 |
from django.core.exceptions import PermissionDenied |
|
53 | 55 |
|
54 | 56 |
USERS = {} |
55 | 57 |
PROJECTS = {} |
... | ... | |
72 | 74 |
alphabet = u'abcdef' |
73 | 75 |
length = randint(2, 4) |
74 | 76 |
last = ''.join(choice(alphabet) for _ in xrange(length)) |
75 |
return first + '@' + last |
|
77 |
return first + '@' + last + '.com'
|
|
76 | 78 |
|
77 | 79 |
|
78 | 80 |
def new_user(): |
79 | 81 |
email = random_email() |
80 |
u = AstakosUser(email=random_email(), first_name=random_name(), |
|
81 |
last_name=random_name(), is_active=True) |
|
82 |
u.save() |
|
83 |
return u.id, u.email |
|
82 |
defaults = {'first_name': random_name(), |
|
83 |
'last_name': random_name(), |
|
84 |
'is_active': True, |
|
85 |
} |
|
86 |
u, created = AstakosUser.objects.get_or_create( |
|
87 |
email=email, defaults=defaults) |
|
88 |
if created: |
|
89 |
quotas.qh_sync_user(u) |
|
90 |
return u.id, u.email |
|
91 |
return None |
|
84 | 92 |
|
85 | 93 |
|
86 | 94 |
@commit_on_success_strict() |
87 | 95 |
def new_users(count): |
88 | 96 |
for i in range(count): |
89 |
uid, email = new_user() |
|
90 |
USERS[uid] = email |
|
97 |
while True: |
|
98 |
result = new_user() |
|
99 |
if result is not None: |
|
100 |
uid, email = result |
|
101 |
USERS[uid] = email |
|
102 |
break |
|
91 | 103 |
|
92 | 104 |
|
93 | 105 |
class SubmitApproveT(threading.Thread): |
... | ... | |
113 | 125 |
% (prefix, now, prec)) |
114 | 126 |
app_id = submit(name, user_id, prec) |
115 | 127 |
prec = app_id |
128 |
except PermissionDenied as e: |
|
129 |
logger.info('Limit reached') |
|
116 | 130 |
except Exception as e: |
117 | 131 |
logger.exception(e) |
132 |
continue |
|
118 | 133 |
try: |
119 | 134 |
now = datetime.datetime.now() |
120 | 135 |
pid = get_chain_of_application_id(app_id) |
... | ... | |
152 | 167 |
logger.info('%s%s: user %s joining project %s' |
153 | 168 |
% (prefix, now, user_id, proj_id)) |
154 | 169 |
join(proj_id, user_id) |
170 |
except PermissionDenied as e: |
|
171 |
logger.info('Membership already exists') |
|
155 | 172 |
except Exception as e: |
156 | 173 |
logger.exception(e) |
157 | 174 |
|
... | ... | |
160 | 177 |
logger.info('%s%s: user %s leaving project %s' |
161 | 178 |
% (prefix, now, user_id, proj_id)) |
162 | 179 |
leave(proj_id, user_id) |
180 |
except IOError as e: |
|
181 |
logger.info('No such membership') |
|
163 | 182 |
except Exception as e: |
164 | 183 |
logger.exception(e) |
165 | 184 |
|
b/snf-astakos-app/astakos/test/views.py | ||
---|---|---|
33 | 33 |
|
34 | 34 |
from datetime import datetime, timedelta |
35 | 35 |
|
36 |
from astakos.im.models import AstakosUser |
|
36 |
from django.core.exceptions import PermissionDenied |
|
37 |
from astakos.im.models import AstakosUser, ProjectApplication |
|
37 | 38 |
from astakos.im.functions import (join_project, leave_project, |
38 |
submit_application, approve_application) |
|
39 |
submit_application, approve_application, |
|
40 |
get_user_by_id, qh_add_pending_app) |
|
39 | 41 |
from snf_django.lib.db.transaction import commit_on_success_strict |
40 | 42 |
|
43 |
|
|
41 | 44 |
@commit_on_success_strict() |
42 |
def join(proj_id, user_id, ctx=None): |
|
43 |
join_project(proj_id, user_id) |
|
45 |
def join(proj_id, user_id): |
|
46 |
join_project(proj_id, get_user_by_id(user_id)) |
|
47 |
|
|
44 | 48 |
|
45 | 49 |
@commit_on_success_strict() |
46 |
def leave(proj_id, user_id, ctx=None): |
|
47 |
leave_project(proj_id, user_id) |
|
50 |
def leave(proj_id, user_id): |
|
51 |
leave_project(proj_id, get_user_by_id(user_id)) |
|
52 |
|
|
48 | 53 |
|
49 | 54 |
@commit_on_success_strict() |
50 |
def submit(name, user_id, prec, ctx=None):
|
|
55 |
def submit(name, user_id, prec): |
|
51 | 56 |
try: |
52 | 57 |
owner = AstakosUser.objects.get(id=user_id) |
53 | 58 |
except AstakosUser.DoesNotExist: |
54 | 59 |
raise AttributeError('user does not exist') |
55 | 60 |
|
56 |
resource_policies = [{'service': 'cyclades', |
|
57 |
'resource': 'network.private', |
|
58 |
'uplimit': 5}] |
|
61 |
precursor = (ProjectApplication.objects.get(id=prec) |
|
62 |
if prec is not None |
|
63 |
else None) |
|
64 |
|
|
65 |
ok, limit = qh_add_pending_app(owner, precursor=precursor, dry_run=True) |
|
66 |
if not ok: |
|
67 |
raise PermissionDenied('Limit %s reached', limit) |
|
68 |
|
|
69 |
resource_policies = [('cyclades.network.private', 5)] |
|
59 | 70 |
data = {'owner': owner, |
60 | 71 |
'name': name, |
61 |
'precursor_application': prec,
|
|
72 |
'precursor_id': prec,
|
|
62 | 73 |
'end_date': datetime.now() + timedelta(days=1), |
63 | 74 |
'member_join_policy': 1, |
64 | 75 |
'member_leave_policy': 1, |
65 | 76 |
'resource_policies': resource_policies, |
77 |
'request_user': owner |
|
66 | 78 |
} |
67 | 79 |
|
68 |
app = submit_application(data, request_user=owner)
|
|
80 |
app = submit_application(**data)
|
|
69 | 81 |
return app.id |
70 | 82 |
|
83 |
|
|
71 | 84 |
@commit_on_success_strict() |
72 |
def approve(app_id, ctx=None):
|
|
85 |
def approve(app_id): |
|
73 | 86 |
approve_application(app_id) |
Also available in: Unified diff