~unifield-team/unifield-wm/us-826

« back to all changes in this revision

Viewing changes to msf_field_access_rights/benchmark/benchmark.py

  • Committer: mmu-openerp
  • Date: 2013-03-13 11:05:40 UTC
  • mfrom: (1349.29.95 button-wm)
  • mto: This revision was merged to the branch mainline in revision 1524.
  • Revision ID: mmu@openerp.com-20130313110540-gk589kzzzkw5ojro
[MERGE] uf-1652 button access rights

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/env python
2
 
# -*- encoding: utf-8 -*-
3
 
##############################################################################
4
 
#
5
 
#    OpenERP, Open Source Management Solution
6
 
#    Copyright (C) 2011 TeMPO Consulting, MSF. All Rights Reserved
7
 
#    Developer: Max Mumford 
8
 
#
9
 
#    This program is free software: you can redistribute it and/or modify
10
 
#    it under the terms of the GNU Affero General Public License as
11
 
#    published by the Free Software Foundation, either version 3 of the
12
 
#    License, or (at your option) any later version.
13
 
#
14
 
#    This program is distributed in the hope that it will be useful,
15
 
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
16
 
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17
 
#    GNU Affero General Public License for more details.
18
 
#
19
 
#    You should have received a copy of the GNU Affero General Public License
20
 
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
21
 
#
22
 
##############################################################################
23
 
 
24
 
import sys
25
 
from optparse import OptionParser
26
 
import datetime
27
 
import openerplib
28
 
import itertools
29
 
import pylab as pl
30
 
import os
31
 
 
32
 
# command line params
33
 
field_access_rule_ids = False
34
 
parser = OptionParser()
35
 
 
36
 
parser.add_option('-c', '--create', action='store_true', help='Test the create function')
37
 
parser.add_option('-w', '--write', action='store_true', help='Test the write function')
38
 
parser.add_option('-f', '--fvg', '--fields-view-get', action='store_true', dest='fvg', help='Test the fields_view_get function')
39
 
parser.add_option('-n', '-i', '--number-of-iterations',  default=30, type='int', dest='iterations', help='The number of creates/writes/fields_view_get to perform for the benchmark')
40
 
parser.add_option('-r', '--number-of-rules', default=10, type='int', dest='rules', help='The number of field access rules to create')
41
 
parser.add_option('-a', '--hostaddress', dest='host', default="localhost", help='The address of the host')
42
 
parser.add_option('-d', '--database', default="access_right", help='The name of the database')
43
 
parser.add_option('-u', '--admin-username', dest='username', default="msf_field_access_rights_benchmarker", help='The username for the account to use to login to OpenERP')
44
 
parser.add_option('-p', '--admin-password', dest='password', default="benchmark_it", help='The password for the account to use to login to OpenERP')
45
 
parser.add_option('-s', '--save-graphs', action='store_true', dest='save', help='Save graphs to physical files (In msf_field_access_rights/benchmark/graphs directory)')
46
 
parser.add_option('-o', '--file-prefix', dest='prefix', help='A prefix for the filenames when they are saved (In msf_field_access_rights/benchmark/graphs directory)')
47
 
 
48
 
options, args = parser.parse_args()
49
 
 
50
 
if not options.create and not options.write and not options.fvg:
51
 
    options.write = options.create = options.fvg = True
52
 
    
53
 
options.prefix = options.prefix or '' 
54
 
    
55
 
# init connection and pools 
56
 
connection = openerplib.get_connection(hostname=options.host, database=options.database, login=options.username, password=options.password)
57
 
 
58
 
field_access_rule_pool = connection.get_model('msf_field_access_rights.field_access_rule')
59
 
field_access_rule_line_pool = connection.get_model('msf_field_access_rights.field_access_rule_line')
60
 
 
61
 
user_pool = connection.get_model("res.users")
62
 
 
63
 
model_pool = connection.get_model("ir.model")
64
 
user_model_id = model_pool.search([('model','=','res.users')])[0]
65
 
 
66
 
def _get_instance_level():
67
 
    company_id = connection.get_model('res.users').read(connection.user_id)['company_id']
68
 
    company = connection.get_model('res.company').read(company_id[0])
69
 
    
70
 
    if company['instance_id']:
71
 
        instance = connection.get_model('msf.instance').read(company['instance_id'])
72
 
        
73
 
        instance_level = instance.get('level', False)
74
 
        
75
 
        if instance_level:
76
 
            if instance_level.lower() == 'section':
77
 
                instance_level = 'hq'
78
 
                
79
 
            return instance_level.lower()
80
 
        else:
81
 
            return False    
82
 
    else:
83
 
        return False
