Revision 9096ffbb
b/snf-astakos-app/astakos/im/functions.py | ||
---|---|---|
316 | 316 |
return get_project_for_update(m.project_id) |
317 | 317 |
|
318 | 318 |
|
319 |
def get_user_by_id(user_id): |
|
320 |
try: |
|
321 |
return AstakosUser.objects.get(id=user_id) |
|
322 |
except AstakosUser.DoesNotExist: |
|
323 |
m = _(astakos_messages.UNKNOWN_USER_ID) % user_id |
|
324 |
raise ProjectNotFound(m) |
|
325 |
|
|
326 |
|
|
327 | 319 |
def get_user_by_uuid(uuid): |
328 | 320 |
try: |
329 | 321 |
return AstakosUser.objects.get(uuid=uuid) |
b/snf-astakos-app/astakos/test/stress.py | ||
---|---|---|
47 | 47 |
os.environ['DJANGO_SETTINGS_MODULE'] = 'synnefo.settings' |
48 | 48 |
|
49 | 49 |
from astakos.im.models import AstakosUser |
50 |
from astakos.im.functions import get_related_project_id, ProjectError
|
|
50 |
from astakos.im.functions import ProjectError |
|
51 | 51 |
from astakos.im import quotas |
52 | 52 |
from views import submit, approve, join, leave |
53 | 53 |
from snf_django.lib.db.transaction import commit_on_success_strict |
... | ... | |
86 | 86 |
email=email, defaults=defaults) |
87 | 87 |
if created: |
88 | 88 |
quotas.qh_sync_user(u) |
89 |
return u.id, u.email
|
|
89 |
return u |
|
90 | 90 |
return None |
91 | 91 |
|
92 | 92 |
|
... | ... | |
94 | 94 |
def new_users(count): |
95 | 95 |
for i in range(count): |
96 | 96 |
while True: |
97 |
result = new_user() |
|
98 |
if result is not None: |
|
99 |
uid, email = result |
|
100 |
USERS[uid] = email |
|
97 |
u = new_user() |
|
98 |
if u is not None: |
|
99 |
USERS[u.id] = u |
|
101 | 100 |
break |
102 | 101 |
|
103 | 102 |
|
... | ... | |
113 | 112 |
prefix=self.name) |
114 | 113 |
|
115 | 114 |
|
116 |
def submit_and_approve(name, user_id, prec, repeat, prefix=""):
|
|
115 |
def submit_and_approve(name, user_id, project_id, repeat, prefix=""):
|
|
117 | 116 |
if prefix: |
118 | 117 |
prefix += ' ' |
119 | 118 |
|
120 | 119 |
for i in range(repeat): |
121 | 120 |
try: |
122 | 121 |
now = datetime.datetime.now() |
123 |
logger.info('%s%s: submitting with precursor %s' |
|
124 |
% (prefix, now, prec)) |
|
125 |
app_id = submit(name, user_id, prec) |
|
126 |
prec = app_id |
|
122 |
logger.info('%s%s: submitting for project %s' |
|
123 |
% (prefix, now, project_id)) |
|
124 |
app_id, project_id = submit(name, user_id, project_id) |
|
127 | 125 |
except ProjectError as e: |
128 |
logger.info('Limit reached') |
|
126 |
logger.info(e.message) |
|
127 |
continue |
|
129 | 128 |
except Exception as e: |
130 | 129 |
logger.exception(e) |
131 | 130 |
continue |
132 | 131 |
try: |
133 | 132 |
now = datetime.datetime.now() |
134 |
pid = get_related_project_id(app_id) |
|
135 | 133 |
logger.info('%s%s: approving application %s of project %s' |
136 |
% (prefix, now, app_id, pid)) |
|
134 |
% (prefix, now, app_id, project_id))
|
|
137 | 135 |
approve(app_id) |
138 |
PROJECTS[pid] = True |
|
136 |
PROJECTS[project_id] = True
|
|
139 | 137 |
except Exception as e: |
140 | 138 |
logger.exception(e) |
141 | 139 |
|
... | ... | |
146 | 144 |
threading.Thread.__init__(self, *args, **kwargs) |
147 | 145 |
|
148 | 146 |
def run(self): |
149 |
owner = choice(USERS.keys())
|
|
147 |
user = choice(USERS.values())
|
|
150 | 148 |
while True: |
151 | 149 |
projects = PROJECTS.keys() |
152 | 150 |
if projects: |
153 | 151 |
pid = choice(projects) |
154 | 152 |
break |
155 | 153 |
sleep(0.1) |
156 |
join_and_leave(pid, owner, self.repeat, prefix=self.name)
|
|
154 |
join_and_leave(pid, user, self.repeat, prefix=self.name)
|
|
157 | 155 |
|
158 | 156 |
|
159 |
def join_and_leave(proj_id, user_id, repeat, prefix=""): |
|
157 |
def join_and_leave(proj_id, user, repeat, prefix=""): |
|
158 |
user_id = user.id |
|
160 | 159 |
if prefix: |
161 | 160 |
prefix += ' ' |
162 | 161 |
|
... | ... | |
165 | 164 |
now = datetime.datetime.now() |
166 | 165 |
logger.info('%s%s: user %s joining project %s' |
167 | 166 |
% (prefix, now, user_id, proj_id)) |
168 |
join(proj_id, user_id)
|
|
167 |
membership = join(proj_id, user)
|
|
169 | 168 |
except ProjectError as e: |
170 |
logger.info('Membership already exists') |
|
169 |
logger.info(e.message) |
|
170 |
continue |
|
171 | 171 |
except Exception as e: |
172 | 172 |
logger.exception(e) |
173 |
|
|
173 |
continue |
|
174 | 174 |
try: |
175 | 175 |
now = datetime.datetime.now() |
176 | 176 |
logger.info('%s%s: user %s leaving project %s' |
177 | 177 |
% (prefix, now, user_id, proj_id)) |
178 |
leave(proj_id, user_id)
|
|
178 |
leave(membership.id, user)
|
|
179 | 179 |
except ProjectError as e: |
180 |
logger.info('No such membership')
|
|
180 |
logger.info(e.message)
|
|
181 | 181 |
except Exception as e: |
182 | 182 |
logger.exception(e) |
183 | 183 |
|
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, ProjectApplication
|
|
36 |
from astakos.im.models import AstakosUser, Project |
|
37 | 37 |
from astakos.im.functions import (join_project, leave_project, |
38 | 38 |
submit_application, approve_application, |
39 |
get_user_by_id, check_pending_app_quota,
|
|
39 |
check_pending_app_quota, |
|
40 | 40 |
ProjectForbidden) |
41 | 41 |
from snf_django.lib.db.transaction import commit_on_success_strict |
42 | 42 |
|
43 | 43 |
|
44 | 44 |
@commit_on_success_strict() |
45 |
def join(proj_id, user_id):
|
|
46 |
join_project(proj_id, get_user_by_id(user_id))
|
|
45 |
def join(proj_id, user): |
|
46 |
return join_project(proj_id, user)
|
|
47 | 47 |
|
48 | 48 |
|
49 | 49 |
@commit_on_success_strict() |
50 |
def leave(proj_id, user_id):
|
|
51 |
leave_project(proj_id, get_user_by_id(user_id))
|
|
50 |
def leave(memb_id, request_user):
|
|
51 |
return leave_project(memb_id, request_user)
|
|
52 | 52 |
|
53 | 53 |
|
54 | 54 |
@commit_on_success_strict() |
55 |
def submit(name, user_id, prec):
|
|
55 |
def submit(name, user_id, project_id=None):
|
|
56 | 56 |
try: |
57 | 57 |
owner = AstakosUser.objects.get(id=user_id) |
58 | 58 |
except AstakosUser.DoesNotExist: |
59 | 59 |
raise AttributeError('user does not exist') |
60 | 60 |
|
61 |
precursor = (ProjectApplication.objects.get(id=prec) |
|
62 |
if prec is not None |
|
63 |
else None) |
|
64 |
|
|
65 |
ok, limit = check_pending_app_quota(owner, precursor=precursor) |
|
61 |
project = (Project.objects.get(id=project_id) if project_id is not None |
|
62 |
else None) |
|
63 |
ok, limit = check_pending_app_quota(owner, project=project) |
|
66 | 64 |
if not ok: |
67 | 65 |
raise ProjectForbidden('Limit %s reached', limit) |
68 | 66 |
|
69 |
resource_policies = [('cyclades.network.private', 5)]
|
|
67 |
resource_policies = {'cyclades.network.private': {'member_capacity': 5}}
|
|
70 | 68 |
data = {'owner': owner, |
71 | 69 |
'name': name, |
72 |
'precursor_id': prec,
|
|
70 |
'project_id': project_id,
|
|
73 | 71 |
'end_date': datetime.now() + timedelta(days=1), |
74 | 72 |
'member_join_policy': 1, |
75 | 73 |
'member_leave_policy': 1, |
76 |
'resource_policies': resource_policies,
|
|
74 |
'resources': resource_policies, |
|
77 | 75 |
'request_user': owner |
78 | 76 |
} |
79 | 77 |
|
80 | 78 |
app = submit_application(**data) |
81 |
return app.id |
|
79 |
return app.id, app.chain_id
|
|
82 | 80 |
|
83 | 81 |
|
84 | 82 |
@commit_on_success_strict() |
Also available in: Unified diff