Statistics
| Branch: | Tag: | Revision:

root / snf-astakos-app / astakos / test / stress.py @ 0d069390

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 770dba12 Giorgos Korfiatis
from astakos.im.models import AstakosUser
50 9096ffbb Giorgos Korfiatis
from astakos.im.functions import ProjectError
51 770dba12 Giorgos Korfiatis
from astakos.im import quotas
52 0932ac43 Giorgos Korfiatis
from views import submit, approve, join, leave
53 b830f774 Giorgos Korfiatis
from snf_django.lib.db.transaction import commit_on_success_strict
54 0932ac43 Giorgos Korfiatis
55 0932ac43 Giorgos Korfiatis
USERS = {}
56 0932ac43 Giorgos Korfiatis
PROJECTS = {}
57 0932ac43 Giorgos Korfiatis
58 327eb666 Giorgos Korfiatis
logger = logging.getLogger(__name__)
59 327eb666 Giorgos Korfiatis
logger.setLevel(logging.INFO)
60 327eb666 Giorgos Korfiatis
61 0932ac43 Giorgos Korfiatis
62 0932ac43 Giorgos Korfiatis
def random_name():
63 0932ac43 Giorgos Korfiatis
    alphabet = u'abcdef_123490αβγδεζ'
64 0932ac43 Giorgos Korfiatis
    length = randint(1, 15)
65 0932ac43 Giorgos Korfiatis
    return ''.join(choice(alphabet) for _ in xrange(length))
66 0932ac43 Giorgos Korfiatis
67 0932ac43 Giorgos Korfiatis
68 0932ac43 Giorgos Korfiatis
def random_email():
69 0932ac43 Giorgos Korfiatis
    alphabet = u'abcdef_123490'
70 0932ac43 Giorgos Korfiatis
    length = randint(1, 10)
71 0932ac43 Giorgos Korfiatis
    first = ''.join(choice(alphabet) for _ in xrange(length))
72 0932ac43 Giorgos Korfiatis
73 0932ac43 Giorgos Korfiatis
    alphabet = u'abcdef'
74 327eb666 Giorgos Korfiatis
    length = randint(2, 4)
75 0932ac43 Giorgos Korfiatis
    last = ''.join(choice(alphabet) for _ in xrange(length))
76 770dba12 Giorgos Korfiatis
    return first + '@' + last + '.com'
77 0932ac43 Giorgos Korfiatis
78 0932ac43 Giorgos Korfiatis
79 0932ac43 Giorgos Korfiatis
def new_user():
80 0932ac43 Giorgos Korfiatis
    email = random_email()
81 770dba12 Giorgos Korfiatis
    defaults = {'first_name': random_name(),
82 770dba12 Giorgos Korfiatis
                'last_name': random_name(),
83 770dba12 Giorgos Korfiatis
                'is_active': True,
84 770dba12 Giorgos Korfiatis
                }
85 770dba12 Giorgos Korfiatis
    u, created = AstakosUser.objects.get_or_create(
86 770dba12 Giorgos Korfiatis
        email=email, defaults=defaults)
87 770dba12 Giorgos Korfiatis
    if created:
88 770dba12 Giorgos Korfiatis
        quotas.qh_sync_user(u)
89 9096ffbb Giorgos Korfiatis
        return u
90 770dba12 Giorgos Korfiatis
    return None
91 0932ac43 Giorgos Korfiatis
92 0932ac43 Giorgos Korfiatis
93 757f3256 Giorgos Korfiatis
@commit_on_success_strict()
94 0932ac43 Giorgos Korfiatis
def new_users(count):
95 0932ac43 Giorgos Korfiatis
    for i in range(count):
96 770dba12 Giorgos Korfiatis
        while True:
97 9096ffbb Giorgos Korfiatis
            u = new_user()
98 9096ffbb Giorgos Korfiatis
            if u is not None:
99 9096ffbb Giorgos Korfiatis
                USERS[u.id] = u
100 770dba12 Giorgos Korfiatis
                break
101 0932ac43 Giorgos Korfiatis
102 0932ac43 Giorgos Korfiatis
103 0932ac43 Giorgos Korfiatis
class SubmitApproveT(threading.Thread):
104 0932ac43 Giorgos Korfiatis
    def __init__(self, *args, **kwargs):
105 0932ac43 Giorgos Korfiatis
        self.repeat = kwargs.pop('repeat', 1)
106 0932ac43 Giorgos Korfiatis
        threading.Thread.__init__(self, *args, **kwargs)
107 0932ac43 Giorgos Korfiatis
108 0932ac43 Giorgos Korfiatis
    def run(self):
109 0932ac43 Giorgos Korfiatis
        owner = choice(USERS.keys())
