chef-apply 0.3.3 → 0.4.6

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 (55) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/chef-apply.gemspec +2 -1
  4. data/lib/chef_apply/action/base.rb +1 -0
  5. data/lib/chef_apply/action/converge_target.rb +11 -11
  6. data/lib/chef_apply/action/converge_target/ccr_failure_mapper.rb +100 -0
  7. data/lib/chef_apply/action/generate_local_policy.rb +1 -1
  8. data/lib/chef_apply/action/generate_temp_cookbook.rb +53 -53
  9. data/lib/chef_apply/action/generate_temp_cookbook/recipe_lookup.rb +124 -0
  10. data/lib/chef_apply/action/generate_temp_cookbook/temp_cookbook.rb +175 -0
  11. data/lib/chef_apply/action/install_chef.rb +8 -8
  12. data/lib/chef_apply/action/install_chef/minimum_chef_version.rb +85 -0
  13. data/lib/chef_apply/cli.rb +10 -9
  14. data/lib/chef_apply/cli/options.rb +2 -2
  15. data/lib/chef_apply/cli/validation.rb +2 -1
  16. data/lib/chef_apply/file_fetcher.rb +1 -1
  17. data/lib/chef_apply/log.rb +4 -6
  18. data/lib/chef_apply/startup.rb +7 -4
  19. data/lib/chef_apply/target_host.rb +10 -5
  20. data/lib/chef_apply/target_host/linux.rb +1 -1
  21. data/lib/chef_apply/target_resolver.rb +3 -1
  22. data/lib/chef_apply/telemeter.rb +1 -1
  23. data/lib/chef_apply/text/error_translation.rb +1 -1
  24. data/lib/chef_apply/text/text_wrapper.rb +2 -1
  25. data/lib/chef_apply/ui/error_printer.rb +15 -13
  26. data/lib/chef_apply/ui/plain_text_element.rb +1 -2
  27. data/lib/chef_apply/ui/plain_text_header.rb +1 -1
  28. data/lib/chef_apply/ui/terminal.rb +4 -4
  29. data/lib/chef_apply/version.rb +1 -1
  30. data/spec/spec_helper.rb +43 -3
  31. data/spec/unit/action/base_spec.rb +2 -1
  32. data/spec/unit/{errors → action/converge_target}/ccr_failure_mapper_spec.rb +12 -9
  33. data/spec/unit/action/converge_target_spec.rb +21 -22
  34. data/spec/unit/action/generate_local_policy_spec.rb +5 -5
  35. data/spec/unit/{recipe_lookup_spec.rb → action/generate_temp_cookbook/recipe_lookup_spec.rb} +10 -10
  36. data/spec/unit/{temp_cookbook_spec.rb → action/generate_temp_cookbook/temp_cookbook_spec.rb} +23 -24
  37. data/spec/unit/action/generate_temp_cookbook_spec.rb +4 -6
  38. data/spec/unit/{minimum_chef_version_spec.rb → action/install_chef/minimum_chef_version_spec.rb} +13 -13
  39. data/spec/unit/action/install_chef_spec.rb +4 -4
  40. data/spec/unit/cli/options_spec.rb +17 -17
  41. data/spec/unit/cli/validation_spec.rb +6 -3
  42. data/spec/unit/cli_spec.rb +12 -9
  43. data/spec/unit/log_spec.rb +1 -1
  44. data/spec/unit/startup_spec.rb +11 -12
  45. data/spec/unit/target_host/windows_spec.rb +1 -1
  46. data/spec/unit/target_host_spec.rb +3 -2
  47. data/spec/unit/telemeter_spec.rb +5 -5
  48. data/spec/unit/text/error_translation_spec.rb +11 -7
  49. data/spec/unit/ui/error_printer_spec.rb +6 -7
  50. metadata +24 -11
  51. data/Gemfile.lock +0 -400
  52. data/lib/chef_apply/errors/ccr_failure_mapper.rb +0 -93
  53. data/lib/chef_apply/minimum_chef_version.rb +0 -79
  54. data/lib/chef_apply/recipe_lookup.rb +0 -117
  55. data/lib/chef_apply/temp_cookbook.rb +0 -170
@@ -106,6 +106,7 @@ module ChefApply
106
106
 
107
107
  def first_run_tasks
108
108
  return if Dir.exist?(Config::WS_BASE_PATH)
109
+
109
110
  create_default_config
110
111
  setup_telemetry
111
112
  end
@@ -129,7 +130,7 @@ module ChefApply
129
130
  end
