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_checks, 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?, #create_lv_snapshot, #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, #get_lv_info, #get_lv_path, #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?, #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.



83
84
85
86
87
88
# File 'lib/foreman_maintain/scenario.rb', line 83

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



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

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

.new_from_hash(hash) ⇒ Object



191
192
193
194
195
196
197
198
199
# File 'lib/foreman_maintain/scenario.rb', line 191

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



164
165
166
# File 'lib/foreman_maintain/scenario.rb', line 164

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

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



168
169
170
171
172
# File 'lib/foreman_maintain/scenario.rb', line 168

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



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

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

#add_steps_with_context(*definitions) ⇒ Object



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

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



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

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



91
92
# File 'lib/foreman_maintain/scenario.rb', line 91

def compose
end

#executed_stepsObject



106
107
108
# File 'lib/foreman_maintain/scenario.rb', line 106

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

#failed?Boolean

Returns:

  • (Boolean)


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

def failed?
  !passed?
end

#filter_whitelisted(steps, options) ⇒ Object



126
127
128
129
130
131
132
133
134
135
# File 'lib/foreman_maintain/scenario.rb', line 126

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

#inspectObject



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

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

#load_step_states(steps_hash) ⇒ Object



201
202
203
204
205
206
207
208
209
210
211
212
# File 'lib/foreman_maintain/scenario.rb', line 201

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)


137
138
139
140
# File 'lib/foreman_maintain/scenario.rb', line 137

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

#preparation_stepsObject



98
99
100
101
102
103
104
# File 'lib/foreman_maintain/scenario.rb', line 98

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



95
96
# File 'lib/foreman_maintain/scenario.rb', line 95

def set_context_mapping
end

#steps_with_abort(options = {}) ⇒ Object



114
115
116
# File 'lib/foreman_maintain/scenario.rb', line 114

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

#steps_with_error(options = {}) ⇒ Object



110
111
112
# File 'lib/foreman_maintain/scenario.rb', line 110

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

#steps_with_skipped(options = {}) ⇒ Object



122
123
124
# File 'lib/foreman_maintain/scenario.rb', line 122

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

#steps_with_warning(options = {}) ⇒ Object



118
119
120
# File 'lib/foreman_maintain/scenario.rb', line 118

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

#to_hashObject



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

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

#warning?Boolean

Returns:

  • (Boolean)


142
143
144
# File 'lib/foreman_maintain/scenario.rb', line 142

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