110 0932ac43 Giorgos Korfiatis
        p_name = random_name()
111 0932ac43 Giorgos Korfiatis
        submit_and_approve(p_name, owner, None, self.repeat,
112 327eb666 Giorgos Korfiatis
                           prefix=self.name)
113 0932ac43 Giorgos Korfiatis
114 0932ac43 Giorgos Korfiatis
115 9096ffbb Giorgos Korfiatis
def submit_and_approve(name, user_id, project_id, repeat, prefix=""):
116 0932ac43 Giorgos Korfiatis
    if prefix:
117 0932ac43 Giorgos Korfiatis
        prefix += ' '
118 0932ac43 Giorgos Korfiatis
119 0932ac43 Giorgos Korfiatis
    for i in range(repeat):
120 0932ac43 Giorgos Korfiatis
        try:
121 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
122 9096ffbb Giorgos Korfiatis
            logger.info('%s%s: submitting for project %s'
123 9096ffbb Giorgos Korfiatis
                        % (prefix, now, project_id))
124 9096ffbb Giorgos Korfiatis
            app_id, project_id = submit(name, user_id, project_id)
125 f12bcb3d Giorgos Korfiatis
        except ProjectError as e:
126 9096ffbb Giorgos Korfiatis
            logger.info(e.message)
127 9096ffbb Giorgos Korfiatis
            continue
128 0932ac43 Giorgos Korfiatis
        except Exception as e:
129 327eb666 Giorgos Korfiatis
            logger.exception(e)
130 770dba12 Giorgos Korfiatis
            continue
131 0932ac43 Giorgos Korfiatis
        try:
132 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
133 327eb666 Giorgos Korfiatis
            logger.info('%s%s: approving application %s of project %s'
134 9096ffbb Giorgos Korfiatis
                        % (prefix, now, app_id, project_id))
135 0932ac43 Giorgos Korfiatis
            approve(app_id)
136 9096ffbb Giorgos Korfiatis
            PROJECTS[project_id] = True
137 0932ac43 Giorgos Korfiatis
        except Exception as e:
138 327eb666 Giorgos Korfiatis
            logger.exception(e)
139 327eb666 Giorgos Korfiatis
140 0932ac43 Giorgos Korfiatis
141 0932ac43 Giorgos Korfiatis
class JoinLeaveT(threading.Thread):
142 0932ac43 Giorgos Korfiatis
    def __init__(self, *args, **kwargs):
143 0932ac43 Giorgos Korfiatis
        self.repeat = kwargs.pop('repeat', 1)
144 0932ac43 Giorgos Korfiatis
        threading.Thread.__init__(self, *args, **kwargs)
145 0932ac43 Giorgos Korfiatis
146 0932ac43 Giorgos Korfiatis
    def run(self):
147 9096ffbb Giorgos Korfiatis
        user = choice(USERS.values())
148 0932ac43 Giorgos Korfiatis
        while True:
149 0932ac43 Giorgos Korfiatis
            projects = PROJECTS.keys()
150 0932ac43 Giorgos Korfiatis
            if projects:
151 0932ac43 Giorgos Korfiatis
                pid = choice(projects)
152 0932ac43 Giorgos Korfiatis
                break
153 0932ac43 Giorgos Korfiatis
            sleep(0.1)
154 9096ffbb Giorgos Korfiatis
        join_and_leave(pid, user, self.repeat, prefix=self.name)
155 0932ac43 Giorgos Korfiatis
156 0932ac43 Giorgos Korfiatis
157 9096ffbb Giorgos Korfiatis
def join_and_leave(proj_id, user, repeat, prefix=""):
158 9096ffbb Giorgos Korfiatis
    user_id = user.id
159 0932ac43 Giorgos Korfiatis
    if prefix:
160 0932ac43 Giorgos Korfiatis
        prefix += ' '
161 0932ac43 Giorgos Korfiatis
162 0932ac43 Giorgos Korfiatis
    for i in range(repeat):
163 0932ac43 Giorgos Korfiatis
        try:
164 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
165 327eb666 Giorgos Korfiatis
            logger.info('%s%s: user %s joining project %s'
166 327eb666 Giorgos Korfiatis
                        % (prefix, now, user_id, proj_id))
167 9096ffbb Giorgos Korfiatis
            membership = join(proj_id, user)
168 f12bcb3d Giorgos Korfiatis
        except ProjectError as e:
169 9096ffbb Giorgos Korfiatis
            logger.info(e.message)
170 9096ffbb Giorgos Korfiatis
            continue
171 0932ac43 Giorgos Korfiatis
        except Exception as e:
172 327eb666 Giorgos Korfiatis
            logger.exception(e)
173 9096ffbb Giorgos Korfiatis
            continue
