test-kitchen-rsync 3.0.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +21 -0
  3. data/LICENSE +15 -0
  4. data/Rakefile +53 -0
  5. data/bin/zl-kitchen +11 -0
  6. data/lib/kitchen/base64_stream.rb +48 -0
  7. data/lib/kitchen/chef_utils_wiring.rb +40 -0
  8. data/lib/kitchen/cli.rb +413 -0
  9. data/lib/kitchen/collection.rb +52 -0
  10. data/lib/kitchen/color.rb +63 -0
  11. data/lib/kitchen/command/action.rb +41 -0
  12. data/lib/kitchen/command/console.rb +54 -0
  13. data/lib/kitchen/command/diagnose.rb +84 -0
  14. data/lib/kitchen/command/doctor.rb +39 -0
  15. data/lib/kitchen/command/exec.rb +37 -0
  16. data/lib/kitchen/command/list.rb +148 -0
  17. data/lib/kitchen/command/login.rb +39 -0
  18. data/lib/kitchen/command/package.rb +32 -0
  19. data/lib/kitchen/command/sink.rb +50 -0
  20. data/lib/kitchen/command/test.rb +47 -0
  21. data/lib/kitchen/command.rb +207 -0
  22. data/lib/kitchen/config.rb +344 -0
  23. data/lib/kitchen/configurable.rb +616 -0
  24. data/lib/kitchen/data_munger.rb +1024 -0
  25. data/lib/kitchen/diagnostic.rb +138 -0
  26. data/lib/kitchen/driver/base.rb +133 -0
  27. data/lib/kitchen/driver/dummy.rb +105 -0
  28. data/lib/kitchen/driver/exec.rb +70 -0
  29. data/lib/kitchen/driver/proxy.rb +70 -0
  30. data/lib/kitchen/driver/ssh_base.rb +351 -0
  31. data/lib/kitchen/driver.rb +40 -0
  32. data/lib/kitchen/errors.rb +243 -0
  33. data/lib/kitchen/generator/init.rb +254 -0
  34. data/lib/kitchen/instance.rb +726 -0
  35. data/lib/kitchen/lazy_hash.rb +148 -0
  36. data/lib/kitchen/lifecycle_hook/base.rb +78 -0
  37. data/lib/kitchen/lifecycle_hook/local.rb +53 -0
  38. data/lib/kitchen/lifecycle_hook/remote.rb +39 -0
  39. data/lib/kitchen/lifecycle_hooks.rb +92 -0
  40. data/lib/kitchen/loader/yaml.rb +377 -0
  41. data/lib/kitchen/logger.rb +422 -0
  42. data/lib/kitchen/logging.rb +52 -0
  43. data/lib/kitchen/login_command.rb +49 -0
  44. data/lib/kitchen/metadata_chopper.rb +49 -0
  45. data/lib/kitchen/platform.rb +64 -0
  46. data/lib/kitchen/plugin.rb +76 -0
  47. data/lib/kitchen/plugin_base.rb +60 -0
  48. data/lib/kitchen/provisioner/base.rb +269 -0
  49. data/lib/kitchen/provisioner/chef/berkshelf.rb +116 -0
  50. data/lib/kitchen/provisioner/chef/common_sandbox.rb +350 -0
  51. data/lib/kitchen/provisioner/chef/policyfile.rb +163 -0
  52. data/lib/kitchen/provisioner/chef_apply.rb +121 -0
  53. data/lib/kitchen/provisioner/chef_base.rb +705 -0
  54. data/lib/kitchen/provisioner/chef_infra.rb +167 -0
  55. data/lib/kitchen/provisioner/chef_solo.rb +82 -0
  56. data/lib/kitchen/provisioner/chef_zero.rb +12 -0
  57. data/lib/kitchen/provisioner/dummy.rb +75 -0
  58. data/lib/kitchen/provisioner/shell.rb +157 -0
  59. data/lib/kitchen/provisioner.rb +42 -0
  60. data/lib/kitchen/rake_tasks.rb +80 -0
  61. data/lib/kitchen/shell_out.rb +90 -0
  62. data/lib/kitchen/ssh.rb +289 -0
  63. data/lib/kitchen/state_file.rb +112 -0
  64. data/lib/kitchen/suite.rb +48 -0
  65. data/lib/kitchen/thor_tasks.rb +63 -0
  66. data/lib/kitchen/transport/base.rb +236 -0
  67. data/lib/kitchen/transport/dummy.rb +78 -0
  68. data/lib/kitchen/transport/exec.rb +145 -0
  69. data/lib/kitchen/transport/ssh.rb +579 -0
  70. data/lib/kitchen/transport/winrm.rb +546 -0
  71. data/lib/kitchen/transport.rb +40 -0
  72. data/lib/kitchen/util.rb +229 -0
  73. data/lib/kitchen/verifier/base.rb +243 -0
  74. data/lib/kitchen/verifier/busser.rb +275 -0
  75. data/lib/kitchen/verifier/dummy.rb +75 -0
  76. data/lib/kitchen/verifier/shell.rb +99 -0
  77. data/lib/kitchen/verifier.rb +39 -0
  78. data/lib/kitchen/version.rb +20 -0
  79. data/lib/kitchen/which.rb +26 -0
  80. data/lib/kitchen.rb +152 -0
  81. data/lib/vendor/hash_recursive_merge.rb +79 -0
  82. data/support/busser_install_command.ps1 +14 -0
  83. data/support/busser_install_command.sh +21 -0
  84. data/support/chef-client-fail-if-update-handler.rb +15 -0
  85. data/support/chef_base_init_command.ps1 +18 -0
  86. data/support/chef_base_init_command.sh +1 -0
  87. data/support/chef_base_install_command.ps1 +85 -0
  88. data/support/chef_base_install_command.sh +229 -0
  89. data/support/download_helpers.sh +109 -0
  90. data/support/dummy-validation.pem +27 -0
  91. data/templates/driver/CHANGELOG.md.erb +3 -0
  92. data/templates/driver/Gemfile.erb +3 -0
  93. data/templates/driver/README.md.erb +64 -0
  94. data/templates/driver/Rakefile.erb +21 -0
  95. data/templates/driver/driver.rb.erb +23 -0
  96. data/templates/driver/gemspec.erb +29 -0
  97. data/templates/driver/gitignore.erb +17 -0
  98. data/templates/driver/license_apachev2.erb +15 -0
  99. data/templates/driver/license_lgplv3.erb +16 -0
  100. data/templates/driver/license_mit.erb +22 -0
  101. data/templates/driver/license_reserved.erb +5 -0
  102. data/templates/driver/tailor.erb +4 -0
  103. data/templates/driver/travis.yml.erb +11 -0
  104. data/templates/driver/version.rb.erb +12 -0
  105. data/templates/init/chefignore.erb +2 -0
  106. data/templates/init/kitchen.yml.erb +18 -0
  107. data/test-kitchen.gemspec +52 -0
  108. metadata +528 -0
