bolt 2.6.0 → 2.11.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/Puppetfile +4 -3
  3. data/bolt-modules/boltlib/lib/puppet/datatypes/applyresult.rb +2 -0
  4. data/bolt-modules/boltlib/lib/puppet/datatypes/resourceinstance.rb +27 -0
  5. data/bolt-modules/boltlib/lib/puppet/datatypes/result.rb +2 -0
  6. data/bolt-modules/boltlib/lib/puppet/datatypes/resultset.rb +2 -0
  7. data/bolt-modules/boltlib/lib/puppet/datatypes/target.rb +4 -3
  8. data/bolt-modules/boltlib/lib/puppet/functions/run_plan.rb +1 -1
  9. data/bolt-modules/boltlib/lib/puppet/functions/run_task_with.rb +192 -0
  10. data/bolt-modules/boltlib/lib/puppet/functions/set_resources.rb +122 -0
  11. data/bolt-modules/boltlib/types/planresult.pp +12 -1
  12. data/bolt-modules/file/lib/puppet/functions/file/exists.rb +3 -1
  13. data/bolt-modules/file/lib/puppet/functions/file/join.rb +1 -1
  14. data/bolt-modules/file/lib/puppet/functions/file/read.rb +2 -1
  15. data/bolt-modules/file/lib/puppet/functions/file/readable.rb +3 -1
  16. data/bolt-modules/file/lib/puppet/functions/file/write.rb +3 -1
  17. data/bolt-modules/prompt/lib/puppet/functions/prompt.rb +43 -0
  18. data/lib/bolt/analytics.rb +1 -1
  19. data/lib/bolt/applicator.rb +3 -2
  20. data/lib/bolt/apply_inventory.rb +1 -1
  21. data/lib/bolt/apply_result.rb +1 -1
  22. data/lib/bolt/apply_target.rb +11 -2
  23. data/lib/bolt/bolt_option_parser.rb +27 -7
  24. data/lib/bolt/catalog.rb +32 -3
  25. data/lib/bolt/cli.rb +52 -22
  26. data/lib/bolt/config.rb +51 -27
  27. data/lib/bolt/config/transport/base.rb +3 -3
  28. data/lib/bolt/config/transport/docker.rb +7 -1
  29. data/lib/bolt/config/transport/local.rb +9 -1
  30. data/lib/bolt/config/transport/orch.rb +4 -2
  31. data/lib/bolt/config/transport/remote.rb +2 -0
  32. data/lib/bolt/config/transport/ssh.rb +81 -3
  33. data/lib/bolt/config/transport/winrm.rb +6 -1
  34. data/lib/bolt/executor.rb +38 -0
  35. data/lib/bolt/inventory.rb +2 -1
  36. data/lib/bolt/inventory/group.rb +1 -0
  37. data/lib/bolt/inventory/inventory.rb +9 -0
  38. data/lib/bolt/inventory/target.rb +17 -1
  39. data/lib/bolt/node/output.rb +1 -1
  40. data/lib/bolt/outputter/human.rb +5 -4
  41. data/lib/bolt/outputter/json.rb +1 -1
  42. data/lib/bolt/pal.rb +32 -14
  43. data/lib/bolt/pal/yaml_plan.rb +1 -0
  44. data/lib/bolt/plugin.rb +14 -8
  45. data/lib/bolt/plugin/env_var.rb +2 -1
  46. data/lib/bolt/plugin/module.rb +40 -7
  47. data/lib/bolt/plugin/prompt.rb +1 -1
  48. data/lib/bolt/plugin/puppetdb.rb +5 -2
  49. data/lib/bolt/project.rb +135 -0
  50. data/lib/bolt/puppetdb/config.rb +16 -28
  51. data/lib/bolt/rerun.rb +1 -1
  52. data/lib/bolt/resource_instance.rb +126 -0
  53. data/lib/bolt/result.rb +46 -23
  54. data/lib/bolt/result_set.rb +2 -5
  55. data/lib/bolt/secret.rb +20 -4
  56. data/lib/bolt/shell/bash.rb +27 -14
  57. data/lib/bolt/shell/bash/tmpdir.rb +1 -1
  58. data/lib/bolt/shell/powershell.rb +43 -15
  59. data/lib/bolt/shell/powershell/snippets.rb +1 -1
  60. data/lib/bolt/target.rb +18 -2
  61. data/lib/bolt/transport/base.rb +24 -8
  62. data/lib/bolt/transport/docker.rb +3 -3
  63. data/lib/bolt/transport/docker/connection.rb +11 -7
  64. data/lib/bolt/transport/local/connection.rb +13 -7
  65. data/lib/bolt/transport/orch.rb +5 -1
  66. data/lib/bolt/transport/ssh.rb +6 -2
  67. data/lib/bolt/transport/ssh/connection.rb +26 -1
  68. data/lib/bolt/transport/ssh/exec_connection.rb +110 -0
  69. data/lib/bolt/transport/winrm/connection.rb +10 -2
  70. data/lib/bolt/version.rb +1 -1
  71. data/lib/bolt_server/pe/pal.rb +1 -38
  72. data/lib/bolt_server/transport_app.rb +7 -7
  73. data/lib/bolt_spec/bolt_context.rb +3 -6
  74. data/lib/bolt_spec/plans.rb +78 -8
  75. data/lib/bolt_spec/plans/action_stubs.rb +37 -7
  76. data/lib/bolt_spec/plans/action_stubs/plan_stub.rb +55 -0
  77. data/lib/bolt_spec/plans/mock_executor.rb +62 -2
  78. data/lib/bolt_spec/run.rb +10 -13
  79. metadata +26 -7
  80. data/lib/bolt/boltdir.rb +0 -54
  81. data/lib/bolt/plugin/pkcs7.rb +0 -104
  82. data/lib/bolt/secret/base.rb +0 -41
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'bolt/plan_result'
3
4
  require 'bolt/result'
