kitchen-pulumi 0.1.0.pre.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +4 -0
  4. data/lib/kitchen/driver/pulumi.rb +170 -0
  5. data/lib/kitchen/provisioner/pulumi.rb +24 -0
  6. data/lib/kitchen/pulumi.rb +8 -0
  7. data/lib/kitchen/pulumi/command.rb +11 -0
  8. data/lib/kitchen/pulumi/command/input.rb +33 -0
  9. data/lib/kitchen/pulumi/command/output.rb +33 -0
  10. data/lib/kitchen/pulumi/config_attribute.rb +12 -0
  11. data/lib/kitchen/pulumi/config_attribute/backend.rb +34 -0
  12. data/lib/kitchen/pulumi/config_attribute/color.rb +34 -0
  13. data/lib/kitchen/pulumi/config_attribute/config.rb +35 -0
  14. data/lib/kitchen/pulumi/config_attribute/config_file.rb +34 -0
  15. data/lib/kitchen/pulumi/config_attribute/directory.rb +34 -0
  16. data/lib/kitchen/pulumi/config_attribute/fail_fast.rb +34 -0
  17. data/lib/kitchen/pulumi/config_attribute/plugins.rb +34 -0
  18. data/lib/kitchen/pulumi/config_attribute/refresh_config.rb +34 -0
  19. data/lib/kitchen/pulumi/config_attribute/secrets.rb +35 -0
  20. data/lib/kitchen/pulumi/config_attribute/stack.rb +33 -0
  21. data/lib/kitchen/pulumi/config_attribute/stack_evolution.rb +37 -0
  22. data/lib/kitchen/pulumi/config_attribute/systems.rb +33 -0
  23. data/lib/kitchen/pulumi/config_attribute_cacher.rb +28 -0
  24. data/lib/kitchen/pulumi/config_attribute_definer.rb +39 -0
  25. data/lib/kitchen/pulumi/config_schemas.rb +11 -0
  26. data/lib/kitchen/pulumi/config_schemas/array_of_hashes.rb +12 -0
  27. data/lib/kitchen/pulumi/config_schemas/boolean.rb +12 -0
  28. data/lib/kitchen/pulumi/config_schemas/config_evolution_array.rb +40 -0
  29. data/lib/kitchen/pulumi/config_schemas/error_messages.yml +21 -0
  30. data/lib/kitchen/pulumi/config_schemas/hash.rb +12 -0
  31. data/lib/kitchen/pulumi/config_schemas/stack_settings_hash.rb +20 -0
  32. data/lib/kitchen/pulumi/config_schemas/string.rb +12 -0
  33. data/lib/kitchen/pulumi/config_schemas/system.rb +577 -0
  34. data/lib/kitchen/pulumi/config_schemas/systems.rb +20 -0
  35. data/lib/kitchen/pulumi/configurable.rb +27 -0
  36. data/lib/kitchen/pulumi/error.rb +10 -0
  37. data/lib/kitchen/pulumi/file_path_config_attribute_definer.rb +25 -0
  38. data/lib/kitchen/pulumi/inspec.rb +66 -0
  39. data/lib/kitchen/pulumi/inspec_options_mapper.rb +69 -0
  40. data/lib/kitchen/pulumi/inspec_with_hosts.rb +40 -0
  41. data/lib/kitchen/pulumi/inspec_without_hosts.rb +34 -0
  42. data/lib/kitchen/pulumi/kitchen_instance.rb +12 -0
  43. data/lib/kitchen/pulumi/shell_out.rb +40 -0
  44. data/lib/kitchen/pulumi/system.rb +130 -0
  45. data/lib/kitchen/pulumi/system_attrs_resolver.rb +59 -0
  46. data/lib/kitchen/pulumi/system_hosts_resolver.rb +34 -0
  47. data/lib/kitchen/pulumi/version.rb +5 -0
  48. data/lib/kitchen/verifier/pulumi.rb +177 -0
  49. metadata +323 -0
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kitchen/pulumi'
4
+ require 'kitchen/pulumi/error'
5
+
6
+ module Kitchen
7
+ module Pulumi
8
+ # SystemAttrsResolver is the class of objects which resolve for systems the
9
+ # attrs which are contained in outputs.
10
+ class SystemAttrsResolver
11
+ # #resolve resolves the attrs.
12
+ #
13
+ # @param attrs_outputs_keys [::Array<::String>] the names of the InSpec
14
+ # attributes.
15
+ # @param attrs_outputs_values [::Array<::String>] the names of the Pulumi
16
+ # outputs.
17
+ # @param system [::Kitchen::Pulumi::System] the system.
18
+ # @raise [::Kitchen::Pulumi::Error] if the fetching the value of the
19
+ # output fails.
20
+ def resolve(attrs_outputs_keys:, attrs_outputs_values:, system:)
21
+ system.add_attrs(attrs: @inputs.merge(
22
+ @outputs.merge(
23
+ attrs_outputs_keys.lazy.map(&:to_s).zip(
24
+ @outputs.fetch_values(*attrs_outputs_values),
25
+ ).to_h,
26
+ ),
27
+ ))
28
+
29
+ self
30
+ rescue ::KeyError => e
31
+ raise ::Kitchen::Pulumi::Error, "Resolving attrs failed\n#{e}"
32
+ end
33
+
34
+ private
35
+
36
+ # #initialize prepares the instance to be used.
37
+ #
38
+ # @param inputs [#to_hash] the config inputs provided to a stack
39
+ # @param outputs [#to_hash] the outputs of the Pulumi stack under test.
40
+ def initialize(inputs:, outputs:)
41
+ @inputs = inputs.map do |key, value|
42
+ [key, value.fetch('value', nil)]
43
+ end.to_h
44
+ @inputs.merge!(@inputs.map do |key, value|
45
+ ["input_#{key}", value]
46
+ end.to_h)
47
+
48
+ @outputs = Hash[outputs].map do |key, value|
49
+ [key, value]
50
+ end.to_h
51
+ @outputs.merge!(@outputs.map do |key, value|
52
+ ["output_#{key}", value]
53
+ end.to_h)
54
+ rescue ::KeyError => e
55
+ raise ::Kitchen::Pulumi::Error, "System attrs resolution failed\n#{e}"
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kitchen/pulumi'
4
+ require 'kitchen/pulumi/error'
5
+
6
+ module Kitchen
7
+ module Pulumi
8
+ # SystemHostsResolver is the class of objects which resolve for systems the
9
+ # hosts which are contained in outputs.
10
+ class SystemHostsResolver
11
+ # #resolve resolves the hosts.
12
+ #
13
+ # @param hosts_output [::String] the name of the Pulumi output which has
14
+ # a value of hosts for the system.
15
+ # @param system [::Kitchen::Pulumi::System] the system.
16
+ # @raise [::Kitchen::Pulumi::Error] if the fetching the value of the
17
+ # output fails.
18
+ def resolve(hosts_output:, system:)
19
+ system.add_hosts hosts: @outputs.fetch(hosts_output)
20
+ rescue ::KeyError => e
21
+ raise ::Kitchen::Pulumi::Error, "Resolving hosts failed\n#{e}"
22
+ end
23
+
24
+ private
25
+
26
+ # #initialize prepares the instance to be used.
27
+ #
28
+ # @param outputs [#to_hash] the outputs of the Pulumi stack under test.
29
+ def initialize(outputs:)
30
+ @outputs = Hash[outputs]
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kitchen/pulumi'
4
+
5
+ ::Kitchen::Pulumi::VERSION = '0.1.0.pre.beta'
@@ -0,0 +1,177 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'kitchen'
4
+ require 'kitchen/pulumi/config_attribute/color'
5
+ require 'kitchen/pulumi/config_attribute/fail_fast'
6
+ require 'kitchen/pulumi/config_attribute/systems'
7
+ require 'kitchen/pulumi/configurable'
8
+ require 'kitchen/pulumi/error'
9
+ require 'kitchen/pulumi/inspec_options_mapper'
10
+
11
+ module Kitchen
12
+ # This namespace is defined by Kitchen.
13
+ #
14
+ # @see https://www.rubydoc.info/gems/test-kitchen/Kitchen/Verifier
15
+ module Verifier
16
+ # The verifier utilizes the {https://www.inspec.io/ InSpec infrastructure
17
+ # testing framework to verify the behaviour and
18
+ # state of resources in the Pulumi state.
19
+ #
20
+ # === Commands
21
+ #
22
+ # The following command-line commands are provided by the verifier.
23
+ #
24
+ # ==== kitchen verify
25
+ #
26
+ # A Kitchen instance is verified by iterating through the systems and
27
+ # running the associated InSpec controls against the hosts of each system.
28
+ # The outputs of the Pulumi state are retrieved and exposed as attributes
29
+ # to the InSpec controls.
30
+ #
31
+ # ===== Retrieving the Pulumi Output
32
+ #
33
+ # pulumi stack output -json
34
+ #
35
+ # === Configuration Attributes
36
+ #
37
+ # The configuration attributes of the verifier control the behaviour
38
+ # of the InSpec runner. Within the
39
+ # {http://kitchen.ci/docs/getting-started/kitchen-yml .kitchen.yml},
40
+ # these attributes must be declared in the +verifier+ mapping along with
41
+ # the plugin name.
42
+ #
43
+ # verifier:
44
+ # name: pulumi
45
+ # a_configuration_attribute: some value
46
+ #
47
+ # ==== color
48
+ #
49
+ # {include:Kitchen::Pulumi::ConfigAttribute::Color}
50
+ #
51
+ # ==== fail_fast
52
+ #
53
+ # {include:Kitchen::Pulumi::ConfigAttribute::FailFast}
54
+ #
55
+ # ==== systems
56
+ #
57
+ # {include:Kitchen::Pulumi::ConfigAttribute::Systems}
58
+ #
59
+ # === Ruby Interface
60
+ #
61
+ # This class implements the interface of Kitchen::Configurable which
62
+ # requires the following Reek suppressions:
63
+ # :reek:MissingSafeMethod {
64
+ # exclude: [ finalize_config!, load_needed_dependencies! ]
65
+ # }
66
+ class Pulumi
67
+ include ::Kitchen::Configurable
68
+ include ::Kitchen::Logging
69
+ include ::Kitchen::Pulumi::ConfigAttribute::Color
70
+ include ::Kitchen::Pulumi::ConfigAttribute::FailFast
71
+ include ::Kitchen::Pulumi::ConfigAttribute::Systems
72
+ include ::Kitchen::Pulumi::Configurable
73
+ @api_version = 2
74
+
75
+ attr_reader :inputs, :outputs
76
+
77
+ def initialize(configuration = {})
78
+ init_config configuration
79
+ self.inspec_options_mapper = ::Kitchen::Pulumi::InSpecOptionsMapper.new
80
+ self.error_messages = []
81
+ self.inputs = {}
82
+ self.outputs = {}
83
+ end
84
+
85
+ # The verifier enumerates through each host of each system and verifies
86
+ # the associated InSpec controls.
87
+ #
88
+ # @example
89
+ # `kitchen verify suite-name`
90
+ # @param _kitchen_state [::Hash] the mutable instance and verifier state.
91
+ # @raise [::Kitchen::ActionFailed] if result of the action is failure.
92
+ # @return [void]
93
+ def call(_kitchen_state)
94
+ load_variables
95
+ verify_systems
96
+ unless error_messages.empty?
97
+ raise ::Kitchen::ActionFailed, error_messages.join("\n\n")
98
+ end
99
+ rescue ::Kitchen::Pulumi::Error => e
100
+ raise ::Kitchen::ActionFailed, e.message
101
+ end
102
+
103
+ # doctor checks the system and configuration for common errors.
104
+ #
105
+ # @param _kitchen_state [::Hash] the mutable Kitchen instance state.
106
+ # @return [Boolean] false
107
+ # @see https://github.com/test-kitchen/test-kitchen/blob/v1.21.2/lib/kitchen/verifier/base.rb#L85-L91
108
+ def doctor(_kitchen_state)
109
+ false
110
+ end
111
+
112
+ private
113
+
114
+ attr_accessor :inspec_options_mapper, :error_messages
115
+ attr_writer :inputs, :outputs
116
+
117
+ def handle_error(message:)
118
+ raise ::Kitchen::Pulumi::Error, message if config_fail_fast
119
+
120
+ logger.error message
121
+ error_messages.push message
122
+ end
123
+
124
+ def load_variables
125
+ instance.driver.stack_outputs do |outputs:|
126
+ self.outputs.replace(outputs)
127
+ end
128
+
129
+ instance.driver.stack_inputs do |inputs:|
130
+ self.inputs.replace(inputs)
131
+ end
132
+ end
133
+
134
+ # load_needed_dependencies! loads the InSpec libraries required to verify
135
+ # a Pulumi stack's state.
136
+ #
137
+ # @raise [::Kitchen::ClientError] if loading the InSpec libraries fails.
138
+ # @see https://github.com/test-kitchen/test-kitchen/blob/v1.21.2/lib/kitchen/configurable.rb#L252-L274
139
+ def load_needed_dependencies!
140
+ require 'kitchen/pulumi/inspec'
141
+ require 'kitchen/pulumi/system'
142
+ ::Kitchen::Pulumi::InSpec.logger = logger
143
+ rescue ::LoadError => e
144
+ raise ::Kitchen::ClientError, e.message
145
+ end
146
+
147
+ def system_inspec_options(system:)
148
+ inspec_options_mapper.map(
149
+ options: { 'color' => config_color, 'distinct_exit' => false },
150
+ system: system,
151
+ )
152
+ end
153
+
154
+ def verify(system:)
155
+ ::Kitchen::Pulumi::System.new(
156
+ mapping: {
157
+ profile_locations: [
158
+ ::File.join(config.fetch(:test_base_path), instance.suite.name),
159
+ ],
160
+ }.merge(system),
161
+ ).verify(
162
+ inputs: inputs,
163
+ inspec_options: system_inspec_options(system: system),
164
+ outputs: outputs,
165
+ )
166
+ rescue StandardError => e
167
+ handle_error message: e.message
168
+ end
169
+
170
+ def verify_systems
171
+ config_systems.each do |system|
172
+ verify system: system
173
+ end
174
+ end
175
+ end
176
+ end
177
+ end
metadata ADDED
@@ -0,0 +1,323 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: kitchen-pulumi
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0.pre.beta
5
+ platform: ruby
6
+ authors:
7
+ - Jacob Learned
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-06-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: guard
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '2.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '2.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: guard-rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '4.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '4.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '0.11'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '0.11'
55
+ - !ruby/object:Gem::Dependency
56
+ name: pry-byebug
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '3.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '3.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '12.3'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '12.3'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.7'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.7'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rspec-json_expectations
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '2.1'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '2.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rspec_junit_formatter
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.3'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.3'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rubocop
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.67'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.67'
139
+ - !ruby/object:Gem::Dependency
140
+ name: logger
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.2'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.2'
153
+ - !ruby/object:Gem::Dependency
154
+ name: dry-types
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '0.13'
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '0.13'
167
+ - !ruby/object:Gem::Dependency
168
+ name: dry-validation
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '0.12'
174
+ type: :runtime
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - "~>"
179
+ - !ruby/object:Gem::Version
180
+ version: '0.12'
181
+ - !ruby/object:Gem::Dependency
182
+ name: inspec
183
+ requirement: !ruby/object:Gem::Requirement
184
+ requirements:
185
+ - - "~>"
186
+ - !ruby/object:Gem::Version
187
+ version: '3.0'
188
+ type: :runtime
189
+ prerelease: false
190
+ version_requirements: !ruby/object:Gem::Requirement
191
+ requirements:
192
+ - - "~>"
193
+ - !ruby/object:Gem::Version
194
+ version: '3.0'
195
+ - !ruby/object:Gem::Dependency
196
+ name: json
197
+ requirement: !ruby/object:Gem::Requirement
198
+ requirements:
199
+ - - "~>"
200
+ - !ruby/object:Gem::Version
201
+ version: 2.1.0
202
+ type: :runtime
203
+ prerelease: false
204
+ version_requirements: !ruby/object:Gem::Requirement
205
+ requirements:
206
+ - - "~>"
207
+ - !ruby/object:Gem::Version
208
+ version: 2.1.0
209
+ - !ruby/object:Gem::Dependency
210
+ name: mixlib-shellout
211
+ requirement: !ruby/object:Gem::Requirement
212
+ requirements:
213
+ - - "~>"
214
+ - !ruby/object:Gem::Version
215
+ version: '2.3'
216
+ type: :runtime
217
+ prerelease: false
218
+ version_requirements: !ruby/object:Gem::Requirement
219
+ requirements:
220
+ - - "~>"
221
+ - !ruby/object:Gem::Version
222
+ version: '2.3'
223
+ - !ruby/object:Gem::Dependency
224
+ name: test-kitchen
225
+ requirement: !ruby/object:Gem::Requirement
226
+ requirements:
227
+ - - ">="
228
+ - !ruby/object:Gem::Version
229
+ version: '1.22'
230
+ - - "<"
231
+ - !ruby/object:Gem::Version
232
+ version: '3.0'
233
+ type: :runtime
234
+ prerelease: false
235
+ version_requirements: !ruby/object:Gem::Requirement
236
+ requirements:
237
+ - - ">="
238
+ - !ruby/object:Gem::Version
239
+ version: '1.22'
240
+ - - "<"
241
+ - !ruby/object:Gem::Version
242
+ version: '3.0'
243
+ description: 'Kitchen-Pulumi makes it easy to add integration tests to Pulumi-based
244
+ infrastructure projects.
245
+
246
+ '
247
+ email:
248
+ - jacobmlearned@gmail.com
249
+ executables: []
250
+ extensions: []
251
+ extra_rdoc_files: []
252
+ files:
253
+ - LICENSE
254
+ - README.md
255
+ - lib/kitchen/driver/pulumi.rb
256
+ - lib/kitchen/provisioner/pulumi.rb
257
+ - lib/kitchen/pulumi.rb
258
+ - lib/kitchen/pulumi/command.rb
259
+ - lib/kitchen/pulumi/command/input.rb
260
+ - lib/kitchen/pulumi/command/output.rb
261
+ - lib/kitchen/pulumi/config_attribute.rb
262
+ - lib/kitchen/pulumi/config_attribute/backend.rb
263
+ - lib/kitchen/pulumi/config_attribute/color.rb
264
+ - lib/kitchen/pulumi/config_attribute/config.rb
265
+ - lib/kitchen/pulumi/config_attribute/config_file.rb
266
+ - lib/kitchen/pulumi/config_attribute/directory.rb
267
+ - lib/kitchen/pulumi/config_attribute/fail_fast.rb
268
+ - lib/kitchen/pulumi/config_attribute/plugins.rb
269
+ - lib/kitchen/pulumi/config_attribute/refresh_config.rb
270
+ - lib/kitchen/pulumi/config_attribute/secrets.rb
271
+ - lib/kitchen/pulumi/config_attribute/stack.rb
272
+ - lib/kitchen/pulumi/config_attribute/stack_evolution.rb
273
+ - lib/kitchen/pulumi/config_attribute/systems.rb
274
+ - lib/kitchen/pulumi/config_attribute_cacher.rb
275
+ - lib/kitchen/pulumi/config_attribute_definer.rb
276
+ - lib/kitchen/pulumi/config_schemas.rb
277
+ - lib/kitchen/pulumi/config_schemas/array_of_hashes.rb
278
+ - lib/kitchen/pulumi/config_schemas/boolean.rb
279
+ - lib/kitchen/pulumi/config_schemas/config_evolution_array.rb
280
+ - lib/kitchen/pulumi/config_schemas/error_messages.yml
281
+ - lib/kitchen/pulumi/config_schemas/hash.rb
282
+ - lib/kitchen/pulumi/config_schemas/stack_settings_hash.rb
283
+ - lib/kitchen/pulumi/config_schemas/string.rb
284
+ - lib/kitchen/pulumi/config_schemas/system.rb
285
+ - lib/kitchen/pulumi/config_schemas/systems.rb
286
+ - lib/kitchen/pulumi/configurable.rb
287
+ - lib/kitchen/pulumi/error.rb
288
+ - lib/kitchen/pulumi/file_path_config_attribute_definer.rb
289
+ - lib/kitchen/pulumi/inspec.rb
290
+ - lib/kitchen/pulumi/inspec_options_mapper.rb
291
+ - lib/kitchen/pulumi/inspec_with_hosts.rb
292
+ - lib/kitchen/pulumi/inspec_without_hosts.rb
293
+ - lib/kitchen/pulumi/kitchen_instance.rb
294
+ - lib/kitchen/pulumi/shell_out.rb
295
+ - lib/kitchen/pulumi/system.rb
296
+ - lib/kitchen/pulumi/system_attrs_resolver.rb
297
+ - lib/kitchen/pulumi/system_hosts_resolver.rb
298
+ - lib/kitchen/pulumi/version.rb
299
+ - lib/kitchen/verifier/pulumi.rb
300
+ homepage: https://github.com/jacoblearned/kitchen-pulumi
301
+ licenses:
302
+ - MIT
303
+ metadata: {}
304
+ post_install_message:
305
+ rdoc_options: []
306
+ require_paths:
307
+ - lib
308
+ required_ruby_version: !ruby/object:Gem::Requirement
309
+ requirements:
310
+ - - ">="
311
+ - !ruby/object:Gem::Version
312
+ version: '0'
313
+ required_rubygems_version: !ruby/object:Gem::Requirement
314
+ requirements:
315
+ - - ">"
316
+ - !ruby/object:Gem::Version
317
+ version: 1.3.1
318
+ requirements: []
319
+ rubygems_version: 3.0.1
320
+ signing_key:
321
+ specification_version: 4
322
+ summary: Test-Kitchen plugins for Pulumi projects
323
+ test_files: []