Class: Origen::RegressionManager
Overview
Instance Method Summary
collapse
Methods included from Users
#admins, #app_users, #current_user
#find_space, #get_text, #split_long_line
Instance Method Details
#copy_regression_file ⇒ Object
We want the reference workspace to run the same regression as the local workspace, so copy the current version of the regression command file across.
247
248
249
250
251
|
# File 'lib/origen/regression_manager.rb', line 247
def copy_regression_file
path_to_command_file = regression_command_file.relative_path_from(Origen.root)
system "rm -f #{reference_origen_root}/#{path_to_command_file}"
system "cp #{Origen.root}/#{path_to_command_file} #{reference_origen_root}/#{path_to_command_file}"
end
|
#disable_origen_version_check ⇒ Object
117
118
119
120
121
122
123
124
125
|
# File 'lib/origen/regression_manager.rb', line 117
def disable_origen_version_check
if Origen.respond_to?(:with_disable_origen_version_check)
Origen.with_disable_origen_version_check(all_processes: true) do
yield
end
else
yield
end
end
|
#get_reference_workspace(_options = {}) ⇒ Object
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
|
# File 'lib/origen/regression_manager.rb', line 261
def get_reference_workspace(_options = {})
puts ''
puts 'It looks like this is the first time that you have run a regression from this workspace.'
puts ''
puts 'In order to run a regression test Origen must have access to a secondary workspace in which'
puts 'it can build the reference files.'
puts ''
puts 'Generally all of your developments workspaces should use the same reference workspace.'
puts ''
puts 'Origen will make a suggestion for the reference workspace below, however if you know that'
puts 'you already have an existing one at a different location then please enter the path.'
puts ''
puts 'WHERE SHOULD THE REFERENCE WORKSPACE RESIDE?'
puts ''
get_text(default: ws.reference_workspace_proposal, single: true)
end
|
#get_version(_options = {}) ⇒ Object
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
|
# File 'lib/origen/regression_manager.rb', line 278
def get_version(_options = {})
puts ''
puts 'WHAT VERSION DO YOU WANT TO COMPARE AGAINST?'
puts ''
if Origen.app.rc.git?
puts "Valid values are 'latest', 'last' (production release), a tag, a commit or a branch."
else
puts "Valid values are 'latest', 'last' (production release), or a tag."
end
puts ''
v = VersionString.new(get_text(default: Origen.app.version, single: true))
if v.semantic?
v.prefixed
else
v
end
end
|
#load_options ⇒ Object
175
176
177
178
179
180
181
182
183
184
|
# File 'lib/origen/regression_manager.rb', line 175
def load_options
options = {}
if File.exist?(store_file)
File.open(store_file.to_s) do |f|
options = Marshal.load(f)
end
FileUtils.rm_f store_file
end
options
end
|
#prepare_targets(options) ⇒ Object
Cycle through all targets in the upcoming run to ensure that all output directories exist
160
161
162
163
164
165
166
167
168
169
|
# File 'lib/origen/regression_manager.rb', line 160
def prepare_targets(options)
targets = [options[:target], options[:targets]].flatten.compact
if targets.empty?
puts 'You must supply the targets you are going to run in the options'
puts 'passed to regression_manager.run.'
fail
end
Origen.target.loop(options) { |_options| }
targets
end
|
#reference_origen_root ⇒ Object
201
202
203
204
205
206
207
|
# File 'lib/origen/regression_manager.rb', line 201
def reference_origen_root
if running_in_reference_workspace?
Origen.root
else
ws.origen_root(@reference_workspace)
end
end
|
#regression_command_file ⇒ Object
Returns a full path to the regression command file within the local application
254
255
256
257
258
259
|
# File 'lib/origen/regression_manager.rb', line 254
def regression_command_file
first_call = caller.find { |line| line =~ /regression_manager.rb.*run/ }
app_caller_line = caller[caller.index(first_call) + 1]
app_caller_line =~ /(.*\.rb)/
path = Pathname.new(Regexp.last_match[1])
end
|
#run(options = {}) ⇒ Object
Serves to execute a regression. Any block of code passed to this method will receive regression check
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
# File 'lib/origen/regression_manager.rb', line 35
def run(options = {})
options = {
build_reference: true,
send_email: false,
email_all_developers: false,
report_results: false,
uses_lsf: true
}.merge(options)
options = load_options if running_in_reference_workspace?
targets = prepare_targets(options)
if running_in_reference_workspace?
Origen.lsf.clear_all
yield options
wait_for_completion(options) if options[:uses_lsf]
save_and_delete_output
else
if options[:build_reference]
@reference_tag = version_to_tag(options[:version] || get_version(options))
setup_reference_workspace(options)
save_options(options)
Origen.with_origen_root(reference_origen_root) do
disable_origen_version_check do
Dir.chdir reference_origen_root do
Bundler.with_clean_env do
system 'rm -rf lbin'
if options[:service_account]
puts "Running with a service account, setting up the workspace manually now, assuming it runs BASH!! <-- can't assume bash always"
puts 'This is not an ideal way, need to discuss. Though, a normal user will never set service_account to true'
system 'source ~/.bash_profile'
system 'source ~/.bashrc.user'
system 'bundle install --gemfile Gemfile --binstubs lbin --path ~/.origen/gems/' system 'origen -v' else
if Origen.site_config.gem_manage_bundler
system 'origen -v'
system 'bundle install' system 'origen m debug'
else
system 'bundle install' system 'bundle exec origen -v'
system 'origen m debug'
end
end
Origen.log.info '######################################################'
Origen.log.info 'running regression command in reference workspace...'
Origen.log.info '######################################################'
Origen.log.info
if Origen.site_config.gem_manage_bundler
system 'origen regression'
else
system 'bundle exec origen regression'
end
end
end
end
end
end
Origen.lsf.clear_all
Origen.log.info '######################################################'
Origen.log.info 'running regression command in local workspace...'
Origen.log.info '######################################################'
Origen.log.info
yield options
wait_for_completion(options) if options[:uses_lsf]
summarize_results(options)
unless Origen.app.stats.clean_run?
exit 1
end
end
end
|
#running_in_reference_workspace? ⇒ Boolean
192
193
194
|
# File 'lib/origen/regression_manager.rb', line 192
def running_in_reference_workspace?
File.exist?("#{Origen.root}/.this_is_a_reference_workspace")
end
|
#save_and_delete_output ⇒ Object
Saves all generated output (to the reference dir) and then deletes the output directory to save space
147
148
149
150
151
152
153
154
155
156
|
# File 'lib/origen/regression_manager.rb', line 147
def save_and_delete_output
Origen.lsf.build_log
Origen.log.flush
Dir.chdir reference_origen_root do
Bundler.with_clean_env do
system 'bundle exec origen save all'
end
end
FileUtils.rm_rf "#{reference_origen_root}/output"
end
|
#save_options(options) ⇒ Object
186
187
188
189
190
|
# File 'lib/origen/regression_manager.rb', line 186
def save_options(options)
File.open(store_file.to_s, 'w') do |f|
Marshal.dump(options, f)
end
end
|
#setup_reference_workspace(options) ⇒ Object
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
|
# File 'lib/origen/regression_manager.rb', line 209
def setup_reference_workspace(options)
if ws.reference_workspace_set?
if options[:reference_workspace]
@reference_workspace = options[:reference_workspace]
unless File.exist?(@reference_workspace)
highlight { Origen.log.info 'Building reference workspace...' }
ws.build(@reference_workspace)
end
ws.set_reference_workspace(@reference_workspace)
else
@reference_workspace = ws.reference_workspace
end
else
if options[:reference_workspace]
@reference_workspace = options[:reference_workspace]
else
@reference_workspace = get_reference_workspace
end
unless File.exist?(@reference_workspace)
highlight { Origen.log.info 'Building reference workspace...' }
ws.build(@reference_workspace)
end
ws.set_reference_workspace(@reference_workspace)
end
highlight { Origen.log.info "Switching reference workspace to version #{@reference_tag}..." }
ws.switch_version(@reference_workspace, @reference_tag, origen_root_only: true)
unless File.exist?("#{reference_origen_root}/.this_is_a_reference_workspace")
system "touch #{reference_origen_root}/.this_is_a_reference_workspace"
end
copy_regression_file
end
|
#store_file ⇒ Object
171
172
173
|
# File 'lib/origen/regression_manager.rb', line 171
def store_file
@store_file ||= Pathname.new "#{reference_origen_root}/.regression_options"
end
|
#summarize_results(options = {}) ⇒ Object
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
# File 'lib/origen/regression_manager.rb', line 127
def summarize_results(options = {})
Origen.lsf.build_log
stats = Origen.app.stats
if options[:report_results]
puts "Regression results: \n"
puts "#{stats.summary_text}\n"
end
if stats.clean_run?
stats.report_pass
else
stats.report_fail
end
if options[:send_email]
to = options[:email_all_developers] ? developers : current_user
Origen.mailer.send_regression_complete_notice(to: to)
end
end
|
#version_to_tag(version) ⇒ Object
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
# File 'lib/origen/regression_manager.rb', line 296
def version_to_tag(version)
version = version.strip
if version.downcase == 'last'
Origen.app.version_tracker.versions.last
elsif version.downcase == 'latest'
if Origen.app.rc.git?
if Origen.app.config.rc_workflow == :gitflow
'develop'
else
'master'
end
else
version
end
else
version
end
end
|
#wait_for_completion(_options = {}) ⇒ Object
196
197
198
199
|
# File 'lib/origen/regression_manager.rb', line 196
def wait_for_completion(_options = {})
highlight { Origen.log.info 'Waiting for all to complete...' }
Origen.lsf.wait_for_completion
end
|
21
22
23
|
# File 'lib/origen/regression_manager.rb', line 21
def ws
Origen.app.workspace_manager
end
|