130
131
 
131
132
  def start_telemeter_upload
132
- ChefApply::Telemeter::Sender.start_upload_thread()
133
+ ChefApply::Telemeter::Sender.start_upload_thread
133
134
  end
134
135
 
135
136
  def setup_workstation_user_directories
@@ -167,6 +168,7 @@ module ChefApply
167
168
  next_arg = argv[index + 1]
168
169
  raise ConfigPathNotProvided.new if next_arg.nil?
169
170
  raise ConfigPathInvalid.new(next_arg) unless File.file?(next_arg) && File.readable?(next_arg)
171
+
170
172
  return next_arg
171
173
  end
172
174
  end
@@ -178,9 +180,10 @@ module ChefApply
178
180
  ChefApply::Log.info("Initialized logger")
179
181
 
180
182
  ChefConfig.logger = ChefApply::Log
181
- # Setting the config isn't enough, we need to ensure the logger is initialized
182
- # or automatic initialization will still go to stdout
183
- Chef::Log.init(ChefApply::Log.location)
183
+ # Setting the config isn't enough, we need to ensure the logger is
184
+ # initialized with our existing stream or automatic initialization
185
+ # will still go to stdout instead of the log file we opened.
186
+ Chef::Log.init(ChefApply::Log.stream)
184
187
  Chef::Log.level = ChefApply::Log.level
185
188
  end
186
189
 
@@ -25,7 +25,7 @@ module ChefApply
25
25
  # These values may exist in .ssh/config but will be ignored by train
26
26
  # in favor of its defaults unless we specify them explicitly.
27
27
  # See #apply_ssh_config
28
- SSH_CONFIG_OVERRIDE_KEYS = [:user, :port, :proxy].freeze
28
+ SSH_CONFIG_OVERRIDE_KEYS = %i{user port proxy}.freeze
29
29
 
30
30
  # We're borrowing a page from train here - because setting up a
31
31
  # reliable connection for testing is a multi-step process,
@@ -34,7 +34,7 @@ module ChefApply
34
34
  # OS, this instance will mix-in the supporting methods for the given platform;
35
35
  # otherwise those methods will raise NotImplementedError.
36
36
  def self.mock_instance(url, family: "unknown", name: "unknown",
37
- release: "unknown", arch: "x86_64")
37
+ release: "unknown", arch: "x86_64")
38
38
  # Specifying sudo: false ensures that attempted operations
39
39
  # don't fail because the mock platform doesn't support sudo
40
40
  target_host = TargetHost.new(url, { sudo: false })
@@ -87,7 +87,7 @@ module ChefApply
87
87
  connection_opts[:self_signed] = (opts_in[:ssl_verify] === false ? true : false)
88
88
  end
89
89
 
90
- [:sudo_password, :sudo, :sudo_command, :password, :user].each do |key|
90
+ %i{sudo_password sudo sudo_command password user}.each do |key|
91
91
  connection_opts[key] = opts_in[key] if opts_in.key? key
92
92
  end
93
93
 
@@ -114,6 +114,7 @@ module ChefApply
114
114
  def connect!
115
115
  # Keep existing connections
116
116
  return unless @backend.nil?
117
+
117
118
  @backend = train_connection.connection
118
119
  @backend.wait_until_ready
119
120
 
@@ -146,6 +147,7 @@ module ChefApply
146
147
  # Returns the user being used to connect. Defaults to train's default user if not specified
147
148
  def user
148
149
  return config[:user] unless config[:user].nil?
150
+
149
151
  require "train/transports/ssh"
150
152
  Train::Transports::SSH.default_options[:user][:default]
151
153
  end
@@ -182,6 +184,7 @@ module ChefApply
182
184
  if result.exit_status != 0
183
185
  raise RemoteExecutionFailed.new(@config[:host], command, result)
184
186
  end
187
+
185
188
  result
186
189
  end
187
190
 
@@ -209,9 +212,10 @@ module ChefApply
209
212
  # be found.
210
213
  def installed_chef_version
211
214
  return @installed_chef_version if @installed_chef_version
215
+
212
216
  # Note: In the case of a very old version of chef (that has no manifest - pre 12.0?)
213
217
  # this will report as not installed.
214
- manifest = read_chef_version_manifest()
218
+ manifest = read_chef_version_manifest
215
219
 
216
220
  # We split the version here because unstable builds install from)
217
221
  # are in the form "Major.Minor.Build+HASH" which is not a valid
