bolt 2.37.0 → 2.44.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of bolt might be problematic. Click here for more details.

Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/Puppetfile +17 -17
  3. data/bolt-modules/boltlib/lib/puppet/functions/parallelize.rb +6 -8
  4. data/lib/bolt/analytics.rb +3 -2
  5. data/lib/bolt/applicator.rb +11 -1
  6. data/lib/bolt/bolt_option_parser.rb +20 -13
  7. data/lib/bolt/catalog.rb +10 -29
  8. data/lib/bolt/cli.rb +58 -40
  9. data/lib/bolt/config.rb +134 -119
  10. data/lib/bolt/config/options.rb +142 -77
  11. data/lib/bolt/config/transport/base.rb +2 -2
  12. data/lib/bolt/config/transport/local.rb +1 -0
  13. data/lib/bolt/config/transport/options.rb +18 -68
  14. data/lib/bolt/config/transport/orch.rb +1 -0
  15. data/lib/bolt/config/transport/ssh.rb +0 -5
  16. data/lib/bolt/executor.rb +15 -5
  17. data/lib/bolt/inventory.rb +26 -0
  18. data/lib/bolt/inventory/group.rb +35 -12
  19. data/lib/bolt/inventory/inventory.rb +1 -1
  20. data/lib/bolt/inventory/options.rb +130 -0
  21. data/lib/bolt/inventory/target.rb +10 -11
  22. data/lib/bolt/logger.rb +114 -10
  23. data/lib/bolt/module.rb +10 -2
  24. data/lib/bolt/module_installer.rb +25 -15
  25. data/lib/bolt/module_installer/resolver.rb +65 -12
  26. data/lib/bolt/module_installer/specs/forge_spec.rb +8 -2
  27. data/lib/bolt/module_installer/specs/git_spec.rb +17 -2
  28. data/lib/bolt/outputter.rb +19 -5
  29. data/lib/bolt/outputter/human.rb +24 -1
  30. data/lib/bolt/outputter/json.rb +1 -1
  31. data/lib/bolt/outputter/logger.rb +1 -1
  32. data/lib/bolt/outputter/rainbow.rb +12 -1
  33. data/lib/bolt/pal.rb +93 -14
  34. data/lib/bolt/pal/yaml_plan.rb +8 -2
  35. data/lib/bolt/pal/yaml_plan/evaluator.rb +2 -2
  36. data/lib/bolt/pal/yaml_plan/transpiler.rb +6 -1
  37. data/lib/bolt/plugin.rb +3 -3
  38. data/lib/bolt/plugin/cache.rb +8 -8
  39. data/lib/bolt/plugin/module.rb +1 -1
  40. data/lib/bolt/plugin/puppet_connect_data.rb +35 -0
  41. data/lib/bolt/plugin/puppetdb.rb +2 -2
  42. data/lib/bolt/project.rb +76 -50
  43. data/lib/bolt/project_manager.rb +2 -0
  44. data/lib/bolt/project_manager/config_migrator.rb +9 -1
  45. data/lib/bolt/project_manager/module_migrator.rb +2 -0
  46. data/lib/bolt/puppetdb/client.rb +8 -0
  47. data/lib/bolt/rerun.rb +1 -1
  48. data/lib/bolt/shell/bash.rb +1 -1
  49. data/lib/bolt/shell/bash/tmpdir.rb +4 -1
  50. data/lib/bolt/shell/powershell.rb +7 -5
  51. data/lib/bolt/target.rb +4 -0
  52. data/lib/bolt/task.rb +1 -1
  53. data/lib/bolt/transport/docker/connection.rb +2 -2
  54. data/lib/bolt/transport/local.rb +13 -0
  55. data/lib/bolt/transport/orch/connection.rb +1 -1
  56. data/lib/bolt/transport/ssh.rb +1 -2
  57. data/lib/bolt/transport/ssh/connection.rb +1 -1
  58. data/lib/bolt/validator.rb +227 -0
  59. data/lib/bolt/version.rb +1 -1
  60. data/lib/bolt_server/config.rb +1 -1
  61. data/lib/bolt_server/schemas/partials/task.json +1 -1
  62. data/lib/bolt_server/transport_app.rb +28 -27
  63. data/libexec/bolt_catalog +1 -1
  64. metadata +27 -11
  65. data/lib/bolt/config/validator.rb +0 -231
