cuken 0.1.4 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. data/.relish +2 -0
  2. data/Gemfile +4 -4
  3. data/Gemfile.lock +17 -23
  4. data/VERSION +1 -1
  5. data/cuken.gems +108 -0
  6. data/cuken.gemspec +33 -10
  7. data/features/about.md +15 -2
  8. data/features/chef_examples/cookbooks_cookbook.feature +38 -3
  9. data/features/chef_examples/cookbooks_remote_repo.feature +10 -0
  10. data/features/chef_examples/cookbooks_repo.feature +5 -5
  11. data/features/{chef_steps → chef_examples}/knife_admin_client.feature +4 -4
  12. data/features/chef_examples/knife_client_create.feature +13 -0
  13. data/features/chef_steps/common_steps.feature +2 -2
  14. data/features/chef_steps/cookbook_steps.feature +12 -5
  15. data/features/chef_steps/node_steps.feature +1 -1
  16. data/features/file_steps/file_steps.feature +11 -11
  17. data/lib/cuken/all.rb +4 -0
  18. data/lib/cuken/api/chef/common.rb +46 -8
  19. data/lib/cuken/api/chef/knife.rb +107 -0
  20. data/lib/cuken/api/chef.rb +21 -13
  21. data/lib/cuken/api/common.rb +12 -0
  22. data/lib/cuken/api/rvm.rb +501 -0
  23. data/lib/cuken/api/ssh-forever.rb +237 -0
  24. data/lib/cuken/chef.rb +2 -0
  25. data/lib/cuken/common.rb +1 -0
  26. data/lib/cuken/cucumber/chef/common.rb +4 -2
  27. data/lib/cuken/cucumber/chef/cookbook.rb +87 -12
  28. data/lib/cuken/cucumber/chef/data_bag.rb +27 -0
  29. data/lib/cuken/cucumber/chef/knife.rb +10 -0
  30. data/lib/cuken/cucumber/chef/node.rb +20 -8
  31. data/lib/cuken/cucumber/chef/role.rb +18 -1
  32. data/lib/cuken/cucumber/chef.rb +5 -3
  33. data/lib/cuken/cucumber/cmd.rb +1 -1
  34. data/lib/cuken/cucumber/file.rb +18 -2
  35. data/lib/cuken/cucumber/rvm.rb +4 -0
  36. data/lib/cuken/rvm.rb +3 -0
  37. data/spec/api/knife_spec.rb +94 -0
  38. data/spec/api/rvm_spec.rb +274 -0
  39. data/spec/api/rvmrc_processor_spec.rb +288 -0
  40. data/spec/spec_helper.rb +58 -2
  41. metadata +67 -30