@@ -222,6 +226,7 @@ module ChefApply
222
226
  def read_chef_version_manifest
223
227
  manifest = fetch_file_contents(omnibus_manifest_path)
224
228
  raise ChefNotInstalled.new if manifest.nil?
229
+
225
230
  JSON.parse(manifest)
226
231
  end
227
232
 
@@ -233,7 +238,7 @@ module ChefApply
233
238
  #
234
239
  # The base temp dir is cached and will only be created once per connection lifetime.
235
240
  def temp_dir
236
- dir = make_temp_dir()
241
+ dir = make_temp_dir
237
242
  chown(dir, user)
238
243
  dir
239
244
  end
@@ -15,7 +15,7 @@ module ChefApply
15
15
  end
16
16
 
17
17
  def chown(path, owner)
18
- owner ||= user()
18
+ owner ||= user
19
19
  run_command!("chown #{owner} '#{path}'")
20
20
  nil
21
21
  end
@@ -35,6 +35,7 @@ module ChefApply
35
35
  # them to account for ranges embedded in the target name.
36
36
  def targets
37
37
  return @targets unless @targets.nil?
38
+
38
39
  expanded_urls = []
39
40
  @split_targets.each do |target|
40
41
  expanded_urls = (expanded_urls | expand_targets(target))
@@ -84,7 +85,7 @@ module ChefApply
84
85
  end
85
86
 
86
87
  def prefix_from_target(target)
87
- if target =~ /^(.+?):\/\/(.*)/
88
+ if target =~ %r{^(.+?)://(.*)}
88
89
  # We'll store the existing prefix to avoid it interfering
89
90
  # with the check further below.
90
91
  if ChefApply::Config::SUPPORTED_PROTOCOLS.include? $1.downcase
@@ -115,6 +116,7 @@ module ChefApply
115
116
 
116
117
  def do_parse(targets, depth = 0)
117
118
  raise TooManyRanges.new(@current_target) if depth > 2
119
+
118
120
  new_targets = []
119
121
  done = false
120
122
  targets.each do |target|
@@ -152,7 +152,7 @@ module ChefApply
152
152
  loop do
153
153
  id += 1
154
154
  filename = File.join(ChefApply::Config.telemetry_path,
155
- "telemetry-payload-#{id}.yml")
155
+ "telemetry-payload-#{id}.yml")
156
156
  break unless File.exist?(filename)
157
157
  end
158
158
  filename
@@ -18,7 +18,7 @@
18
18
  module ChefApply
19
19
  module Text
20
20
  class ErrorTranslation
21
- ATTRIBUTES = [:decorations, :header, :footer, :stack, :log].freeze
21
+ ATTRIBUTES = %i{decorations header footer stack log}.freeze
22
22
  attr_reader :message, *ATTRIBUTES
23
23
 
24
24
  def initialize(id, params: [])
@@ -31,6 +31,7 @@ module ChefApply
31
31
  if k.class == Integer
32
32
  raise MissingPlural.new(@tree.instance_variable_get(:@path), k)
33
33
  end
34
+
34
35
  k = k.to_sym
35
36
  define_singleton_method k do |*args|
36
37
  subtree = @tree.send(k, *args)
@@ -55,7 +56,7 @@ module ChefApply
55
56
  def set_call_context
56
57
  # TODO - this can vary (8 isn't always right) - inspect
57
58
  @line = caller(8, 1).first
58
- if @line =~ /.*\/lib\/(.*\.rb):(\d+)/
59
+ if @line =~ %r{.*/lib/(.*\.rb):(\d+)}
59
60
  @line = "File: #{$1} Line: #{$2}"
60
61
  end
61
62
  end
@@ -55,7 +55,7 @@ module ChefApply::UI
55
55
  e.jobs.each do |j|
56
56
  wrapped = ChefApply::Errors::StandardErrorResolver.wrap_exception(j.exception, j.target_host)
57
57
  ep = ErrorPrinter.new(wrapped)
58
- msg = ep.format_body().tr("\n", " ").gsub(/ {2,}/, " ").chomp.strip
58
+ msg = ep.format_body.tr("\n", " ").gsub(/ {2,}/, " ").chomp.strip
59
59
  out.write("Host: #{j.target_host.hostname} ")
60
60
  if ep.exception.respond_to? :id
61
61
  out.write("Error: #{ep.exception.id}: ")
@@ -95,7 +95,7 @@ module ChefApply::UI
95
95
  @command = exception.respond_to?(:command) ? exception.command : nil
96
96
  @pastel = Pastel.new
