cuken 0.1.11 → 0.1.12

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.
Files changed (39) hide show
  1. data/Gemfile +1 -1
  2. data/Gemfile.lock +8 -8
  3. data/VERSION +1 -1
  4. data/cuken.gemspec +19 -5
  5. data/features/about.md +110 -27
  6. data/features/chef_examples/cookbooks_cookbook.feature +2 -2
  7. data/features/chef_examples/zenoss/01_chef_server_setup.feature +205 -0
  8. data/features/chef_examples/zenoss/02_monitor_vm_setup.feature +139 -0
  9. data/features/chef_examples/zenoss/03_monitor_chef_setup.feature +109 -0
  10. data/features/step_definitions/cuken_steps.rb +16 -0
  11. data/features/support/env.rb +1 -0
  12. data/lib/cuken/api/chef/common.rb +20 -0
  13. data/lib/cuken/api/chef/cookbook.rb +62 -1
  14. data/lib/cuken/api/chef/data_bag.rb +89 -0
  15. data/lib/cuken/api/chef/knife.rb +16 -0
  16. data/lib/cuken/api/chef/role.rb +71 -0
  17. data/lib/cuken/api/chef.rb +51 -9
  18. data/lib/cuken/api/file.rb +68 -0
  19. data/lib/cuken/api/vagrant/common.rb +85 -0
  20. data/lib/cuken/api/vagrant/v_m.rb +125 -0
  21. data/lib/cuken/api/vagrant.rb +83 -0
  22. data/lib/cuken/chef.rb +16 -0
  23. data/lib/cuken/cucumber/chef/common.rb +4 -0
  24. data/lib/cuken/cucumber/chef/cookbook.rb +16 -2
  25. data/lib/cuken/cucumber/chef/data_bag.rb +48 -16
  26. data/lib/cuken/cucumber/chef/role.rb +30 -0
  27. data/lib/cuken/cucumber/chef.rb +16 -5
  28. data/lib/cuken/cucumber/cmd.rb +16 -0
  29. data/lib/cuken/cucumber/common.rb +16 -0
  30. data/lib/cuken/cucumber/file.rb +52 -0
  31. data/lib/cuken/cucumber/git/hooks.rb +28 -0
  32. data/lib/cuken/cucumber/rvm.rb +16 -0
  33. data/lib/cuken/cucumber/ssh/hooks.rb +31 -0
  34. data/lib/cuken/cucumber/ssh.rb +16 -0
  35. data/lib/cuken/cucumber/vagrant/common.rb +93 -0
  36. data/lib/cuken/cucumber/vagrant/hooks.rb +35 -0
  37. data/lib/cuken/cucumber/vagrant.rb +26 -0
  38. data/lib/cuken/vagrant.rb +19 -0
  39. metadata +18 -4
data/Gemfile CHANGED
@@ -5,7 +5,7 @@ source "http://rubygems.org"
5
5
  group :default do
6
6
  gem 'aruba', "~> 0.3.6"
7
7
  gem "cucumber", ">= 0"
8
- gem 'chef', "~>0.10.0.rc.0"
8
+ gem 'chef', "~>0.10.0"
9
9
  gem 'grit', "~>2.4.1"
10
10
  gem 'rvm', "~>1.5.2"
11
11
  gem 'open4'
data/Gemfile.lock CHANGED
@@ -9,11 +9,11 @@ GEM
9
9
  rspec (>= 2.5.0)
10
10
  builder (3.0.0)
11
11
  bunny (0.6.0)
12
- chef (0.10.0.rc.1)
12
+ chef (0.10.0)
13
13
  bunny (>= 0.6.0)
14
14
  erubis
15
15
  highline
16
- json (>= 1.4.4, <= 1.5.2)
16
+ json (<= 1.5.2, >= 1.4.4)
17
17
  mixlib-authentication (>= 1.1.0)
18
18
  mixlib-cli (>= 1.1.0)
19
19
  mixlib-config (>= 1.1.2)
@@ -22,7 +22,7 @@ GEM
22
22
  net-ssh (~> 2.1.3)
23
23
  net-ssh-multi (~> 1.0.1)