84
 
 
85
 
instance_level = _get_instance_level()
86
 
 
87
 
def create_rules():
88
 
    # create rules to benchmark against
89
 
    print '... creating %s rules' % options.rules
90
 
    field_access_rule_ids = field_access_rule_pool.search([('name','like','benchmark_users_')])
91
 
    
92
 
    if field_access_rule_ids:
93
 
        field_access_rule_pool.unlink(field_access_rule_ids)
94
 
        
95
 
    field_access_rule_ids = []
96
 
    
97
 
    for i in range(0, options.rules):
98
 
        rule_values = {
99
 
          'name':'benchmark_users_' + str(i),
100
 
          'model_id':user_model_id,
101
 
          'instance_level':instance_level,
102
 
          'filter':False,
103
 
          'domain_text':False,
104
 
          'group_ids':False,
105
 
          'state':'filter_validated',
106
 
          'active':'1'
107
 
        }
108
 
        field_access_rule_ids.append(field_access_rule_pool.create(rule_values))
109
 
        
110
 
    # generate field access rule lines and edit them to have appropriate settings for tests
111
 
    existing_lines = field_access_rule_line_pool.search([('field_access_rule','in',field_access_rule_ids)])
112
 
    if existing_lines:
113
 
        field_access_rule_line_pool.unlink(existing_lines)
114
 
        
115
 
    field_access_rule_pool.generate_rules_button(field_access_rule_ids)
116
 
    
117
 
    field_access_rules = field_access_rule_pool.read(field_access_rule_ids)
118
 
    
119
 
    field_access_rule_line_ids = list(itertools.chain(*[rule['field_access_rule_line_ids'] for rule in field_access_rules]))
120
 
    field_access_rule_lines = field_access_rule_line_pool.read(field_access_rule_line_ids)
121
 
    
122
 
    lines_to_edit = [line['id'] for line in field_access_rule_lines if \
123
 
                     line['field_name'] == 'address_id' \
124
 
                     or line['field_name'] == 'user_email' \
125
 
                     or line['field_name'] == 'action_id']
126
 
    
127
 
    try:
128
 
        field_access_rule_line_pool.write(lines_to_edit, {"value_not_synchronized_on_write":"1"})
129
 
    except:
130
 
        field_access_rule_pool.unlink(field_access_rule_ids)
131
 
        raise
132
 
    
133
 
    print '... done'
134
 
    return field_access_rule_ids
135
 
 
136
 
# init create
137
 
def create():
138
 
    # save timestamp
139
 
    start = datetime.datetime.now()
140
 
    print '========================================================'
141
 
    print 'STARTING %s CREATES AS %s' % (options.iterations, options.username)
142
 
    
143
 
    created_user_ids = []
144
 
    
145
 
    # loop create
146
 
    for i in range(0, options.iterations):
147
 
        user_values = {
148
 
            'name':'msf_field_access_rights_benchmark_create_' + str(i),
149
 
            'login':'msf_field_access_rights_benchmark_create_' + str(i),
150
 
            'user_email':'benchmark%s@test.com' % str(i),
151
 
        }
152
 
        created_user_ids.append(user_pool.create(user_values))
153
 
    
154
 
    # print time taken
155
 
    end = datetime.datetime.now()
156
 
    time_taken = end - start
157
 
    print 'TIME TAKEN TO PERFORM %s CREATES: %s.%s (seconds)' % (options.iterations, time_taken.seconds, time_taken.microseconds)
158
 
    per_create_time_taken = time_taken / options.iterations
159
 
    print '1 CREATE = %s.%06d (seconds)' % (per_create_time_taken.seconds, per_create_time_taken.microseconds)
160
 
    print '========================================================'
161
 
    
162
 
    # delete created users
163
 
    user_pool.unlink(created_user_ids)
164
 
    
165
 
    return per_create_time_taken
166
 
 
167
 
def write():
168
 
        
169
 
    # create the user to write on (unless already exists)
170
 
    user_id = user_pool.search([('name','=','msf_field_access_rights_benchmark')])
171
 
    
172
 
    if not user_id:
173
 
        
174
 
        user_values = {
175
 
            'name':'msf_field_access_rights_benchmark',
176
 
            'login':'msf_field_access_rights_benchmark',
177
 
            'user_email':'benchmark@test.com',
178
 
        }
179
 
        
180
 
        user_id = user_pool.create(user_values)
181
 
    else:
182
 
        user_id = user_id[0]
183
 
    
184
 
    # save timestamp
185
 
    start = datetime.datetime.now()
186
 
    print '========================================================'
187
 
    print 'STARTING %s WRITES AS %s' % (options.iterations, options.username)