97
97
  @content = StringIO.new
98
- @id = if exception.kind_of? ChefApply::Error
98
+ @id = if exception.is_a? ChefApply::Error
99
99
  exception.id
100
100
  else
101
101
  DEFAULT_ERROR_NO
@@ -117,7 +117,7 @@ module ChefApply::UI
117
117
 
118
118
  def format_undecorated
119
119
  @content << "\n"
120
- @content << format_body()
120
+ @content << format_body
121
121
  if @command
122
122
  @content << "\n"
123
123
  @content << @command.usage
@@ -126,11 +126,11 @@ module ChefApply::UI
126
126
 
127
127
  def format_decorated
128
128
  @content << "\n"
129
- @content << format_header()
129
+ @content << format_header
130
130
  @content << "\n\n"
131
- @content << format_body()
131
+ @content << format_body
132
132
  @content << "\n"
133
- @content << format_footer()
133
+ @content << format_footer
134
134
  @content << "\n"
135
135
  end
136
136
 
@@ -139,9 +139,9 @@ module ChefApply::UI
139
139
  end
140
140
 
141
141
  def format_body
142
- if exception.kind_of? ChefApply::Error
142
+ if exception.is_a? ChefApply::Error
143
143
  format_workstation_exception
144
- elsif exception.kind_of? Train::Error
144
+ elsif exception.is_a? Train::Error
145
145
  format_train_exception
146
146
  else
147
147
  format_other_exception
@@ -152,7 +152,7 @@ module ChefApply::UI
152
152
  if translation.log
153
153
  if translation.stack
154
154
  t.footer.both(ChefApply::Config.log.location,
155
- ChefApply::Config.stack_trace_path)
155
+ ChefApply::Config.stack_trace_path)
156
156
  else
157
157
  t.footer.log_only(ChefApply::Config.log.location)
158
158
  end
@@ -168,7 +168,7 @@ module ChefApply::UI
168
168
  def add_backtrace_header(out, args)
169
169
  out.write("\n#{"-" * 80}\n")
170
170
  out.print("#{Time.now}: Error encountered while running the following:\n")
171
- out.print(" #{args.join(' ')}\n")
171
+ out.print(" #{args.join(" ")}\n")
172
172
  out.print("Backtrace:\n")
173
173
  end
174
174
 
@@ -179,10 +179,10 @@ module ChefApply::UI
179
179
  end
180
180
 
181
181
  def self.error_summary(e)
182
- if e.kind_of? ChefApply::Error
182
+ if e.is_a? ChefApply::Error
183
183
  # By convention, all of our defined messages have a short summary on the first line.
184
184
  ChefApply::Text.errors.send(e.id).text(*e.params).split("\n").first
185
- elsif e.kind_of? String
185
+ elsif e.is_a? String
186
186
  e
187
187
  else
188
188
  if e.respond_to? :message
@@ -201,7 +201,7 @@ module ChefApply::UI
201
201
  # TODO this gets moved to trainerrormapper or simply removed since
202
202
  # many of these issues are now handled in the RemoteTarget::ConnectionFailure
203
203
  def format_train_exception
204
- backend, host = formatted_host()
204
+ backend, host = formatted_host
205
205
  if host.nil?
206
206
  t.CHEFTRN002.text(exception.message)
207
207
  else
@@ -215,6 +215,7 @@ module ChefApply::UI
215
215
 
216
216
  def formatted_host
217
217
  return nil if target_host.nil?
218
+
218
219
  cfg = target_host.config
219
220
  port = cfg[:port].nil? ? "" : ":#{cfg[:port]}"
220
221
  user = cfg[:user].nil? ? "" : "#{cfg[:user]}@"
@@ -251,6 +252,7 @@ module ChefApply::UI
251
252
  i = 1
252
253
  while i <= backtrace1.size && i <= backtrace2.size
253
254
  break if backtrace1[-i] != backtrace2[-i]
255
+
254
256
  i += 1
255
257
  end
256
258
  backtrace1[0..-i]
@@ -71,8 +71,7 @@ module ChefApply
71
71
  @err = false
72
72
  end
73
73
 
74
- def auto_spin
75
- end
74
+ def auto_spin; end
76
75
  end
77
76
  end
78
77
  end
@@ -39,7 +39,7 @@ module ChefApply
39
39
  @children.each do |child, block|
40
40
  @threads << Thread.new { block.call(child) }
41
41
  end
42
- @threads.each { |thr| thr.join }
42
+ @threads.each(&:join)
43
43
  end
