aws-flow 1.3.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. checksums.yaml +15 -0
  2. data/aws-flow.gemspec +1 -0
  3. data/lib/aws/decider/activity.rb +8 -6
  4. data/lib/aws/decider/async_decider.rb +1 -0
  5. data/lib/aws/decider/async_retrying_executor.rb +3 -3
  6. data/lib/aws/decider/decider.rb +16 -14
  7. data/lib/aws/decider/executor.rb +35 -22
  8. data/lib/aws/decider/flow_defaults.rb +28 -14
  9. data/lib/aws/decider/generic_client.rb +3 -4
  10. data/lib/aws/decider/options.rb +91 -117
  11. data/lib/aws/decider/state_machines.rb +1 -0
  12. data/lib/aws/decider/utilities.rb +15 -0
  13. data/lib/aws/decider/version.rb +1 -1
  14. data/lib/aws/decider/worker.rb +14 -8
  15. data/lib/aws/decider/workflow_client.rb +16 -11
  16. data/lib/aws/runner.rb +43 -39
  17. data/spec/aws/decider/integration/activity_spec.rb +345 -0
  18. data/spec/aws/{integration → decider/integration}/integration_spec.rb +818 -1183
  19. data/spec/aws/decider/integration/setup.rb +3 -0
  20. data/spec/aws/decider/unit/activity_spec.rb +233 -0
  21. data/spec/aws/decider/unit/async_retrying_executor_spec.rb +131 -0
  22. data/spec/aws/{unit → decider/unit}/decider_spec.rb +171 -718
  23. data/spec/aws/decider/unit/executor_spec.rb +123 -0
  24. data/spec/aws/decider/unit/flow_defaults_spec.rb +62 -0
  25. data/spec/aws/decider/unit/misc_spec.rb +101 -0
  26. data/spec/aws/decider/unit/options_spec.rb +289 -0
  27. data/spec/aws/decider/unit/retry_spec.rb +217 -0
  28. data/spec/aws/{unit → decider/unit}/rubyflow.rb +0 -0
  29. data/spec/aws/decider/unit/setup.rb +3 -0
  30. data/spec/aws/decider/unit/worker_spec.rb +325 -0
  31. data/spec/aws/decider/unit/workflow_client_spec.rb +83 -0
  32. data/spec/aws/{unit → flow}/async_backtrace_spec.rb +0 -0
  33. data/spec/aws/{unit → flow}/async_scope_spec.rb +0 -0
  34. data/spec/aws/{unit → flow}/begin_rescue_ensure_spec.rb +1 -0
  35. data/spec/aws/{unit → flow}/external_task_spec.rb +0 -0
  36. data/spec/aws/{unit → flow}/factories.rb +0 -0
  37. data/spec/aws/{unit → flow}/fiber_condition_variable_spec.rb +0 -0
  38. data/spec/aws/{unit → flow}/fiber_spec.rb +0 -0
  39. data/spec/aws/{unit → flow}/flow_spec.rb +0 -0
  40. data/spec/aws/{unit → flow}/future_spec.rb +0 -0
  41. data/spec/aws/{unit → flow}/simple_dfa_spec.rb +0 -0
  42. data/spec/aws/{integration → runner/integration}/runner_integration_spec.rb +16 -43
  43. data/spec/aws/{unit → runner/unit}/runner_unit_spec.rb +18 -18
  44. data/spec/spec_helper.rb +264 -2
  45. metadata +37 -28
  46. data/spec/aws/unit/executor_spec.rb +0 -49
  47. data/spec/aws/unit/options_spec.rb +0 -293
  48. data/spec/aws/unit/preinclude_tests.rb +0 -149
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZDY5Y2FlNWU1YWQ4ODI4OWIzNGVhZDY2Yjg5ZDI5MjExYzQyODgyNg==
5
+ data.tar.gz: !binary |-
6
+ ZjA4MTljNTcwNjNhYWE0MjZlZGVkMjY2YmI4YzE2Y2Y0MGZiM2Q2NQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ NDU4NzdjNGE1NDRiNDA2NjEzZjc5YmM2NzQ4MWIxMjZhNDA2OWE4MDZiMzI1
10
+ NzQ0NTY3OWVmMjFmYzQwMzNhMDJhZDI4ODczNjhlMzEwMjMwYWQzOWU0MWNl
11
+ ODQyNTQ3NWM5ZDMzZjJkNjgxOGMwMmE5ZTliOGFjNTM0ZDJiYWU=
12
+ data.tar.gz: !binary |-
13
+ OGU3NzgxYTQ2YmZmMTBmMzNiMzAxNzQ5NWJiNTVkNDBhZTUzNThhMjRjZTE0
14
+ NDU5MDE1NGY3NGQ1MDYxNGRiN2ViMjY0OGM4M2VkMzRjOTliZGFiMDViOTYy
15
+ M2NiNGM4MmM5YzQ3ZWZmMDA0ZWU1MTAxMjM2NjE1NmMwZDBhNWY=
@@ -12,5 +12,6 @@ Gem::Specification.new do |s|
12
12
  s.email = ''