@@ -7,7 +7,7 @@ require 'bolt/project'
7
7
  require 'bolt/logger'
8
8
  require 'bolt/util'
9
9
  require 'bolt/config/options'
10
- require 'bolt/config/validator'
10
+ require 'bolt/validator'
11
11
 
12
12
  module Bolt
13
13
  class UnknownTransportError < Bolt::Error
@@ -20,7 +20,7 @@ module Bolt
20
20
  class Config
21
21
  include Bolt::Config::Options
22
22
 
23
- attr_reader :config_files, :logs, :data, :transports, :project, :modified_concurrency, :deprecations
23
+ attr_reader :config_files, :data, :transports, :project, :modified_concurrency
24
24
 
25
25
  BOLT_CONFIG_NAME = 'bolt.yaml'
26
26
  BOLT_DEFAULTS_NAME = 'bolt-defaults.yaml'
@@ -33,9 +33,6 @@ module Bolt
33
33
  end
34
34
 
35
35
  def self.from_project(project, overrides = {})
36
- logs = []
37
- deprecations = []
38
-
39
36
  conf = if project.project_file == project.config_file
40
37
  project.data
41
38
  else
@@ -43,34 +40,28 @@ module Bolt
43
40
 
44
41
  # Validate the config against the schema. This will raise a single error
45
42
  # with all validation errors.
46
- Validator.new.tap do |validator|
43
+ Bolt::Validator.new.tap do |validator|
47
44
  validator.validate(c, bolt_schema, project.config_file.to_s)
48
-
49
- validator.warnings.each { |warning| logs << { warn: warning } }
50
-
51
- validator.deprecations.each do |dep|
52
- deprecations << { type: "#{BOLT_CONFIG_NAME} #{dep[:option]}", msg: dep[:message] }
53
- end
45
+ validator.warnings.each { |warning| Bolt::Logger.warn(warning[:id], warning[:msg]) }
46
+ validator.deprecations.each { |dep| Bolt::Logger.deprecate(dep[:id], dep[:msg]) }
54
47
  end
55
48
 
56
- logs << { debug: "Loaded configuration from #{project.config_file}" } if File.exist?(project.config_file)
49
+ if File.exist?(project.config_file)
50
+ Bolt::Logger.debug("Loaded configuration from #{project.config_file}")
51
+ end
57
52
  c
58
53
  end
59
54
 
60
55
  data = load_defaults(project).push(
61
- filepath: project.config_file,
62
- data: conf,
63
- logs: logs,
64
- deprecations: deprecations
56
+ filepath: project.config_file,
57
+ data: conf
65
58
  )
66
59
 
67
60
  new(project, data, overrides)
68
61
  end
69
62
 
70
63
  def self.from_file(configfile, overrides = {})
71
- project = Bolt::Project.create_project(Pathname.new(configfile).expand_path.dirname)
72
- logs = []
73
- deprecations = []
64
+ project = Bolt::Project.create_project(Pathname.new(configfile).expand_path.dirname)
74
65
 
75
66
  conf = if project.project_file == project.config_file
76
67
  project.data
@@ -79,46 +70,55 @@ module Bolt
79
70
 
80
71
  # Validate the config against the schema. This will raise a single error
81
72
  # with all validation errors.
82
- Validator.new.tap do |validator|
73
+ Bolt::Validator.new.tap do |validator|
83
74
  validator.validate(c, bolt_schema, project.config_file.to_s)
84
-
85
- validator.warnings.each { |warning| logs << { warn: warning } }
86
-
87
- validator.deprecations.each do |dep|
88
- deprecations << { type: "#{BOLT_CONFIG_NAME} #{dep[:option]}", msg: dep[:message] }
89
- end
75
+ validator.warnings.each { |warning| Bolt::Logger.warn(warning[:id], warning[:msg]) }
76
+ validator.deprecations.each { |dep| Bolt::Logger.deprecate(dep[:id], dep[:msg]) }
90
77
  end
91
78
 
92
- logs << { debug: "Loaded configuration from #{configfile}" }
79
+ Bolt::Logger.debug("Loaded configuration from #{configfile}")
80
+
93
81
  c
94
82
  end
95
83
 
96
84
  data = load_defaults(project).push(
97
- filepath: configfile,
98
- data: conf,
99
- logs: logs,
100
- deprecations: deprecations
85
+ filepath: configfile,
86
+ data: conf
101
87
  )