44
44
  end
45
45
  end
@@ -51,9 +51,9 @@ module ChefApply
51
51
  # keys :top :middle and :bottom can contain Strings that are used to
52
52
  # indent the spinners. Ignored if message is blank
53
53
  multispinner = get_multispinner.new("[:spinner] #{header}",
54
- output: @location,
55
- hide_cursor: true,
56
- style: indent_style)
54
+ output: @location,
55
+ hide_cursor: true,
56
+ style: indent_style)
57
57
  jobs.each do |job|
58
58
  multispinner.register(spinner_prefix(job.prefix), hide_cursor: true) do |spinner|
59
59
  reporter = StatusReporter.new(spinner, prefix: job.prefix, key: :status)
@@ -91,7 +91,7 @@ module ChefApply
91
91
  end
92
92
 
93
93
  def show_cursor
94
- TTY::Cursor.show()
94
+ TTY::Cursor.show
95
95
  end
96
96
  end
97
97
  end
@@ -16,5 +16,5 @@
16
16
  #
17
17
 
18
18
  module ChefApply
19
- VERSION = "0.3.3".freeze
19
+ VERSION = "0.4.6".freeze
20
20
  end
data/spec/spec_helper.rb CHANGED
@@ -20,6 +20,46 @@ require "simplecov"
20
20
  require "rspec/expectations"
21
21
  require "support/matchers/output_to_terminal"
22
22
 
23
+ # class << Kernel
24
+ # alias :_require :require
25
+ # def require(*args)
26
+ #
27
+ # show = false
28
+ # args.each do |a|
29
+ # if a =~ /chef_apply.*/
30
+ # show = true
31
+ # break
32
+ # end
33
+ # end
34
+ #
35
+ # $stderr.puts "from #{File.basename(caller[1])}: require: %s" % [args.inspect] if show
36
+ # _require(*args)
37
+ # end
38
+ #
39
+ # alias :_load :load
40
+ # def load(*args)
41
+ # show = false
42
+ # args.each do |a|
43
+ # if a =~ /chef_apply.*/
44
+ # show = true
45
+ # break
46
+ # end
47
+ # end
48
+ # $stderr.puts "from #{File.basename(caller[1])}: load: %s" % [args.inspect] if show
49
+ # _load(*args)
50
+ # end
51
+ #
52
+ # end
53
+ #
54
+ # module Kernel
55
+ # def require(*args)
56
+ # Kernel.require(*args)
57
+ # end
58
+ # def load(*args)
59
+ # Kernel.load(*args)
60
+ # end
61
+ # end
62
+
23
63
  RemoteExecResult = Struct.new(:exit_status, :stdout, :stderr)
24
64
 
25
65
  class ChefApply::MockReporter
@@ -67,7 +107,7 @@ def assert_string_lookup(key, retval = "testvalue")
67
107
  it "should look up string #{key}" do
68
108
  top_level_method, *call_seq = key.split(".")
69
109
  terminal_method = call_seq.pop
70
- tmock = double()
110
+ tmock = double
71
111
  # Because ordering is important
72
112
  # (eg calling errors.hello is different from hello.errors),
73
113
  # we need to add this individually instead of using
@@ -102,8 +142,8 @@ RSpec.configure do |config|
102
142
  end
103
143
 
104
144
  config.before(:all) do
105
- ChefApply::Log.setup "/dev/null", :error
106
- ChefApply::UI::Terminal.init(File.open("/dev/null", "w"))
145
+ ChefApply::Log.setup File::NULL, :error
146
+ ChefApply::UI::Terminal.init(File.open(File::NULL, "w"))
107
147
  end
108
148
  end
109
149
 
@@ -28,7 +28,8 @@ RSpec.describe ChefApply::Action::Base do
28
28
  end
29
29
  let(:opts) do
30
30
  { target_host: target_host,
31
- other: "something-else" } end
31
+ other: "something-else" }
32
+ end
32
33
  subject(:action) { ChefApply::Action::Base.new(opts) }
33
34
 
34
35
  context "#initialize" do
@@ -16,16 +16,16 @@
16
16
  #
17
17
 
18
18
  require "spec_helper"
19
- require "chef_apply/errors/ccr_failure_mapper"
19
+ require "chef_apply/action/converge_target/ccr_failure_mapper"
20
20
 
21
- RSpec.describe ChefApply::Errors::CCRFailureMapper do
21
+ RSpec.describe ChefApply::Action::ConvergeTarget::CCRFailureMapper do
22
22
  let(:cause_line) { nil }