4
5
  require 'bolt/util'
5
6
 
@@ -23,8 +24,8 @@ module BoltSpec
23
24
  @stubs.each { |s| s.assert_called(object) }
24
25
  end
25
26
 
26
- def add_stub
27
- stub = Plans.const_get(@action_stub).new
27
+ def add_stub(inventory = nil)
28
+ stub = Plans.const_get(@action_stub).new(false, inventory)
28
29
  @stubs.unshift stub
29
30
  stub
30
31
  end
@@ -33,7 +34,7 @@ module BoltSpec
33
34
  class ActionStub
34
35
  attr_reader :invocation
35
36
 
36
- def initialize(expect = false)
37
+ def initialize(expect = false, inventory = nil)
37
38
  @calls = 0
38
39
  @expect = expect
39
40
  @expected_calls = nil
@@ -41,6 +42,7 @@ module BoltSpec
41
42
  @invocation = {}
42
43
  # return value
43
44
  @data = { default: {} }
45
+ @inventory = inventory
44
46
  end
45
47
 
46
48
  def assert_called(object)
@@ -55,7 +57,16 @@ module BoltSpec
55
57
  end
56
58
  message = "Expected #{object} to be called #{times} times"
57
59
  message += " with targets #{@invocation[:targets]}" if @invocation[:targets]
58
- message += " with parameters #{parameters}" if parameters
60
+ if parameters
61
+ # Print the parameters hash by converting it to JSON and then re-parsing.
62
+ # This prevents issues in Bolt data types, such as Targets, from generating
63
+ # gigantic, unreadable, data when converted to string by interpolation.
64
+ # Targets exhibit this behavior because they have a reference to @inventory.
65
+ # When the target is converted into a string, it converts the full Inventory
66
+ # into a string recursively.
67
+ parameters_str = JSON.parse(parameters.to_json)
68
+ message += " with parameters #{parameters_str}"
69
+ end
59
70
  raise message
60
71
  end
61
72
  end
@@ -71,6 +82,14 @@ module BoltSpec
71
82
  # Used to create a valid Bolt::Result object from result data.
72
83
  def default_for(target)
73
84
  case @data[:default]
85
+ when Bolt::PlanFailure
86
+ # Bolt::PlanFailure needs to be declared before Bolt::Error because
87
+ # Bolt::PlanFailure is an instance of Bolt::Error, so it can match both
88
+ # in this case we need to treat Bolt::PlanFailure's in a different way
89
+ #
90
+ # raise Bolt::PlanFailure errors so that the PAL can catch them and wrap
91
+ # them into Bolt::PlanResult's for us.
92
+ raise @data[:default]
74
93
  when Bolt::Error
75
94
  Bolt::Result.from_exception(target, @data[:default])
76
95
  when Hash
@@ -87,6 +106,13 @@ module BoltSpec
87
106
  result_set
88
107
  end
89
108
 
