knife-solo 0.4.1 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cc5fe9ecb3ae1c82b5e1adceb0108d37d8b8ec56
4
- data.tar.gz: 869dda3bdfa85f9f57591d162a3067924b6f039c
3
+ metadata.gz: d1be6240f65ce8b7255b2da87a1aadad46e91139
4
+ data.tar.gz: dafd0b80483566f921c9ce779fa1baa0ced57d0d
5
5
  SHA512:
6
- metadata.gz: 1516533d664b431e2424d493a02088f240eac13e7398bda438251e475433794554450f5430035b81223687fcfe5beb080b9c48dd9a39616c333a9b0430451899
7
- data.tar.gz: 7cbe38fe74bcacc0c6e22bf20861ecef1f80a976ecfabfc83418abc41f85e71898189299e030fc7b18bda5670d92befbd1f974483276fefece00f43de53dd94e
6
+ metadata.gz: d72d04c97936e105e7d60d62399ad156500843b25023f8feea4d844cd8c01720e8f612521f14697050ab0ab424e192982f941e9d8c324d82c578da64daa5f43f
7
+ data.tar.gz: 55556df5ca2c38708d85b384f7a8b1108638fabb2b9d35dc42a83e1b3b86eef6d72b359523d93ae9627624171ca40e5377b0319ea5a3308f680b91aed1207887
@@ -1,3 +1,42 @@
1
+ # 0.4.2 / 2014-06-05
2
+
3
+ ## Changes and new features
4
+
5
+ * SSH agent forwarding support ([328][], [347][], [358][])
6
+ * SSH gateway support ([8d1f4f8][])
7
+ * Support non-bash shells (csh, sh, dash, bash, and fish) ([351][])
8
+ * Add `node_name` & `ssl_verify_mode` to `solo.rb` ([359][], [363][])
9
+ * Store IP address in generated node file ([360][])
10
+ * openSUSE 13 support ([352][])
11
+ * Mavericks support ([356][])
12
+
13
+ ## Fixes
14
+
15
+ * Avoid Net::SSH auto-reading default openssh configs when an ssh config file is used ([341][])
16
+
17
+ ## Thanks to our contributors!
18
+
19
+ * [Yuki Sonoda][yugui]
20
+ * [Todd Willey][xtoddx]
21
+ * [Andy Leonard][anl]
22
+ * [Robert L. Carpenter][robacarp]
23
+ * [alexsiri7][alexsiri7]
24
+ * [Ravil Bayramgalin][brainopia]
25
+ * [Chun-wei Kuo][Domon]
26
+ * [Angel Abad][angelabad]
27
+
28
+ [308]: https://github.com/matschaffer/knife-solo/issues/308
29
+ [328]: https://github.com/matschaffer/knife-solo/issues/328
30
+ [347]: https://github.com/matschaffer/knife-solo/issues/347
31
+ [351]: https://github.com/matschaffer/knife-solo/issues/351
32
+ [352]: https://github.com/matschaffer/knife-solo/issues/352
33
+ [358]: https://github.com/matschaffer/knife-solo/issues/358
34
+ [359]: https://github.com/matschaffer/knife-solo/issues/359
35
+ [360]: https://github.com/matschaffer/knife-solo/issues/360
36
+ [363]: https://github.com/matschaffer/knife-solo/issues/363
37
+ [356]: https://github.com/matschaffer/knife-solo/issues/356
38
+ [8d1f4f8]: https://github.com/matschaffer/knife-solo/commit/8d1f4f8
39
+
1
40
  # 0.4.1 / 2013-12-07
2
41
 
3
42
  ## Changes and new features
@@ -402,57 +441,65 @@ And a special thanks to [Teemu Matilainen][tmatilai] who is now on the list of d
402
441
  * Generate node config on prepare
403
442
  * Cook via rsync
404
443
 
