Class: ForemanMaintain::Scenario

Inherits:
Object
  • Object
show all
Extended by:
Concerns::Finders
Includes:
Concerns::Finders, Concerns::Logger, Concerns::ScenarioMetadata, Concerns::SystemHelpers, Concerns::Versions
Defined in:
lib/foreman_maintain/scenario.rb

Direct Known Subclasses

FilteredScenario, PreparationScenario

Defined Under Namespace

Classes: FilteredScenario, PreparationScenario

Constant Summary

Constants included from Concerns::OsFacts

Concerns::OsFacts::FALLBACK_OS_RELEASE_FILE, Concerns::OsFacts::OS_RELEASE_FILE

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Concerns::Finders

check, detector, feature, find_all_scenarios, find_procedures, find_scenarios, procedure

Methods included from Concerns::Versions

#at_least_version?, #current_minor_version, #less_than_version?

Methods included from Concerns::ScenarioMetadata

included, #run_strategy

Methods included from Concerns::SystemHelpers

#check_max_version, #check_min_version, #command_present?, #directory_empty?, #execute, #execute!, #execute?, #execute_runner, #execute_with_status, #file_exists?, #file_nonzero?, #find_dir_containing_file, #find_package, #find_symlinks, #foreman_plugin_name, #format_shell_args, #hammer_package, #hammer_plugin_name, #hostname, included, #package_manager, #package_version, #packages_action, #parse_csv, #parse_json, #proxy_plugin_name, #repository_manager, #ruby_prefix, #server?, #shellescape, #systemd_installed?, #version

Methods included from Concerns::OsFacts

#centos?, #cpu_cores, #deb_major_version, #debian?, #debian_or_ubuntu?, #el8?, #el?, #el_major_version, #el_short_name, #facts, #memory, #os_id, #os_id_like_list, #os_name, #os_release_file, #os_version, #os_version_codename, #os_version_id, #rhel?, #ubuntu?, #ubuntu_major_version

Methods included from Concerns::Logger

#logger

Constructor Details

#initialize(context_data = {}) ⇒ Scenario

Returns a new instance of Scenario.



89
90
91
92
93
94
# File 'lib/foreman_maintain/scenario.rb', line 89

def initialize(context_data = {})
  @steps = []
  @context = Context.new(context_data)
  set_context_mapping
  compose
end

Instance Attribute Details

#contextObject (readonly)

Returns the value of attribute context.



10
11
12
# File 'lib/foreman_maintain/scenario.rb', line 10

def context
  @context
end

#stepsObject (readonly)

Returns the value of attribute steps.



10
11
12
# File 'lib/foreman_maintain/scenario.rb', line 10

def steps
  @steps
end

Class Method Details

.inspectObject



192
193
194
# File 'lib/foreman_maintain/scenario.rb', line 192

def self.inspect
  "Scenario Class #{[:description]}<#{name}>"
end

.new_from_hash(hash) ⇒ Object



205
206
207
208
209
210
211
212
213
# File 'lib/foreman_maintain/scenario.rb', line 205

def self.new_from_hash(hash)
  scenarios = find_all_scenarios(:label => hash[:label])
  unless scenarios.size == 1
    raise "Could not find scenario #{hash[:label]}, found #{scenarios.size} scenarios"
  end
  scenario = scenarios.first
  scenario.load_step_states(hash[:steps])
  scenario
end

Instance Method Details

#add_step(step) ⇒ Object



178
179
180
# File 'lib/foreman_maintain/scenario.rb', line 178

def add_step(step)
  add_steps(step) unless step.nil?
end

#add_step_with_context(definition, extra_params = {}) ⇒ Object



182
183
184
185
186
# File 'lib/foreman_maintain/scenario.rb', line 182

def add_step_with_context(definition, extra_params = {})
  if definition.present?
    add_step(definition.send(:new, context.params_for(definition).merge(extra_params)))
  end
end

#add_steps(*steps) ⇒ Object



172
173
174
175
176
# File 'lib/foreman_maintain/scenario.rb', line 172

def add_steps(*steps)
  steps.flatten.each do |step|
    self.steps << step.ensure_instance
  end
end

#add_steps_with_context(*definitions) ⇒ Object



188
189
190
# File 'lib/foreman_maintain/scenario.rb', line 188

def add_steps_with_context(*definitions)
  definitions.flatten.each { |definition| add_step_with_context(definition) }
end

#before_scenariosObject

scenarios to be run before this scenario