174 0932ac43 Giorgos Korfiatis
        try:
175 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
176 327eb666 Giorgos Korfiatis
            logger.info('%s%s: user %s leaving project %s'
177 327eb666 Giorgos Korfiatis
                        % (prefix, now, user_id, proj_id))
178 9096ffbb Giorgos Korfiatis
            leave(membership.id, user)
179 f12bcb3d Giorgos Korfiatis
        except ProjectError as e:
180 9096ffbb Giorgos Korfiatis
            logger.info(e.message)
181 0932ac43 Giorgos Korfiatis
        except Exception as e:
182 327eb666 Giorgos Korfiatis
            logger.exception(e)
183 0932ac43 Giorgos Korfiatis
184 0932ac43 Giorgos Korfiatis
185 0932ac43 Giorgos Korfiatis
def test(users, projects, memb, repeat):
186 0932ac43 Giorgos Korfiatis
    logging.basicConfig()
187 0932ac43 Giorgos Korfiatis
188 0932ac43 Giorgos Korfiatis
    new_users(users)
189 0932ac43 Giorgos Korfiatis
190 0932ac43 Giorgos Korfiatis
    for i in range(projects):
191 0932ac43 Giorgos Korfiatis
        SubmitApproveT(repeat=repeat).start()
192 0932ac43 Giorgos Korfiatis
193 0932ac43 Giorgos Korfiatis
    for i in range(memb):
194 0932ac43 Giorgos Korfiatis
        JoinLeaveT(repeat=repeat).start()
195 0932ac43 Giorgos Korfiatis
196 327eb666 Giorgos Korfiatis
    for thread in threading.enumerate():
197 327eb666 Giorgos Korfiatis
        if thread is not threading.currentThread():
198 327eb666 Giorgos Korfiatis
            thread.join()
199 327eb666 Giorgos Korfiatis
200 0932ac43 Giorgos Korfiatis
201 0932ac43 Giorgos Korfiatis
def main():
202 0932ac43 Giorgos Korfiatis
    parser = OptionParser()
203 0932ac43 Giorgos Korfiatis
    parser.add_option('--users',
204 0932ac43 Giorgos Korfiatis
                      dest='users',
205 0932ac43 Giorgos Korfiatis
                      default=2,
206 0932ac43 Giorgos Korfiatis
                      help="Number of users (default=2)")
207 0932ac43 Giorgos Korfiatis
    parser.add_option('--projects',
208 0932ac43 Giorgos Korfiatis
                      dest='projects',
209 0932ac43 Giorgos Korfiatis
                      default=2,
210 0932ac43 Giorgos Korfiatis
                      help="Number of projects (default=2)")
211 0932ac43 Giorgos Korfiatis
    parser.add_option('--memb',
212 0932ac43 Giorgos Korfiatis
                      dest='memb',
213 0932ac43 Giorgos Korfiatis
                      default=2,
214 0932ac43 Giorgos Korfiatis
                      help="Number of membership requests (default=2)")
215 0932ac43 Giorgos Korfiatis
    parser.add_option('--repeat',
216 0932ac43 Giorgos Korfiatis
                      dest='repeat',
217 0932ac43 Giorgos Korfiatis
                      default=20,
218 0932ac43 Giorgos Korfiatis
                      help="Number of iterations (default=20)")
219 327eb666 Giorgos Korfiatis
    parser.add_option('-q', '--quiet',
220 327eb666 Giorgos Korfiatis
                      action='store_true',
221 327eb666 Giorgos Korfiatis
                      dest='quiet',
222 327eb666 Giorgos Korfiatis
                      default=False,
223 327eb666 Giorgos Korfiatis
                      help="Print only errors")
224 0932ac43 Giorgos Korfiatis
225 0932ac43 Giorgos Korfiatis
    (options, args) = parser.parse_args()
226 0932ac43 Giorgos Korfiatis
227 327eb666 Giorgos Korfiatis
    if options.quiet:
228 327eb666 Giorgos Korfiatis
        logger.setLevel(logging.WARNING)
229 327eb666 Giorgos Korfiatis
230 0932ac43 Giorgos Korfiatis
    users = int(options.users)
231 0932ac43 Giorgos Korfiatis
    projects = int(options.projects)
232 0932ac43 Giorgos Korfiatis
    memb = int(options.memb)
233 0932ac43 Giorgos Korfiatis
    repeat = int(options.repeat)
234 0932ac43 Giorgos Korfiatis
    test(users, projects, memb, repeat)
235 0932ac43 Giorgos Korfiatis
236 0932ac43 Giorgos Korfiatis
237 0932ac43 Giorgos Korfiatis
if __name__ == "__main__":
238 0932ac43 Giorgos Korfiatis
    main()