13
13
  s.files = `git ls-files`.split("\n").reject {|file| file =~ /aws-flow-core/}
14
14
  s.require_paths << "lib/aws/"
15
+ s.required_ruby_version = "~> 1.9", ">= 1.9.1"
15
16
  s.add_dependency "aws-sdk", "~> 1", ">= 1.39.0"
16
17
  end
@@ -94,14 +94,16 @@ module AWS
94
94
  #
95
95
  def method_missing(method_name, *args, &block)
96
96
  options = Utilities::interpret_block_for_options(ActivityOptions, block)
97
- options = Utilities::merge_all_options(@options,
97
+ client_options = Utilities::client_options_from_method_name(method_name, @options)
98
+
99
+ options = Utilities::merge_all_options(client_options,
98
100
  @activity_option_map[method_name.to_sym],
99
101
  @option_map[method_name.to_sym],
100
102
  options
101
103
  )
102
104
  new_options = ActivityOptions.new(options)
103
105
 
104
- activity_type = ActivityType.new("#{new_options.prefix_name}.#{method_name.to_s}", new_options.version, new_options.get_default_options)
106
+ activity_type = ActivityType.new("#{new_options.prefix_name}.#{method_name.to_s}", new_options.version, new_options.get_registration_options)
105
107
  if new_options._exponential_retry
106
108
  retry_function = new_options._exponential_retry.retry_function || FlowConstants.exponential_retry_function
107
109
  new_options._exponential_retry.return_on_start ||= new_options.return_on_start
@@ -392,9 +394,9 @@ module AWS
392
394
  property(:activities, [])
393
395
 
394
396
  # @api private
395
- def _options; @activities.map(&:options); end
397
+ def _options; @activities; end
396
398
 
397
- # Defines one or more activities with {ActivityOptions} provided in the
399
+ # Defines one or more activities with {ActivityRegistrationOptions} provided in the
398
400
  # supplied block.
399
401
  #
400
402
  # @param [Array] activity_names
@@ -406,7 +408,7 @@ module AWS
406
408
  # comes from the list passed to this parameter.
407
409
  #
408
410
  # @param [Hash] block
409
- # {ActivityOptions} to use on the defined activities.
411
+ # {ActivityRegistrationOptions} to use on the defined activities.
410
412
  #
411
413
  # The following options are *required* when registering an activity:
412
414
  #
@@ -434,7 +436,7 @@ module AWS
434
436
  # end
435
437
  # end
436
438
  def activity(*activity_names, &block)
437
- options = Utilities::interpret_block_for_options(ActivityOptions, block)
439
+ options = Utilities::interpret_block_for_options(ActivityRegistrationOptions, block)
438
440
  activity_names.each do |activity_name|
439
441
  prefix_name = options.prefix_name || self.to_s
440
442
  activity_type = ActivityType.new(prefix_name + "." + activity_name.to_s, options.version, options)
@@ -404,6 +404,7 @@ module AWS
404
404
  @decision_helper[timer_id].consume(:handle_completion_event)
405
405
  if @decision_helper[timer_id].done?
406
406
  open_request = @decision_helper.scheduled_timers.delete(timer_id)
407
+ return if open_request.nil?
407
408
  open_request.blocking_promise.set(nil)
408
409
  open_request.completion_handle.complete
409
410
  end
@@ -24,12 +24,12 @@ module AWS
24
24
  @execution_id = execution_id
25
25
  end
26
26
  def execute(command, options = nil)
27
- return schedule_with_retry(command, nil, Hash.new { |hash, key| hash[key] = 1 }, @clock.current_time, 0) if @return_on_start
27
+ return schedule_with_retry(command, nil, Hash.new { |hash, key| hash[key] = 1 }, @clock.current_time, nil) if @return_on_start
28
28
  output = Utilities::AddressableFuture.new
29
29
  result_lock = Utilities::AddressableFuture.new
30
30
  error_handler do |t|
31
31
  t.begin do
32
- output.set(schedule_with_retry(command, nil, Hash.new { |hash, key| hash[key] = 1 }, @clock.current_time, 0))
32
+ output.set(schedule_with_retry(command, nil, Hash.new { |hash, key| hash[key] = 1 }, @clock.current_time, nil))
33
33
  end
34
34
  t.rescue(Exception) do |error|
35
35
  @error_seen = error
@@ -77,7 +77,7 @@ module AWS
77
77
  failure = should_retry.get
78
78
  if ! failure.nil?
79
79
  attempts[failure.class] += 1
80
- output.set(schedule_with_retry(command, failure, attempts, first_attempt_time, @clock.current_time - first_attempt_time))
80
+ output.set(schedule_with_retry(command, failure, attempts, first_attempt_time, @clock.current_time))
81
81
  else
82
82
  output.set(return_value.get)
83
83
  end
@@ -245,7 +245,7 @@ module AWS
245
245
  module Workflows
246
246
  attr_accessor :version
247
247
  extend Utilities::UpwardLookups
248
- @precursors = []
248
+ @precursors ||= []
249
249
  def look_upwards(variable)
250
250
  precursors = self.ancestors.dup
251
251
  precursors.delete(self)
@@ -263,10 +263,10 @@ module AWS
263
263
  def entry_point(input=nil)
264
264
  if input
265
265
  @entry_point = input
266
- workflow_type = WorkflowType.new(self.to_s + "." + input.to_s, nil, WorkflowOptions.new(:execution_method => input))
266
+ workflow_type = WorkflowType.new(self.to_s + "." + input.to_s, nil, WorkflowRegistrationOptions.new(:execution_method => input))
267
267
  self.workflows.each { |workflow| workflow.name = self.to_s + "." + input.to_s }
268
268
  self.workflows.each do |workflow|
269
- workflow.options = WorkflowOptions.new(:execution_method => input)
269
+ workflow.options = WorkflowRegistrationOptions.new(:execution_method => input)
270
270
  end
271
271
  self.workflows = self.workflows << workflow_type
272
272
  end
@@ -327,22 +327,24 @@ module AWS
327
327
 
328
328
 
329
329
  # @api private
330
- def _options; self.workflows.map(&:options); end
330
+ def _options; self.workflows; end
331
331
 
332
332
  # Defines a new workflow.
333
333
  #
334
- # @param entry_point
335
- # The entry point (method) that starts the workflow.
334
+ # @param workflow_names
335
+ # The entry points (methods) that starts the workflow.
336
336
  #
337
337
  # @param block
338
- # A block of {WorkflowOptions} for the workflow.
339
- #
340
- def workflow(entry_point, &block)
341
- options = Utilities::interpret_block_for_options(WorkflowOptions, block)
342
- options.execution_method = entry_point
343
- workflow_name = options.prefix_name || self.to_s
344
- workflow_type = WorkflowType.new(workflow_name.to_s + "." + entry_point.to_s, options.version, options)
345
- self.workflows = self.workflows << workflow_type
338
+ # A block of {WorflowRegistrationOptions} for the workflow.
339
+ #
340
+ def workflow(*workflow_names, &block)
341
+ workflow_names.each do |workflow_name|
342
+ options = Utilities::interpret_block_for_options(WorkflowRegistrationOptions, block)
343
+ options.execution_method = workflow_name
344
+ prefix_name = options.prefix_name || self.to_s
345
+ workflow_type = WorkflowType.new(prefix_name.to_s + "." + workflow_name.to_s, options.version, options)
346
+ self.workflows = self.workflows << workflow_type
347
+ end
346
348
  end
347
349
 
348
350
  # @return [MethodPair]
@@ -134,36 +134,49 @@ module AWS
134
134
  # @api private
135
135
  def remove_completed_pids(block=false)
136
136
  @log.debug "Removing completed child processes"
137
+
138
+ # waitpid2 throws an Errno::ECHILD if there are no child processes,
139
+ # so we don't even call it if there aren't any pids to wait on.
140
+ if @pids.empty?
141
+ @log.debug "No child processes. Returning."
142
+ return
143
+ end
144
+
145
+ @log.debug "Current child processes: #{@pids}"
146
+
147
+ # Non-blocking wait only returns a non-null pid if the child process has exited.
148
+ # This is the only part where we block if block=true.
149
+ pid, status = Process.waitpid2(-1, block ? 0 : Process::WNOHANG)
150
+
137
151
  loop do
152
+
153
+ # If nothing to reap, then exit
154
+ break unless pid
155
+
156
+ # We have something to reap
157
+ @log.debug "Reaping child process=#{pid}"
158
+ if status.success?
159
+ @log.debug "Child process #{pid} exited successfully"
160
+ else
161
+ @log.error "Child process #{pid} exited with non-zero status code"
162
+ end
163
+
164
+ # Reap
165
+ @pids.delete(pid)
166
+
138
167
  # waitpid2 throws an Errno::ECHILD if there are no child processes,
139
168
  # so we don't even call it if there aren't any pids to wait on.
140
169
  break if @pids.empty?
170
+
141
171
  @log.debug "Current child processes: #{@pids}"
142
- # Non-blocking wait only returns a non-null pid
143
- # if the child process has exited.
144
- pid, status = Process.waitpid2(-1, block ? 0 : Process::WNOHANG)
145
172
 
146
- if pid
147
- # We have something to reap
148
- @log.debug "Reaping child process=#{pid}"
149
- if status.success?
150
- @log.debug "Child process #{pid} exited successfully"
151
- else
152
- @log.error "Child process #{pid} exited with non-zero status code"
153
- end
154
- # Delete the pid from the list
155
- @pids.delete(pid)
156
- # Contract is to block only once if block=true. If we are in this code branch and if block=true, it
157
- # means we have already blocked once above, hence it is safe to exit now
158
- break if block
159
- else
160
- # Nothing to reap, exit
161
- break
162
- end
163
-
173
+ # Contract is to block only once if block=true. Since we have potentially already
174
+ # blocked once above, we only need to do a non blocking call to waitpid2 to see if
175
+ # any other process is available to reap.
176
+ pid, status = Process.waitpid2(-1, Process::WNOHANG)
164
177
  end
165
178
  end
166
-
167
179
  end
180
+
168
181
  end
169
182
  end
@@ -67,10 +67,12 @@ module AWS
67
67
  class FlowConstants
68
68
 
69
69
  class << self
70
- attr_reader :exponential_retry_maximum_retry_interval_seconds, :exponential_retry_retry_expiration_seconds, :exponential_retry_backoff_coefficient, :exponential_retry_maximum_attempts, :exponential_retry_function, :default_data_converter, :exponential_retry_exceptions_to_include, :exponential_retry_exceptions_to_exclude, :jitter_function, :should_jitter, :exponential_retry_initial_retry_interval
70
+ attr_reader :exponential_retry_maximum_retry_interval_seconds, :exponential_retry_retry_expiration_seconds, :exponential_retry_backoff_coefficient, :exponential_retry_maximum_attempts, :exponential_retry_function, :default_data_converter, :exponential_retry_exceptions_to_include, :exponential_retry_exceptions_to_exclude, :jitter_function, :should_jitter, :exponential_retry_initial_retry_interval, :use_worker_task_list
71
71
  end
72
72
 
73
73
  INFINITY = -1
74
+ RETENTION_DEFAULT = 7
75
+ NUM_OF_WORKERS_DEFAULT = 1
74
76
  @exponential_retry_maximum_attempts = Float::INFINITY
75
77
  @exponential_retry_maximum_retry_interval_seconds = -1
76
78
  @exponential_retry_retry_expiration_seconds = -1
@@ -81,22 +83,33 @@ module AWS
81
83
  @exponential_retry_exceptions_to_include = [Exception]
82
84
  @exponential_retry_function = lambda do |first, time_of_failure, attempts, options|
83
85
 
84
- raise ArgumentError.new("first is not an instance of Time") unless first.instance_of?(Time)
85
- raise ArgumentError.new("time_of_failure can't be negative") if time_of_failure < 0
86
- raise ArgumentError.new("number of attempts can't be negative") if (attempts.values.find {|x| x < 0})
86
+ raise ArgumentError.new("first should be an instance of Time") unless first.instance_of?(Time)
87
+ raise ArgumentError.new("time_of_failure should be nil or an instance of Time") unless time_of_failure.nil? || time_of_failure.instance_of?(Time)
88
+ raise ArgumentError.new("number of attempts should be positive") if (attempts.values.find {|x| x < 0})
87
89
  raise ArgumentError.new("number of attempts should be more than 2") if (attempts.values.reduce(0,:+) < 2)
88
90
  raise ArgumentError.new("user options must be of type ExponentialRetryOptions") unless options.is_a? ExponentialRetryOptions
89
91
 
90
- initial_retry_interval = options.initial_retry_interval
91
- backoff_coefficient = options.backoff_coefficient
92
- maximum_retry_interval_seconds = options.maximum_retry_interval_seconds
93
- retry_expiration_interval_seconds = options.retry_expiration_interval_seconds
94
- result = initial_retry_interval * (backoff_coefficient ** (attempts.values.reduce(0, :+) - 2))
95
- result = maximum_retry_interval_seconds if (! maximum_retry_interval_seconds.nil? && maximum_retry_interval_seconds != INFINITY && result > maximum_retry_interval_seconds)
96
- seconds_since_first_attempt = time_of_failure.zero? ? 0 : -(first - time_of_failure).to_i
97
- result = -1 if (! retry_expiration_interval_seconds.nil? &&
98
- retry_expiration_interval_seconds != INFINITY &&
99
- (result + seconds_since_first_attempt) >= retry_expiration_interval_seconds)
92
+ # get values from options
93
+ initial_interval = options.initial_retry_interval
94
+ backoff = options.backoff_coefficient
95
+ max_interval = options.maximum_retry_interval_seconds
96
+ retry_expiration = options.retry_expiration_interval_seconds
97
+
98
+ # calculate the initial retry seconds
99
+ result = initial_interval * (backoff ** (attempts.values.reduce(0, :+) - 2))
100
+
101
+ # check if the calculated retry seconds is greater than the maximum
102
+ # retry interval allowed. If it is, then replace it with maximum_retry_interval_seconds
103
+ result = max_interval if ( !max_interval.nil? && max_interval != INFINITY && result > max_interval)
104
+
105
+ # how much time has elapsed since the first time this task was scheduled
106
+ time_elapsed = time_of_failure.nil? ? 0 : (time_of_failure - first).to_i
107
+
108
+ # return -1 if retry will expire
109
+ result = -1 if (! retry_expiration.nil? &&
110
+ retry_expiration != INFINITY &&
111
+ (result + time_elapsed) >= retry_expiration)
112
+
100
113
  return result.to_i
101
114
  end
102
115
 
@@ -107,6 +120,7 @@ module AWS
107
120
  end
108
121
 
109
122
  @default_data_converter = YAMLDataConverter.new
123
+ @use_worker_task_list = "USE_WORKER_TASK_LIST"
110
124
  end
111
125
  end
112
126
  end
@@ -34,11 +34,10 @@ module AWS
34
34
  # The options to set.
35
35
  #
36
36
  def with_opts(opts = {})
37
- klass = self.class.default_option_class
38
- options = klass.new(opts)
39
37
  modified_instance = self.dup
40
- options = klass.new(Utilities::merge_all_options(modified_instance.options, options))
41
- modified_instance.options = options
38
+ opts.each_pair do |key, value|
39
+ modified_instance.options.send("#{key}=", value) if modified_instance.options.methods.map(&:to_sym).include? "#{key}=".to_sym
40
+ end
42
41
  modified_instance
43
42
  end
44
43
 
@@ -25,69 +25,6 @@ module AWS
25
25
  end
26
26
  end
27
27
 
28
- # This module refactors out some of the common methods for the Options
29
- # classes. Any class including this module should implement
30
- # make_runtime_key method and default_keys method. default_keys method
31
- # provides an array of keys that are considered to be the default options
32
- # for that class. make_runtime_key method converts a passed in default key
33
- # to it's corresponding runtime key.
34
- module OptionsMethods
35
-
36
- # Retrieves the runtime values for the default options
37
- #
38
- # @return [Hash]
39
- # The runtime option names and their current values.
40
- #
41
- def get_runtime_options
42
- runtime_options = {}
43
- # For the default values that are present, convert the default keys into
44
- # runtime keys. i.e. remove 'default_' and 'default_task_' from the key
45
- # name and merge their values with the default values
46
- get_default_options.each do |key, val|
47
- new_key = make_runtime_key(key)
48
- new_val = get_options([new_key])
49
- runtime_options[new_key] = new_val.empty? ? val : new_val.values.first
50
- end
51
- runtime_options
52
- end
53
-
54
- # Retrieves the default options.
55
- #
56
- # @return [Hash]
57
- # A hash containing the default option names and their current values.
58
- #
59
- def get_default_options
60
- # Get the default options
61
- get_options(default_keys)
62
- end
63
-
64
- # Retrieves full options. It merges the runtime options with the remaining
65
- # options
66
- #
67
- # @return [Hash]
68
- # A hash containing the full option names and their current values.
69
- #
70
- def get_full_options
71
- # Initialize an empty hash
72
- options_hash = {}
73
-
74
- # Get all the properties held by this class
75
- options_keys = self.class.held_properties
76
-
77
- # Remove the unnecessary options (i.e. options not recognized by swf but
78
- # only by flow) from the options_keys array.
79
- default_keys.concat([:from_class]).each { |x| options_keys.delete(x) }
80
-
81
- # If the value for an option is held by the class, get it and store it
82
- # in a hash
83
- options_keys.each do |option|
84
- options_hash[option] = self.send(option) if self.send(option)
85
- end
86
- # Merge the options_hash with the runtime options
87
- options_hash.merge(self.get_runtime_options)
88
- end
89
- end
90
-
91
28
  # The base class for all options classes in the AWS Flow Framework for Ruby.
92
29
  class Options
93
30
  extend Utilities::UpwardLookups
@@ -247,7 +184,7 @@ module AWS
247
184
  def get_full_options
248
185
  result = {}
249
186
  SignalWorkflowOptions.held_properties.each do |option|
250
- result[option] = self.send(option) if self.send(option) && self.send(option) != ""
187
+ result[option] = self.send(option) if self.send(option) != nil && self.send(option) != ""
251
188
  end
252
189
  result
253
190
  end
@@ -378,6 +315,13 @@ module AWS
378
315
  # Defaults for `WorkflowOptions`.
379
316
  class WorkflowDefaults < Defaults
380
317
 
318
+ # The default data converter. By default, this is {YAMLDataConverter}.
319
+ def data_converter; FlowConstants.default_data_converter; end
320
+
321
+ end
322
+
323
+ class WorkflowRegistrationDefaults < WorkflowDefaults
324
+
381
325
  # The default task start-to-close timeout duration. The default value is
382
326
  # `30`.
383
327
  def default_task_start_to_close_timeout; 30; end
@@ -389,8 +333,7 @@ module AWS
389
333
  # array (no tags).
390
334
  def tag_list; []; end
391
335
 
392
- # The default data converter. By default, this is {YAMLDataConverter}.
393
- def data_converter; FlowConstants.default_data_converter; end
336
+ def default_task_list; FlowConstants.use_worker_task_list; end
394
337
  end
395
338
 
396
339
  # Options for workflows.
@@ -485,7 +428,6 @@ module AWS
485
428
  # * It must not contain the literal string "arn".
486
429
  #
487
430
  class WorkflowOptions < Options
488
- include OptionsMethods
489
431
 
490
432
  properties(
491
433
  :version,
@@ -497,37 +439,54 @@ module AWS
497
439
  :execution_method
498
440
  )
499
441
 
442
+ property(:tag_list, [])
443
+ property(:child_policy, [lambda(&:to_s), lambda(&:upcase)])
444
+ property(:data_converter, [])
445
+
446
+ default_classes << WorkflowDefaults.new
447
+
448
+ def get_full_options
449
+ result = {}
450
+ usable_properties = self.class.held_properties
451
+ usable_properties.delete(:from_class)
452
+ usable_properties.each do |option|
453
+ result[option] = self.send(option) if self.send(option) != nil && self.send(option) != ""
454
+ end
455
+ result
456
+ end
457
+
458
+ end
459
+
460
+ class WorkflowRegistrationOptions < WorkflowOptions
461
+ class << self
462
+ def registration_options
463
+ [
464
+ :default_task_start_to_close_timeout,
465
+ :default_execution_start_to_close_timeout,
466
+ :default_task_list,
467
+ :default_child_policy
468
+ ]
469
+ end
470
+ end
471
+
500
472
  # Adding default properties
501
473
  properties(
502
474
  :default_task_start_to_close_timeout,
503
475
  :default_execution_start_to_close_timeout,
504
476
  :default_task_list
505
477
  )
506
- property(:default_child_policy, [lambda(&:to_s), lambda(&:upcase)])
507
-
508
-
509
- property(:tag_list, [])
510
- property(:child_policy, [lambda(&:to_s), lambda(&:upcase)])
511
- property(:data_converter, [])
512
478
 
513
- default_classes << WorkflowDefaults.new
479
+ property(:default_child_policy, [lambda(&:to_s), lambda(&:upcase)])
514
480
 
515
- # This method provides the default option keys for workflows
516
- def default_keys
517
- [:default_task_start_to_close_timeout,
518
- :default_execution_start_to_close_timeout,
519
- :default_task_list,
520
- :default_child_policy]
521
- end
481
+ default_classes << WorkflowRegistrationDefaults.new
522
482
 
523
- # This method converts default option keys to runtime keys by replacing
524
- # "default_" in the key name
525
- def make_runtime_key(key)
526
- key.to_s.gsub(/default_/, "").to_sym
483
+ def get_registration_options
484
+ get_options(self.class.registration_options)
527
485
  end
528
486
 
529
487
  end
530
488
 
489
+
531
490
  # Options for {WorkflowClient#start_execution}.
532
491
  #
533
492
  # @!attribute workflow_name
@@ -549,6 +508,10 @@ module AWS
549
508
 
550
509
  # Defaults for the {ActivityOptions} class.
551
510
  class ActivityDefaults < Defaults
511
+ def data_converter; FlowConstants.default_data_converter; end
512
+ end
513
+
514
+ class ActivityRegistrationDefaults < ActivityDefaults
552
515
 
553
516
  # The default schedule-to-start timeout for activity tasks. This timeout
554
517
  # represents the time, in seconds, between when the activity task is first
@@ -585,10 +548,9 @@ module AWS
585
548
  # set this value to "NONE" to imply no timeout value.
586
549
  def default_task_heartbeat_timeout; Float::INFINITY; end
587
550
 
588
- def data_converter; FlowConstants.default_data_converter; end
551
+ def default_task_list; FlowConstants.use_worker_task_list; end
589
552
  end
590
553
 
591
-
592
554
  # Options to use on an activity or decider. The following options are
593
555
  # defined:
594
556
  #
@@ -640,7 +602,6 @@ module AWS
640
602
  # decision.
641
603
  #
642
604
  class ActivityOptions < Options
643
- include OptionsMethods
644
605
 
645
606
  properties(
646
607
  :heartbeat_timeout,
@@ -652,40 +613,11 @@ module AWS
652
613
  :input
653
614
  )
654
615
 
655
- # Adding default properties
656
- properties(
657
- :default_task_heartbeat_timeout,
658
- :default_task_list,
659
- :default_task_schedule_to_close_timeout,
660
- :default_task_schedule_to_start_timeout,
661
- :default_task_start_to_close_timeout,
662
- )
663
-
664
616
  property(:manual_completion, [lambda {|x| x == true}])
665
617
  property(:data_converter, [])
666
618
 
667
619
  default_classes << ActivityDefaults.new
668
620
 
669
- # This method provides the default option keys for activities
670
- def default_keys
671
- [:default_task_heartbeat_timeout,
672
- :default_task_schedule_to_close_timeout,
673
- :default_task_schedule_to_start_timeout,
674
- :default_task_start_to_close_timeout,
675
- :default_task_list]
676
- end
677
-
678
- # This method converts default option keys to runtime keys by replacing
679
- # "default_task_" in the key name. It handles the exception of task_list
680
- # where only "default_" needs to be replaced.
681
- def make_runtime_key(key)
682
- if key =~ /task_list/
683
- key.to_s.gsub(/default_/, "").to_sym
684
- else
685
- key.to_s.gsub(/default_task_/, "").to_sym
686
- end
687
- end
688
-
689
621
  # Gets the activity prefix name.
690
622
  #
691
623
  # @return [String]
@@ -777,6 +709,48 @@ module AWS
777
709
  retry_options = Utilities::interpret_block_for_options(ExponentialRetryOptions, block)
778
710
  @_exponential_retry = retry_options
779
711
  end
712
+
713
+ def get_full_options
714
+ result = {}
715
+ usable_properties = self.class.held_properties
716
+ usable_properties.delete(:from_class)
717
+ usable_properties.each do |option|
718
+ result[option] = self.send(option) if self.send(option) != nil && self.send(option) != ""
719
+ end
720
+ result
721
+ end
722
+
723
+ end
724
+
725
+ # This class is used to capture the options passed during activity declaration.
726
+ class ActivityRegistrationOptions < ActivityOptions
727
+ class << self
728
+ def registration_options
729
+ [
730
+ :default_task_heartbeat_timeout,
731
+ :default_task_schedule_to_close_timeout,
732
+ :default_task_schedule_to_start_timeout,
733
+ :default_task_start_to_close_timeout,
734
+ :default_task_list
735
+ ]
736
+ end
737
+ end
738
+
739
+ # Adding default properties
740
+ properties(
741
+ :default_task_heartbeat_timeout,
742
+ :default_task_list,
743
+ :default_task_schedule_to_close_timeout,
744
+ :default_task_schedule_to_start_timeout,
745
+ :default_task_start_to_close_timeout,
746
+ )
747
+
748
+ default_classes << ActivityRegistrationDefaults.new
749
+
750
+ def get_registration_options
751
+ get_options(self.class.registration_options)
752
+ end
753
+
780
754
  end
781
755
 
782
756
  # Runtime options for an activity.