109
+ def check_plan_result(plan_result, plan_clj)
110
+ unless plan_result.is_a?(Bolt::PlanResult)
111
+ raise "Return block for #{plan_clj.closure_name} did not return a Bolt::PlanResult"
112
+ end
113
+ plan_result
114
+ end
115
+
90
116
  # Below here are the intended 'public' methods of the stub
91
117
 
92
118
  # Restricts the stub to only match invocations with
@@ -127,7 +153,10 @@ module BoltSpec
127
153
  def return_for_targets(data)
128
154
  data.each_with_object(@data) do |(target, result), hsh|
129
155
  raise "Mocked results must be hashes: #{target}: #{result}" unless result.is_a? Hash
130
- hsh[target] = result_for(Bolt::Target.new(target), Bolt::Util.walk_keys(result, &:to_sym))
156
+ # set the inventory from the BoltSpec::Plans, otherwise if we try to convert
157
+ # this target to a string, it will fail to string conversion because the
158
+ # inventory is nil
159
+ hsh[target] = result_for(Bolt::Target.new(target, @inventory), Bolt::Util.walk_keys(result, &:to_sym))
131
160
  end
132
161
  raise "Cannot set return values and return block." if @return_block
133
162
  @data_set = true
@@ -143,10 +172,10 @@ module BoltSpec
143
172
  end
144
173
 
145
174
  # Set a default error result for all targets.
146
- def error_with(data)
175
+ def error_with(data, clazz = Bolt::Error)
147
176
  data = Bolt::Util.walk_keys(data, &:to_s)
148
177
  if data['msg'] && data['kind'] && (data.keys - %w[msg kind details issue_code]).empty?
149
- @data[:default] = Bolt::Error.new(data['msg'], data['kind'], data['details'], data['issue_code'])
178
+ @data[:default] = clazz.new(data['msg'], data['kind'], data['details'], data['issue_code'])
150
179
  else
151
180
  STDERR.puts "In the future 'error_with()' may require msg and kind, and " \
152
181
  "optionally accept only details and issue_code."
@@ -160,6 +189,7 @@ module BoltSpec
160
189
  end
161
190
 
162
191
  require_relative 'action_stubs/command_stub'
192
+ require_relative 'action_stubs/plan_stub'
163
193
  require_relative 'action_stubs/script_stub'
164
194
  require_relative 'action_stubs/task_stub'
165
195
  require_relative 'action_stubs/upload_stub'
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BoltSpec
4
+ module Plans
5
+ class PlanStub < ActionStub
6
+ def matches(_scope, _plan, params)
7
+ targets = params.fetch('nodes', params.fetch('targets', nil))
8
+ if @invocation[:targets] && Set.new(@invocation[:targets]) != Set.new(targets)
9
+ return false
10
+ end
11
+
12
+ if @invocation[:params] && params != @invocation[:params]
13
+ return false
14
+ end
15
+
16
+ true
17
+ end
18
+
19
+ def call(_scope, plan, params)
20
+ @calls += 1
21
+ if @return_block
22
+ check_plan_result(@return_block.call(plan: plan, params: params), plan)
23
+ else
24
+ default_for(nil)
25
+ end
26
+ end
27
+
28
+ def parameters
29
+ @invocation[:params]
30
+ end
31
+
32
+ # Allow any data.
33
+ def result_for(_target, data)
34
+ Bolt::PlanResult.new(Bolt::Util.walk_keys(data, &:to_s), 'success')
35
+ end
36
+
37
+ # Public methods
38
+
39
+ # Restricts the stub to only match invocations with certain parameters.
40
+ # All parameters must match exactly.
41
+ def with_params(params)
42
+ @invocation[:params] = params
43
+ self
44
+ end
45
+
46
+ def return_for_targets(_data)
47
+ raise "return_for_targets is not implemented for plan spec tests (allow_plan, expect_plan, allow_any_plan, etc)"
48
+ end
49
+
50
+ def error_with(data, clazz = Bolt::PlanFailure)
51
+ super(data, clazz)
52
+ end
53
+ end
54
+ end
55
+ end
@@ -3,6 +3,7 @@
3
3
  require 'bolt_spec/plans/action_stubs'
4
4
  require 'bolt_spec/plans/publish_stub'
5
5
  require 'bolt/error'
6
+ require 'bolt/executor'
6
7
  require 'bolt/result_set'
7
8
  require 'bolt/result'
8
9
  require 'pathname'
@@ -10,14 +11,14 @@ require 'set'
10
11
 
11
12
  module BoltSpec
