openstudio-workflow 1.0.0.pat1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +12 -0
- data/README.md +16 -68
- data/Rakefile +9 -9
- data/bin/openstudio_cli +786 -0
- data/lib/openstudio/workflow/adapters/input/local.rb +97 -0
- data/lib/openstudio/workflow/adapters/output/local.rb +90 -0
- data/lib/openstudio/workflow/adapters/output/socket.rb +70 -0
- data/lib/openstudio/workflow/{jobs/run_preflight/run_preflight.rb → adapters/output/web.rb} +37 -19
- data/lib/openstudio/workflow/{adapter.rb → adapters/output_adapter.rb} +53 -51
- data/lib/openstudio/workflow/job.rb +22 -0
- data/lib/openstudio/workflow/jobs/{run_energyplus → resources}/monthly_report.idf +0 -0
- data/lib/openstudio/workflow/jobs/run_energyplus.rb +49 -0
- data/lib/openstudio/workflow/jobs/run_ep_measures.rb +55 -0
- data/lib/openstudio/workflow/jobs/run_initialization.rb +136 -0
- data/lib/openstudio/workflow/jobs/run_os_measures.rb +59 -0
- data/lib/openstudio/workflow/jobs/run_postprocess.rb +53 -0
- data/lib/openstudio/workflow/jobs/run_preprocess.rb +81 -0
- data/lib/openstudio/workflow/jobs/run_reporting_measures.rb +86 -0
- data/lib/openstudio/workflow/jobs/run_translation.rb +49 -0
- data/lib/openstudio/workflow/multi_delegator.rb +1 -3
- data/lib/openstudio/workflow/registry.rb +137 -0
- data/lib/openstudio/workflow/run.rb +182 -221
- data/lib/openstudio/workflow/time_logger.rb +1 -1
- data/lib/openstudio/workflow/util/energyplus.rb +564 -0
- data/lib/openstudio/workflow/util/io.rb +33 -0
- data/lib/openstudio/workflow/util/measure.rb +520 -0
- data/lib/openstudio/workflow/util/model.rb +100 -0
- data/lib/openstudio/workflow/util/post_process.rb +177 -0
- data/lib/openstudio/workflow/util/weather_file.rb +108 -0
- data/lib/openstudio/workflow/util.rb +14 -0
- data/lib/openstudio/workflow/version.rb +1 -1
- data/lib/openstudio/workflow_json.rb +399 -0
- data/lib/openstudio/workflow_runner.rb +213 -0
- data/lib/openstudio-workflow.rb +13 -118
- metadata +45 -85
- data/lib/openstudio/extended_runner.rb +0 -105
- data/lib/openstudio/workflow/adapters/local.rb +0 -101
- data/lib/openstudio/workflow/adapters/mongo.rb +0 -227
- data/lib/openstudio/workflow/jobs/lib/apply_measures.rb +0 -253
- data/lib/openstudio/workflow/jobs/run_energyplus/run_energyplus.rb +0 -314
- data/lib/openstudio/workflow/jobs/run_openstudio/run_openstudio.rb +0 -230
- data/lib/openstudio/workflow/jobs/run_postprocess/run_postprocess.rb +0 -110
- data/lib/openstudio/workflow/jobs/run_reporting_measures/run_reporting_measures.rb +0 -471
- data/lib/openstudio/workflow/jobs/run_runmanager/run_runmanager.rb +0 -247
- data/lib/openstudio/workflow/jobs/run_xml/run_xml.rb +0 -279
@@ -17,181 +17,236 @@
|
|
17
17
|
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
18
18
|
######################################################################
|
19
19
|
|
20
|
-
|
20
|
+
require_relative 'registry'
|
21
|
+
require_relative 'adapters/input/local'
|
22
|
+
require_relative 'adapters/output/local'
|
23
|
+
|
24
|
+
require 'logger'
|
25
|
+
|
26
|
+
# Run Class for OpenStudio workflow. All comments here need some love, as well as the code itself
|
21
27
|
module OpenStudio
|
22
28
|
module Workflow
|
23
29
|
class Run
|
24
|
-
attr_accessor :
|
25
|
-
attr_accessor :workflow_arguments
|
30
|
+
attr_accessor :registry
|
26
31
|
|
27
32
|
attr_reader :options
|
28
|
-
attr_reader :
|
29
|
-
attr_reader :
|
30
|
-
attr_reader :run_directory
|
31
|
-
attr_reader :final_state
|
33
|
+
attr_reader :input_adapter
|
34
|
+
attr_reader :output_adapter
|
32
35
|
attr_reader :final_message
|
33
36
|
attr_reader :job_results
|
37
|
+
attr_reader :current_state
|
34
38
|
|
35
|
-
#
|
36
|
-
|
37
|
-
|
38
|
-
{ from: :queued, to: :preflight },
|
39
|
-
{ from: :preflight, to: :openstudio },
|
40
|
-
{ from: :openstudio, to: :energyplus },
|
41
|
-
{ from: :energyplus, to: :reporting_measures },
|
42
|
-
{ from: :reporting_measures, to: :postprocess },
|
43
|
-
{ from: :postprocess, to: :finished }
|
44
|
-
]
|
45
|
-
end
|
46
|
-
|
47
|
-
# The default states for the workflow. Note that the states of :queued of :finished need
|
48
|
-
# to exist for all cases.
|
49
|
-
def self.default_states
|
50
|
-
[
|
51
|
-
{ state: :queued, options: { initial: true } },
|
52
|
-
{ state: :preflight, options: { after_enter: :run_preflight } },
|
53
|
-
{ state: :openstudio, options: { after_enter: :run_openstudio } }, # TODO: this should be run_openstudio_measures and run_energyplus_measures
|
54
|
-
{ state: :energyplus, options: { after_enter: :run_energyplus } },
|
55
|
-
{ state: :reporting_measures, options: { after_enter: :run_reporting_measures } },
|
56
|
-
{ state: :postprocess, options: { after_enter: :run_postprocess } },
|
57
|
-
{ state: :finished },
|
58
|
-
{ state: :errored }
|
59
|
-
]
|
60
|
-
end
|
61
|
-
|
62
|
-
# transitions for pat job
|
63
|
-
def self.pat_transition
|
64
|
-
[
|
65
|
-
{ from: :queued, to: :preflight },
|
66
|
-
{ from: :preflight, to: :runmanager },
|
67
|
-
{ from: :runmanager, to: :postprocess },
|
68
|
-
{ from: :postprocess, to: :finished }
|
69
|
-
]
|
70
|
-
end
|
71
|
-
|
72
|
-
# states for pat job
|
73
|
-
def self.pat_states
|
39
|
+
# Define the default set of jobs. Note that the states of :queued of :finished need to exist for all job arrays.
|
40
|
+
#
|
41
|
+
def self.default_jobs
|
74
42
|
[
|
75
|
-
{ state: :queued, options: { initial: true } },
|
76
|
-
{ state: :
|
77
|
-
|
78
|
-
{ state: :
|
43
|
+
{ state: :queued, next_state: :initialization, options: { initial: true } },
|
44
|
+
{ state: :initialization, next_state: :os_measures, job: :RunInitialization,
|
45
|
+
file: 'openstudio/workflow/jobs/run_initialization', options: {} },
|
46
|
+
{ state: :os_measures, next_state: :translator, job: :RunOpenStudioMeasures,
|
47
|
+
file: 'openstudio/workflow/jobs/run_os_measures.rb', options: {} },
|
48
|
+
{ state: :translator, next_state: :ep_measures, job: :RunTranslation,
|
49
|
+
file: 'openstudio/workflow/jobs/run_translation.rb', options: {} },
|
50
|
+
{ state: :ep_measures, next_state: :preprocess, job: :RunEnergyPlusMeasures,
|
51
|
+
file: 'openstudio/workflow/jobs/run_ep_measures.rb', options: {} },
|
52
|
+
{ state: :preprocess, next_state: :simulation, job: :RunPreprocess,
|
53
|
+
file: 'openstudio/workflow/jobs/run_preprocess.rb', options: {} },
|
54
|
+
{ state: :simulation, next_state: :reporting_measures, job: :RunEnergyPlus,
|
55
|
+
file: 'openstudio/workflow/jobs/run_energyplus.rb', options: {} },
|
56
|
+
{ state: :reporting_measures, next_state: :postprocess, job: :RunReportingMeasures,
|
57
|
+
file: 'openstudio/workflow/jobs/run_reporting_measures.rb', options: {} },
|
58
|
+
{ state: :postprocess, next_state: :finished, job: :RunPostprocess,
|
59
|
+
file: 'openstudio/workflow/jobs/run_postprocess.rb', options: {} },
|
79
60
|
{ state: :finished },
|
80
61
|
{ state: :errored }
|
81
62
|
]
|
82
63
|
end
|
83
64
|
|
84
|
-
#
|
65
|
+
# Initialize a new run class
|
85
66
|
#
|
86
|
-
# @param
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
90
|
-
|
91
|
-
|
67
|
+
# @param [String] osw_path the path to the OSW file to run. It is highly recommended that this be an absolute
|
68
|
+
# path, however if not it will be made absolute relative to the current working directory
|
69
|
+
# @param [Hash] options ({}) A set of user-specified options that are used to override default behaviors. Some
|
70
|
+
# sort of definitive documentation is needed for this hash
|
71
|
+
# @option options [Hash] :transitions Non-default transitions set (see Run#default_transition)
|
72
|
+
# @option options [Hash] :states Non-default states set (see Run#default_states)
|
73
|
+
# @option options [Hash] :jobs ???
|
74
|
+
# @todo (rhorsey) establish definitive documentation on all option parameters
|
75
|
+
#
|
76
|
+
def initialize(osw_path, options = {})
|
77
|
+
# DLM - what is final_message?
|
92
78
|
@final_message = ''
|
93
79
|
@current_state = nil
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
#
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
80
|
+
|
81
|
+
# Registry is a large hash of objects that are populated during the run, the number of objects in the registry should be reduced over time
|
82
|
+
# - openstudio_2 - true if we are running in OpenStudio 2.X environment
|
83
|
+
# - logger - general logger
|
84
|
+
# - log_targets - IO devices that are being logged to
|
85
|
+
# - time_logger - logger for doing profiling - time to run each step will be captured in OSResult, deprecate
|
86
|
+
# - workflow - the current OSW parsed as a Ruby Hash
|
87
|
+
# - workflow_json - the current WorkflowJSON object
|
88
|
+
# - osw_dir - the directory the OSW was loaded from as a string
|
89
|
+
# - root_dir - the root directory in the OSW as a string
|
90
|
+
# - run_dir - the run directory for the simulation as a string
|
91
|
+
# - datapoint - the current OSD parsed as a Ruby Hash
|
92
|
+
# - analysis - the current OSA parsed as a Ruby Hash
|
93
|
+
# - runner - the current OSRunner object
|
94
|
+
# - results - the output of the run_extract_inputs_and_outputs method
|
95
|
+
# - model - the current OpenStudio Model object, updated after each step
|
96
|
+
# - model_idf - the current EnergyPlus Workspace object, updated after each step
|
97
|
+
# - wf - the path to the current weather file as a string, updated after each step
|
98
|
+
# - output_attributes - ? - deprecate
|
99
|
+
# - sql - the path to the current EnergyPlus SQL file as a string
|
100
|
+
@registry = Registry.new
|
101
|
+
|
102
|
+
openstudio_2 = false
|
103
|
+
begin
|
104
|
+
# OpenStudio 2.X test
|
105
|
+
OpenStudio::WorkflowJSON.new
|
106
|
+
openstudio_2 = true
|
107
|
+
rescue NameError => e
|
108
|
+
end
|
109
|
+
@registry.register(:openstudio_2) { openstudio_2 }
|
110
|
+
|
111
|
+
# get the input osw
|
112
|
+
@input_adapter = OpenStudio::Workflow::InputAdapter::Local.new(osw_path)
|
113
|
+
|
114
|
+
# create the output adapter
|
115
|
+
@output_adapter = nil
|
116
|
+
if options[:output_adapter]
|
117
|
+
@output_adapter = options[:output_adapter]
|
109
118
|
else
|
110
|
-
|
111
|
-
transitions: OpenStudio::Workflow::Run.default_transition,
|
112
|
-
states: OpenStudio::Workflow::Run.default_states,
|
113
|
-
jobs: {}
|
114
|
-
}
|
119
|
+
@output_adapter = OpenStudio::Workflow::OutputAdapter::Local.new(output_directory: @input_adapter.run_dir)
|
115
120
|
end
|
116
|
-
@options = defaults.merge(options)
|
117
121
|
|
118
|
-
@
|
122
|
+
@registry.register(:osw_path) { @input_adapter.osw_path }
|
123
|
+
@registry.register(:osw_dir) { @input_adapter.osw_dir }
|
124
|
+
@registry.register(:run_dir) { @input_adapter.run_dir }
|
125
|
+
|
126
|
+
# DLM: need to check that we have correct permissions to all these paths
|
119
127
|
|
120
128
|
# By default blow away the entire run directory every time and recreate it
|
121
|
-
|
122
|
-
|
129
|
+
unless options[:preserve_run_dir]
|
130
|
+
if File.exist?(@registry[:run_dir])
|
131
|
+
# logger is not initialized yet (it needs run dir to exist for log)
|
132
|
+
puts "Removing existing run directory #{@registry[:run_dir]}" if options[:debug]
|
133
|
+
|
134
|
+
# DLM: this is dangerous, we are calling rm_rf on a user entered directory, need to check this first
|
135
|
+
# TODO: Echoing Dan's comment
|
136
|
+
FileUtils.rm_rf(@registry[:run_dir])
|
137
|
+
end
|
138
|
+
end
|
139
|
+
FileUtils.mkdir_p(@registry[:run_dir])
|
140
|
+
|
141
|
+
defaults = {
|
142
|
+
jobs: OpenStudio::Workflow::Run.default_jobs,
|
143
|
+
preserve_run_dir: false,
|
144
|
+
debug: false,
|
145
|
+
profile: true
|
146
|
+
}
|
147
|
+
if options[:targets].nil?
|
148
|
+
# DLM: need to make sure that run.log will be closed later
|
149
|
+
defaults[:targets] = [STDOUT, File.open(File.join(@registry[:run_dir], 'run.log'), 'a')]
|
150
|
+
end
|
151
|
+
@options = defaults.merge(options)
|
123
152
|
|
124
|
-
|
125
|
-
|
153
|
+
@registry.register(:log_targets) { @options[:targets] }
|
154
|
+
@registry.register(:time_logger) { TimeLogger.new } if @options[:profile]
|
126
155
|
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
156
|
+
# Initialize the MultiDelegator logger
|
157
|
+
logger_level = @options[:debug] ? ::Logger::DEBUG : ::Logger::WARN
|
158
|
+
@logger = ::Logger.new(MultiDelegator.delegate(:write, :close).to(*@options[:targets])) # * is the splat operator
|
159
|
+
@logger.level = logger_level
|
160
|
+
@registry.register(:logger) { @logger }
|
161
|
+
|
162
|
+
@logger.info "openstudio_2 = #{@registry[:openstudio_2]}"
|
163
|
+
|
164
|
+
openstudio_dir = "unknown"
|
165
|
+
begin
|
166
|
+
openstudio_dir = $OpenStudio_Dir
|
167
|
+
if openstudio_dir.nil?
|
168
|
+
openstudio_dir = OpenStudio::getOpenStudioModuleDirectory.to_s
|
169
|
+
end
|
170
|
+
rescue
|
132
171
|
end
|
172
|
+
@logger.info "openstudio_dir = #{openstudio_dir}"
|
133
173
|
|
134
|
-
@logger.info "Initializing directory #{@
|
174
|
+
@logger.info "Initializing directory #{@registry[:run_dir]} for simulation with options #{@options}"
|
135
175
|
|
136
|
-
#
|
137
|
-
|
176
|
+
# Define the state and transitions
|
177
|
+
@current_state = :queued
|
178
|
+
@jobs = @options[:jobs]
|
138
179
|
end
|
139
180
|
|
140
|
-
#
|
141
|
-
#
|
181
|
+
# execute the workflow defined in the state object
|
182
|
+
#
|
183
|
+
# @todo add a catch if any job fails
|
184
|
+
# @todo make a block method to provide feedback
|
142
185
|
def run
|
143
|
-
@logger.info "Starting workflow in #{@
|
186
|
+
@logger.info "Starting workflow in #{@registry[:run_dir]}"
|
144
187
|
begin
|
188
|
+
next_state
|
145
189
|
while @current_state != :finished && @current_state != :errored
|
146
190
|
sleep 2
|
147
191
|
step
|
148
192
|
end
|
149
193
|
|
150
194
|
@logger.info 'Finished workflow - communicating results and zipping files'
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
# these are the results that need to be sent back to adapter
|
155
|
-
if @job_results[:run_runmanager]
|
156
|
-
@logger.info 'Sending the run_runmananger results back to the adapter'
|
157
|
-
@adapter.communicate_results @directory, @job_results[:run_runmanager]
|
158
|
-
elsif @job_results[:run_reporting_measures]
|
159
|
-
@logger.info 'Sending the reporting measures results back to the adapter'
|
160
|
-
@time_logger.save(File.join(@directory, 'profile.json'))
|
161
|
-
@adapter.communicate_results @directory, @job_results[:run_reporting_measures]
|
162
|
-
end
|
195
|
+
@output_adapter.communicate_results(@registry[:run_dir], @registry[:results])
|
196
|
+
rescue => e
|
197
|
+
@logger.info "Error occurred during running with #{e.message}"
|
163
198
|
ensure
|
199
|
+
@logger.info 'Workflow complete'
|
200
|
+
|
164
201
|
if @current_state == :errored
|
165
|
-
@
|
202
|
+
@registry[:workflow_json].setCompletedStatus('Fail') if @registry[:workflow_json]
|
166
203
|
else
|
167
|
-
@
|
204
|
+
@registry[:workflow_json].setCompletedStatus('Success')
|
168
205
|
end
|
169
206
|
|
170
|
-
|
171
|
-
|
172
|
-
|
207
|
+
# save all files before calling output adapter
|
208
|
+
@registry[:log_targets].each(&:flush)
|
209
|
+
|
210
|
+
# save workflow with results
|
211
|
+
if @registry[:workflow_json]
|
212
|
+
out_path = @registry[:workflow_json].absoluteOutPath
|
213
|
+
@registry[:workflow_json].saveAs(out_path)
|
214
|
+
end
|
215
|
+
|
216
|
+
# Write out the TimeLogger to the filesystem
|
217
|
+
@registry[:time_logger].save(File.join(@registry[:run_dir], 'profile.json')) if @registry[:time_logger]
|
173
218
|
|
174
|
-
|
175
|
-
|
219
|
+
if @current_state == :errored
|
220
|
+
@output_adapter.communicate_failure
|
221
|
+
else
|
222
|
+
@output_adapter.communicate_complete
|
223
|
+
end
|
176
224
|
|
177
|
-
# Print the objective functions to the screen even though the file is being used right now
|
178
|
-
# Note as well that we can't guarantee that the csv format will be in the right order
|
179
|
-
puts obj_function_array.join(',')
|
180
225
|
end
|
181
226
|
|
182
227
|
@current_state
|
183
228
|
end
|
184
229
|
|
185
230
|
# Step through the states, if there is an error (e.g. exception) then go to error
|
186
|
-
|
231
|
+
#
|
232
|
+
def step
|
233
|
+
step_instance = @jobs.find { |h| h[:state] == @current_state }
|
234
|
+
require step_instance[:file]
|
235
|
+
klass = OpenStudio::Workflow.new_class(step_instance[:job], @input_adapter, @output_adapter, @registry, options)
|
236
|
+
@output_adapter.communicate_transition("Starting state #{@current_state}", :state)
|
237
|
+
state_return = klass.perform
|
238
|
+
if state_return
|
239
|
+
@output_adapter.communicate_transition("Returned from state #{@current_state} with message #{state_return}", :state)
|
240
|
+
else
|
241
|
+
@output_adapter.communicate_transition("Returned from state #{@current_state}", :state)
|
242
|
+
end
|
187
243
|
next_state
|
188
|
-
|
189
|
-
send("run_#{@current_state}")
|
190
244
|
rescue => e
|
191
245
|
step_error("#{e.message}:#{e.backtrace.join("\n")}")
|
192
246
|
end
|
193
247
|
|
194
|
-
#
|
248
|
+
# Error handling for when there is an exception running any of the state transitions
|
249
|
+
#
|
195
250
|
def step_error(*args)
|
196
251
|
# Make sure to set the instance variable @error to true in order to stop the :step
|
197
252
|
# event from being fired.
|
@@ -202,117 +257,23 @@ module OpenStudio
|
|
202
257
|
@current_state = :errored
|
203
258
|
end
|
204
259
|
|
205
|
-
#
|
206
|
-
#
|
207
|
-
def
|
208
|
-
|
209
|
-
klass = get_run_class(__method__)
|
210
|
-
|
211
|
-
@job_results[__method__.to_sym] = klass.perform
|
212
|
-
end
|
213
|
-
|
214
|
-
# run openstudio to create the model and apply the measures
|
215
|
-
def run_openstudio
|
216
|
-
@logger.info "Running #{__method__}"
|
217
|
-
klass = get_run_class(__method__)
|
218
|
-
|
219
|
-
# TODO: save the resulting filenames to an array
|
220
|
-
@job_results[__method__.to_sym] = klass.perform
|
221
|
-
end
|
222
|
-
|
223
|
-
# run a pat file using runmanager
|
224
|
-
def run_runmanager
|
225
|
-
@logger.info "Running #{__method__}"
|
226
|
-
klass = get_run_class(__method__)
|
227
|
-
|
228
|
-
# TODO: save the resulting filenames to an array
|
229
|
-
@job_results[__method__.to_sym] = klass.perform
|
230
|
-
end
|
231
|
-
|
232
|
-
# run reporting measures
|
233
|
-
def run_reporting_measures
|
234
|
-
@logger.info "Running #{__method__}"
|
235
|
-
klass = get_run_class(__method__)
|
236
|
-
|
237
|
-
# TODO: save the resulting filenames to an array
|
238
|
-
@job_results[__method__.to_sym] = klass.perform
|
239
|
-
end
|
240
|
-
|
241
|
-
def run_postprocess
|
242
|
-
@logger.info "Running #{__method__}"
|
243
|
-
klass = get_run_class(__method__)
|
244
|
-
|
245
|
-
@job_results[__method__.to_sym] = klass.perform
|
246
|
-
end
|
247
|
-
|
248
|
-
# preconfigured run method for preflight. This configures the input directories and sets everything
|
249
|
-
# up for running the simulations.
|
250
|
-
def run_preflight
|
251
|
-
@logger.info "Running #{__method__}"
|
252
|
-
klass = get_run_class(__method__)
|
253
|
-
|
254
|
-
@job_results[__method__.to_sym] = klass.perform
|
255
|
-
end
|
256
|
-
|
257
|
-
def run_xml
|
258
|
-
@logger.info "Running #{__method__}"
|
259
|
-
klass = get_run_class(__method__)
|
260
|
-
|
261
|
-
@job_results[__method__.to_sym] = klass.perform
|
262
|
-
@logger.info @job_results
|
263
|
-
end
|
264
|
-
|
265
|
-
# last method that is called.
|
266
|
-
def run_finished
|
267
|
-
@logger.info "Running #{__method__}"
|
260
|
+
# Return the finished state and exit
|
261
|
+
#
|
262
|
+
def run_finished(_, _, _)
|
263
|
+
logger.info "Running #{__method__}"
|
268
264
|
|
269
265
|
@current_state
|
270
266
|
end
|
271
|
-
alias_method :final_state, :run_finished
|
272
267
|
|
273
268
|
private
|
274
269
|
|
275
|
-
#
|
276
|
-
#
|
277
|
-
def machine
|
278
|
-
@logger.info 'Initializing state machine'
|
279
|
-
@current_state = :queued
|
280
|
-
|
281
|
-
@transitions = @options[:transitions]
|
282
|
-
end
|
283
|
-
|
270
|
+
# Advance the @current_state to the next state
|
271
|
+
#
|
284
272
|
def next_state
|
285
273
|
@logger.info "Current state: '#{@current_state}'"
|
286
|
-
ns = @
|
274
|
+
ns = @jobs.find { |h| h[:state] == @current_state }[:next_state]
|
287
275
|
@logger.info "Next state will be: '#{ns}'"
|
288
|
-
|
289
|
-
# Set the next state before calling the method
|
290
276
|
@current_state = ns
|
291
|
-
|
292
|
-
# do not return anything, the step method uses the @current_state variable to call run_#{next_state}
|
293
|
-
end
|
294
|
-
|
295
|
-
# Get any options that may have been sent into the class defining the workflow step
|
296
|
-
def get_job_options
|
297
|
-
result = {}
|
298
|
-
# if @options[:jobs].has_key?(@current_state)
|
299
|
-
# logger.info "Retrieving job options from the @options array for #{state.current_state}"
|
300
|
-
# result = @options[:jobs][@current_state]
|
301
|
-
# end
|
302
|
-
|
303
|
-
# result
|
304
|
-
|
305
|
-
# TODO: fix this so that it gets the base config options plus its job options. Need to
|
306
|
-
# also merge in all the former job results.
|
307
|
-
@options.merge(@job_results)
|
308
|
-
end
|
309
|
-
|
310
|
-
def get_run_class(from_method)
|
311
|
-
require_relative "jobs/#{from_method}/#{from_method}"
|
312
|
-
klass_name = from_method.to_s.split('_').map(&:capitalize) * ''
|
313
|
-
@logger.info "Getting method for state transition '#{from_method}'"
|
314
|
-
klass = Object.const_get(klass_name).new(@directory, @logger, @time_logger, @adapter, @workflow_arguments, @past_results, get_job_options)
|
315
|
-
klass
|
316
277
|
end
|
317
278
|
end
|
318
279
|
end
|
@@ -13,7 +13,7 @@ class TimeLogger
|
|
13
13
|
def start(channel)
|
14
14
|
# warning -- "will reset timer for #{moniker}" if @monikers.key? moniker
|
15
15
|
s = ::Time.now
|
16
|
-
@channels[channel] = { start_time_str:
|
16
|
+
@channels[channel] = { start_time_str: s.to_s, start_time: s.to_f }
|
17
17
|
end
|
18
18
|
|
19
19
|
def stop(channel)
|