405
- [ChrisLundquist]:https://github.com/ChrisLundquist
406
- [DrGonzo65]: https://github.com/DrGonzo65
407
- [Frozenproduce]: https://github.com/Frozenproduce
408
- [Motiejus]: https://github.com/Motiejus
409
- [Nix-wie-weg]: https://github.com/Nix-wie-weg
410
- [TheAlphaTester]:https://github.com/TheAlphaTester
411
- [TylerRick]: https://github.com/TylerRick
412
- [aaronjensen]: https://github.com/aaronjensen
413
- [amoslanka]: https://github.com/amoslanka
414
- [ares]: https://github.com/ares
415
- [aromarom64]: https://github.com/aromarom64
416
- [avit]: https://github.com/avit
417
- [bambuchaAdm]: https://github.com/bambuchaAdm
418
- [brynary]: https://github.com/brynary
419
- [btm]: https://github.com/btm
420
- [dapatil]: https://github.com/dapatil
421
- [davidsch]: https://github.com/davidsch
422
- [deepak]: https://github.com/deepak
423
- [dkinzer]: https://github.com/dkinzer
424
- [dwradcliffe]: https://github.com/dwradcliffe
425
- [fnichol]: https://github.com/fnichol
426
- [funglaub]: https://github.com/funglaub
427
- [gregf]: https://github.com/gregf
428
- [gsterndale]: https://github.com/gsterndale
429
- [hectcastro]: https://github.com/hectcastro
430
- [hrp]: https://github.com/hrp
431
- [jgarber]: https://github.com/jgarber
432
- [jgrevich]: https://github.com/jgrevich
433
- [kmdsbng]: https://github.com/kmdsbng
434
- [makern]: https://github.com/makern
435
- [michaelglass]: https://github.com/michaelglass
436
- [naoya]: https://github.com/naoya
437
- [natlownes]: https://github.com/natlownes
438
- [patatepartie]: https://github.com/patatepartie
439
- [patcon]: https://github.com/patcon
440
- [pferdefleisch]: https://github.com/pferdefleisch
441
- [piglovesyou]: https://github.com/piglovesyou
442
- [portertech]: https://github.com/portertech
443
- [retr0h]: https://github.com/retr0h
444
- [rmoriz]: https://github.com/rmoriz
445
- [rosstimson]: https://github.com/rosstimson
446
- [rubiojr]: https://github.com/rubiojr
444
+ [ChrisLundquist]: https://github.com/ChrisLundquist
445
+ [DrGonzo65]: https://github.com/DrGonzo65
446
+ [Frozenproduce]: https://github.com/Frozenproduce
447
+ [Motiejus]: https://github.com/Motiejus
448
+ [Nix-wie-weg]: https://github.com/Nix-wie-weg
449
+ [TheAlphaTester]: https://github.com/TheAlphaTester
450
+ [TylerRick]: https://github.com/TylerRick
451
+ [aaronjensen]: https://github.com/aaronjensen
452
+ [amoslanka]: https://github.com/amoslanka
453
+ [ares]: https://github.com/ares
454
+ [aromarom64]: https://github.com/aromarom64
455
+ [avit]: https://github.com/avit
456
+ [bambuchaAdm]: https://github.com/bambuchaAdm
457
+ [brynary]: https://github.com/brynary
458
+ [btm]: https://github.com/btm
459
+ [dapatil]: https://github.com/dapatil
460
+ [davidsch]: https://github.com/davidsch
461
+ [deepak]: https://github.com/deepak
462
+ [dkinzer]: https://github.com/dkinzer
463
+ [dwradcliffe]: https://github.com/dwradcliffe
464
+ [fnichol]: https://github.com/fnichol
465
+ [funglaub]: https://github.com/funglaub
466
+ [gregf]: https://github.com/gregf
467
+ [gsterndale]: https://github.com/gsterndale
468
+ [hectcastro]: https://github.com/hectcastro
469
+ [hrp]: https://github.com/hrp
470
+ [jgarber]: https://github.com/jgarber
471
+ [jgrevich]: https://github.com/jgrevich
472
+ [kmdsbng]: https://github.com/kmdsbng
473
+ [makern]: https://github.com/makern
474
+ [michaelglass]: https://github.com/michaelglass
475
+ [naoya]: https://github.com/naoya
476
+ [natlownes]: https://github.com/natlownes
477
+ [patatepartie]: https://github.com/patatepartie
478
+ [patcon]: https://github.com/patcon
479
+ [pferdefleisch]: https://github.com/pferdefleisch
480
+ [piglovesyou]: https://github.com/piglovesyou
481
+ [portertech]: https://github.com/portertech
482
+ [retr0h]: https://github.com/retr0h
483
+ [rmoriz]: https://github.com/rmoriz
484
+ [rosstimson]: https://github.com/rosstimson
485
+ [rubiojr]: https://github.com/rubiojr
447
486
  [russellcardullo]: https://github.com/russellcardullo
448
- [ryandub]: https://github.com/ryandub
449
- [searlm]: https://github.com/searlm
450
- [skyeagle]: https://github.com/skyeagle
451
- [smdern]: https://github.com/smdern
452
- [teyrow]: https://github.com/teyrow
453
- [tknerr]: https://github.com/tknerr
454
- [tmatilai]: https://github.com/tmatilai
455
- [tocky]: https://github.com/tocky
456
- [vjpr]: https://github.com/vjpr
457
- [zeph]: https://github.com/zeph
458
- [allaire]: https://github.com/allaire
487
+ [ryandub]: https://github.com/ryandub
488
+ [searlm]: https://github.com/searlm
489
+ [skyeagle]: https://github.com/skyeagle
490
+ [smdern]: https://github.com/smdern
491
+ [teyrow]: https://github.com/teyrow
492
+ [tknerr]: https://github.com/tknerr
493
+ [tmatilai]: https://github.com/tmatilai
494
+ [tocky]: https://github.com/tocky
495
+ [vjpr]: https://github.com/vjpr
496
+ [zeph]: https://github.com/zeph
497
+ [allaire]: https://github.com/allaire
498
+ [yugui]: https://github.com/yugui
499
+ [xtoddx]: https://github.com/xtoddx
500
+ [anl]: https://github.com/anl
501
+ [robacarp]: https://github.com/robacarp
502
+ [alexsiri7]: https://github.com/alexsiri7
503
+ [brainopia]: https://github.com/brainopia
504
+ [Domon]: https://github.com/Domon
505
+ [angelabad]: https://github.com/angelabad
@@ -19,7 +19,7 @@ class Chef
19
19
 
20
20
  # Use (some) options from prepare and cook commands
21
21
  self.options = SoloPrepare.options
22
- [:berkshelf, :librarian, :sync_only, :why_run].each { |opt| option opt, SoloCook.options[opt] }
22
+ [:berkshelf, :librarian, :sync_only, :why_run, :clean_up].each { |opt| option opt, SoloCook.options[opt] }
23
23
 
24
24
  def run
25
25
  validate!
@@ -67,6 +67,10 @@ class Chef
67
67
  :long => '--provisioning-path path',
68
68
  :description => 'Where to store kitchen data on the node'
69
69
 
70
+ option :clean_up,
71
+ :long => '--clean-up',
72
+ :description => 'Run the clean command after cooking'
73
+
70
74
  def run