24
24
  ohai (>= 0.6.0)
25
- rest-client (>= 1.0.4, < 1.7.0)
25
+ rest-client (< 1.7.0, >= 1.0.4)
26
26
  treetop (~> 1.4.9)
27
27
  uuidtools
28
28
  childprocess (0.1.7)
@@ -36,10 +36,10 @@ GEM
36
36
  diff-lcs (1.1.2)
37
37
  erubis (2.6.6)
38
38
  abstract (>= 1.0.0)
39
- fakefs (0.3.1)
39
+ fakefs (0.3.2)
40
40
  ffi (0.6.3)
41
41
  rake (>= 0.8.7)
42
- gherkin (2.3.6)
42
+ gherkin (2.3.7)
43
43
  json (>= 1.4.6)
44
44
  git (1.2.5)
45
45
  grit (2.4.1)
@@ -63,12 +63,12 @@ GEM
63
63
  net-scp (1.0.4)
64
64
  net-ssh (>= 1.99.1)
65
65
  net-ssh (2.1.4)
66
- net-ssh-gateway (1.0.1)
66
+ net-ssh-gateway (1.1.0)
67
67
  net-ssh (>= 1.99.1)
68
68
  net-ssh-multi (1.0.1)
69
69
  net-ssh (>= 1.99.2)
70
70
  net-ssh-gateway (>= 0.99.0)
71
- ohai (0.6.2)
71
+ ohai (0.6.4)
72
72
  mixlib-cli
73
73
  mixlib-config
74
74
  mixlib-log
@@ -129,7 +129,7 @@ PLATFORMS
129
129
  DEPENDENCIES
130
130
  aruba (~> 0.3.6)
131
131
  bundler (~> 1.0.11)
132
- chef (~> 0.10.0.rc.0)
132
+ chef (~> 0.10.0)
133
133
  cucumber
134
134
  fakefs (~> 0.3.1)
135
135
  grit (~> 2.4.1)
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.11
1
+ 0.1.12
data/cuken.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{cuken}
8
- s.version = "0.1.11"
8
+ s.version = "0.1.12"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Hedgehog"]
12
- s.date = %q{2011-05-02}
12
+ s.date = %q{2011-05-03}
13
13
  s.description = %q{Reusable Cucumber steps and API for post-convergence system integration descriptions}
14
14
  s.email = %q{hedgehogshiatus@gmail.com}