165
166
167
168
169
170
# File 'lib/foreman_maintain/scenario.rb', line 165

def before_scenarios
  scenarios = []
  preparation_scenario = PreparationScenario.new(self)
  scenarios << [preparation_scenario] unless preparation_scenario.steps.empty?
  scenarios
end

#composeObject

Override to compose steps for the scenario



97
98
# File 'lib/foreman_maintain/scenario.rb', line 97

def compose
end

#executed_stepsObject



112
113
114
# File 'lib/foreman_maintain/scenario.rb', line 112

def executed_steps
  steps.find_all(&:executed?)
end

#failed?Boolean

Returns:

  • (Boolean)


160
161
162
# File 'lib/foreman_maintain/scenario.rb', line 160

def failed?
  !passed?
end

#filter_whitelisted(steps, options) ⇒ Object



136
137
138
139
140
141
142
143
144
145
# File 'lib/foreman_maintain/scenario.rb', line 136

def filter_whitelisted(steps, options)
  options.validate_options!(:whitelisted)
  if options.key?(:whitelisted)
    steps.select do |step|
      options[:whitelisted] ? step.whitelisted? : !step.whitelisted?
    end
  else
    steps
  end
end

#info_warning?Boolean

Returns:

  • (Boolean)


156
157
158
# File 'lib/foreman_maintain/scenario.rb', line 156

def info_warning?
  !steps_with_info_warning(:whitelisted => false).empty?
end

#inspectObject



196
197
198
# File 'lib/foreman_maintain/scenario.rb', line 196

def inspect
  "#{self.class.[:description]}<#{self.class.name}>"
end

#load_step_states(steps_hash) ⇒ Object



215
216
217
218
219
220
221
222
223
224
225
226
# File 'lib/foreman_maintain/scenario.rb', line 215

def load_step_states(steps_hash)
  steps = self.steps.dup
  steps_hash.each do |step_hash|
    until steps.empty?
      step = steps.shift
      if step.matches_hash?(step_hash)
        step.update_from_hash(step_hash)
        break
      end
    end
  end
end

#passed?Boolean

Returns:

  • (Boolean)


147
148
149
150
# File 'lib/foreman_maintain/scenario.rb', line 147

def passed?
  (steps_with_abort(:whitelisted => false) +
    steps_with_error(:whitelisted => false)).empty?
end

#preparation_stepsObject



104
105
106
107
108
109
110
# File 'lib/foreman_maintain/scenario.rb', line 104

def preparation_steps
  # we first take the preparation steps defined for the scenario + collect
  # preparation steps for the steps inside the scenario
  steps.inject(super.dup) do |results, step|
    results.concat(step.preparation_steps)
  end.uniq
end

#set_context_mappingObject

Override to map context for the scenario



101
102
# File 'lib/foreman_maintain/scenario.rb', line 101

def set_context_mapping
end

#steps_with_abort(options = {}) ⇒ Object



120
121
122
# File 'lib/foreman_maintain/scenario.rb', line 120

def steps_with_abort(options = {})
  filter_whitelisted(executed_steps.find_all(&:aborted?), options)
end

#steps_with_error(options = {}) ⇒ Object



116
117
118
# File 'lib/foreman_maintain/scenario.rb', line 116

def steps_with_error(options = {})
  filter_whitelisted(executed_steps.find_all(&:fail?), options)
end

#steps_with_info_warning(options = {}) ⇒ Object



128
129
130
# File 'lib/foreman_maintain/scenario.rb', line 128

def steps_with_info_warning(options = {})
  filter_whitelisted(executed_steps.find_all(&:info_warning?), options)
end

#steps_with_skipped(options = {}) ⇒ Object



132
133
134
# File 'lib/foreman_maintain/scenario.rb', line 132

def steps_with_skipped(options = {})
  filter_whitelisted(executed_steps.find_all(&:skipped?), options)
end

#steps_with_warning(options = {}) ⇒ Object



124
125
126
# File 'lib/foreman_maintain/scenario.rb', line 124

def steps_with_warning(options = {})
  filter_whitelisted(executed_steps.find_all(&:warning?), options)
end

#to_hashObject



200
201
202
203
# File 'lib/foreman_maintain/scenario.rb', line 200

def to_hash
  { :label => label,
    :steps => steps.map(&:to_hash) }
end

#warning?Boolean

Returns:

  • (Boolean)


152
153
154
# File 'lib/foreman_maintain/scenario.rb', line 152

def warning?
  !steps_with_warning(:whitelisted => false).empty?
end