71
75
  time('Run') do
72
76
 
@@ -89,6 +93,8 @@ class Chef
89
93
  generate_solorb
90
94
  end
91
95
  cook unless config[:sync_only]
96
+
97
+ clean_up if config[:clean_up]
92
98
  end
93
99
  end
94
100
 
@@ -121,6 +127,10 @@ class Chef
121
127
  upload_to_provision_path(:environment_path, 'environments')
122
128
  end
123
129
 
130
+ def ssl_verify_mode
131
+ Chef::Config[:ssl_verify_mode] || :verify_peer
132
+ end
133
+
124
134
  def expand_path(path)
125
135
  Pathname.new(path).expand_path
126
136
  end
@@ -246,8 +256,14 @@ class Chef
246
256
  file.unlink
247
257
  end
248
258
 
249
- def rsync(source_path, target_path, extra_opts = '--delete')
250
- cmd = ['rsync', '-rL', rsync_debug, rsync_permissions, %Q{--rsh=ssh #{ssh_args}}, extra_opts]
259
+ def rsync(source_path, target_path, extra_opts = '--delete-after')
260
+ if config[:ssh_gateway]
261
+ ssh_command = "ssh -TA #{config[:ssh_gateway]} ssh -T -o StrictHostKeyChecking=no #{ssh_args}"
262
+ else
263
+ ssh_command = "ssh #{ssh_args}"
264
+ end
265
+
266
+ cmd = ['rsync', '-rL', rsync_debug, rsync_permissions, %Q{--rsh=#{ssh_command}}, extra_opts]
251
267
  cmd += rsync_excludes.map { |ignore| "--exclude=#{ignore}" }
252
268
  cmd << adjust_rsync_path_on_client(source_path)
253
269
  cmd << %Q{:#{adjust_rsync_path_on_node(target_path)}}
@@ -291,10 +307,18 @@ class Chef
291
307
  raise "chef-solo failed. See output above." unless result.success?
292
308
  end
293
309
 
310
+ def clean_up
311
+ clean = SoloClean.new
312
+ clean.ui = ui
313
+ clean.name_args = @name_args
314
+ clean.config.merge! config
315
+ clean.run
316
+ end
317
+
294
318
  protected
295
319
 
296
320
  def patch_cookbooks_install
297
- add_cookbook_path(patch_cookbooks_path)
321
+ add_cookbook_path(patch_cookbooks_path)
298
322
  end
299
323
  end
300
324
  end
@@ -62,11 +62,13 @@ module KnifeSolo
62
62
 
63
63
  def http_client_get_url(url, file)
64
64
  stream_command <<-BASH
65
- if command -v curl >/dev/null 2>&1; then
66
- curl -L -o #{file} #{url}
67
- else
68
- wget -O #{file} #{url}
69
- fi
65
+ /bin/sh -c " \
66
+ if command -v curl >/dev/null 2>&1; then \
67
+ curl -L -o '#{file}' '#{url}'; \
68
+ else \
69
+ wget -O '#{file}' '#{url}'; \
70
+ fi; \
71
+ "
70
72
  BASH
71
73
  end
72
74
 
@@ -7,7 +7,7 @@ module KnifeSolo::Bootstraps
7
7
 
8
8
  def distro
9
9
  case issue
10
- when %r{10.[6-8]}
10
+ when %r{10.[6-9]}
11
11
  {:type => 'omnibus'}
12
12
  else
13
13
  raise "OS X version #{issue} not supported"
@@ -85,6 +85,8 @@ module KnifeSolo::Bootstraps
85
85
  {:type => "debianoid_gem"}
86
86
  when %r{Raspbian}
87
87
  {:type => "debianoid_gem"}
88
+ when %r{Linux Mint}
89
+ {:type => "debianoid_gem"}
88
90
  when %r{Ubuntu}i
89
91
  {:type => (x86? ? "debianoid_omnibus" : "debianoid_gem")}
90
92
  when %r{Linaro}
@@ -95,6 +97,8 @@ module KnifeSolo::Bootstraps
95
97
  {:type => "yum_omnibus"}
96
98
  when %r{Red Hat Enterprise}
97
99
  {:type => "yum_omnibus"}
100
+ when %r{Oracle Linux Server}
101
+ {:type => "yum_omnibus"}
98
102
  when %r{Enterprise Linux Enterprise Linux Server}
99
103
  {:type => "yum_omnibus"}
100
104
  when %r{Fedora release}
@@ -105,7 +109,7 @@ module KnifeSolo::Bootstraps
105
109
  {:type => "yum_omnibus"}
106
110
  when %r{SUSE Linux Enterprise Server 1[12]}
107
111
  {:type => "omnibus"}
108
- when %r{openSUSE 12}
112
+ when %r{openSUSE 1[23]}
109
113
  {:type => "zypper_omnibus"}
110
114
  when %r{This is \\n\.\\O \(\\s \\m \\r\) \\t}
111
115
  {:type => "emerge_gem"}
@@ -1,6 +1,6 @@
1
1
  module KnifeSolo
2
2
  def self.version
3
- '0.4.1'
3
+ '0.4.2'
4
4
  end
5
5
 
6
6
  def self.post_install_message
@@ -74,7 +74,8 @@ module KnifeSolo
74
74
  attributes = config[:json_attributes] || config[:first_boot_attributes] || {}
75
75
  run_list = { :run_list => config[:run_list] || [] }
76
76
  environment = config[:environment] ? { :environment => config[:environment] } : {}
77
- f.print attributes.merge(run_list).merge(environment).to_json
77
+ automatic = host ? { :automatic => { :ipaddress => host } } : {}
78
+ f.print JSON.pretty_generate(attributes.merge(run_list).merge(environment).merge(automatic))
78
79
  end
79
80
  end
80
81
  end
@@ -1,3 +1,5 @@
1
+ node_name <%= host.inspect %>
2
+
1
3
  base = File.expand_path('..', __FILE__)
2
4
 
3
5
  nodes_path File.join(base, 'nodes')
@@ -6,6 +8,7 @@ data_bag_path File.join(base, 'data_bags')
6
8
  encrypted_data_bag_secret File.join(base, 'data_bag_key')
7
9
  environment_path File.join(base, 'environments')
8
10
  environment <%= node_environment.inspect %>
11
+ ssl_verify_mode <%= ssl_verify_mode.inspect %>
9
12
 
10
13
  cookbook_path []
11
14
  <% cookbook_paths.each_with_index do |path, i| -%>
@@ -5,6 +5,7 @@ module KnifeSolo
5
5
  def self.load_deps
6
6
  require 'knife-solo/ssh_connection'
7
7
  require 'net/ssh'
8
+ require 'net/ssh/gateway'
8
9
  end
9
10
 
10
11
  def self.included(other)
@@ -38,6 +39,10 @@ module KnifeSolo
38
39
  :long => '--ssh-password PASSWORD',
39
40
  :description => 'The ssh password'
40
41
 
42
+ option :ssh_gateway,
43
+ :long => '--ssh-gateway GATEWAY',
44
+ :description => 'The ssh gateway'
45
+
41
46
  option :ssh_identity,
42
47
  :long => '--ssh-identity FILE',
43
48
  :description => 'Deprecated. Replaced with --identity-file.'
@@ -47,6 +52,12 @@ module KnifeSolo
47
52
  :long => '--identity-file FILE',
48
53
  :description => 'The ssh identity file'
49
54
 
55
+ option :forward_agent,
56
+ :long => '--forward-agent',
57
+ :description => 'Forward SSH authentication',
58
+ :boolean => true,
59
+ :default => false
60
+
50
61
  option :ssh_port,
51
62
  :short => '-p PORT',
52
63
  :long => '--ssh-port PORT',
@@ -118,7 +129,7 @@ module KnifeSolo
118
129
  end
119
130
 
120
131
  def try_connection
121
- Net::SSH.start(host, user, connection_options) do |ssh|
132
+ ssh_connection.session do |ssh|
122
133
  ssh.exec!("true")
123
134
  end
124
135
  end
@@ -132,10 +143,15 @@ module KnifeSolo
132
143
  options[:port] = config[:ssh_port] if config[:ssh_port]
133
144
  options[:password] = config[:ssh_password] if config[:ssh_password]
134
145
  options[:keys] = [config[:identity_file]] if config[:identity_file]
146
+ options[:gateway] = config[:ssh_gateway] if config[:ssh_gateway]
147
+ options[:forward_agent] = true if config[:forward_agent]
135
148
  if !config[:host_key_verify]
136
149
  options[:paranoid] = false
137
150
  options[:user_known_hosts_file] = "/dev/null"
138
151
  end
152
+ # Respect users' specification of config[:ssh_config]
153
+ # Prevents Net::SSH itself from applying the default ssh_config files.
154
+ options[:config] = false
139
155
  options
140
156
  end
141
157
 
@@ -160,12 +176,13 @@ module KnifeSolo
160
176
  host_arg = [user, host].compact.join('@')
161
177
  config_arg = "-F #{config[:ssh_config]}" if config[:ssh_config]
162
178
  ident_arg = "-i #{config[:identity_file]}" if config[:identity_file]
163
- port_arg = "-p #{config[:ssh_port]}" if config[:ssh_port]
179
+ forward_arg = "-o ForwardAgent=yes" if config[:forward_agent]
180
+ port_arg = "-p #{config[:ssh_port]}" if config[:ssh_port]
164
181
  knownhosts_arg = "-o UserKnownHostsFile=#{connection_options[:user_known_hosts_file]}" if config[:host_key_verify] == false
165
182
  stricthosts_arg = "-o StrictHostKeyChecking=no" if config[:host_key_verify] == false
166
183
 
167
184
 
168
- [host_arg, config_arg, ident_arg, port_arg, knownhosts_arg, stricthosts_arg].compact.join(' ')
185
+ [host_arg, config_arg, ident_arg, forward_arg, port_arg, knownhosts_arg, stricthosts_arg].compact.join(' ')
169
186
  end
170
187
 
171
188
  def sudo_command
@@ -195,7 +212,7 @@ module KnifeSolo
195
212
  Chef::Log.debug("Using replacement sudo command: #{sudo_command}")
196
213
  replacement = sudo_command
197
214
  elsif sudo_available?
198
- replacement = 'sudo -p \'knife sudo password: \''
215
+ replacement = 'sudo -E -p \'knife sudo password: \''
199
216
  else
200
217
  replacement = ''
201
218
  end
@@ -229,10 +246,15 @@ module KnifeSolo
229
246
 
230
247
  output = ui.stdout if options[:streaming]
231
248
 
232
- @connection ||= SshConnection.new(host, user, connection_options, method(:password))
249
+
250
+ @connection ||= ssh_connection
233
251
  @connection.run_command(command, output)
234
252
  end
235
253
 
254
+ def ssh_connection
255
+ SshConnection.new(host, user, connection_options, method(:password))
256
+ end
257
+
236
258
  # Runs commands from the specified array until successful.
237
259
  # Returns the result of the successful command or an ExecResult with
238
260
  # exit_code 1 if all fail.
@@ -32,8 +32,16 @@ module KnifeSolo
32
32
 
33
33
  attr_reader :host, :user, :connection_options
34
34
 
35
- def session
36
- @session ||= Net::SSH.start(host, user, connection_options)
35
+ def session(&block)
36
+ @session ||= begin
37
+ if connection_options[:gateway]
38
+ co = connection_options
39
+ gw_user,gw = co.delete(:gateway).split '@'
40
+ Net::SSH::Gateway.new(gw, gw_user).ssh(host, user, co, &block)
41
+ else
42
+ Net::SSH.start(host, user, connection_options, &block)
43
+ end
44
+ end
37
45
  end
38
46
 
39
47
  def password
@@ -1,12 +1,15 @@
1
1
  require 'integration_helper'
2
2
 
3
+
3
4
  class Debian6BootstrapTest < IntegrationTest
4
5
  def user
5
6
  "admin"
6
7
  end
7
8
 
8
9
  def image_id
9
- "ami-7ce17315"
10
+ # PVM 64-bit
11
+ # From https://wiki.debian.org/Cloud/AmazonEC2Image/Squeeze
12
+ "ami-0740476e"
10
13
  end
11
14
 
12
15
  def prepare_server
@@ -6,7 +6,9 @@ class Debian7KnifeBootstrapTest < IntegrationTest
6
6
  end
7
7
 
8
8
  def image_id
9
- "ami-9e95e8f7"
9
+ # PVM instance store
10
+ # From https://wiki.debian.org/Cloud/AmazonEC2Image/Wheezy
11
+ "ami-848a6eec"
10
12
  end
11
13
 
12
14
  def prepare_server
@@ -45,7 +45,8 @@ class NodeConfigCommandTest < TestCase
45
45
  cmd = command(@host)
46
46
  cmd.generate_node_config
47
47
  assert cmd.node_config.exist?
48
- assert_match '{"run_list":[]}', cmd.node_config.read
48
+
49
+ assert_config_contains({"run_list" => []}, cmd)
49
50
  end
50
51
  end
51
52
 
@@ -72,7 +73,8 @@ class NodeConfigCommandTest < TestCase
72
73
  in_kitchen do
73
74
  cmd = command(@host, "--run-list=role[base],recipe[foo]")
74
75
  cmd.generate_node_config
75
- assert_match '{"run_list":["role[base]","recipe[foo]"]}', cmd.node_config.read
76
+
77
+ assert_config_contains({"run_list" => ["role[base]","recipe[foo]"]}, cmd)
76
78
  end
77
79
  end
78
80
 
@@ -81,7 +83,13 @@ class NodeConfigCommandTest < TestCase
81
83
  foo_json = '"foo":{"bar":[1,2],"baz":"x"}'
82
84
  cmd = command(@host, "--json-attributes={#{foo_json}}")
83
85
  cmd.generate_node_config
84
- assert_match "{#{foo_json},\"run_list\":[]}", cmd.node_config.read
86
+
87
+ expected_hash = {
88
+ "foo" => {"bar" => [1,2], "baz" => "x"},
89
+ "run_list" => []
90
+ }
91
+
92
+ assert_config_contains expected_hash, cmd
85
93
  end
86
94
  end
87
95
 
@@ -94,17 +102,28 @@ class NodeConfigCommandTest < TestCase
94
102
  cmd.config[:json_attributes] = JSON.parse("{#{foo_json}}")
95
103
  cmd.config[:first_boot_attributes] = JSON.parse("{#{ignored_json}}")
96
104
  cmd.generate_node_config
97
- assert_match "{#{foo_json},\"run_list\":[]}", cmd.node_config.read
105
+
106
+ expected_hash = {
107
+ "foo" => 99,
108
+ "run_list" => []
109
+ }
110
+
111
+ assert_config_contains expected_hash, cmd
98
112
  end
99
113
  end
100
114
 
101
115
  def test_generates_a_node_config_with_specified_first_boot_attributes
102
116
  in_kitchen do
103
- foo_json = '"foo":null'
104
117
  cmd = command(@host)
105
- cmd.config[:first_boot_attributes] = JSON.parse("{#{foo_json}}")
118
+ cmd.config[:first_boot_attributes] = {"foo"=>nil}
106
119
  cmd.generate_node_config
107
- assert_match "{#{foo_json},\"run_list\":[]}", cmd.node_config.read
120
+
121
+ expected_hash = {
122
+ "foo" => nil,
123
+ "run_list" => []
124
+ }
125
+
126
+ assert_config_contains expected_hash, cmd
108
127
  end
109
128
  end
110
129
 
@@ -114,10 +133,33 @@ class NodeConfigCommandTest < TestCase
114
133
  run_list = 'recipe[baz]'
115
134
  cmd = command(@host, "--run-list=#{run_list}", "--json-attributes={#{foo_json}}")
116
135
  cmd.generate_node_config
117
- assert_match "{#{foo_json},\"run_list\":[\"#{run_list}\"]}", cmd.node_config.read
136
+
137
+ expected_hash = {
138
+ "foo" => "bar",
139
+ "run_list" => [run_list]
140
+ }
141
+
142
+ assert_config_contains expected_hash, cmd
143
+
118
144
  end
119
145
  end
120
146
 
147
+ def test_generates_a_node_config_with_the_ip_address
148
+ in_kitchen do
149
+ cmd = command(@host)
150
+ cmd.generate_node_config
151
+
152
+ expected_hash = {
153
+ "automatic" => { "ipaddress" => @host }
154
+ }
155
+
156
+ assert_config_contains expected_hash, cmd
157
+
158
+ end
159
+ end
160
+
161
+
162
+
121
163
  def test_creates_the_nodes_directory_if_needed
122
164
  outside_kitchen do
123
165
  cmd = command(@host, "--node-name=mynode")
@@ -126,7 +168,17 @@ class NodeConfigCommandTest < TestCase
126
168
  end
127
169
  end
128
170
 
171
+ private
172
+
129
173
  def command(*args)
130
174
  knife_command(DummyNodeConfigCommand, *args)
131
175
  end
176
+
177
+ def assert_config_contains expected_hash, cmd
178
+ config = JSON.parse(cmd.node_config.read)
179
+ expected_hash.each do |k, v|
180
+ assert_equal v, config[k]
181
+ end
182
+ end
183
+
132
184
  end
@@ -17,6 +17,10 @@ class SoloBootstrapTest < TestCase
17
17
  end
18
18
  end
19
19
 
20
+ def test_includes_clean_up_cook_option
21
+ assert Chef::Knife::SoloBootstrap.options.include?(:clean_up), "Should support option :clean_up"
22
+ end
23
+
20
24
  def test_runs_prepare_and_cook
21
25
  Chef::Knife::SoloPrepare.any_instance.expects(:run)
22
26
  Chef::Knife::SoloCook.any_instance.expects(:run)
@@ -4,6 +4,7 @@ require 'support/validation_helper'
4
4
 
5
5
  require 'berkshelf'
6
6
  require 'chef/cookbook/chefignore'
7
+ require 'chef/knife/solo_clean'
7
8
  require 'chef/knife/solo_cook'
8
9
  require 'fileutils'
9
10
  require 'knife-solo/berkshelf'
@@ -33,6 +34,65 @@ class SoloCookTest < TestCase
33
34
  end
34
35
  end
35
36
 
37
+ def test_sets_ssl_verify_mode_returns_verify_peer_for_nil
38
+ Chef::Config[:ssl_verify_mode] = nil
39
+ assert_equal :verify_peer, command.ssl_verify_mode
40
+ end
41
+
42
+ def test_sets_ssl_verify_mode
43
+ Chef::Config[:ssl_verify_mode] = :verify_none
44
+ assert_equal :verify_none, command.ssl_verify_mode
45
+ end
46
+
47
+ def test_rsync_without_gateway_connection_options
48
+ in_kitchen do
49
+
50
+ cmd = knife_command(Chef::Knife::SoloCook)
51
+ cmd.expects(:system!).with('rsync',
52
+ '-rL',
53
+ '--rsh=ssh ssh_arguments',
54
+ '--delete-after',
55
+ '--exclude=revision-deploys',
56
+ '--exclude=tmp',
57
+ '--exclude=.git',
58
+ '--exclude=.hg',
59
+ '--exclude=.svn',
60
+ '--exclude=.bzr',
61
+ 'source',
62
+ ':dest')
63
+
64
+ cmd.stubs(:ssh_args => 'ssh_arguments')
65
+ cmd.stubs(:windows_node? => false)
66
+
67
+ cmd.rsync 'source', 'dest'
68
+ end
69
+ end
70
+
71
+ def test_rsync_with_gateway_connection_options
72
+ in_kitchen do
73
+
74
+ cmd = knife_command(Chef::Knife::SoloCook)
75
+ cmd.config[:ssh_gateway] = 'user@gateway'
76
+ cmd.expects(:system!).with('rsync',
77
+ '-rL',
78
+ '--rsh=ssh -TA user@gateway ssh -T -o StrictHostKeyChecking=no ssh_arguments',
79
+ '--delete-after',
80
+ '--exclude=revision-deploys',
81
+ '--exclude=tmp',
82
+ '--exclude=.git',
83
+ '--exclude=.hg',
84
+ '--exclude=.svn',
85
+ '--exclude=.bzr',
86
+ 'source',
87
+ ':dest')
88
+
89
+ cmd.stubs(:ssh_args => 'ssh_arguments')
90
+ cmd.stubs(:windows_node? => false)
91
+
92
+ cmd.rsync 'source', 'dest'
93
+ end
94
+ end
95
+
36
96
  def test_expanded_config_paths_returns_empty_array_for_nil
37
97
  Chef::Config[:foo] = nil
38
98
  assert_equal [], command.expanded_config_paths(:foo)
@@ -85,7 +145,7 @@ class SoloCookTest < TestCase
85
145
  cmd.run
86
146
  #note: cookbook_paths are in order of precedence (low->high)
87
147
  assert_equal cmd.patch_cookbooks_path, cmd.cookbook_paths[0]
88
- end
148
+ end
89
149
  end
90
150
 
91
151
  def test_does_not_run_berkshelf_if_no_berkfile
@@ -198,6 +258,22 @@ class SoloCookTest < TestCase
198
258
  end
199
259
  end
200
260
 
261
+ def test_runs_clean_after_cook_if_enabled_by_option
262
+ Chef::Knife::SoloClean.any_instance.expects(:run)
263
+
264
+ in_kitchen do
265
+ command("somehost", "--clean-up").run
266
+ end
267
+ end
268
+
269
+ def test_does_not_run_clean_after_cook_if_not_enabled_by_option
270
+ Chef::Knife::SoloClean.any_instance.expects(:run).never
271
+
272
+ in_kitchen do
273
+ command("somehost").run
274
+ end
275
+ end
276
+
201
277
  def test_validates_chef_version
202
278
  in_kitchen do
203
279
  cmd = command("somehost")
@@ -58,9 +58,27 @@ class SshCommandTest < TestCase
58
58
  assert_equal "test", cmd.connection_options[:password]
59
59
  end
60
60
 
61
+ def test_try_connection_without_gateway_connects_using_ssh
62
+ cmd = command("10.0.0.1")
63
+ Net::SSH.expects(:start).with(cmd.host, cmd.user, cmd.connection_options)
64
+
65
+ cmd.try_connection
66
+ end
67
+
68
+ def test_try_connection_with_gateway_connects_using_ssh_gateway
69
+ cmd = command("10.0.0.1", "--ssh-gateway=user@gateway")
70
+ ssh_mock = mock 'ssh_mock'
71
+ Net::SSH::Gateway.expects(:new).with('gateway', 'user').returns(ssh_mock)
72
+ ssh_mock.expects(:ssh).with(cmd.host, cmd.user, cmd.connection_options.except(:gateway))
73
+
74
+ Net::SSH.expects(:start).never
75
+
76
+ cmd.try_connection
77
+ end
78
+
61
79
  def test_uses_default_keys_if_conncetion_succeeds
62
80
  cmd = command("10.0.0.1")
63
- assert_equal({}, cmd.connection_options)
81
+ assert_equal false, cmd.connection_options[:config]
64
82
  end
65
83
 
66
84
  def test_uses_ssh_config_if_matched
@@ -70,6 +88,7 @@ class SshCommandTest < TestCase
70
88
  assert_equal "bob", cmd.connection_options[:user]
71
89
  assert_equal "id_rsa_bob", cmd.connection_options[:keys].first
72
90
  assert_equal "bob", cmd.user
91
+ assert_equal false, cmd.connection_options[:config]
73
92
  end
74
93
 
75
94
  def test_handles_port_specification
@@ -88,6 +107,18 @@ class SshCommandTest < TestCase
88
107
  assert_equal "/dev/null", cmd.connection_options[:user_known_hosts_file]
89
108
  end
90
109
 
110
+ def test_handle_forward_agent
111
+ cmd = command("10.0.0.1", "--forward-agent")
112
+ assert_equal true, cmd.connection_options[:forward_agent]
113
+ end
114
+
115
+
116
+ def test_handle_ssh_gateway
117
+ gateway = 'test@host.com'
118
+ cmd = command("10.0.0.1", "--ssh-gateway", gateway)
119
+ assert_equal gateway, cmd.connection_options[:gateway]
120
+ end
121
+
91
122
  def test_handle_default_host_key_verify_is_paranoid
92
123
  cmd = command("10.0.0.1")
93
124
  assert_nil(cmd.connection_options[:paranoid]) # Net:SSH default is :paranoid => true
@@ -119,6 +150,14 @@ class SshCommandTest < TestCase
119
150
  cmd = command("usertest@10.0.0.1", "--no-host-key-verify")
120
151
  cmd.validate_ssh_options!
121
152
  assert_equal "usertest@10.0.0.1 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no", cmd.ssh_args
153
+
154
+ cmd = command("usertest@10.0.0.1", "--forward-agent")
155
+ cmd.validate_ssh_options!
156
+ assert_equal "usertest@10.0.0.1 -o ForwardAgent=yes", cmd.ssh_args
157
+
158
+ cmd = command("usertest@10.0.0.1", "--ssh-gateway=test@host.com")
159
+ cmd.validate_ssh_options!
160
+ assert_equal "usertest@10.0.0.1", cmd.ssh_args
122
161
  end
123
162
 
124
163
  def test_barks_without_atleast_a_hostname
metadata CHANGED
@@ -1,215 +1,215 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-solo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mat Schaffer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-08 00:00:00.000000000 Z
11
+ date: 2014-06-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: berkshelf
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '>='
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 3.0.0.beta.2
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '>='
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 3.0.0.beta.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '>='
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: ffi
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - <
45
+ - - "<"
46
46
  - !ruby/object:Gem::Version
47
47
  version: 1.9.1
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - <
52
+ - - "<"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 1.9.1
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: fog
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - '>='
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
61
  version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - '>='
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: librarian-chef
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - '>='
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - '>='
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: minitest
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ~>
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
89
  version: '4.7'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ~>
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
96
  version: '4.7'
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: mocha
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
- - - '>='
101
+ - - ">="
102
102
  - !ruby/object:Gem::Version
103
103
  version: '0'
104
104
  type: :development
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
- - - '>='
108
+ - - ">="
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: parallel
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '>='
115
+ - - ">="
116
116
  - !ruby/object:Gem::Version
117
117
  version: '0'
118
118
  type: :development
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '>='
122
+ - - ">="
123
123
  - !ruby/object:Gem::Version
124
124
  version: '0'
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: rake
127
127
  requirement: !ruby/object:Gem::Requirement
128
128
  requirements:
129
- - - '>='
129
+ - - ">="
130
130
  - !ruby/object:Gem::Version
131
131
  version: '0'
132
132
  type: :development
133
133
  prerelease: false
134
134
  version_requirements: !ruby/object:Gem::Requirement
135
135
  requirements:
136
- - - '>='
136
+ - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
139
  - !ruby/object:Gem::Dependency
140
140
  name: rdoc
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - ~>
143
+ - - "~>"
144
144
  - !ruby/object:Gem::Version
145
145
  version: '3.12'
146
146
  type: :development
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - ~>
150
+ - - "~>"
151
151
  - !ruby/object:Gem::Version
152
152
  version: '3.12'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: coveralls
155
155
  requirement: !ruby/object:Gem::Requirement
156
156
  requirements:
157
- - - '>='
157
+ - - ">="
158
158
  - !ruby/object:Gem::Version
159
159
  version: '0'
160
160
  type: :development
161
161
  prerelease: false
162
162
  version_requirements: !ruby/object:Gem::Requirement
163
163
  requirements:
164
- - - '>='
164
+ - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
167
  - !ruby/object:Gem::Dependency
168
168
  name: chef
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - '>='
171
+ - - ">="
172
172
  - !ruby/object:Gem::Version
173
173
  version: '10.12'
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - '>='
178
+ - - ">="
179
179
  - !ruby/object:Gem::Version
180
180
  version: '10.12'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: net-ssh
183
183
  requirement: !ruby/object:Gem::Requirement
184
184
  requirements:
185
- - - '>='
185
+ - - ">="
186
186
  - !ruby/object:Gem::Version
187
187
  version: 2.2.2
188
- - - <
188
+ - - "<"
189
189
  - !ruby/object:Gem::Version
190
190
  version: '3.0'
191
191
  type: :runtime
192
192
  prerelease: false
193
193
  version_requirements: !ruby/object:Gem::Requirement
194
194
  requirements:
195
- - - '>='
195
+ - - ">="
196
196
  - !ruby/object:Gem::Version
197
197
  version: 2.2.2
198
- - - <
198
+ - - "<"
199
199
  - !ruby/object:Gem::Version
200
200
  version: '3.0'
201
201
  - !ruby/object:Gem::Dependency
202
202
  name: erubis
203
203
  requirement: !ruby/object:Gem::Requirement
204
204
  requirements:
205
- - - ~>
205
+ - - "~>"
206
206
  - !ruby/object:Gem::Version
207
207
  version: 2.7.0
208
208
  type: :runtime
209
209
  prerelease: false
210
210
  version_requirements: !ruby/object:Gem::Requirement
211
211
  requirements:
212
- - - ~>
212
+ - - "~>"
213
213
  - !ruby/object:Gem::Version
214
214
  version: 2.7.0
215
215
  description: Handles bootstrapping, running chef solo, rsyncing cookbooks etc
@@ -218,7 +218,7 @@ executables: []
218
218
  extensions: []
219
219
  extra_rdoc_files: []
220
220
  files:
221
- - .coveralls.yml
221
+ - ".coveralls.yml"
222
222
  - CHANGELOG.md
223
223
  - LICENSE
224
224
  - README.rdoc
@@ -248,6 +248,29 @@ files:
248
248
  - lib/knife-solo/librarian.rb
249
249
  - lib/knife-solo/node_config_command.rb
250
250
  - lib/knife-solo/resources/knife.rb
251
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/.travis.yml
252
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/CHANGELOG
253
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/LICENSE
254
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/NOTICE
255
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/README.md
256
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/search.rb
257
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/search/overrides.rb
258
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/search/parser.rb
259
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene.treetop
260
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene_nodes.rb
261
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/query_transform.rb
262
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/metadata.rb
263
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/recipes/default.rb
264
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/Gemfile
265
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/node/alpha.json
266
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/node/beta.json
267
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/node/without_json_class.json
268
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/jerry.json
269
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/lea.json
270
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/mike.json
271
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/tom.json
272
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/test_data_bags.rb
273
+ - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/test_search.rb
251
274
  - lib/knife-solo/resources/solo.rb.erb
252
275
  - lib/knife-solo/ssh_command.rb
253
276
  - lib/knife-solo/ssh_connection.rb
@@ -311,29 +334,6 @@ files:
311
334
  - test/support/validation_helper.rb
312
335
  - test/test_helper.rb
313
336
  - test/tools_test.rb
314
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/.travis.yml
315
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/CHANGELOG
316
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/LICENSE
317
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/NOTICE
318
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/README.md
319
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/search.rb
320
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/search/overrides.rb
321
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/search/parser.rb
322
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene.treetop
323
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/lucene_nodes.rb
324
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/libraries/vendor/chef/solr_query/query_transform.rb
325
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/metadata.rb
326
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/recipes/default.rb
327
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/Gemfile
328
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/node/alpha.json
329
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/node/beta.json
330
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/node/without_json_class.json
331
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/jerry.json
332
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/lea.json
333
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/mike.json
334
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/data/data_bags/users/tom.json
335
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/test_data_bags.rb
336
- - lib/knife-solo/resources/patch_cookbooks/chef-solo-search/tests/test_search.rb
337
337
  homepage: http://matschaffer.github.io/knife-solo/
338
338
  licenses: []
339
339
  metadata: {}
@@ -353,17 +353,17 @@ require_paths:
353
353
  - lib
354
354
  required_ruby_version: !ruby/object:Gem::Requirement
355
355
  requirements:
356
- - - '>='
356
+ - - ">="
357
357
  - !ruby/object:Gem::Version
358
358
  version: '0'
359
359
  required_rubygems_version: !ruby/object:Gem::Requirement
360
360
  requirements:
361
- - - '>='
361
+ - - ">="
362
362
  - !ruby/object:Gem::Version
363
363
  version: '0'
364
364
  requirements: []
365
365
  rubyforge_project:
366
- rubygems_version: 2.0.0
366
+ rubygems_version: 2.2.2
367
367
  signing_key:
368
368
  specification_version: 4
369
369
  summary: A collection of knife plugins for dealing with chef solo