12
13
  module Plans
13
- MOCKED_ACTIONS = %i[command script task upload].freeze
14
+ MOCKED_ACTIONS = %i[command plan script task upload].freeze
14
15
 
15
16
  class UnexpectedInvocation < ArgumentError; end
16
17
 
17
18
  # Nothing on the executor is 'public'
18
19
  class MockExecutor
19
20
  attr_reader :noop, :error_message
20
- attr_accessor :run_as, :transport_features
21
+ attr_accessor :run_as, :transport_features, :execute_any_plan
21
22
 
22
23
  def initialize(modulepath)
23
24
  @noop = false
@@ -28,6 +29,13 @@ module BoltSpec
28
29
  MOCKED_ACTIONS.each { |action| instance_variable_set(:"@#{action}_doubles", {}) }
29
30
  @stub_out_message = nil
30
31
  @transport_features = ['puppet-agent']
32
+ @executor_real = Bolt::Executor.new
33
+ # by default, we want to execute any plan that we come across without error
34
+ # or mocking. users can toggle this behavior so that plans will either need to
35
+ # be mocked out, or an error will be thrown.
36
+ @execute_any_plan = true
37
+ # plans that are allowed to be executed by the @executor_real
38
+ @allowed_exec_plans = {}
31
39
  end
32
40
 
33
41
  def module_file_id(file)
@@ -96,6 +104,57 @@ module BoltSpec
96
104
  result
97
105
  end
98
106
 
107
+ def with_plan_allowed_exec(plan_name, params)
108
+ @allowed_exec_plans[plan_name] = params
109
+ result = yield
110
+ @allowed_exec_plans.delete(plan_name)
111
+ result
112
+ end
113
+
114
+ def run_plan(scope, plan_clj, params)
115
+ result = nil
116
+ plan_name = plan_clj.closure_name
117
+
118
+ # get the mock object either by plan name, or the default in case allow_any_plan
119
+ # was called, if both are nil / don't exist, then dub will be nil and we'll fall
120
+ # through to another conditional statement
121
+ doub = @plan_doubles[plan_name] || @plan_doubles[:default]
122
+
123
+ # High level:
124
+ # - If we've explicitly allowed execution of the plan (normally the main plan
125
+ # passed into BoltSpec::Plan::run_plan()), then execute it
126
+ # - If we've explicitly "allowed/expected" the plan (mocked),
127
+ # then run it through the mock object
128
+ # - If we're allowing "any" plan to be executed,
129
+ # then execute it
130
+ # - Otherwise we have an error
131
+ if @allowed_exec_plans.key?(plan_name) && @allowed_exec_plans[plan_name] == params
132
+ # This plan's name + parameters were explicitly allowed to be executed.
133
+ # run it with the real executor.
134
+ # We require this functionality so that the BoltSpec::Plans.run_plan()
135
+ # function can kick off the initial plan. In reality, no other plans should
136
+ # be in this hash.
137
+ result = @executor_real.run_plan(scope, plan_clj, params)
138
+ elsif doub
139
+ result = doub.process(scope, plan_clj, params)
140
+ # the throw here is how Puppet exits out of a closure and returns a result
141
+ # it throws this special symbol with a result object that is captured by
142
+ # the run_plan Puppet function
143
+ throw :return, result
144
+ elsif @execute_any_plan
145
+ # if the plan wasn't allowed or mocked out, and we're allowing any plan to be
146
+ # executed, then execute the plan
147
+ result = @executor_real.run_plan(scope, plan_clj, params)
148
+ else
149
+ # convert to JSON and back so that we get the ruby representation with all keys and
150
+ # values converted to a string .to_s instead of their ruby object notation
151
+ params_str = JSON.parse(params.to_json)
152
+ @error_message = "Unexpected call to 'run_plan(#{plan_name}, #{params_str})'"
153
+ raise UnexpectedInvocation, @error_message
154
+ end
155
+ result
156
+ end
157
+
99
158
  def assert_call_expectations
100
159
  MOCKED_ACTIONS.each do |action|
101
160
  instance_variable_get(:"@#{action}_doubles").map do |object, doub|
@@ -171,6 +230,7 @@ module BoltSpec
171
230
  def transport(_protocol)
172
231
  Class.new do
173
232
  attr_reader :provided_features
233
+
174
234
  def initialize(features)
175
235
  @provided_features = features
176
236
  end
@@ -126,25 +126,25 @@ module BoltSpec
126
126
  end