23
23
  let(:resource) { "apt_package" }
24
24
  let(:params) do
25
25
  { resource: resource, resource_name: "a-test-thing",
26
26
  stderr: "an error", stdout: "other output" }
27
27
  end
28
- subject { ChefApply::Errors::CCRFailureMapper.new(cause_line, params) }
28
+ subject { ChefApply::Action::ConvergeTarget::CCRFailureMapper.new(cause_line, params) }
29
29
 
30
30
  describe "#exception_args_from_cause" do
31
31
  context "when resource properties have valid names but invalid values" do
@@ -45,14 +45,16 @@ RSpec.describe ChefApply::Errors::CCRFailureMapper do
45
45
  it "returns a correct CHEFCCR004 when details are available" do
46
46
  expect(subject.exception_args_from_cause).to eq(
47
47
  ["CHEFCCR004",
48
- "Option force must be a kind of [TrueClass, FalseClass]! You passed \"purle\"."])
48
+ "Option force must be a kind of [TrueClass, FalseClass]! You passed \"purle\"."]
49
+ )
49
50
  end
50
51
  end
51
52
  context "And less detail is available" do
52
53
  let(:cause_line) { "Chef::Exceptions::User: linux_user[marc] ((chef-client cookbook)::(chef-client recipe) line 1) had an error: Chef::Exceptions::User: Couldn't lookup integer GID for group name blah" }
53
54
  it "returns a correct CHEFCCR002" do
54
55
  expect(subject.exception_args_from_cause).to eq(
55
- ["CHEFCCR002", "Couldn't lookup integer GID for group name blah"])
56
+ ["CHEFCCR002", "Couldn't lookup integer GID for group name blah"]
57
+ )
56
58
  end
57
59
  end
58
60
  end
@@ -70,7 +72,8 @@ RSpec.describe ChefApply::Errors::CCRFailureMapper do
70
72
  let(:cause_line) { "NoMethodError: undefined method `badresourceprop' for Chef::Resource::User::LinuxUser" }
71
73
  it "returns a correct CHEFCCR006 " do
72
74
  expect(subject.exception_args_from_cause).to eq(
73
- ["CHEFCCR006", "badresourceprop", "Chef::Resource::User::LinuxUser"])
75
+ ["CHEFCCR006", "badresourceprop", "Chef::Resource::User::LinuxUser"]
76
+ )
74
77
  end
75
78
  end
76
79
  end
@@ -79,7 +82,7 @@ RSpec.describe ChefApply::Errors::CCRFailureMapper do
79
82
  context "when no cause is provided" do
80
83
  let(:cause_line) { nil }
81
84
  it "raises a RemoteChefRunFailedToResolveError" do
82
- expect { subject.raise_mapped_exception! }.to raise_error(ChefApply::Errors::CCRFailureMapper::RemoteChefRunFailedToResolveError)
85
+ expect { subject.raise_mapped_exception! }.to raise_error(ChefApply::Action::ConvergeTarget::CCRFailureMapper::RemoteChefRunFailedToResolveError)
83
86
 
84
87
  end
85
88
  end
@@ -88,14 +91,14 @@ RSpec.describe ChefApply::Errors::CCRFailureMapper do
88
91
  context "but can't resolve it" do
89
92
  let(:cause_line) { "unparseable mess" }
90
93
  it "raises a RemoteChefClientRunFailedUnknownReason" do
91
- expect { subject.raise_mapped_exception! }.to raise_error(ChefApply::Errors::CCRFailureMapper::RemoteChefClientRunFailedUnknownReason)
94
+ expect { subject.raise_mapped_exception! }.to raise_error(ChefApply::Action::ConvergeTarget::CCRFailureMapper::RemoteChefClientRunFailedUnknownReason)
92
95
  end
93
96
  end
94
97
 
95
98
  context "and can resolve the cause" do
96
99
  let(:cause_line) { "NoMethodError: undefined method `badresourceprop' for Chef::Resource::User::LinuxUser" }
97
100
  it "raises a RemoteChefClientRunFailed" do
98
- expect { subject.raise_mapped_exception! }.to raise_error(ChefApply::Errors::CCRFailureMapper::RemoteChefClientRunFailed)
101
+ expect { subject.raise_mapped_exception! }.to raise_error(ChefApply::Action::ConvergeTarget::CCRFailureMapper::RemoteChefClientRunFailed)
99
102
  end
100
103
  end
101
104
  end