102
88
 
103
89
  new(project, data, overrides)
104
90
  end
105
91
 
106
- def self.defaults_schema
107
- base = OPTIONS.slice(*BOLT_DEFAULTS_OPTIONS)
108
- inventory = INVENTORY_OPTIONS.each_with_object({}) do |(option, definition), acc|
92
+ # Builds a hash of definitions for transport configuration.
93
+ #
94
+ def self.transport_definitions
95
+ INVENTORY_OPTIONS.each_with_object({}) do |(option, definition), acc|
109
96
  acc[option] = TRANSPORT_CONFIG.key?(option) ? definition.merge(TRANSPORT_CONFIG[option].schema) : definition
110
97
  end
98
+ end
111
99
 
112
- base['inventory-config'][:properties] = inventory
113
- base
100
+ # Builds the schema for bolt-defaults.yaml used by the validator.
101
+ #
102
+ def self.defaults_schema
103
+ schema = {
104
+ type: Hash,
105
+ properties: BOLT_DEFAULTS_OPTIONS.map { |opt| [opt, _ref: opt] }.to_h,
106
+ definitions: OPTIONS.merge(transport_definitions)
107
+ }
108
+
109
+ schema[:definitions]['inventory-config'][:properties] = transport_definitions
110
+
111
+ schema
114
112
  end
115
113
 
114
+ # Builds the schema for bolt.yaml used by the validator.
115
+ #
116
116
  def self.bolt_schema
117
- inventory = INVENTORY_OPTIONS.each_with_object({}) do |(option, definition), acc|
118
- acc[option] = TRANSPORT_CONFIG.key?(option) ? definition.merge(TRANSPORT_CONFIG[option].schema) : definition
119
- end
120
-
121
- OPTIONS.slice(*BOLT_OPTIONS).merge(inventory)
117
+ {
118
+ type: Hash,
119
+ properties: (BOLT_OPTIONS + INVENTORY_OPTIONS.keys).map { |opt| [opt, _ref: opt] }.to_h,
120
+ definitions: OPTIONS.merge(transport_definitions)
121
+ }
122
122
  end
123
123
 
124
124
  def self.system_path
@@ -141,27 +141,24 @@ module Bolt
141
141
  def self.load_bolt_defaults_yaml(dir)
142
142
  filepath = dir + BOLT_DEFAULTS_NAME
143
143
  data = Bolt::Util.read_yaml_hash(filepath, 'config')
144
- logs = [{ debug: "Loaded configuration from #{filepath}" }]
145
- deprecations = []
144
+
145
+ Bolt::Logger.debug("Loaded configuration from #{filepath}")
146
146
 
147
147
  # Warn if 'bolt.yaml' detected in same directory.
148
148
  if File.exist?(bolt_yaml = dir + BOLT_CONFIG_NAME)