127
127
 
128
128
  class BoltRunner
129
- # Creates a temporary boltdir so no settings are picked up
130
- # WARNING: puppetdb config and orch config which do not use the boltdir may
129
+ # Creates a temporary project so no settings are picked up
130
+ # WARNING: puppetdb config and orch config which do not use the project may
131
131
  # still be loaded
132
132
  def self.with_runner(config_data, inventory_data)
133
- Dir.mktmpdir do |boltdir_path|
134
- runner = new(Bolt::Util.deep_clone(config_data), Bolt::Util.deep_clone(inventory_data), boltdir_path)
133
+ Dir.mktmpdir do |project_path|
134
+ runner = new(Bolt::Util.deep_clone(config_data), Bolt::Util.deep_clone(inventory_data), project_path)
135
135
  yield runner
136
136
  end
137
137
  end
138
138
 
139
- def initialize(config_data, inventory_data, boltdir_path)
139
+ def initialize(config_data, inventory_data, project_path)
140
140
  @config_data = config_data || {}
141
141
  @inventory_data = inventory_data || {}
142
- @boltdir_path = boltdir_path
142
+ @project_path = project_path
143
143
  @analytics = Bolt::Analytics::NoopClient.new
144
144
  end
145
145
 
146
146
  def config
147
- @config ||= Bolt::Config.new(Bolt::Boltdir.new(@boltdir_path), @config_data)
147
+ @config ||= Bolt::Config.new(Bolt::Project.new(@project_path), @config_data)
148
148
  end
149
149
 
150
150
  def inventory
@@ -152,20 +152,17 @@ module BoltSpec
152
152
  end
153
153
 
154
154
  def plugins
155
- @plugins ||= Bolt::Plugin.setup(config, pal, puppetdb_client, @analytics)
155
+ @plugins ||= Bolt::Plugin.setup(config, pal)
156
156
  end
157
157
 
158
158
  def puppetdb_client
159
- @puppetdb_client ||= begin
160
- puppetdb_config = Bolt::PuppetDB::Config.load_config(nil, config.puppetdb)
161
- Bolt::PuppetDB::Client.new(puppetdb_config)
162
- end
159
+ plugins.puppetdb_client
163
160
  end
164
161
 
165
162
  def pal
166
163
  @pal ||= Bolt::PAL.new(config.modulepath,
167
164
  config.hiera_config,
168
- config.boltdir.resource_types,
165
+ config.project.resource_types,
169
166
  config.compile_concurrency)
170
167
  end
171
168
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bolt
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.6.0
4
+ version: 2.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Puppet
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2020-04-20 00:00:00.000000000 Z
11
+ date: 2020-05-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: addressable
@@ -184,7 +184,7 @@ dependencies:
184
184
  requirements:
185
185
  - - ">="
186
186
  - !ruby/object:Gem::Version
187
- version: 6.11.0
187
+ version: 6.15.0
188
188
  - - "<"
189
189
  - !ruby/object:Gem::Version
190
190
  version: '7'
@@ -194,7 +194,7 @@ dependencies:
194
194
  requirements:
195
195
  - - ">="
196
196
  - !ruby/object:Gem::Version
197
- version: 6.11.0
197
+ version: 6.15.0
198
198
  - - "<"
199
199
  - !ruby/object:Gem::Version
200
200
  version: '7'
@@ -324,6 +324,20 @@ dependencies:
324
324
  - - ">="
325
325
  - !ruby/object:Gem::Version
326
326
  version: '1.14'
327
+ - !ruby/object:Gem::Dependency
328
+ name: octokit
329
+ requirement: !ruby/object:Gem::Requirement
330
+ requirements:
331
+ - - "~>"
332
+ - !ruby/object:Gem::Version
333
+ version: '4.0'
334
+ type: :development
335
+ prerelease: false
336
+ version_requirements: !ruby/object:Gem::Requirement
337
+ requirements:
338
+ - - "~>"
339
+ - !ruby/object:Gem::Version
340
+ version: '4.0'
327
341
  - !ruby/object:Gem::Dependency
328
342
  name: puppetlabs_spec_helper
329
343
  requirement: !ruby/object:Gem::Requirement
@@ -376,6 +390,7 @@ extra_rdoc_files: []
376
390
  files:
377
391
  - Puppetfile
378
392
  - bolt-modules/boltlib/lib/puppet/datatypes/applyresult.rb
