Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / test / stress.py @ f6ff3033

History | View | Annotate | Download (7.3 kB)

1 0932ac43 Giorgos Korfiatis
#!/usr/bin/env python
2 0932ac43 Giorgos Korfiatis
# -*- coding: utf-8 -*-
3 0932ac43 Giorgos Korfiatis
4 0932ac43 Giorgos Korfiatis
# Copyright 2013 GRNET S.A. All rights reserved.
5 0932ac43 Giorgos Korfiatis
#
6 0932ac43 Giorgos Korfiatis
# Redistribution and use in source and binary forms, with or
7 0932ac43 Giorgos Korfiatis
# without modification, are permitted provided that the following
8 0932ac43 Giorgos Korfiatis
# conditions are met:
9 0932ac43 Giorgos Korfiatis
#
10 0932ac43 Giorgos Korfiatis
#   1. Redistributions of source code must retain the above
11 0932ac43 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
12 0932ac43 Giorgos Korfiatis
#      disclaimer.
13 0932ac43 Giorgos Korfiatis
#
14 0932ac43 Giorgos Korfiatis
#   2. Redistributions in binary form must reproduce the above
15 0932ac43 Giorgos Korfiatis
#      copyright notice, this list of conditions and the following
16 0932ac43 Giorgos Korfiatis
#      disclaimer in the documentation and/or other materials
17 0932ac43 Giorgos Korfiatis
#      provided with the distribution.
18 0932ac43 Giorgos Korfiatis
#
19 0932ac43 Giorgos Korfiatis
# THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
20 0932ac43 Giorgos Korfiatis
# OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
21 0932ac43 Giorgos Korfiatis
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 0932ac43 Giorgos Korfiatis
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
23 0932ac43 Giorgos Korfiatis
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 0932ac43 Giorgos Korfiatis
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 0932ac43 Giorgos Korfiatis
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
26 0932ac43 Giorgos Korfiatis
# USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 0932ac43 Giorgos Korfiatis
# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 0932ac43 Giorgos Korfiatis
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
29 0932ac43 Giorgos Korfiatis
# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30 0932ac43 Giorgos Korfiatis
# POSSIBILITY OF SUCH DAMAGE.
31 0932ac43 Giorgos Korfiatis
#
32 0932ac43 Giorgos Korfiatis
# The views and conclusions contained in the software and
33 0932ac43 Giorgos Korfiatis
# documentation are those of the authors and should not be
34 0932ac43 Giorgos Korfiatis
# interpreted as representing official policies, either expressed
35 0932ac43 Giorgos Korfiatis
# or implied, of GRNET S.A.
36 0932ac43 Giorgos Korfiatis
37 0932ac43 Giorgos Korfiatis
import os
38 0932ac43 Giorgos Korfiatis
from optparse import OptionParser
39 0932ac43 Giorgos Korfiatis
from time import sleep
40 0932ac43 Giorgos Korfiatis
import threading
41 0932ac43 Giorgos Korfiatis
import datetime
42 0932ac43 Giorgos Korfiatis
from random import choice, randint
43 0932ac43 Giorgos Korfiatis
import logging
44 0932ac43 Giorgos Korfiatis
45 0932ac43 Giorgos Korfiatis
path = os.path.dirname(os.path.realpath(__file__))
46 0932ac43 Giorgos Korfiatis
os.environ['SYNNEFO_SETTINGS_DIR'] = path + '/settings'
47 0932ac43 Giorgos Korfiatis
os.environ['DJANGO_SETTINGS_MODULE'] = 'synnefo.settings'
48 0932ac43 Giorgos Korfiatis
49 a3e3917f Giorgos Korfiatis
from django.db import transaction
50 770dba12 Giorgos Korfiatis
from astakos.im.models import AstakosUser
51 9096ffbb Giorgos Korfiatis
from astakos.im.functions import ProjectError
52 1808f7bc Giorgos Korfiatis
from astakos.im import auth
53 1808f7bc Giorgos Korfiatis
from astakos.im import activation_backends
54 0932ac43 Giorgos Korfiatis
from views import submit, approve, join, leave
55 0932ac43 Giorgos Korfiatis
56 1808f7bc Giorgos Korfiatis
57 0932ac43 Giorgos Korfiatis
USERS = {}
58 0932ac43 Giorgos Korfiatis
PROJECTS = {}
59 0932ac43 Giorgos Korfiatis
60 327eb666 Giorgos Korfiatis
logger = logging.getLogger(__name__)
61 327eb666 Giorgos Korfiatis
logger.setLevel(logging.INFO)
62 327eb666 Giorgos Korfiatis
63 0932ac43 Giorgos Korfiatis
64 0932ac43 Giorgos Korfiatis
def random_name():
65 0932ac43 Giorgos Korfiatis
    alphabet = u'abcdef_123490αβγδεζ'