15
15
  s.extra_rdoc_files = [
@@ -39,6 +39,9 @@ Gem::Specification.new do |s|
39
39
  "features/chef_examples/cookbooks_repo.feature",
40
40
  "features/chef_examples/knife_admin_client.feature",
41
41
  "features/chef_examples/knife_client_create.feature",
42
+ "features/chef_examples/zenoss/01_chef_server_setup.feature",
43
+ "features/chef_examples/zenoss/02_monitor_vm_setup.feature",
44
+ "features/chef_examples/zenoss/03_monitor_chef_setup.feature",
42
45
  "features/chef_steps/common_steps.feature",
43
46
  "features/chef_steps/cookbook_steps.feature",
44
47
  "features/chef_steps/knife_steps.feature",
@@ -402,7 +405,9 @@ Gem::Specification.new do |s|
402
405
  "lib/cuken/api/chef.rb",
403
406
  "lib/cuken/api/chef/common.rb",
404
407
  "lib/cuken/api/chef/cookbook.rb",
408
+ "lib/cuken/api/chef/data_bag.rb",
405
409
  "lib/cuken/api/chef/knife.rb",
410
+ "lib/cuken/api/chef/role.rb",
406
411
  "lib/cuken/api/cmd.rb",
407
412
  "lib/cuken/api/common.rb",
408
413
  "lib/cuken/api/file.rb",
@@ -410,6 +415,9 @@ Gem::Specification.new do |s|
410
415
  "lib/cuken/api/ssh-forever.rb",
411
416
  "lib/cuken/api/ssh.rb",
412
417
  "lib/cuken/api/ssh/password.rb",
418
+ "lib/cuken/api/vagrant.rb",
419
+ "lib/cuken/api/vagrant/common.rb",
420
+ "lib/cuken/api/vagrant/v_m.rb",
413
421
  "lib/cuken/chef.rb",
414
422
  "lib/cuken/cmd.rb",
415
423
  "lib/cuken/common.rb",
@@ -441,11 +449,17 @@ Gem::Specification.new do |s|
441
449
  "lib/cuken/cucumber/cmd.rb",
442
450
  "lib/cuken/cucumber/common.rb",
443
451
  "lib/cuken/cucumber/file.rb",
452
+ "lib/cuken/cucumber/git/hooks.rb",
444
453
  "lib/cuken/cucumber/rvm.rb",
445
454
  "lib/cuken/cucumber/ssh.rb",
455
+ "lib/cuken/cucumber/ssh/hooks.rb",
456
+ "lib/cuken/cucumber/vagrant.rb",
457
+ "lib/cuken/cucumber/vagrant/common.rb",
458
+ "lib/cuken/cucumber/vagrant/hooks.rb",
446
459
  "lib/cuken/file.rb",
447
460
  "lib/cuken/rvm.rb",
448
461
  "lib/cuken/ssh.rb",
462
+ "lib/cuken/vagrant.rb",
449
463
  "spec/api/knife_spec.rb",
450
464
  "spec/api/rvm_spec.rb",
451
465
  "spec/api/rvmrc_processor_spec.rb",
@@ -472,7 +486,7 @@ Gem::Specification.new do |s|
472
486
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
473
487
  s.add_runtime_dependency(%q<aruba>, ["~> 0.3.6"])
474
488
  s.add_runtime_dependency(%q<cucumber>, [">= 0"])
475
- s.add_runtime_dependency(%q<chef>, ["~> 0.10.0.rc.0"])
489
+ s.add_runtime_dependency(%q<chef>, ["~> 0.10.0"])
476
490
  s.add_runtime_dependency(%q<grit>, ["~> 2.4.1"])
477
491
  s.add_runtime_dependency(%q<rvm>, ["~> 1.5.2"])
478
492
  s.add_runtime_dependency(%q<open4>, [">= 0"])
@@ -490,7 +504,7 @@ Gem::Specification.new do |s|
490
504
  else
491
505
  s.add_dependency(%q<aruba>, ["~> 0.3.6"])
492
506
  s.add_dependency(%q<cucumber>, [">= 0"])
493
- s.add_dependency(%q<chef>, ["~> 0.10.0.rc.0"])
507
+ s.add_dependency(%q<chef>, ["~> 0.10.0"])
494
508
  s.add_dependency(%q<grit>, ["~> 2.4.1"])
495
509
  s.add_dependency(%q<rvm>, ["~> 1.5.2"])
496
510
  s.add_dependency(%q<open4>, [">= 0"])
@@ -509,7 +523,7 @@ Gem::Specification.new do |s|
509
523
  else
510
524
  s.add_dependency(%q<aruba>, ["~> 0.3.6"])
511
525
  s.add_dependency(%q<cucumber>, [">= 0"])
512
- s.add_dependency(%q<chef>, ["~> 0.10.0.rc.0"])
526
+ s.add_dependency(%q<chef>, ["~> 0.10.0"])
513
527
  s.add_dependency(%q<grit>, ["~> 2.4.1"])
514
528
  s.add_dependency(%q<rvm>, ["~> 1.5.2"])
515
529
  s.add_dependency(%q<open4>, [">= 0"])
data/features/about.md CHANGED
@@ -17,45 +17,82 @@ The Chef steps assume you have Chef server accessible on `localhost:4040`.
17
17
  If you have ideas to clarify or improve any of these cucumber features,
18
18
  please submit an [issue][9] or [pull request][8].
19
19
 
20
- ## The Chef JSON Issue
21
- Due to several JSON gem conflicts between various gems, Cuken is only intended
20
+ ## The Chef vs Vagrant/Aruba JSON Issue
21
+ Due to several JSON gem conflicts between Chef and the Vagrant/Aruba gems, Cuken is only intended
22
22
  to work with the 0.10 series of Chef. Of course you are free to work whatever
23
- magic you wish.
23
+ magic you wish for the 0.9.x releases.
24
24
 
25
25
  ## Opinons
26
26
  Virtual machines are [Vagrant][11] VM's.
27
27
  Vagrant VM's are all named.
28
28
  Configuration management and system integration is done with [Opscode's Chef][12].
29
- Chef Cookbooks are sourced from the the [Cookbooks account][13] on Github.
29
+ Chef Cookbooks are sourced from the [Cookbooks account][13] on Github.
30
+
31
+ ## Multiple Vagrant Multi-VM Environemts in one Scenario
32
+ Vagrant allows you to have Multi-VM environemnts in one Vagrantfile.
33
+ Cuken allows you to have multiple Vangrant Multi-VM environments in one scenario.
34
+ However there can be a performance penalty, so use this judiciously. To illustrate the performance hit
35
+ the Zenoss example (02_monitor_vm_setup.rb) has a multiple Vagrant environment as a Background - this gets run before
36
+ each scenario. This example also serves to demonstrate the steps neccessary to switch between Vagrant environments
37
+ (Vagrantfiles). Note the convention is that the Vagrant file resides in the Chef-project root directory.
38
+
39
+ Background:
40
+ Given the Chef root directory "/tmp/chef" exists
41
+ And the state of VM "chef" is "running"
42
+ And I switch Vagrant environment
43
+ And the Chef root directory "/tmp/monitor" exists
44
+ And the state of VM "monitor" is not "running"
45
+
46
+ NOTE:
47
+ The Zenoss example is intended to exercise steps and illustrate some useage.
48
+ It is certainly not an illustrattion of best practice.
30
49
 
31
50
  ## Conventions
32
- Rather than repeatedly refer to Chef and Vagrant in step definitions, where it is unambiguous,
33
- we simply treat the item or attribute as the pro-noun, and capitalize it.
51
+
52
+ ### Generic
53
+ Rather than repeatedly refer to Chef, Vagrant, etc. in each step, where it is unambiguous,
54
+ we treat the item or attribute as a pronoun, but capitalize to indicate the specialized substitution.
55
+ So, while there are many virtual machines and data bags in the world, here they refer to
56
+ Vagrant (VirtualBox) and Chef.
57
+
34
58
  Examples:
35
59
 
36
- Given the VM "chef" is not running
60
+ Given the state of VM "chef" is not "running"
37
61
  Given I create the Data Bag "user"
38
62
 
39
- Aruba will timeout if a command takes too long. A convention is to tag Features/Scenarios
40
- according to the size of the timeout threshold:
63
+ ### Place and Placed Files and Folders
64
+ The convention is to carry out all file and folder CRUD inside Aruba's scratch directory.
65
+ Given that Aruba deletes its tmporary working folder at the start of each scenario, it is neccessary to transfer any
66
+ files and folders you wish to keep.
67
+ We refer to this transfer of files and folders as 'placing'. Since a copy does not exists beyond the Scenario's life,
68
+ and since we verify the contents of placed files, it is not a file or folder copy nor move.
69
+ Placing and placed files and folders refer to taking a file from Aruba's scratch folder, moving it
70
+ outside of that ephemeral area and verifying the contents.
41
71
 
42
- no tag: 3 seconds (Aruba default)
43
- @slow
44
- @glacial
45
- @cosmic
72
+ ### Chef
73
+ In most cases Chef operations refer to the remote server, e.g. 'I create the Data Bag "...". The reason we leave remote
74
+ implicit in these steps, are:
75
+ a) to keep steps descriptions succint yet informative/accurate.
76
+ b) a 'local' version of this step is not accurate because local, filesystem, operations are properly done with the file
77
+ and directory steps and API, and are not done through Chef/Knife.
46
78
 