393
+ - bolt-modules/boltlib/lib/puppet/datatypes/resourceinstance.rb
379
394
  - bolt-modules/boltlib/lib/puppet/datatypes/result.rb
380
395
  - bolt-modules/boltlib/lib/puppet/datatypes/resultset.rb
381
396
  - bolt-modules/boltlib/lib/puppet/datatypes/target.rb
@@ -396,8 +411,10 @@ files:
396
411
  - bolt-modules/boltlib/lib/puppet/functions/run_plan.rb
397
412
  - bolt-modules/boltlib/lib/puppet/functions/run_script.rb
398
413
  - bolt-modules/boltlib/lib/puppet/functions/run_task.rb
414
+ - bolt-modules/boltlib/lib/puppet/functions/run_task_with.rb
399
415
  - bolt-modules/boltlib/lib/puppet/functions/set_config.rb
400
416
  - bolt-modules/boltlib/lib/puppet/functions/set_feature.rb
417
+ - bolt-modules/boltlib/lib/puppet/functions/set_resources.rb
401
418
  - bolt-modules/boltlib/lib/puppet/functions/set_var.rb
402
419
  - bolt-modules/boltlib/lib/puppet/functions/upload_file.rb
403
420
  - bolt-modules/boltlib/lib/puppet/functions/vars.rb
@@ -414,6 +431,7 @@ files:
414
431
  - bolt-modules/file/lib/puppet/functions/file/readable.rb
415
432
  - bolt-modules/file/lib/puppet/functions/file/write.rb
416
433
  - bolt-modules/out/lib/puppet/functions/out/message.rb
434
+ - bolt-modules/prompt/lib/puppet/functions/prompt.rb
417
435
  - bolt-modules/system/lib/puppet/functions/system/env.rb
418
436
  - exe/bolt
419
437
  - lib/bolt.rb
@@ -423,7 +441,6 @@ files:
423
441
  - lib/bolt/apply_result.rb
424
442
  - lib/bolt/apply_target.rb
425
443
  - lib/bolt/bolt_option_parser.rb
426
- - lib/bolt/boltdir.rb
427
444
  - lib/bolt/catalog.rb
428
445
  - lib/bolt/catalog/logging.rb
429
446
  - lib/bolt/cli.rb
@@ -469,19 +486,19 @@ files:
469
486
  - lib/bolt/plugin.rb
470
487
  - lib/bolt/plugin/env_var.rb
471
488
  - lib/bolt/plugin/module.rb
472
- - lib/bolt/plugin/pkcs7.rb
473
489
  - lib/bolt/plugin/prompt.rb
474
490
  - lib/bolt/plugin/puppetdb.rb
475
491
  - lib/bolt/plugin/task.rb
492
+ - lib/bolt/project.rb
476
493
  - lib/bolt/puppetdb.rb
477
494
  - lib/bolt/puppetdb/client.rb
478
495
  - lib/bolt/puppetdb/config.rb
479
496
  - lib/bolt/r10k_log_proxy.rb
480
497
  - lib/bolt/rerun.rb
498
+ - lib/bolt/resource_instance.rb
481
499
  - lib/bolt/result.rb
482
500
  - lib/bolt/result_set.rb
483
501
  - lib/bolt/secret.rb
484
- - lib/bolt/secret/base.rb
485
502
  - lib/bolt/shell.rb
486
503
  - lib/bolt/shell/bash.rb
487
504
  - lib/bolt/shell/bash/tmpdir.rb
@@ -502,6 +519,7 @@ files:
502
519
  - lib/bolt/transport/simple.rb
503
520
  - lib/bolt/transport/ssh.rb
504
521
  - lib/bolt/transport/ssh/connection.rb
522
+ - lib/bolt/transport/ssh/exec_connection.rb
505
523
  - lib/bolt/transport/winrm.rb
506
524
  - lib/bolt/transport/winrm/connection.rb
507
525
  - lib/bolt/util.rb
@@ -528,6 +546,7 @@ files:
528
546
  - lib/bolt_spec/plans.rb
529
547
  - lib/bolt_spec/plans/action_stubs.rb
530
548
  - lib/bolt_spec/plans/action_stubs/command_stub.rb
549
+ - lib/bolt_spec/plans/action_stubs/plan_stub.rb
531
550
  - lib/bolt_spec/plans/action_stubs/script_stub.rb
532
551
  - lib/bolt_spec/plans/action_stubs/task_stub.rb
533
552
  - lib/bolt_spec/plans/action_stubs/upload_stub.rb