66 0932ac43 Giorgos Korfiatis
    length = randint(1, 15)
67 0932ac43 Giorgos Korfiatis
    return ''.join(choice(alphabet) for _ in xrange(length))
68 0932ac43 Giorgos Korfiatis
69 0932ac43 Giorgos Korfiatis
70 0932ac43 Giorgos Korfiatis
def random_email():
71 0932ac43 Giorgos Korfiatis
    alphabet = u'abcdef_123490'
72 0932ac43 Giorgos Korfiatis
    length = randint(1, 10)
73 0932ac43 Giorgos Korfiatis
    first = ''.join(choice(alphabet) for _ in xrange(length))
74 0932ac43 Giorgos Korfiatis
75 0932ac43 Giorgos Korfiatis
    alphabet = u'abcdef'
76 327eb666 Giorgos Korfiatis
    length = randint(2, 4)
77 0932ac43 Giorgos Korfiatis
    last = ''.join(choice(alphabet) for _ in xrange(length))
78 770dba12 Giorgos Korfiatis
    return first + '@' + last + '.com'
79 0932ac43 Giorgos Korfiatis
80 0932ac43 Giorgos Korfiatis
81 0932ac43 Giorgos Korfiatis
def new_user():
82 0932ac43 Giorgos Korfiatis
    email = random_email()
83 1808f7bc Giorgos Korfiatis
    backend = activation_backends.get_backend()
84 1808f7bc Giorgos Korfiatis
    try:
85 1808f7bc Giorgos Korfiatis
        AstakosUser.objects.get(email=email)
86 1808f7bc Giorgos Korfiatis
        return None
87 1808f7bc Giorgos Korfiatis
    except AstakosUser.DoesNotExist:
88 1808f7bc Giorgos Korfiatis
        u = auth.make_local_user(email, first_name=random_name(),
89 1808f7bc Giorgos Korfiatis
                                 last_name=random_name())
90 1808f7bc Giorgos Korfiatis
        backend.verify_user(u, u.verification_code)
91 1808f7bc Giorgos Korfiatis
        backend.accept_user(u)
92 9096ffbb Giorgos Korfiatis
        return u
93 0932ac43 Giorgos Korfiatis
94 0932ac43 Giorgos Korfiatis
95 a3e3917f Giorgos Korfiatis
@transaction.commit_on_success
96 0932ac43 Giorgos Korfiatis
def new_users(count):
97 0932ac43 Giorgos Korfiatis
    for i in range(count):
98 770dba12 Giorgos Korfiatis
        while True:
99 9096ffbb Giorgos Korfiatis
            u = new_user()
100 9096ffbb Giorgos Korfiatis
            if u is not None:
101 9096ffbb Giorgos Korfiatis
                USERS[u.id] = u
102 770dba12 Giorgos Korfiatis
                break
103 0932ac43 Giorgos Korfiatis
104 0932ac43 Giorgos Korfiatis
105 0932ac43 Giorgos Korfiatis
class SubmitApproveT(threading.Thread):
106 0932ac43 Giorgos Korfiatis
    def __init__(self, *args, **kwargs):
107 0932ac43 Giorgos Korfiatis
        self.repeat = kwargs.pop('repeat', 1)
108 0932ac43 Giorgos Korfiatis
        threading.Thread.__init__(self, *args, **kwargs)
109 0932ac43 Giorgos Korfiatis
110 0932ac43 Giorgos Korfiatis
    def run(self):
111 0932ac43 Giorgos Korfiatis
        owner = choice(USERS.keys())
112 0932ac43 Giorgos Korfiatis
        p_name = random_name()
113 0932ac43 Giorgos Korfiatis
        submit_and_approve(p_name, owner, None, self.repeat,
114 327eb666 Giorgos Korfiatis
                           prefix=self.name)
115 0932ac43 Giorgos Korfiatis
116 0932ac43 Giorgos Korfiatis
117 9096ffbb Giorgos Korfiatis
def submit_and_approve(name, user_id, project_id, repeat, prefix=""):
118 0932ac43 Giorgos Korfiatis
    if prefix:
119 0932ac43 Giorgos Korfiatis
        prefix += ' '
120 0932ac43 Giorgos Korfiatis
121 0932ac43 Giorgos Korfiatis
    for i in range(repeat):
122 0932ac43 Giorgos Korfiatis
        try:
123 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
124 9096ffbb Giorgos Korfiatis
            logger.info('%s%s: submitting for project %s'
125 9096ffbb Giorgos Korfiatis
                        % (prefix, now, project_id))
126 9096ffbb Giorgos Korfiatis
            app_id, project_id = submit(name, user_id, project_id)
127 f12bcb3d Giorgos Korfiatis
        except ProjectError as e:
128 9096ffbb Giorgos Korfiatis
            logger.info(e.message)
129 9096ffbb Giorgos Korfiatis
            continue
130 0932ac43 Giorgos Korfiatis
        except Exception as e:
131 327eb666 Giorgos Korfiatis
            logger.exception(e)
132 770dba12 Giorgos Korfiatis
            continue
133 0932ac43 Giorgos Korfiatis
        try:
134 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
135 327eb666 Giorgos Korfiatis
            logger.info('%s%s: approving application %s of project %s'
136 9096ffbb Giorgos Korfiatis
                        % (prefix, now, app_id, project_id))
137 0932ac43 Giorgos Korfiatis
            approve(app_id)
138 9096ffbb Giorgos Korfiatis
            PROJECTS[project_id] = True
139 0932ac43 Giorgos Korfiatis
        except Exception as e:
140 327eb666 Giorgos Korfiatis
            logger.exception(e)
141 327eb666 Giorgos Korfiatis
142 0932ac43 Giorgos Korfiatis
143 0932ac43 Giorgos Korfiatis
class JoinLeaveT(threading.Thread):
144 0932ac43 Giorgos Korfiatis
    def __init__(self, *args, **kwargs):
145 0932ac43 Giorgos Korfiatis
        self.repeat = kwargs.pop('repeat', 1)
146 0932ac43 Giorgos Korfiatis
        threading.Thread.__init__(self, *args, **kwargs)
147 0932ac43 Giorgos Korfiatis
148 0932ac43 Giorgos Korfiatis
    def run(self):
149 9096ffbb Giorgos Korfiatis
        user = choice(USERS.values())
150 0932ac43 Giorgos Korfiatis
        while True:
151 0932ac43 Giorgos Korfiatis
            projects = PROJECTS.keys()
152 0932ac43 Giorgos Korfiatis
            if projects:
153 0932ac43 Giorgos Korfiatis
                pid = choice(projects)
154 0932ac43 Giorgos Korfiatis
                break
155 0932ac43 Giorgos Korfiatis
            sleep(0.1)
156 9096ffbb Giorgos Korfiatis
        join_and_leave(pid, user, self.repeat, prefix=self.name)
157 0932ac43 Giorgos Korfiatis
158 0932ac43 Giorgos Korfiatis
159 9096ffbb Giorgos Korfiatis
def join_and_leave(proj_id, user, repeat, prefix=""):
160 9096ffbb Giorgos Korfiatis
    user_id = user.id
161 0932ac43 Giorgos Korfiatis
    if prefix:
162 0932ac43 Giorgos Korfiatis
        prefix += ' '
163 0932ac43 Giorgos Korfiatis
164 0932ac43 Giorgos Korfiatis
    for i in range(repeat):
165 0932ac43 Giorgos Korfiatis
        try:
166 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
167 327eb666 Giorgos Korfiatis
            logger.info('%s%s: user %s joining project %s'
168 327eb666 Giorgos Korfiatis
                        % (prefix, now, user_id, proj_id))
169 9096ffbb Giorgos Korfiatis
            membership = join(proj_id, user)
170 f12bcb3d Giorgos Korfiatis
        except ProjectError as e:
171 9096ffbb Giorgos Korfiatis
            logger.info(e.message)
172 9096ffbb Giorgos Korfiatis
            continue
173 0932ac43 Giorgos Korfiatis
        except Exception as e:
174 327eb666 Giorgos Korfiatis
            logger.exception(e)
175 9096ffbb Giorgos Korfiatis
            continue
176 0932ac43 Giorgos Korfiatis
        try:
177 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
178 327eb666 Giorgos Korfiatis
            logger.info('%s%s: user %s leaving project %s'
179 327eb666 Giorgos Korfiatis
                        % (prefix, now, user_id, proj_id))