@@ -0,0 +1,501 @@
1
+ module ::Cuken
2
+ module Api
3
+ module Rvm
4
+
5
+ class RvmrcProcessor
6
+
7
+ attr_writer :gemspecs_to_install
8
+
9
+ def initialize(path)
10
+ @root_path = ::File.directory?(path) ? path : File.dirname(path)
11
+ rvmrc_read(path)
12
+ end
13
+
14
+ # read the .rvmrc file contents into @rvmrc
15
+ def rvmrc_read(path)
16
+ fn = ::File.directory?(path) ? path + '/.rvmrc' : path
17
+ @rvmrc = ::File.new(fn).read
18
+ return true if @rvmrc.size > 0
19
+ end
20
+
21
+ # return the .rvmrc file contents
22
+ def rvmrc
23
+ @rvmrc
24
+ end
25
+
26
+ # return ruby name parsed from .rvmrc file contents
27
+ def rvmrc_ruby_name
28
+ extract_rubie(rvmrc)
29
+ end
30
+
31
+ # return gemset name parsed from .rvmrc file contents
32
+ def rvmrc_gemset_name
33
+ extract_gemset(rvmrc)
34
+ end
35
+
36
+ # return concatenated string of rvmrc_ruby@rvmrc_gemset
37
+ def rvmrc_ruby_gemset(rvmrc)
38
+ "#{extract_rubie(rvmrc)}@#{extract_gemset(rvmrc)}"
39
+ end
40
+
41
+ # return an array of .rvmrc file paths found beneath a root folder
42
+ def find_rvmrc_files(rvmrc_root)
43
+ Dir.glob(rvmrc_root + '/**' + '/.rvmrc')
44
+ end
45
+
46
+ # return an arry of paths containing .rvmrc files
47
+ def find_rvmrc_paths(rvmrc_root)
48
+ root = File.directory?(rvmrc_root) ? rvmrc_root : File.dirname(rvmrc_root)
49
+ dirs = []
50
+ find_rvmrc_files(root).each do |path|
51
+ dirs << File.dirname(File.expand_path(path)) if File.file?(path)
52
+ end
53
+ dirs
54
+ end
55
+
56
+ #return an array of *.gems file paths found beneath a root folder
57
+ def find_gems_files(rvmrc_root)
58
+ Dir.glob(rvmrc_root + '/**' + '/*.gems')
59
+ end
60
+
61
+ # returns rubies and gemsets from .rvmrc files glob'ed below
62
+ # a root folder.
63
+ def all_rubies_gemsets(root_path=@root_path)
64
+ @all_rubies_gemsets = Hash.new([])
65
+ arry=find_rvmrc_paths(root_path)
66
+ arry.each do |dir|
67
+ Dir.glob(dir + '/*.gems').each do |fn|
68
+ gsn = File.basename(fn,'.gems').to_s
69
+ rvmrc_read(dir + '/.rvmrc')
70
+ rube = rvmrc_ruby_name
71
+ egsn = rvmrc_gemset_name
72
+ @all_rubies_gemsets[rube] = [] unless @all_rubies_gemsets.key? rube
73
+ if gsn == egsn
74
+ @all_rubies_gemsets[rube] << {:ruby_alias => "cuken_#{rube}",:gemset_alias => "cuken_#{gsn}", :gemset_name => gsn, :gemset_path => fn}
75
+ end
76
+ end
77
+ end
78
+ @all_rubies_gemsets
79
+ end
80
+
81
+ # returns hash of all gemsets, per-Ruby, in all .rvmrc files beneath a root folder
82
+ def all_gemsets(root_path=@root_path)
83
+ default = Hash.new{|hsh,ky| hsh[ky] = {:ruby_alias => "cuken_#{ky}"}}
84
+ @all_rubies_gemsets ||= all_rubies_gemsets(root_path)
85
+ @all_gemsets = @all_rubies_gemsets.inject(default){|h,(k,v)| h[k]; h[k][:gemsets]=v; h }
86
+ end
87
+
88
+ # returns array of all rubies in all .rvmrc files beneath a root folder
89
+ def all_rubies(root_path=@root_path)
90
+ @all_rubies_gemsets ||= all_rubies_gemsets(root_path)
91
+ @all_rubies = @all_rubies_gemsets.keys
92
+ end
93
+
94
+ # yield a block in the environment of each in the installed rubies,
95
+ # and return current Ruby string even if the given block raises
96
+ def each_ruby
97
+ begin
98
+ all_rubies(@root_path).each do |rubie|
99
+ RVM.use(rubie)
100
+ yield rubie
101
+ end
102
+ rescue
103
+ ensure
104
+ RVM.reset_current!
105
+ end
106
+ end
107
+
108
+ # create gemsets parsed from all .rvmrc files beneath a root folder
109
+ def create_gemsets
110
+ each_ruby do |rubie|
111
+ all_gemsets(@root_path)[rubie][:gemsets].each do |hsh|
112
+ ::RVM.gemset.create([hsh[:gemset_name]])
113
+ end
114
+ end
115
+ end
116
+
117
+ # Return array of [gem_name, gem_version] to be installed into all
118
+ # gemsets found in .rvmrc files. Default is Bundler versio 1.0.10
119
+ def gemspecs_to_install
120
+ @gemspecs_to_install ||= [['bundler', '1.0.10']]
121
+ end
122
+
123
+ # Install @gemspecs_to_install contents using rubies and gemsets
124
+ # found in .rvmrc files.
125
+ def gems_install
126
+ create_gemsets
127
+ each_ruby do |rubie|
128
+ gemspecs_to_install.each { |spec| install_gem(rubie, spec) }
129
+ end
130
+ end
131
+
132
+ # return the options string for Ruby's `gem install...` CLI
133
+ def gem_install_options
134
+ @gem_install_options ||= ['no_ri', 'no_rdoc']
135
+ "--" + @gem_install_options.join(' --')
136
+ end
137
+
138
+ # install given gem into all ruby+gemsets parsed from .rvmrc files beneath a root folder
139
+ def install_gem(rubie, spec)
140
+ gem, version = spec
141
+ all_gemsets.each do |rubie, hsh|
142
+ hsh[:gemsets].each do |h|
143
+ if gem_available?(spec)
144
+ puts "info: Gem #{gem}-#{version} already installed in #{rvm_current_name}."
145
+ else
146
+ puts "info: Installing gem #{gem}-#{version} in #{rvm_current_name}..."
147
+ RVM.gemset.use(h[:gemset_alias])
148
+ RVM.run("rvm --create use #{h[:gemset_alias]}; gem install #{gem} -v#{version} #{gem_install_options}")
149
+ end
150
+ end
151
+ end
152
+ end
153
+
154
+ # return the parsed .rvmrc info for the current ruby
155
+ def current_ruby_info(rubie)
156
+ @all_rubies_gemsets ||= all_rubies_gemsets
157
+ @all_rubies_gemsets[rubie]
158
+ end
159
+
160
+ def rvm_path
161
+ pn = Pathname.new(File.expand_path(ENV['rvm_path'] || '~/.rvm'))
162
+ pn.exist? ? pn : raise(RuntimeError, "Could not find RVM's .rvm folder (#{pn})", caller)
163
+ end
164
+ # Does not install existing RVM rubies that are listed in the .rvmrc files
165
+ # raise an error if RVM's install root does not exist
166
+ def setup_rubies
167
+ rvm_loaded? ? true : raise(RuntimeError, "RVM library not loaded.", caller)
168
+ @all_rubies_gemsets ||= all_rubies_gemsets(@root_path)
169
+ @all_rubies_gemsets.keys.each do |rubie|
170
+ if RVM.list_strings.include?(rubie)
171
+ puts "info: Rubie #{rubie} already installed."
172
+ else
173
+ with_rvm_environment_vars do
174
+ install_rubie(rubie)
175
+ end
176
+ end
177
+ RVM.alias_create(current_ruby_info(rubie)[0][:ruby_alias], "#{rubie}") unless rubie == current_ruby_info(rubie)[0][:ruby_alias]
178
+ end
179
+ end
180
+
181
+ private
182
+ def extract_rubie(rvmrc)
183
+ rvmrc[/ruby_id=\"(.*)\"/, 1]
184
+ end
185
+ def extract_gemset(rvmrc)
186
+ rvmrc[/gemset_id=\"(.*)\"/, 1]
187
+ end
188
+ def gem_available?(spec)
189
+ gem, version = spec
190
+ RVM.ruby_eval("require 'rubygems' ; print Gem.available?('#{gem}','#{version}')").stdout == 'true'
191
+ end
192
+ def rvm_current_name
193
+ RVM.current.expanded_name
194
+ end
195
+
196
+ def rvm_loaded?
197
+ @rvm_setup = defined?(RVM) ? true : false
198
+ return(true) if @rvm_setup
199
+ rvm_lib_path = rvm_path + "lib" rescue return
200
+ $LOAD_PATH.unshift(rvm_lib_path.to_s) unless $LOAD_PATH.include?(rvm_lib_path.to_s)
201
+ require 'rvm'
202
+ @rvm_setup = defined?(RVM) ? true : false
203
+ end
204
+
205
+ def install_rubie(rubie)
206
+ std_msg = "info: Rubie #{rubie} installed."
207
+ err_msg = "Failed #{rubie} install! Check RVM logs here: #{RVM.path}/log/#{rubie}"
208
+ puts "info: Rubie #{rubie} installation inprogress. This couldtake awhile..."
209
+ RVM.install(rubie, rvm_install_options) ? puts(std_msg) : abort(err_msg)
210
+ end
211
+
212
+ def rvm_install_options
213
+ { }
214
+ end
215
+
216
+ def with_rvm_environment_vars
217
+ my_vars = rvm_environment_vars
218
+ current_vars = my_vars.inject({}) { |cvars,kv| k,v = kv ; cvars[k]= ENV[k] ; cvars }
219
+ set_environment_vars(my_vars)
220
+ yield
221
+ ensure
222
+ set_environment_vars(current_vars)
223
+ end
224
+
225
+ def set_environment_vars(vars)
226
+ vars.each { |k,v| ENV[k] = v }
227
+ end
228
+
229
+ def rvm_environment_vars
230
+ if rvm_for_macports?
231
+ {'CC' => '/usr/bin/gcc-4.2',
232
+ 'CFLAGS' => '-O2 -arch x86_64',
233
+ 'LDFLAGS' => '-L/opt/local/lib -arch x86_64',
234
+ 'CPPFLAGS' => '-I/opt/local/include'}
235
+ else
236
+ {}
237
+ end
238
+ end
239
+
240
+ def rvm_for_macports?
241
+ `uname`.strip == 'Darwin' && `which port`.present?
242
+ end
243
+
244
+ end # class RvmrcProcessor
245
+
246
+ module_function
247
+ class << self
248
+ attr_accessor :rvm_install_rubies, :rvm_install_gem_specs,
249
+ :rvm_gem_install_options
250
+ end
251
+
252
+ def rvmrc(path)
253
+ @rvmrc ||= RvmrcProcessor.new(path)
254
+ end
255
+
256
+ def rvm_current_name
257
+ RVM.current.expanded_name
258
+ end
259
+
260
+ def rvm_gem_install_options
261
+ @rvm_gem_install_options ||= ['no_ri', 'no_rdoc']
262
+ "--" + @rvm_gem_install_options.join(' --')
263
+ end
264
+
265
+ def rvm_install_rubies
266
+ @rvm_install_rubies ||= []
267
+ end
268
+
269
+ def rvm_install_gemspecs
270
+ @rvm_install_gemspecs ||= [['bundler', '1.0.10']]
271
+ end
272
+
273
+ def rvm_create_gemsets
274
+ @rvm_create_gemsets ||= []
275
+ end
276
+
277
+ def rvm_requested_gemset(gemset)
278
+ @rvm_requested_gemset = gemset
279
+ end
280
+
281
+ def rvm_requested_gemset
282
+ @rvm_requested_gemset ||='vagrant'
283
+ end
284
+ #wip
285
+ def rvm_path
286
+ pn = Pathname.new(File.expand_path(ENV['rvm_path'] || '~/.rvm'))
287
+ pn.exist? ? pn : raise(RuntimeError, "Could not find RVM's .rvm folder (#{pn})", caller)
288
+ end
289
+
290
+ def rvm_local_install?
291
+ rvm_path.dirname.realpath.directory?
292
+ end
293
+ # done
294
+ def rvm_loaded?
295
+ _rvm_load
296
+ end
297
+
298
+ def rvm_gemset_paths(root_path='/usr/src/cuken')
299
+ rpn = Pathname(root_path)
300
+ rvmrc_dirs = []
301
+ Dir.glob((rpn + '**' + '.rvmrc').to_s).each do |d|
302
+ dn = File.dirname(d)
303
+ rvmrc_dirs << dn if File.directory?(dn)
304
+ end
305
+ rvmrc_dirs
306
+ end
307
+
308
+ # done
309
+ def rvmrc_rubies_gemsets(root_path='/usr/src/cuken')
310
+ @rvmrc_rubies_gemsets = Hash.new([])
311
+ arry=rvm_gemset_paths(root_path)
312
+ arry.each do |dir|
313
+ Dir.glob(dir + '/*.gems').each do |fn|
314
+ gsn = File.basename(fn,'.gems').to_s
315
+ rvmrc = File.new(File.dirname(fn) + '/.rvmrc').read
316
+ rube = rvmrc_extract_ruby(rvmrc)
317
+ egsn = rvmrc_extract_gemset(rvmrc)
318
+ @rvmrc_rubies_gemsets[rube] = [] unless @rvmrc_rubies_gemsets.key? rube
319
+ @rvmrc_rubies_gemsets[rube] << gsn if gsn == egsn
320
+ end
321
+ end
322
+ @rvmrc_rubies_gemsets
323
+ end
324
+ # done
325
+ def rvmrc_rubies
326
+ @rvmrc_rubies ||= _rvmrc_rubies #.keys.map{ |rubie| "#{rubie}@#{rvm_requested_gemset}" }
327
+ end
328
+ #wip
329
+ def rvm_rubies_setup(root_path='/usr/src/cuken')
330
+ rvm_loaded? ? true : raise(RuntimeError, "RVM library not loaded.", caller)
331
+ @rvmrc_rubies_gemsets ? true : rvmrc_rubies_gemsets(root_path)
332
+ @rvmrc_rubies_gemsets.keys.each do |rubie|
333
+ if RVM.list_strings.include?(rubie)
334
+ puts "info: Rubie #{rubie} already installed."
335
+ else
336
+ with_rvm_environment_vars do
337
+ _rvm_install_rubie(rubie)
338
+ end
339
+ end
340
+ RVM.alias_create(rvmrc_rubies[rubie][:alias], "#{rubie}@#{rvm_requested_gemset}") unless rubie == rvmrc_rubies[rubie][:alias]
341
+ end
342
+ end
343
+ #done
344
+ def rvm_current_rubie_info
345
+ rvmrc_rubies[_rvm_current_rubie_name]
346
+ end
347
+
348
+ # Install @rvm_install_gemspecs gemspec using rubies and gemsets
349
+ # found in .rvmrc files.
350
+ # done
351
+ def rvmrc_gems_install(root_path)
352
+ @rvmrc_root_path = root_path
353
+ _rvmrc_create_gemsets
354
+ _each_rvmrc_rubie do |rubie|
355
+ rvm_install_gemspecs.each { |spec| _rvmrc_install_gem(rubie, spec) }
356
+ end
357
+ end
358
+
359
+ def rvmrc_gemsets_install(root_path)
360
+ @rvmrc_root_path = root_path
361
+ _each_rvmrc_rubie do |rubie|
362
+ rvm_install_gemspecs.each { |spec| _rvmrc_install_gem(rubie, spec) }
363
+ end
364
+ end
365
+
366
+ protected
367
+ #done
368
+ def _rvm_load
369
+ @rvm_setup = false
370
+ rvm_lib_path = rvm_path + "lib" rescue return
371
+ $LOAD_PATH.unshift(rvm_lib_path.to_s) unless $LOAD_PATH.include?(rvm_lib_path.to_s)
372
+ require 'rvm'
373
+ @rvm_setup = defined?(RVM) ? true : false
374
+ end
375
+ module_function :_rvm_load
376
+ #done
377
+ def _rvm_install_rubie(rubie)
378
+ std_msg = "info: Rubie #{rubie} installed."
379
+ err_msg = "Failed #{rubie} install! Check RVM logs here: #{RVM.path}/log/#{rubie}"
380
+ puts "info: Rubie #{rubie} installation inprogress. This couldtake awhile..."
381
+ RVM.install(rubie, rvm_install_options) ? puts(std_msg) : abort(err_msg)
382
+ end
383
+ module_function :_rvm_install_rubie
384
+
385
+ #done
386
+ def rvmrc_extract_ruby_gemset(rvmrc)
387
+ "#{rvmrc_extract_ruby(rvmrc)}@#{rvmrc_extract_gemset(rvmrc)}"
388
+ end
389
+ module_function :rvmrc_extract_ruby_gemset
390
+ #done
391
+ def rvmrc_extract_ruby(rvmrc)
392
+ rvmrc[/ruby_id=\"(.*)\"/, 1]
393
+ end
394
+ module_function :rvmrc_extract_ruby
395
+ #done
396
+ def rvmrc_extract_gemset(rvmrc)
397
+ rvmrc[/gemset_id=\"(.*)\"/, 1]
398
+ end
399
+ module_function :rvmrc_extract_gemset
400
+ #done
401
+ def _rvmrc_rubies
402
+ default = Hash.new{|hsh,ky| hsh[ky] = {:alias => "cuken-#{ky}"}}
403
+ @rvmrc_rubies_gemsets ||= rvmrc_rubies_gemsets(@rvmrc_root_path)
404
+ @rvmrc_rubies = @rvmrc_rubies_gemsets.keys.inject(default){|h,(k,v)| h[k]; h }
405
+ end
406
+ module_function :_rvmrc_rubies
407
+ #done
408
+ def _rvmrc_gemsets
409
+ default = Hash.new{|hsh,ky| hsh[ky] = {:alias => "cuken-#{ky}"}}
410
+ @rvmrc_rubies_gemsets ||= rvmrc_rubies_gemsets(@rvmrc_root_path)
411
+ @rvmrc_gemsets = @rvmrc_rubies_gemsets.inject(default){|h,(k,v)| h[k]; h[k][:gemsets]=v; h }
412
+ end
413
+ module_function :_rvmrc_gemsets
414
+ # done
415
+ def _each_rvmrc_rubie
416
+ _rvmrc_rubies.each do |ary|
417
+ RVM.use(ary[0])
418
+ yield ary[0]
419
+ end
420
+ ensure
421
+ RVM.reset_current!
422
+ end
423
+ module_function :_each_rvmrc_rubie
424
+ # done
425
+ def _rvmrc_create_gemsets
426
+ _rvmrc_gemsets.each do |hsh|
427
+ RVM.use hsh[0]
428
+ hsh[1][:gemsets].each do |gmst|
429
+ # TODO: Post refactor
430
+ #RVM.gemset.create([gmst])
431
+ end
432
+ end
433
+ end
434
+ module_function :_rvmrc_create_gemsets
435
+ #done
436
+ def _rvmrc_install_gem(rubie, spec)
437
+ gem, version = spec
438
+ _rvmrc_gemsets.each do |hsh|
439
+ rubie = hsh[0]
440
+ hsh[1][:gemsets].each do |gmst|
441
+ #RVM.gemset.create([gmst])
442
+ RVM.gemset.use(gmst)
443
+ if _rvm_gem_available?(spec)
444
+ puts "info: Gem #{gem}-#{version} already installed in #{rvm_current_name}."
445
+ else
446
+ puts "info: Installing gem #{gem}-#{version} in #{rvm_current_name}..."
447
+ RVM.run("rvm --create use #{rubie}@#{gmst}; gem install #{gem} -v#{version} #{rvm_gem_install_options}")
448
+ end
449
+ end
450
+ end
451
+ end
452
+ module_function :_rvmrc_install_gem
453
+
454
+ # done
455
+ def set_environment_vars(vars)
456
+ vars.each { |k,v| ENV[k] = v }
457
+ end
458
+ module_function :set_environment_vars
459
+ #done
460
+ def with_rvm_environment_vars
461
+ my_vars = rvm_environment_vars
462
+ puts my_vars
463
+ current_vars = my_vars.inject({}) { |cvars,kv| k,v = kv ; cvars[k]= ENV[k] ; cvars }
464
+ puts current_vars
465
+ set_environment_vars(my_vars)
466
+ yield
467
+ ensure
468
+ set_environment_vars(current_vars)
469
+ end
470
+ module_function :with_rvm_environment_vars
471
+ #done
472
+ def rvm_environment_vars
473
+ if rvm_for_macports?
474
+ {'CC' => '/usr/bin/gcc-4.2',
475
+ 'CFLAGS' => '-O2 -arch x86_64',
476
+ 'LDFLAGS' => '-L/opt/local/lib -arch x86_64',
477
+ 'CPPFLAGS' => '-I/opt/local/include'}
478
+ else
479
+ {}
480
+ end
481
+ end
482
+ module_function :rvm_environment_vars
483
+ #done
484
+ def rvm_for_macports?
485
+ `uname`.strip == 'Darwin' && `which port`.present?
486
+ end
487
+ module_function :rvm_for_macports?
488
+ # done
489
+ def rvm_install_options
490
+ { }
491
+ end
492
+ module_function :rvm_install_options
493
+ #done
494
+ def _rvm_gem_available?(spec)
495
+ gem, version = spec
496
+ RVM.ruby_eval("require 'rubygems' ; print Gem.available?('#{gem}','#{version}')").stdout == 'true'
497
+ end
498
+ module_function :_rvm_gem_available?
499
+ end
500
+ end
501
+ end