188
 
    
189
 
    # loop write
190
 
    even_data = {'user_email':'benchmark1@test.com'}
191
 
    odd_data = {'user_email':'benchmark@test.com'}
192
 
    
193
 
    for i in range(0, options.iterations):
194
 
        if i % 2 == 0:
195
 
            user_pool.write(user_id, even_data)
196
 
        else:
197
 
            user_pool.write(user_id, odd_data)
198
 
    
199
 
    # print time taken
200
 
    end = datetime.datetime.now()
201
 
    time_taken = end - start
202
 
    print 'TIME TAKEN TO PERFORM %s WRITES: %s.%s (seconds)' % (options.iterations, time_taken.seconds, time_taken.microseconds)
203
 
    per_write_time_taken = time_taken / options.iterations
204
 
    print '1 WRITE = %s.%06d (seconds)' % (per_write_time_taken.seconds, per_write_time_taken.microseconds)
205
 
    print '========================================================'
206
 
    
207
 
    # delete test user
208
 
    user_pool.unlink([user_id])
209
 
    
210
 
    return per_write_time_taken
211
 
    
212
 
# init fields_view_get
213
 
def fvg():
214
 
    # save timestamp
215
 
    start = datetime.datetime.now()
216
 
    print '========================================================'
217
 
    print 'STARTING %s FIELDS_VIEW_GET AS %s' % (options.iterations, options.username)
218
 
    
219
 
    # make requests in loop
220
 
    for i in range(0, options.iterations):
221
 
        user_pool.fields_view_get()
222
 
    
223
 
    # print time taken
224
 
    end = datetime.datetime.now()
225
 
    time_taken = end - start
226
 
    print 'TIME TAKEN TO PERFORM %s FIELDS_VIEW_GET: %s.%s (seconds)' % (options.iterations, time_taken.seconds, time_taken.microseconds)
227
 
    per_fvg_time_taken = time_taken / options.iterations
228
 
    print '1 FVG = %s.%06d (seconds)' % (per_fvg_time_taken.seconds, per_fvg_time_taken.microseconds)
229
 
    print '========================================================'
230
 
    
231
 
    return per_fvg_time_taken
232
 
    
233
 
def make_graph(graph_name, x, x_labels, y):
234
 
    fig = pl.figure()
235
 
    ax = pl.subplot(111)
236
 
    ax.bar(x, y, width=1)
237
 
    fig.canvas.manager.set_window_title(graph_name + " with %s iterations and %s rules" % (options.iterations, options.rules))
238
 
    pl.xticks(x, x_labels)
239
 
    pl.ylabel('Seconds per operation')
240
 
    
241
 
    if options.save:
242
 
        pl.savefig(options.prefix + " " + graph_name + ".png")
243
 
    else: 
244
 
        pl.show()
245
 
    
246
 
def friendly_time(td):
247
 
    if td.seconds > 0:
248
 
        return ((td.seconds * 1000000) + td.microseconds) / 1000000.0
249
 
    else:
250
 
        return td.microseconds / 1000000.0
251
 
    
252
 
if options.create:
253
 
    create_time = create()
254
 
    
255
 
if options.write:
256
 
    write_time = write()
257
 
    
258
 
if options.fvg:
259
 
    fvg_time = fvg()
260
 
    
261
 
field_access_rule_ids = create_rules()
262
 
 
263
 
if options.create:
264
 
    create_time_with_rules = create()
265
 
 
266
 
if options.write:
267
 
    write_time_with_rules = write()
268
 
    
269
 
if options.fvg:
270
 
    fvg_time_with_rules = fvg()
271
 
    
272
 
# cleanup
273
 
if field_access_rule_ids:
274
 
    print '... deleting %s rules' % options.rules
275
 
    field_access_rule_pool.unlink(field_access_rule_ids)
276
 
    print '... done'
277
 
 
278
 
# display graphs
279
 
x = [0,1]
280
 
x_labels = ["Without Test Rules", "With Test Rules"]
281
 
 
282
 
if options.create:
283
 
    create_data = [friendly_time(create_time), friendly_time(create_time_with_rules)]
284
 
    make_graph("Create Speed", x, x_labels, create_data)
285
 
    
286
 
if options.write:
287
 
    write_data = [friendly_time(write_time), friendly_time(write_time_with_rules)]
288
 
    make_graph("Write Speed", x, x_labels, write_data)
289
 
    
290
 
if options.fvg:
291
 
    fvg_data = [friendly_time(fvg_time), friendly_time(fvg_time_with_rules)]
292
 
    make_graph("Field View Get Speed", x, x_labels, fvg_data)
 
 
b'\\ No newline at end of file'