47
- Aruba will timeout if IO takes too long. This affects interactive SSH connections.
79
+ Cookbooks are are checked out into the branch 'cuken'.
80
+ Once you are happy with your changes, you can [rebase][14] ([interactively][15]) then push your changes to your fork
81
+ There are other ways, here is one [Git ver. 1.7.5]):
48
82
 
49
- no tag: 0.1 seconds (Aruba default)
50
- @ssh_local
51
- @ssh_remote
52
- @ssh_pigeon
83
+ git checkout cuken # Just in case. Cuken leaves this branch checked-out
84
+ git rebase qa
85
+ git push origin qa
53
86
 
54
- The default before blocks are in some of the Cucumber files. Example:
87
+ Then, on Github, issue a pull request from the qa branch of your fork.
88
+ To see a listing of the changes (before you rebase): `git diff qa..cuken`
55
89
 
56
- ./lib/cuken/cucumber/chef.rb
90
+ ### Vagrant
91
+ The Vagrantfile is required to be in the Chef-project root directory. Consequently the step
92
+ 'the Chef root directory "/tmp/chef" exists' is required before any Vagrant steps.
57
93
 
58
- If you need to change a default, add to your features/support/env.rb:
94
+ ## Hooks
95
+ If you need to change a default hook, add your variation of the following to your project's features/support/env.rb:
59
96
 