149
- logs.push(
150
- warn: "Detected multiple configuration files: ['#{bolt_yaml}', '#{filepath}']. '#{bolt_yaml}' "\
149
+ Bolt::Logger.warn(
150
+ "multiple_config_files",
151
+ "Detected multiple configuration files: ['#{bolt_yaml}', '#{filepath}']. '#{bolt_yaml}' "\
151
152
  "will be ignored."
152
153
  )
153
154
  end
154
155
 
155
156
  # Validate the config against the schema. This will raise a single error
156
157
  # with all validation errors.
157
- Validator.new.tap do |validator|
158
+ Bolt::Validator.new.tap do |validator|
158
159
  validator.validate(data, defaults_schema, filepath)
159
-
160
- validator.warnings.each { |warning| logs << { warn: warning } }
161
-
162
- validator.deprecations.each do |dep|
163
- deprecations << { type: "#{BOLT_DEFAULTS_NAME} #{dep[:option]}", msg: dep[:message] }
164
- end
160
+ validator.warnings.each { |warning| Bolt::Logger.warn(warning[:id], warning[:msg]) }
161
+ validator.deprecations.each { |dep| Bolt::Logger.deprecate(dep[:id], dep[:msg]) }
165
162
  end
166
163
 
167
164
  # Remove project-specific config such as hiera-config, etc.
@@ -169,8 +166,10 @@ module Bolt
169
166
 
170
167
  if project_config.any?
171
168
  data.reject! { |key, _| project_config.include?(key) }
172
- logs.push(
173
- warn: "Unsupported project configuration detected in '#{filepath}': #{project_config.keys}. "\
169
+
170
+ Bolt::Logger.warn(
171
+ "unsupported_project_config",
172
+ "Unsupported project configuration detected in '#{filepath}': #{project_config.keys}. "\
174
173
  "Project configuration should be set in 'bolt-project.yaml'."
175
174
  )
176
175
  end
@@ -180,8 +179,10 @@ module Bolt
180
179
 
181
180
  if transport_config.any?
182
181
  data.reject! { |key, _| transport_config.include?(key) }
183
- logs.push(
184
- warn: "Unsupported inventory configuration detected in '#{filepath}': #{transport_config.keys}. "\
182
+
183
+ Bolt::Logger.warn(
184
+ "unsupported_inventory_config",
185
+ "Unsupported inventory configuration detected in '#{filepath}': #{transport_config.keys}. "\
185
186
  "Transport configuration should be set under the 'inventory-config' option or "\
186
187
  "in 'inventory.yaml'."
187
188
  )
@@ -206,7 +207,7 @@ module Bolt
206
207
  data = data.merge(data.delete('inventory-config'))
207
208
  end
208
209
 
209
- { filepath: filepath, data: data, logs: logs, deprecations: deprecations }
210
+ { filepath: filepath, data: data }
210
211
  end
211
212
 
212
213
  # Loads a 'bolt.yaml' file, the legacy configuration file. There's no special munging needed
@@ -214,24 +215,24 @@ module Bolt
214
215
  def self.load_bolt_yaml(dir)
215
216
  filepath = dir + BOLT_CONFIG_NAME
216
217
  data = Bolt::Util.read_yaml_hash(filepath, 'config')
217
- logs = [{ debug: "Loaded configuration from #{filepath}" }]
218
- deprecations = [{ type: 'Using bolt.yaml for system configuration',
219
- msg: "Configuration file #{filepath} is deprecated and will be removed in Bolt 3.0. "\
220
- "See https://pup.pt/update-bolt-config for how to update to the latest Bolt practices." }]
218
+
219
+ Bolt::Logger.debug("Loaded configuration from #{filepath}")
220
+
221
+ Bolt::Logger.deprecate(
222
+ "bolt_yaml",
223
+ "Configuration file #{filepath} is deprecated and will be removed in Bolt 3.0. "\
224
+ "See https://pup.pt/update-bolt-config for how to update to the latest Bolt practices."
225
+ )
221
226
 
222
227
  # Validate the config against the schema. This will raise a single error
223
228
  # with all validation errors.
224
- Validator.new.tap do |validator|
229
+ Bolt::Validator.new.tap do |validator|
225
230
  validator.validate(data, bolt_schema, filepath)
226
-
227
- validator.warnings.each { |warning| logs << { warn: warning } }
228
-
229
- validator.deprecations.each do |dep|
230
- deprecations << { type: "#{BOLT_CONFIG_NAME} #{dep[:option]}", msg: dep[:message] }
231
- end
231
+ validator.warnings.each { |warning| Bolt::Logger.warn(warning[:id], warning[:msg]) }
232
+ validator.deprecations.each { |dep| Bolt::Logger.deprecate(dep[:id], dep[:msg]) }
232
233
  end
233
234
 
234
- { filepath: filepath, data: data, logs: logs, deprecations: deprecations }
235
+ { filepath: filepath, data: data }
235
236
  end
236
237
 
237
238
  def self.load_defaults(project)
@@ -262,16 +263,11 @@ module Bolt
262
263
 
263
264
  def initialize(project, config_data, overrides = {})
264
265
  unless config_data.is_a?(Array)
265
- config_data = [{ filepath: project.config_file,
266
- data: config_data,
267
- logs: [],
268
- deprecations: [] }]
266
+ config_data = [{ filepath: project.config_file, data: config_data }]
269
267
  end
270
268
 
271
269
  @logger = Bolt::Logger.logger(self)
272
270
  @project = project
273
- @logs = @project.logs.dup
274
- @deprecations = @project.deprecations.dup
275
271
  @transports = {}
276
272
  @config_files = []
277
273
 
@@ -281,14 +277,17 @@ module Bolt
281
277
  'color' => true,
282
278
  'compile-concurrency' => Etc.nprocessors,
283
279
  'concurrency' => default_concurrency,
280
+ 'disable-warnings' => [],
284
281
  'format' => 'human',
285
282
  'log' => { 'console' => {} },
283
+ 'module-install' => {},
286
284
  'plugin-hooks' => {},
287
285
  'plugin_hooks' => {},
288
286
  'plugins' => {},
289
287
  'puppetdb' => {},
290
288
  'puppetfile' => {},
291
289
  'save-rerun' => true,
290
+ 'spinner' => true,
292
291
  'transport' => 'ssh'
293
292
  }
294
293
 
@@ -300,9 +299,6 @@ module Bolt
300
299
  end
301
300
 
302
301
  loaded_data = config_data.each_with_object([]) do |data, acc|
303
- @logs.concat(data[:logs]) if data[:logs].any?
304
- @deprecations.concat(data[:deprecations]) if data[:deprecations].any?
305
-
306
302
  if data[:data].any?
307
303
  @config_files.push(data[:filepath])
308
304
  acc.push(data[:data])
@@ -353,7 +349,7 @@ module Bolt
353
349
  overrides['trace'] = opts['trace'] if opts.key?('trace')
354
350
 
355
351
  # Validate the overrides
356
- Validator.new.validate(overrides, OPTIONS, 'command line')
352
+ Bolt::Validator.new.validate(overrides, self.class.bolt_schema, 'command line')
357
353
 
358
354
  overrides
359
355
  end
@@ -373,6 +369,9 @@ module Bolt
373
369
  # Hash values are shallow merged
374
370
  when 'puppetdb', 'plugin-hooks', 'plugin_hooks', 'apply-settings', 'apply_settings', 'log'
375
371
  val1.merge(val2)
372
+ # Disabled warnings are concatenated
373
+ when 'disable-warnings'
374
+ val1.concat(val2)
376
375
  # All other values are overwritten
377
376
  else
378
377
  val2
@@ -408,7 +407,7 @@ module Bolt
408
407
  end
409
408
 
410
409
  # Filter hashes to only include valid options
411
- %w[apply-settings apply_settings puppetfile].each do |opt|
410
+ %w[apply-settings apply_settings module-install puppetfile].each do |opt|
412
411
  @data[opt] = @data[opt].slice(*OPTIONS.dig(opt, :properties).keys)
413
412
  end
414
413
  end
@@ -433,46 +432,23 @@ module Bolt
433
432
  next if val == 'disable'
434
433
 
435
434
  name = normalize_log(key)
435
+ acc[name] = val.slice('append', 'level').transform_keys(&:to_sym)
436
436
 
437
- # But otherwise it has to be a Hash
438
- unless val.is_a?(Hash)
439
- raise Bolt::ValidationError,
440
- "config of log #{name} must be a Hash, received #{val.class} #{val.inspect}"
441
- end
442
-
443
- acc[name] = val.slice('append', 'level')
444
- .transform_keys(&:to_sym)
445
-
446
- if (v = acc[name][:level])
447
- unless v.is_a?(String) || v.is_a?(Symbol)
448
- raise Bolt::ValidationError,
449
- "level of log #{name} must be a String or Symbol, received #{v.class} #{v.inspect}"
450
- end
451
-
452
- unless Bolt::Logger.valid_level?(v)
453
- raise Bolt::ValidationError,
454
- "level of log #{name} must be one of #{Bolt::Logger.levels.join(', ')}; received #{v}"
455
- end
437
+ next unless acc[name][:level] == 'notice'
456
438
 
457
- if v == 'notice'
458
- @deprecations << {
459
- type: 'notice log level',
460
- msg: "Log level 'notice' is deprecated and will be removed in Bolt 3.0. Use 'info' instead."
461
- }
462
- end
463
- end
464
-
465
- if (v = acc[name][:append]) && v != true && v != false
466
- raise Bolt::ValidationError,
467
- "append flag of log #{name} must be a Boolean, received #{v.class} #{v.inspect}"
468
- end
439
+ Bolt::Logger.deprecate(
440
+ "notice_log_level",
441
+ "Log level 'notice' is deprecated and will be removed in Bolt 3.0. Use 'info' instead."
442
+ )
469
443
  end
470
444
  end
471
445
 
472
446
  def validate
473
447
  if @data['future']
474
- msg = "Configuration option 'future' no longer exposes future behavior."
475
- @logs << { warn: msg }
448
+ Bolt::Logger.warn(
449
+ "future_option",
450
+ "Configuration option 'future' no longer exposes future behavior."
451
+ )
476
452
  end
477
453
 
478
454
  if @project.modules && @data['modulepath']&.include?(@project.managed_moduledir.to_s)
@@ -494,8 +470,35 @@ module Bolt
494
470
  Bolt::Util.validate_file('inventory file', default_inventoryfile)
495
471
  end
496
472
 
497
- unless TRANSPORT_CONFIG.include?(transport)
498
- raise UnknownTransportError, transport
473
+ # Warn the user how they should be using the 'puppetfile' or
474
+ # 'module-install' config options. We don't error here since these
475
+ # settings can be set at the user or system level.
476
+ if @project.modules && puppetfile_config.any? && module_install.empty?
477
+ command = Bolt::Util.powershell? ? 'Update-BoltProject' : 'bolt project migrate'
478
+ Bolt::Logger.warn(
479
+ "module_install_config",
480
+ "Detected configuration for 'puppetfile'. This setting is not "\
481
+ "used when 'modules' is configured. Use 'module-install' instead. "\
482
+ "To automatically update your project configuration, run '#{command}'."
483
+ )
484
+ elsif @project.modules.nil? && puppetfile_config.empty? && module_install.any?
485
+ Bolt::Logger.warn(
486
+ "module_install_config",
487
+ "Detected configuration for 'module-install'. This setting is not "\
488
+ "used when 'modules' is not configured. Use 'puppetfile' instead."
489
+ )
490
+ elsif @project.modules && puppetfile_config.any? && module_install.any?
491
+ Bolt::Logger.warn(
492
+ "module_install_config",
493
+ "Detected configuration for 'puppetfile' and 'module-install'. Using "\
494
+ "configuration for 'module-install' because 'modules' is also configured."
495
+ )
496
+ elsif @project.modules.nil? && puppetfile_config.any? && module_install.any?
497
+ Bolt::Logger.warn(
498
+ "module_install_config",
499
+ "Detected configuration for 'puppetfile' and 'module-install'. Using "\
500
+ "configuration for 'puppetfile' because 'modules' is not configured."
501
+ )
499
502
  end
500
503
  end
501
504
 
@@ -565,6 +568,10 @@ module Bolt
565
568
  @data['save-rerun']
566
569
  end
567
570
 
571
+ def spinner
572
+ @data['spinner']
573
+ end
574
+
568
575
  def inventoryfile
569
576
  @data['inventoryfile']
570
577
  end
@@ -584,7 +591,7 @@ module Bolt
584
591
  def plugin_hooks
585
592
  if @data['plugin-hooks'].any? && @data['plugin_hooks'].any?
586
593
  Bolt::Logger.warn_once(
587
- "plugin-hooks and plugin_hooks set",
594
+ "plugin_hooks_conflict",
588
595
  "Detected configuration for 'plugin-hooks' and 'plugin_hooks'. Bolt will ignore 'plugin_hooks'."
589
596
  )
590
597
 
@@ -603,7 +610,7 @@ module Bolt
603
610
  def apply_settings
604
611
  if @data['apply-settings'].any? && @data['apply_settings'].any?
605
612
  Bolt::Logger.warn_once(
606
- "apply-settings and apply_settings set",
613
+ "apply_settings_conflict",
607
614
  "Detected configuration for 'apply-settings' and 'apply_settings'. Bolt will ignore 'apply_settings'."
608
615
  )
609
616
 
@@ -619,6 +626,14 @@ module Bolt
619
626
  @data['transport']
620
627
  end
621
628
 
629
+ def module_install
630
+ @project.module_install || @data['module-install']
631
+ end
632
+
633
+ def disable_warnings
634
+ Set.new(@project.disable_warnings + @data['disable-warnings'])
635
+ end
636
+
622
637
  # Check if there is a case-insensitive match to the path
623
638
  def check_path_case(type, paths)
624
639
  return if paths.nil?
@@ -627,7 +642,7 @@ module Bolt
627
642
  if matches.any?
628
643
  msg = "WARNING: Bolt is case sensitive when specifying a #{type}. Did you mean:\n"
629
644
  matches.each { |path| msg += " #{path}\n" }
630
- @logger.warn msg
645
+ Bolt::Logger.warn("path_case", msg)
631
646
  end
632
647
  end
633
648