2
# -*- encoding: utf-8 -*-
3
##############################################################################
5
# OpenERP, Open Source Management Solution
6
# Copyright (C) 2011 TeMPO Consulting, MSF. All Rights Reserved
7
# Developer: Max Mumford
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.
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.
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/>.
22
##############################################################################
25
from optparse import OptionParser
33
field_access_rule_ids = False
34
parser = OptionParser()
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)')
48
options, args = parser.parse_args()
50
if not options.create and not options.write and not options.fvg:
51
options.write = options.create = options.fvg = True
53
options.prefix = options.prefix or ''
55
# init connection and pools
56
connection = openerplib.get_connection(hostname=options.host, database=options.database, login=options.username, password=options.password)
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')
61
user_pool = connection.get_model("res.users")
63
model_pool = connection.get_model("ir.model")
64
user_model_id = model_pool.search([('model','=','res.users')])[0]
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])
70
if company['instance_id']:
71
instance = connection.get_model('msf.instance').read(company['instance_id'])
73
instance_level = instance.get('level', False)
76
if instance_level.lower() == 'section':
79
return instance_level.lower()
85
instance_level = _get_instance_level()
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_')])
92
if field_access_rule_ids:
93
field_access_rule_pool.unlink(field_access_rule_ids)
95
field_access_rule_ids = []
97
for i in range(0, options.rules):
99
'name':'benchmark_users_' + str(i),
100
'model_id':user_model_id,
101
'instance_level':instance_level,
105
'state':'filter_validated',
108
field_access_rule_ids.append(field_access_rule_pool.create(rule_values))
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)])
113
field_access_rule_line_pool.unlink(existing_lines)
115
field_access_rule_pool.generate_rules_button(field_access_rule_ids)
117
field_access_rules = field_access_rule_pool.read(field_access_rule_ids)
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)
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']
128
field_access_rule_line_pool.write(lines_to_edit, {"value_not_synchronized_on_write":"1"})
130
field_access_rule_pool.unlink(field_access_rule_ids)
134
return field_access_rule_ids
139
start = datetime.datetime.now()
140
print '========================================================'
141
print 'STARTING %s CREATES AS %s' % (options.iterations, options.username)
143
created_user_ids = []
146
for i in range(0, options.iterations):
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),
152
created_user_ids.append(user_pool.create(user_values))
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 '========================================================'
162
# delete created users
163
user_pool.unlink(created_user_ids)
165
return per_create_time_taken
169
# create the user to write on (unless already exists)
170
user_id = user_pool.search([('name','=','msf_field_access_rights_benchmark')])
175
'name':'msf_field_access_rights_benchmark',
176
'login':'msf_field_access_rights_benchmark',
177
'user_email':'benchmark@test.com',
180
user_id = user_pool.create(user_values)
185
start = datetime.datetime.now()
186
print '========================================================'
187
print 'STARTING %s WRITES AS %s' % (options.iterations, options.username)
190
even_data = {'user_email':'benchmark1@test.com'}
191
odd_data = {'user_email':'benchmark@test.com'}
193
for i in range(0, options.iterations):
195
user_pool.write(user_id, even_data)
197
user_pool.write(user_id, odd_data)
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 '========================================================'
208
user_pool.unlink([user_id])
210
return per_write_time_taken
212
# init fields_view_get
215
start = datetime.datetime.now()
216
print '========================================================'
217
print 'STARTING %s FIELDS_VIEW_GET AS %s' % (options.iterations, options.username)
219
# make requests in loop
220
for i in range(0, options.iterations):
221
user_pool.fields_view_get()
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 '========================================================'
231
return per_fvg_time_taken
233
def make_graph(graph_name, x, x_labels, y):
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')
242
pl.savefig(options.prefix + " " + graph_name + ".png")
246
def friendly_time(td):
248
return ((td.seconds * 1000000) + td.microseconds) / 1000000.0
250
return td.microseconds / 1000000.0
253
create_time = create()
261
field_access_rule_ids = create_rules()
264
create_time_with_rules = create()
267
write_time_with_rules = write()
270
fvg_time_with_rules = fvg()
273
if field_access_rule_ids:
274
print '... deleting %s rules' % options.rules
275
field_access_rule_pool.unlink(field_access_rule_ids)
280
x_labels = ["Without Test Rules", "With Test Rules"]
283
create_data = [friendly_time(create_time), friendly_time(create_time_with_rules)]
284
make_graph("Create Speed", x, x_labels, create_data)
287
write_data = [friendly_time(write_time), friendly_time(write_time_with_rules)]
288
make_graph("Write Speed", x, x_labels, write_data)
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'