60
97
  Before do
61
98
  @aruba_timeout_seconds.nil? || @aruba_timeout_seconds < 3 ? @aruba_timeout_seconds = 3 : @aruba_timeout_seconds
@@ -65,19 +102,61 @@ If you need to change a default, add to your features/support/env.rb:
65
102
  @aruba_timeout_seconds.nil? || @aruba_timeout_seconds < 3600 ? @aruba_timeout_seconds = 3600 : @aruba_timeout_seconds
66
103
  end
67
104
 
105
+ ### Aruba
106
+ Aruba will timeout if a command takes too long. A convention is to tag Features/Scenarios
107
+ according to the size of the timeout threshold:
108
+ See lib/cuken/vagrant/hooks.rb:
109
+
110
+ no tag: 3 seconds (Aruba default)
111
+ @fast 6 seconds
112
+ @quick 20 seconds
113
+ @slow 60 seconds
114
+ @glacial 600 seconds
115
+ @cosmic 3600 seconds
68
116
 
69
- ## Step contributions:
70
- - Ideally the API methods should be covered by RSpec (I've been slack
71
- on this simply because I'm trying to get over the initial backlog of
72
- steps to port).
73
- - Have a feature/scenario that illustrates its use.
117
+ Aruba will timeout if IO takes too long. This affects interactive SSH connections.
118
+ See lib/cuken/ssh/hooks.rb:
119
+
120
+ no tag: 0.1 second (Aruba default)
121
+ @ssh_local 0.3 second
122
+ @ssh_remote 1 second
123
+ @ssh_pigeon 3 seconds
124
+ @ssh_dodo 10 seconds
125
+
126
+ ### Git/Grit
127
+ See lib/cuken/git/hooks.rb:
128
+
129
+ no tag: 10 seconds (Grit default)
130
+ @git_quick 20 seconds
131
+ @git_slow 60 seconds
132
+ @git_glacial 600 seconds
133
+ @git_cosmic 3600 seconds
134
+
135
+ ## Gotcha's
136
+ Unicorns are a dream, but Dragons are real...
137
+ ### Aruba
138
+ Aruba doesn't yet handle generic script execution, and that includes Bash and friends. There is some support for Ruby.
139
+ No trouble, you just need to use this syntax, if you want to fix it, see [here][16]:
140
+
141
+ And I run `bash -c 'cp ~/chef/vagrant/lucid64.box /tmp/monitor'`
142
+
143
+ ## API and Step contributions:
144
+ - Ideally the API methods should be covered by RSpec (I've been slack due to the backlog of pre-existing steps to port).
145
+ - Have a feature/scenario that illustrates its use, this is the psuedo specs I've been relying on. If you are not
146
+ convinced this approach is a long term disaster, review Bundler's code base circa v1.0.10.
147
+ - Refactoring an API method is discouraged before a spec fully describing the current behavior exists.
148
+
149
+ ## TODO
150
+ - General passwordless and interactive SSH steps (currently Vagrant VM specific)
151
+ - Cloud launch and basic management steps, i.e. CRUD operations for Cloud VM
152
+ - Updating packages on a VM, and repackaging the VM, essentialy CRUD too.
74
153
 
75
154
  ## Prior Art:
76
155
  - [Aruba][2] confirmed the utility of reusable steps.
77
156
  - [Auxesis' Cucumber-Nagios][4] served as launch pad, and [had this idea early on][10].
78
157
  - [Chef][5] steps are being ported.
79
158
  - [Virtualbox][6] steps are planned to be ported.
80
- - [SSH-Forever][7] serves as the API-base for passwordless SSH steps.
159
+ - [SSH-Forever][7] copied as the API-base for passwordless SSH steps.
81
160
 
82
161
  [0]: https://github.com/aslakhellesoy/cucumber
83
162
  [1]: https://github.com/hedgehog/cuken
@@ -93,3 +172,7 @@ steps to port).
93
172
  [11]: http://vagrantup.com/
94
173
  [12]: http://wiki.opscode.com/display/chef/Home
95
174
  [13]: https://github.com/cookbooks/
175
+ [14]: http://book.git-scm.com/4_rebasing.html
176
+ [15]: http://book.git-scm.com/4_interactive_rebasing.html
177
+ [16]: https://github.com/aslakhellesoy/aruba/issues/69
178
+
@@ -29,8 +29,8 @@ Feature: Cookbook Validity
29
29
  Scenario: Clone non-existant Cookbooks from a Cookbooks URI
30
30
  Given the remote Cookbooks URI "git://github.com/cookbooks/"
31
31
  When I clone the Cookbooks:
32
- | cookbook | branch | tag | ref | destination |
33
- | hfgrt | | 37s.0.1.0 | | ckbk/scratch/myapp/cookbooks/hosts3 |
32
+ | cookbook | tag | destination |
33
+ | hfgrt | 37s.0.1.0 | ckbk/scratch/myapp/cookbooks/hosts3 |
34
34
  Then the output should contain "Could not find Repository cookbooks/hfgrt"
35
35
 
36
36
  Scenario: Clone multiple Cookbooks from a Cookbooks URI
@@ -0,0 +1,205 @@
1
+ @announce
2
+ Feature: Zenoss Monitoring
3
+ In order to launch a Zenoss server
4
+ As a admin/developer
5
+ I want to define the Chef admin client configuration via executable features
6
+
7
+ Scenario: Create the Chef server Node's Vagrantfile
8
+ Given the file "Vagrantfile" contains nothing
9
+ When I write to "Vagrantfile":
10
+ """
11
+ Vagrant::Config.run do |config|
12
+
13
+ @cs_root_path = File.dirname(File.absolute_path(__FILE__))
14
+ @cs_box = "chef"
15
+ @cs_box_url = (Pathname(@cs_root_path) + 'lucid64.box').to_s
16
+ @cs_nodename = "chef"
17
+ @cs_tld = "private.org"
18
+ @cs_ip = "33.33.33.254" # Host-only networking
19
+ @cs_port = 4000
20
+ @cs_ssh_port = 2200
21
+ @cs_webui_port = 4040
22
+ @cs_kitchen = @cs_root_path
23
+ @cs_validation_client_name = "chef-validator"
24
+
25
+ config.vm.define :chef do |csc|
26
+
27
+ csc.send :eval, IO.read("#{@cs_root_path}/hobos/vm.bo")
28
+
29
+ csc.vm.box = "#{@cs_box}"
30
+ csc.vm.box_url = "#{@cs_box_url}"
31
+ csc.vm.forward_port("chefs", @cs_port, @cs_port)
32
+ csc.vm.forward_port("chefs_web", @cs_webui_port, @cs_webui_port)
33
+ csc.vm.forward_port("ssh", 22, @cs_ssh_port, :auto => true)
34
+ csc.vm.network(@cs_ip)
35
+ csc.vm.share_folder("chef", "~/chef", "#{@cs_root_path}/mnt/chef")
36
+ csc.vm.share_folder("chef-server-etc", "/etc/chef", "#{@cs_kitchen}/mnt/etc" )
37
+ csc.vm.share_folder("chef-cookbooks-0", "/tmp/vagrant-chef/cookbooks-0", "#{@cs_kitchen}/site-cookbooks")
38
+ csc.vm.share_folder("chef-cookbooks-1", "/tmp/vagrant-chef/cookbooks-1", "#{@cs_kitchen}/cookbooks")
39
+ csc.vm.provision :chef_solo do |chef|
40
+ chef.log_level = :debug # :info or :debug
41
+ chef.node_name = @cs_nodename
42
+ chef.cookbooks_path = [
43
+ File.expand_path("#{@cs_kitchen}/site-cookbooks"),
44
+ File.expand_path("#{@cs_kitchen}/cookbooks")]
45
+ chef.add_recipe("hosts::chefserver")
46
+ chef.add_recipe("apt")
47
+ chef.add_recipe("build-essential")
48
+ chef.add_recipe("chef-server::rubygems-install")
49
+ chef.json.merge!({
50
+ :chef_server=> {
51
+ :name=> @cs_nodename,
52
+ :validation_client_name=> @cs_validation_client_name,
53
+ :url_type=>"http",
54
+ :server_fqdn=> "#{@cs_nodename}.#{@cs_tld}",
55
+ :server_port=> "#{@cs_port}",
56
+ :webui_port=> "#{@cs_webui_port}",
57
+ :webui_enabled=> true,
58
+ :umask => '0644'
59
+ }
60
+ })
61
+ end
62
+ end
63
+ end
64
+ """
65
+ Then I place "Vagrantfile" in "/tmp/chef"
66
+
67
+ Scenario: Create some shared Vagrant configuration details
68
+ Given the directory "hobos"
69
+ And the file "hobos/vm.bo" contains nothing
70
+ When I write to "hobos/vm.bo":
71
+ """
72
+ vm.customize do |cvm|
73
+ cvm.memory_size = 1024
74
+ cvm.vram_size = 12
75
+ cvm.cpu_count = 2
76
+ cvm.accelerate_3d_enabled = false
77
+ cvm.accelerate_2d_video_enabled = false
78
+ cvm.monitor_count = 1
79
+
80
+ cvm.bios.acpi_enabled = true
81
+ cvm.bios.io_apic_enabled = false
82
+
83
+ cvm.cpu.pae = true
84
+
85
+ cvm.hw_virt.enabled = false
86
+ cvm.hw_virt.nested_paging = false
87
+ # STORAGE
88
+ end
89
+ """
90
+ And I place "hobos/vm.bo" in "/tmp/chef"
91
+
92
+ Scenario: Clone a Chef skeleton repository
93
+ Given the remote Chef repository "git://github.com/cookbooks/chef-repo.git"
94
+ When I clone the remote Chef repository branch "master" to "chef"
95
+ And the local Chef repository exists
96
+ Then I place all in "chef" in "/tmp/chef"
97
+
98
+ Scenario: Download Cookbooks from a Cookbooks URI
99
+ Given the remote Cookbooks URI "git://github.com/cookbooks/"
100
+ When I clone the Cookbooks:
101
+ | cookbook | branch | destination |
102
+ | apache2 | master | chef/cookbooks/apache2 |
103
+ | apt | master | chef/cookbooks/apt |
104
+ | bluepill | master | chef/cookbooks/bluepill |
105
+ | build-essential | master | chef/cookbooks/build-essential |
106
+ | chef-client | master | chef/cookbooks/chef-client |
107
+ | chef-server | master | chef/cookbooks/chef-server |
108
+ | couchdb | master | chef/cookbooks/couchdb |
109
+ | daemontools | master | chef/cookbooks/daemontools |
110
+ | erlang | master | chef/cookbooks/erlang |
111
+ | gecode | master | chef/cookbooks/gecode |
112
+ | hosts | master | chef/cookbooks/hosts |
113
+ | java | master | chef/cookbooks/java |
114
+ | openssl | master | chef/cookbooks/openssl |
115
+ | rabbitmq | master | chef/cookbooks/rabbitmq |
116
+ | runit | master | chef/cookbooks/runit |
117
+ | ucspi-tcp | master | chef/cookbooks/ucspi-tcp |
118
+ | xml | master | chef/cookbooks/xml |
119
+ | zlib | master | chef/cookbooks/zlib |
120
+ And these local Cookbooks exist:
121
+ | cookbook |
122
+ | apache2 |
123
+ | apt |
124
+ | bluepill |
125
+ | build-essential |
126
+ | chef-client |
127
+ | chef-server |
128
+ | couchdb |
129
+ | daemontools |
130
+ | erlang |
131
+ | gecode |
132
+ | hosts |
133
+ | java |
134
+ | openssl |
135
+ | rabbitmq |
136
+ | runit |
137
+ | ucspi-tcp |
138
+ | xml |
139
+ | zlib |
140
+ Then I place all in "chef" in "/tmp/chef"
141
+
142
+ Scenario: Download Site-Cookbooks from a Cookbooks URI
143
+ Given the remote Cookbooks URI "git@github.com:hedgehog/"
144
+ When I clone the Cookbooks:
145
+ | cookbook | branch | destination |
146
+ | hosts | qa | chef/site-cookbooks/hosts |
147
+ | java | qa | chef/site-cookbooks/java |
148
+ And these local Cookbooks exist:
149
+ | site-cookbook |
150
+ | hosts |
151
+ | java |
152
+ Then I place all in "chef" in "/tmp/chef"
153
+
154
+ Scenario: Configure Knife file for the Chef administrator's client certificate
155
+ Given I write to ".chef/knife.rb":
156
+ """
157
+ current_dir = File.dirname(__FILE__)
158
+ user = ENV['CHEF_USER'] || ENV['OPSCODE_USER'] || ENV['USER'] || `whoami`
159
+ org = ENV['CHEF_ORGNAME'] || 'Private'
160
+ email = ENV['CHEF_EMAIL'] || "#{user}@mailinator.com"
161
+ log_path = "#{current_dir}/../log"
162
+
163
+ current_dir = File.dirname(__FILE__)
164
+ node_name "chef-webui"
165
+ log_location "#{log_path}/client_#{node_name}.log"
166
+ log_level :debug
167
+ verbose_logging true
168
+ client_key "#{File.dirname(current_dir)}/mnt/etc/webui.pem"
169
+ chef_server_url "http://localhost:4000"
170
+ cache_type 'BasicFile'
171
+ cache_options :path => "#{log_path}/checksums"
172
+ cookbook_path ["#{current_dir}/../cookbooks","#{current_dir}/../site-cookbooks"]
173
+
174
+ """
175
+ And I place ".chef/knife.rb" in "/tmp/chef"
176
+
177
+ Scenario: Start the Chef server VM
178
+ Given the Chef root directory "/tmp/chef" exists
179
+ And the VM "chef" is not "running"
180
+ And the Vagrantfile "/tmp/chef/Vagrantfile" exists
181
+ When I launch the VM "chef"
182
+ Then the state of VM "chef" is "running"
183
+
184
+ @ssh_local
185
+ Scenario: Fix the Chef server key/certificate permissions
186
+ Given the Chef root directory "/tmp/chef" exists
187
+ And the Vagrantfile "/tmp/chef/Vagrantfile" exists
188
+ And the state of VM "chef" is "running"
189
+ When I ssh to VM "chef"
190
+ And I type "sudo chmod 0644 /etc/chef/webui.pem"
191
+ And I type "sudo chmod 0644 /etc/chef/certificates/key.pem"
192
+ And I type "stat -c %A /etc/chef/webui.pem"
193
+ And I type "stat -c %A /etc/chef/certificates/key.pem"
194
+ Then the output should contain:
195
+ """
196
+ -rw-r--r--
197
+ -rw-r--r--
198
+ """
199
+
200
+ Scenario: Create the admin client monitor
201
+ Given the Chef root directory "/tmp/chef" exists
202
+ And the state of VM "chef" is "running"
203
+ When I create the Chef admin client "monitor"
204
+ Then the placed file "/tmp/chef/.chef/monitor.pem" contains "-----END RSA PRIVATE KEY-----"
205
+