180 9096ffbb Giorgos Korfiatis
            leave(membership.id, user)
181 f12bcb3d Giorgos Korfiatis
        except ProjectError as e:
182 9096ffbb Giorgos Korfiatis
            logger.info(e.message)
183 0932ac43 Giorgos Korfiatis
        except Exception as e:
184 327eb666 Giorgos Korfiatis
            logger.exception(e)
185 0932ac43 Giorgos Korfiatis
186 0932ac43 Giorgos Korfiatis
187 0932ac43 Giorgos Korfiatis
def test(users, projects, memb, repeat):
188 0932ac43 Giorgos Korfiatis
    logging.basicConfig()
189 0932ac43 Giorgos Korfiatis
190 0932ac43 Giorgos Korfiatis
    new_users(users)
191 0932ac43 Giorgos Korfiatis
192 0932ac43 Giorgos Korfiatis
    for i in range(projects):
193 0932ac43 Giorgos Korfiatis
        SubmitApproveT(repeat=repeat).start()
194 0932ac43 Giorgos Korfiatis
195 0932ac43 Giorgos Korfiatis
    for i in range(memb):
196 0932ac43 Giorgos Korfiatis
        JoinLeaveT(repeat=repeat).start()
197 0932ac43 Giorgos Korfiatis
198 327eb666 Giorgos Korfiatis
    for thread in threading.enumerate():
199 327eb666 Giorgos Korfiatis
        if thread is not threading.currentThread():
200 327eb666 Giorgos Korfiatis
            thread.join()
201 327eb666 Giorgos Korfiatis
202 0932ac43 Giorgos Korfiatis
203 0932ac43 Giorgos Korfiatis
def main():
204 0932ac43 Giorgos Korfiatis
    parser = OptionParser()
205 0932ac43 Giorgos Korfiatis
    parser.add_option('--users',
206 0932ac43 Giorgos Korfiatis
                      dest='users',
207 0932ac43 Giorgos Korfiatis
                      default=2,
208 0932ac43 Giorgos Korfiatis
                      help="Number of users (default=2)")
209 0932ac43 Giorgos Korfiatis
    parser.add_option('--projects',
210 0932ac43 Giorgos Korfiatis
                      dest='projects',
211 0932ac43 Giorgos Korfiatis
                      default=2,
212 0932ac43 Giorgos Korfiatis
                      help="Number of projects (default=2)")
213 0932ac43 Giorgos Korfiatis
    parser.add_option('--memb',
214 0932ac43 Giorgos Korfiatis
                      dest='memb',
215 0932ac43 Giorgos Korfiatis
                      default=2,
216 0932ac43 Giorgos Korfiatis
                      help="Number of membership requests (default=2)")
217 0932ac43 Giorgos Korfiatis
    parser.add_option('--repeat',
218 0932ac43 Giorgos Korfiatis
                      dest='repeat',
219 0932ac43 Giorgos Korfiatis
                      default=20,
220 0932ac43 Giorgos Korfiatis
                      help="Number of iterations (default=20)")
221 327eb666 Giorgos Korfiatis
    parser.add_option('-q', '--quiet',
222 327eb666 Giorgos Korfiatis
                      action='store_true',
223 327eb666 Giorgos Korfiatis
                      dest='quiet',
224 327eb666 Giorgos Korfiatis
                      default=False,
225 327eb666 Giorgos Korfiatis
                      help="Print only errors")
226 0932ac43 Giorgos Korfiatis
227 0932ac43 Giorgos Korfiatis
    (options, args) = parser.parse_args()
228 0932ac43 Giorgos Korfiatis
229 327eb666 Giorgos Korfiatis
    if options.quiet:
230 327eb666 Giorgos Korfiatis
        logger.setLevel(logging.WARNING)
231 327eb666 Giorgos Korfiatis
232 0932ac43 Giorgos Korfiatis
    users = int(options.users)
233 0932ac43 Giorgos Korfiatis
    projects = int(options.projects)
234 0932ac43 Giorgos Korfiatis
    memb = int(options.memb)
235 0932ac43 Giorgos Korfiatis
    repeat = int(options.repeat)
236 0932ac43 Giorgos Korfiatis
    test(users, projects, memb, repeat)
237 0932ac43 Giorgos Korfiatis
238 0932ac43 Giorgos Korfiatis
239 0932ac43 Giorgos Korfiatis
if __name__ == "__main__":
240 0932ac43 Giorgos Korfiatis
    main()