@@ -0,0 +1,422 @@
1
+ #
2
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
+ #
4
+ # Copyright (C) 2013, Fletcher Nichol
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require "fileutils" unless defined?(FileUtils)
19
+ require "logger"
20
+
21
+ module Kitchen
22
+ # Logging implementation for Kitchen. By default the console/stdout output
23
+ # will be displayed differently than the file log output. Therefor, this
24
+ # class wraps multiple loggers that conform to the stdlib `Logger` class
25
+ # behavior.
26
+ #
27
+ # @author Fletcher Nichol <fnichol@nichol.ca>
28
+ class Logger
29
+ include ::Logger::Severity
30
+
31
+ # @return [IO] the log device
32
+ attr_reader :logdev
33
+
34
+ # @return [Boolean] whether logger is configured for
35
+ # overwriting
36
+ attr_reader :log_overwrite
37
+
38
+ # Constructs a new logger.
39
+ #
40
+ # @param options [Hash] configuration for a new logger
41
+ # @option options [Symbol] :color color to use when when outputting
42
+ # messages
43
+ # @option options [Integer] :level the logging severity threshold
44
+ # (default: `Kitchen::DEFAULT_LOG_LEVEL`)
45
+ # @option options [Boolean] whether to overwrite the log
46
+ # when Test Kitchen runs. Only applies if the :logdev is a String.
47
+ # (default: `Kitchen::DEFAULT_LOG_OVERWRITE`)
48
+ # @option options [String,IO] :logdev filepath String or IO object to be
49
+ # used for logging (default: `nil`)
50
+ # @option options [String] :progname program name to include in log
51
+ # messages (default: `"Kitchen"`)
52
+ # @option options [IO] :stdout a standard out IO object to use
53
+ # (default: `$stdout`)
54
+ # @option options [Boolean] :colorize whether to colorize output
55
+ # when Test Kitchen runs.
56
+ # (default: `$stdout.tty?`)
57
+ def initialize(options = {})
58
+ @log_overwrite = if options[:log_overwrite].nil?
59
+ default_log_overwrite
60
+ else
61
+ options[:log_overwrite]
62
+ end
63
+
64
+ @logdev = logdev_logger(options[:logdev], log_overwrite) if options[:logdev]
65
+
66
+ populate_loggers(options)
67
+
68
+ # These setters cannot be called until @loggers are populated because
69
+ # they are delegated
70
+ self.progname = options[:progname] || "Kitchen"
71
+ self.level = options[:level] || default_log_level
72
+ end
73
+
74
+ # Pulled out for Rubocop complexity issues
75
+ #
76
+ # @api private
77
+ def populate_loggers(options)
78
+ @loggers = []
79
+ @loggers << logdev unless logdev.nil?
80
+ @loggers << stdout_logger(options[:stdout], options[:color], options[:colorize]) if
81
+ options[:stdout]
82
+ @loggers << stdout_logger($stdout, options[:color], options[:colorize]) if
83
+ @loggers.empty?
84
+ end
85
+ private :populate_loggers
86
+
87
+ class << self
88
+ private
89
+
90
+ # @api private
91
+ # @!macro delegate_to_first_logger
92
+ # @method $1()
93
+ def delegate_to_first_logger(meth)
94
+ define_method(meth) { |*args| @loggers.first.public_send(meth, *args) }
95
+ end
96
+
97
+ # @api private
98
+ # @!macro delegate_to_all_loggers
99
+ # @method $1()
100
+ def delegate_to_all_loggers(meth)
101
+ define_method(meth) do |*args|
102
+ result = nil
103
+ @loggers.each { |l| result = l.public_send(meth, *args) }
104
+ result
105
+ end
106
+ end
107
+ end
108
+
109
+ # @return [Integer] the logging severity threshold
110
+ # @see http://is.gd/Okuy5p
111
+ delegate_to_first_logger :level
112
+
113
+ # Sets the logging severity threshold.
114
+ #
115
+ # @param level [Integer] the logging severity threshold
116
+ # @see http://is.gd/H1VBFH
117
+ delegate_to_all_loggers :level=
118
+
119
+ # @return [String] program name to include in log messages
120
+ # @see http://is.gd/5uHGK0
121
+ delegate_to_first_logger :progname
122
+
123
+ # Sets the program name to include in log messages.
124
+ #
125
+ # @param progname [String] the program name to include in log messages
126
+ # @see http://is.gd/f2U5Xj
127
+ delegate_to_all_loggers :progname=
128
+
129
+ # @return [String] the date format being used
130
+ # @see http://is.gd/btmFWJ
131
+ delegate_to_first_logger :datetime_format
132
+
133
+ # Sets the date format being used.
134
+ #
135
+ # @param format [String] the date format
136
+ # @see http://is.gd/M36ml8
137
+ delegate_to_all_loggers :datetime_format=
138
+
139
+ # Log a message if the given severity is high enough.
140
+ #
141
+ # @see http://is.gd/5opBW0
142
+ delegate_to_all_loggers :add
143
+
144
+ # Dump one or more messages to info.
145
+ #
146
+ # @param message [#to_s] the message to log
147
+ # @see http://is.gd/BCp5KV
148
+ delegate_to_all_loggers :<<
149
+
150
+ # Log a message with severity of banner (high level).
151
+ #
152
+ # @param message_or_progname [#to_s] the message to log. In the block
153
+ # form, this is the progname to use in the log message.
154
+ # @yield evaluates to the message to log. This is not evaluated unless the
155
+ # logger's level is sufficient to log the message. This allows you to
156
+ # create potentially expensive logging messages that are only called when
157
+ # the logger is configured to show them.
158
+ # @return [nil,true] when the given severity is not high enough (for this
159
+ # particular logger), log no message, and return true
160
+ # @see http://is.gd/pYUCYU
161
+ delegate_to_all_loggers :banner
162
+
163
+ # Log a message with severity of debug.
164
+ #
165
+ # @param message_or_progname [#to_s] the message to log. In the block
166
+ # form, this is the progname to use in the log message.
167
+ # @yield evaluates to the message to log. This is not evaluated unless the
168
+ # logger's level is sufficient to log the message. This allows you to
169
+ # create potentially expensive logging messages that are only called when
170
+ # the logger is configured to show them.
171
+ # @return [nil,true] when the given severity is not high enough (for this
172
+ # particular logger), log no message, and return true
173
+ # @see http://is.gd/Re97Zp
174
+ delegate_to_all_loggers :debug
175
+
176
+ # @return [true,false] whether or not the current severity level
177
+ # allows for the printing of debug messages
178
+ # @see http://is.gd/Iq08xB
179
+ delegate_to_first_logger :debug?
180
+
181
+ # Log a message with severity of info.
182
+ #
183
+ # @param message_or_progname [#to_s] the message to log. In the block
184
+ # form, this is the progname to use in the log message.
185
+ # @yield evaluates to the message to log. This is not evaluated unless the
186
+ # logger's level is sufficient to log the message. This allows you to
187
+ # create potentially expensive logging messages that are only called when
188
+ # the logger is configured to show them.
189
+ # @return [nil,true] when the given severity is not high enough (for this
190
+ # particular logger), log no message, and return true
191
+ # @see http://is.gd/pYUCYU
192
+ delegate_to_all_loggers :info
193
+
194
+ # @return [true,false] whether or not the current severity level
195
+ # allows for the printing of info messages
196
+ # @see http://is.gd/lBtJkT
197
+ delegate_to_first_logger :info?
198
+
199
+ # Log a message with severity of error.
200
+ #
201
+ # @param message_or_progname [#to_s] the message to log. In the block
202
+ # form, this is the progname to use in the log message.
203
+ # @yield evaluates to the message to log. This is not evaluated unless the
204
+ # logger's level is sufficient to log the message. This allows you to
205
+ # create potentially expensive logging messages that are only called when
206
+ # the logger is configured to show them.
207
+ # @return [nil,true] when the given severity is not high enough (for this
208
+ # particular logger), log no message, and return true
209
+ # @see http://is.gd/mLwYMl
210
+ delegate_to_all_loggers :error
211
+
212
+ # @return [true,false] whether or not the current severity level
213
+ # allows for the printing of error messages
214
+ # @see http://is.gd/QY19JL
215
+ delegate_to_first_logger :error?
216
+
217
+ # Log a message with severity of warn.
218
+ #
219
+ # @param message_or_progname [#to_s] the message to log. In the block
220
+ # form, this is the progname to use in the log message.
221
+ # @yield evaluates to the message to log. This is not evaluated unless the
222
+ # logger's level is sufficient to log the message. This allows you to
223
+ # create potentially expensive logging messages that are only called when
224
+ # the logger is configured to show them.
225
+ # @return [nil,true] when the given severity is not high enough (for this
226
+ # particular logger), log no message, and return true
227
+ # @see http://is.gd/PX9AIS
228
+ delegate_to_all_loggers :warn
229
+
230
+ # @return [true,false] whether or not the current severity level
231
+ # allows for the printing of warn messages
232
+ # @see http://is.gd/Gdr4lD
233
+ delegate_to_first_logger :warn?
234
+
235
+ # Log a message with severity of fatal.
236
+ #
237
+ # @param message_or_progname [#to_s] the message to log. In the block
238
+ # form, this is the progname to use in the log message.
239
+ # @yield evaluates to the message to log. This is not evaluated unless the
240
+ # logger's level is sufficient to log the message. This allows you to
241
+ # create potentially expensive logging messages that are only called when
242
+ # the logger is configured to show them.
243
+ # @return [nil,true] when the given severity is not high enough (for this
244
+ # particular logger), log no message, and return true
245
+ # @see http://is.gd/5ElFPK
246
+ delegate_to_all_loggers :fatal
247
+
248
+ # @return [true,false] whether or not the current severity level
249
+ # allows for the printing of fatal messages
250
+ # @see http://is.gd/7PgwRl
251
+ delegate_to_first_logger :fatal?
252
+
253
+ # Log a message with severity of unknown.
254
+ #
255
+ # @param message_or_progname [#to_s] the message to log. In the block
256
+ # form, this is the progname to use in the log message.
257
+ # @yield evaluates to the message to log. This is not evaluated unless the
258
+ # logger's level is sufficient to log the message. This allows you to
259
+ # create potentially expensive logging messages that are only called when
260
+ # the logger is configured to show them.
261
+ # @return [nil,true] when the given severity is not high enough (for this
262
+ # particular logger), log no message, and return true
263
+ # @see http://is.gd/Y4hqpf
264
+ delegate_to_all_loggers :unknown
265
+
266
+ # Close the logging devices.
267
+ #
268
+ # @see http://is.gd/b13cVn
269
+ delegate_to_all_loggers :close
270
+
271
+ private
272
+
273
+ # @return [Integer] the default logger level
274
+ # @api private
275
+ def default_log_level
276
+ Util.to_logger_level(Kitchen::DEFAULT_LOG_LEVEL)
277
+ end
278
+
279
+ # @return [Boolean] whether to overwrite logs by default
280
+ # @api private
281
+ def default_log_overwrite
282
+ Kitchen::DEFAULT_LOG_OVERWRITE
283
+ end
284
+
285
+ # Construct a new standard out logger.
286
+ #
287
+ # @param stdout [IO] the IO object that represents stdout (or similar)
288
+ # @param color [Symbol] color to use when outputing messages
289
+ # @param colorize [Boolean] whether to enable color
290
+ # @return [StdoutLogger] a new logger
291
+ # @api private
292
+ def stdout_logger(stdout, color, colorize)
293
+ logger = StdoutLogger.new(stdout)
294
+ if colorize
295
+ logger.formatter = proc do |_severity, _datetime, _progname, msg|
296
+ Color.colorize(msg.dup.to_s, color).concat("\n")
297
+ end
298
+ else
299
+ logger.formatter = proc do |_severity, _datetime, _progname, msg|
300
+ msg.dup.concat("\n")
301
+ end
302
+ end
303
+ logger
304
+ end
305
+
306
+ # Construct a new logdev logger.
307
+ #
308
+ # @param filepath_or_logdev [String,IO] a filepath String or IO object
309
+ # @param log_overwrite [Boolean] apply log overwriting
310
+ # if filepath_or_logdev is a file path
311
+ # @return [LogdevLogger] a new logger
312
+ # @api private
313
+ def logdev_logger(filepath_or_logdev, log_overwrite)
314
+ LogdevLogger.new(resolve_logdev(filepath_or_logdev, log_overwrite))
315
+ end
316
+
317
+ # Return an IO object from a filepath String or the IO object itself.
318
+ #
319
+ # @param filepath_or_logdev [String,IO] a filepath String or IO object
320
+ # @param log_overwrite [Boolean] apply log overwriting
321
+ # if filepath_or_logdev is a file path
322
+ # @return [IO] an IO object
323
+ # @api private
324
+ def resolve_logdev(filepath_or_logdev, log_overwrite)
325
+ if filepath_or_logdev.is_a? String
326
+ mode = log_overwrite ? "wb" : "ab"
327
+ FileUtils.mkdir_p(File.dirname(filepath_or_logdev))
328
+ file = File.open(File.expand_path(filepath_or_logdev), mode)
329
+ file.sync = true
330
+ file
331
+ else
332
+ filepath_or_logdev
333
+ end
334
+ end
335
+
336
+ # Internal class which adds a #banner method call that displays the
337
+ # message with a callout arrow.
338
+ class LogdevLogger < ::Logger
339
+ alias super_info info
340
+
341
+ # Dump one or more messages to info.
342
+ #
343
+ # @param msg [String] a message
344
+ def <<(msg)
345
+ @buffer ||= ""
346
+ @buffer += msg
347
+ while (i = @buffer.index("\n"))
348
+ format_line(@buffer[0, i].chomp)
349
+ @buffer[0, i + 1] = ""
350
+ end
351
+ end
352
+
353
+ # Log a banner message.
354
+ #
355
+ # @param msg [String] a message
356
+ def banner(msg = nil, &block)
357
+ super_info("-----> #{msg}", &block)
358
+ end
359
+
360
+ private
361
+
362
+ # Reformat a line if it already contains log formatting.
363
+ #
364
+ # @param line [String] a message line
365
+ # @api private
366
+ def format_line(line)
367
+ case line
368
+ when /^-----> / then banner(line.gsub(/^[ >-]{6} /, ""))
369
+ when /^>>>>>> / then error(line.gsub(/^[ >-]{6} /, ""))
370
+ when /^ / then info(line.gsub(/^[ >-]{6} /, ""))
371
+ else info(line)
372
+ end
373
+ end
374
+ end
375
+
376
+ # Internal class which reformats logging methods for display as console
377
+ # output.
378
+ class StdoutLogger < LogdevLogger
379
+ # Log a debug message
380
+ #
381
+ # @param msg [String] a message
382
+ def debug(msg = nil, &block)
383
+ super("D #{msg}", &block)
384
+ end
385
+
386
+ # Log an info message
387
+ #
388
+ # @param msg [String] a message
389
+ def info(msg = nil, &block)
390
+ super(" #{msg}", &block)
391
+ end
392
+
393
+ # Log a warn message
394
+ #
395
+ # @param msg [String] a message
396
+ def warn(msg = nil, &block)
397
+ super("$$$$$$ #{msg}", &block)
398
+ end
399
+
400
+ # Log an error message
401
+ #
402
+ # @param msg [String] a message
403
+ def error(msg = nil, &block)
404
+ super(">>>>>> #{msg}", &block)
405
+ end
406
+
407
+ # Log a fatal message
408
+ #
409
+ # @param msg [String] a message
410
+ def fatal(msg = nil, &block)
411
+ super("!!!!!! #{msg}", &block)
412
+ end
413
+
414
+ # Log an unknown message
415
+ #
416
+ # @param msg [String] a message
417
+ def unknown(msg = nil, &block)
418
+ super("?????? #{msg}", &block)
419
+ end
420
+ end
421
+ end
422
+ end
@@ -0,0 +1,52 @@
1
+ #
2
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
+ #
4
+ # Copyright (C) 2013, Fletcher Nichol
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Kitchen
19
+ # Mixin module that delegates logging methods to a local `#logger`.
20
+ #
21
+ # @author Fletcher Nichol <fnichol@nichol.ca>
22
+ module Logging
23
+ class << self
24
+ private
25
+
26
+ # @api private
27
+ # @!macro logger_method
28
+ # @method $1($2)
29
+ # Log a message with severity of $1
30
+ # @param message_or_progname [#to_s] the message to log. In the block
31
+ # form, this is the progname to use in the log message.
32
+ # @yield evaluates to the message to log. This is not evaluated unless
33
+ # the logger's level is sufficient to log the message. This allows
34
+ # you to create potentially expensive logging messages that are
35
+ # only called when the logger is configured to show them.
36
+ # @return [nil,true] when the given severity is not high enough (for
37
+ # this particular logger), log no message, and return true
38
+ def logger_method(meth)
39
+ define_method(meth) do |*args|
40
+ logger.public_send(meth, *args)
41
+ end
42
+ end
43
+ end
44
+
45
+ logger_method :banner
46
+ logger_method :debug
47
+ logger_method :info
48
+ logger_method :warn
49
+ logger_method :error
50
+ logger_method :fatal
51
+ end
52
+ end
@@ -0,0 +1,49 @@
1
+ #
2
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
+ #
4
+ # Copyright (C) 2013, Fletcher Nichol
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Kitchen
19
+ # Value object to track a shell command that will be passed to Kernel.exec
20
+ # for execution.
21
+ #
22
+ # @author Fletcher Nichol <fnichol@nichol.ca>
23
+ class LoginCommand
24
+ # @return [String] login command
25
+ attr_reader :command
26
+
27
+ # @return [Array] array of arguments to the command
28
+ attr_reader :arguments
29
+
30
+ # @return [Hash] options hash, passed to `Kernel#exec`
31
+ attr_reader :options
32
+
33
+ # Constructs a new LoginCommand instance.
34
+ #
35
+ # @param command [String] command
36
+ # @param arguments [Array] array of arguments to the command
37
+ # @param options [Hash] options hash, passed to `Kernel#exec`
38
+ # @see http://www.ruby-doc.org/core-2.1.2/Kernel.html#method-i-exec
39
+ def initialize(command, arguments, options = {})
40
+ @command = command
41
+ @arguments = Array(arguments)
42
+ @options = options
43
+ end
44
+
45
+ def exec_args
46
+ [command, *arguments, options]
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,49 @@
1
+ #
2
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
+ #
4
+ # Copyright (C) 2012, Fletcher Nichol
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Kitchen
19
+ # A rather insane and questionable class to quickly consume a metadata.rb
20
+ # file and return the cookbook name and version attributes.
21
+ #
22
+ # @see https://twitter.com/fnichol/status/281650077901144064
23
+ # @see https://gist.github.com/4343327
24
+ class MetadataChopper < Hash
25
+ # Return an Array containing the cookbook name and version attributes,
26
+ # or nil values if they could not be parsed.
27
+ #
28
+ # @param metadata_file [String] path to a metadata.rb file
29
+ # @return [Array<String>] array containing the cookbook name and version
30
+ # attributes or nil values if they could not be determined
31
+ def self.extract(metadata_file)
32
+ mc = new(File.expand_path(metadata_file))
33
+ [mc[:name], mc[:version]]
34
+ end
35
+
36
+ # Creates a new instances and loads in the contents of the metdata.rb
37
+ # file. If you value your life, you may want to avoid reading the
38
+ # implementation.
39
+ #
40
+ # @param metadata_file [String] path to a metadata.rb file
41
+ def initialize(metadata_file)
42
+ instance_eval(IO.read(metadata_file), metadata_file)
43
+ end
44
+
45
+ def method_missing(meth, *args, &_block)
46
+ self[meth] = args.first
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,64 @@
1
+ #
2
+ # Author:: Fletcher Nichol (<fnichol@nichol.ca>)
3
+ #
4
+ # Copyright (C) 2012, Fletcher Nichol
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ module Kitchen
19
+ # A target operating system environment in which convergence integration
20
+ # will take place. This may represent a specific operating system, version,
21
+ # and machine architecture.
22
+ #
23
+ # @author Fletcher Nichol <fnichol@nichol.ca>
24
+ class Platform
25
+ # @return [String] logical name of this platform
26
+ attr_reader :name
27
+
28
+ # @return [String] operating system type hint (default: `"unix"`)
29
+ attr_reader :os_type
30
+
31
+ # @return [String] shell command flavor hint (default: `"bourne"`)
32
+ attr_reader :shell_type
33
+
34
+ # Constructs a new platform.
35
+ #
36
+ # @param [Hash] options configuration for a new platform
37
+ # @option options [String] :name logical name of this platform
38
+ # (**Required**)
39
+ def initialize(options = {})
40
+ @name = options.fetch(:name) do
41
+ raise ClientError, "Platform#new requires option :name"
42
+ end
43
+ @os_type = options.fetch(:os_type) do
44
+ windows?(options) ? "windows" : "unix"
45
+ end
46
+ @shell_type = options.fetch(:shell_type) do
47
+ windows?(options) ? "powershell" : "bourne"
48
+ end
49
+ end
50
+
51
+ def windows?(options)
52
+ @name.downcase =~ /^win/ || (
53
+ !options[:transport].nil? && options[:transport][:name] == "winrm"
54
+ )
55
+ end
56
+
57
+ # Returns a Hash of configuration and other useful diagnostic information.
58
+ #
59
+ # @return [Hash] a diagnostic hash
60
+ def diagnose
61
+ { os_type: os_type, shell_type: shell_type }
62
+ end
63
+ end
64
+ end