Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (6.8 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
import sys
39 0932ac43 Giorgos Korfiatis
from optparse import OptionParser
40 0932ac43 Giorgos Korfiatis
from time import sleep
41 0932ac43 Giorgos Korfiatis
import threading
42 0932ac43 Giorgos Korfiatis
import datetime
43 0932ac43 Giorgos Korfiatis
from random import choice, randint
44 0932ac43 Giorgos Korfiatis
import logging
45 0932ac43 Giorgos Korfiatis
46 0932ac43 Giorgos Korfiatis
path = os.path.dirname(os.path.realpath(__file__))
47 0932ac43 Giorgos Korfiatis
os.environ['SYNNEFO_SETTINGS_DIR'] = path + '/settings'
48 0932ac43 Giorgos Korfiatis
os.environ['DJANGO_SETTINGS_MODULE'] = 'synnefo.settings'
49 0932ac43 Giorgos Korfiatis
50 0932ac43 Giorgos Korfiatis
from astakos.im.api.callpoint import AstakosCallpoint
51 0932ac43 Giorgos Korfiatis
from astakos.im.functions import get_chain_of_application_id
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 0932ac43 Giorgos Korfiatis
    return first + '@' + last
77 0932ac43 Giorgos Korfiatis
78 0932ac43 Giorgos Korfiatis
79 0932ac43 Giorgos Korfiatis
def new_user():
80 0932ac43 Giorgos Korfiatis
    email = random_email()
81 0932ac43 Giorgos Korfiatis
    u = {'email': email,
82 0932ac43 Giorgos Korfiatis
         'first_name': random_name(),
83 0932ac43 Giorgos Korfiatis
         'last_name': random_name(),
84 0932ac43 Giorgos Korfiatis
         'active': True,
85 0932ac43 Giorgos Korfiatis
         }
86 0932ac43 Giorgos Korfiatis
    c = AstakosCallpoint()
87 0932ac43 Giorgos Korfiatis
    r = c.create_users((u,)).next()
88 0932ac43 Giorgos Korfiatis
    return r.data['id'], email
89 0932ac43 Giorgos Korfiatis
90 0932ac43 Giorgos Korfiatis
91 757f3256 Giorgos Korfiatis
@commit_on_success_strict()
92 0932ac43 Giorgos Korfiatis
def new_users(count):
93 0932ac43 Giorgos Korfiatis
    for i in range(count):
94 0932ac43 Giorgos Korfiatis
        uid, email = new_user()
95 0932ac43 Giorgos Korfiatis
        USERS[uid] = email
96 0932ac43 Giorgos Korfiatis
97 0932ac43 Giorgos Korfiatis
98 0932ac43 Giorgos Korfiatis
class SubmitApproveT(threading.Thread):
99 0932ac43 Giorgos Korfiatis
    def __init__(self, *args, **kwargs):
100 0932ac43 Giorgos Korfiatis
        self.repeat = kwargs.pop('repeat', 1)
101 0932ac43 Giorgos Korfiatis
        threading.Thread.__init__(self, *args, **kwargs)
102 0932ac43 Giorgos Korfiatis
103 0932ac43 Giorgos Korfiatis
    def run(self):
104 0932ac43 Giorgos Korfiatis
        owner = choice(USERS.keys())
105 0932ac43 Giorgos Korfiatis
        p_name = random_name()
106 0932ac43 Giorgos Korfiatis
        submit_and_approve(p_name, owner, None, self.repeat,
107 327eb666 Giorgos Korfiatis
                           prefix=self.name)
108 0932ac43 Giorgos Korfiatis
109 0932ac43 Giorgos Korfiatis
110 0932ac43 Giorgos Korfiatis
def submit_and_approve(name, user_id, prec, repeat, prefix=""):
111 0932ac43 Giorgos Korfiatis
    if prefix:
112 0932ac43 Giorgos Korfiatis
        prefix += ' '
113 0932ac43 Giorgos Korfiatis
114 0932ac43 Giorgos Korfiatis
    for i in range(repeat):
115 0932ac43 Giorgos Korfiatis
        try:
116 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
117 327eb666 Giorgos Korfiatis
            logger.info('%s%s: submitting with precursor %s'
118 327eb666 Giorgos Korfiatis
                        % (prefix, now, prec))
119 0932ac43 Giorgos Korfiatis
            app_id = submit(name, user_id, prec)
120 0932ac43 Giorgos Korfiatis
            prec = app_id
121 0932ac43 Giorgos Korfiatis
        except Exception as e:
122 327eb666 Giorgos Korfiatis
            logger.exception(e)
123 0932ac43 Giorgos Korfiatis
        try:
124 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
125 0932ac43 Giorgos Korfiatis
            pid = get_chain_of_application_id(app_id)
126 327eb666 Giorgos Korfiatis
            logger.info('%s%s: approving application %s of project %s'
127 327eb666 Giorgos Korfiatis
                        % (prefix, now, app_id, pid))
128 0932ac43 Giorgos Korfiatis
            approve(app_id)
129 0932ac43 Giorgos Korfiatis
            PROJECTS[pid] = True
130 0932ac43 Giorgos Korfiatis
        except Exception as e:
131 327eb666 Giorgos Korfiatis
            logger.exception(e)
132 327eb666 Giorgos Korfiatis
133 0932ac43 Giorgos Korfiatis
134 0932ac43 Giorgos Korfiatis
class JoinLeaveT(threading.Thread):
135 0932ac43 Giorgos Korfiatis
    def __init__(self, *args, **kwargs):
136 0932ac43 Giorgos Korfiatis
        self.repeat = kwargs.pop('repeat', 1)
137 0932ac43 Giorgos Korfiatis
        threading.Thread.__init__(self, *args, **kwargs)
138 0932ac43 Giorgos Korfiatis
139 0932ac43 Giorgos Korfiatis
    def run(self):
140 0932ac43 Giorgos Korfiatis
        owner = choice(USERS.keys())
141 0932ac43 Giorgos Korfiatis
        while True:
142 0932ac43 Giorgos Korfiatis
            projects = PROJECTS.keys()
143 0932ac43 Giorgos Korfiatis
            if projects:
144 0932ac43 Giorgos Korfiatis
                pid = choice(projects)
145 0932ac43 Giorgos Korfiatis
                break
146 0932ac43 Giorgos Korfiatis
            sleep(0.1)
147 327eb666 Giorgos Korfiatis
        join_and_leave(pid, owner, self.repeat, prefix=self.name)
148 0932ac43 Giorgos Korfiatis
149 0932ac43 Giorgos Korfiatis
150 0932ac43 Giorgos Korfiatis
def join_and_leave(proj_id, user_id, repeat, prefix=""):
151 0932ac43 Giorgos Korfiatis
    if prefix:
152 0932ac43 Giorgos Korfiatis
        prefix += ' '
153 0932ac43 Giorgos Korfiatis
154 0932ac43 Giorgos Korfiatis
    for i in range(repeat):
155 0932ac43 Giorgos Korfiatis
        try:
156 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
157 327eb666 Giorgos Korfiatis
            logger.info('%s%s: user %s joining project %s'
158 327eb666 Giorgos Korfiatis
                        % (prefix, now, user_id, proj_id))
159 0932ac43 Giorgos Korfiatis
            join(proj_id, user_id)
160 0932ac43 Giorgos Korfiatis
        except Exception as e:
161 327eb666 Giorgos Korfiatis
            logger.exception(e)
162 327eb666 Giorgos Korfiatis
163 0932ac43 Giorgos Korfiatis
        try:
164 0932ac43 Giorgos Korfiatis
            now = datetime.datetime.now()
165 327eb666 Giorgos Korfiatis
            logger.info('%s%s: user %s leaving project %s'
166 327eb666 Giorgos Korfiatis
                        % (prefix, now, user_id, proj_id))
167 0932ac43 Giorgos Korfiatis
            leave(proj_id, user_id)
168 0932ac43 Giorgos Korfiatis
        except Exception as e:
169 327eb666 Giorgos Korfiatis
            logger.exception(e)
170 0932ac43 Giorgos Korfiatis
171 0932ac43 Giorgos Korfiatis
172 0932ac43 Giorgos Korfiatis
def test(users, projects, memb, repeat):
173 0932ac43 Giorgos Korfiatis
    logging.basicConfig()
174 0932ac43 Giorgos Korfiatis
175 0932ac43 Giorgos Korfiatis
    new_users(users)
176 0932ac43 Giorgos Korfiatis
177 0932ac43 Giorgos Korfiatis
    for i in range(projects):
178 0932ac43 Giorgos Korfiatis
        SubmitApproveT(repeat=repeat).start()
179 0932ac43 Giorgos Korfiatis
180 0932ac43 Giorgos Korfiatis
    for i in range(memb):
181 0932ac43 Giorgos Korfiatis
        JoinLeaveT(repeat=repeat).start()
182 0932ac43 Giorgos Korfiatis
183 327eb666 Giorgos Korfiatis
    for thread in threading.enumerate():
184 327eb666 Giorgos Korfiatis
        if thread is not threading.currentThread():
185 327eb666 Giorgos Korfiatis
            thread.join()
186 327eb666 Giorgos Korfiatis
187 0932ac43 Giorgos Korfiatis
188 0932ac43 Giorgos Korfiatis
def main():
189 0932ac43 Giorgos Korfiatis
    parser = OptionParser()
190 0932ac43 Giorgos Korfiatis
    parser.add_option('--users',
191 0932ac43 Giorgos Korfiatis
                      dest='users',
192 0932ac43 Giorgos Korfiatis
                      default=2,
193 0932ac43 Giorgos Korfiatis
                      help="Number of users (default=2)")
194 0932ac43 Giorgos Korfiatis
    parser.add_option('--projects',
195 0932ac43 Giorgos Korfiatis
                      dest='projects',
196 0932ac43 Giorgos Korfiatis
                      default=2,
197 0932ac43 Giorgos Korfiatis
                      help="Number of projects (default=2)")
198 0932ac43 Giorgos Korfiatis
    parser.add_option('--memb',
199 0932ac43 Giorgos Korfiatis
                      dest='memb',
200 0932ac43 Giorgos Korfiatis
                      default=2,
201 0932ac43 Giorgos Korfiatis
                      help="Number of membership requests (default=2)")
202 0932ac43 Giorgos Korfiatis
    parser.add_option('--repeat',
203 0932ac43 Giorgos Korfiatis
                      dest='repeat',
204 0932ac43 Giorgos Korfiatis
                      default=20,
205 0932ac43 Giorgos Korfiatis
                      help="Number of iterations (default=20)")
206 327eb666 Giorgos Korfiatis
    parser.add_option('-q', '--quiet',
207 327eb666 Giorgos Korfiatis
                      action='store_true',
208 327eb666 Giorgos Korfiatis
                      dest='quiet',
209 327eb666 Giorgos Korfiatis
                      default=False,
210 327eb666 Giorgos Korfiatis
                      help="Print only errors")
211 0932ac43 Giorgos Korfiatis
212 0932ac43 Giorgos Korfiatis
    (options, args) = parser.parse_args()
213 0932ac43 Giorgos Korfiatis
214 327eb666 Giorgos Korfiatis
    if options.quiet:
215 327eb666 Giorgos Korfiatis
        logger.setLevel(logging.WARNING)
216 327eb666 Giorgos Korfiatis
217 0932ac43 Giorgos Korfiatis
    users = int(options.users)
218 0932ac43 Giorgos Korfiatis
    projects = int(options.projects)
219 0932ac43 Giorgos Korfiatis
    memb = int(options.memb)
220 0932ac43 Giorgos Korfiatis
    repeat = int(options.repeat)
221 0932ac43 Giorgos Korfiatis
    test(users, projects, memb, repeat)
222 0932ac43 Giorgos Korfiatis
223 0932ac43 Giorgos Korfiatis
224 0932ac43 Giorgos Korfiatis
if __name__ == "__main__":
225 0932ac43 Giorgos Korfiatis
    main()