cucumber-chef 0.4.0

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 (51) hide show
  1. data/.document +5 -0
  2. data/.gitignore +45 -0
  3. data/Gemfile +21 -0
  4. data/LICENSE +201 -0
  5. data/README.md +83 -0
  6. data/Rakefile +53 -0
  7. data/VERSION +1 -0
  8. data/bin/cucumber-chef +162 -0
  9. data/cookbooks/cucumber-chef/README.rdoc +8 -0
  10. data/cookbooks/cucumber-chef/files/default/add-git-identity +2 -0
  11. data/cookbooks/cucumber-chef/files/default/controller-first-boot +1 -0
  12. data/cookbooks/cucumber-chef/files/default/cucumber-net +5 -0
  13. data/cookbooks/cucumber-chef/files/default/cucumber-private-key +27 -0
  14. data/cookbooks/cucumber-chef/files/default/cucumber-run_list +1 -0
  15. data/cookbooks/cucumber-chef/files/default/git-private-key +27 -0
  16. data/cookbooks/cucumber-chef/files/default/install-chef +1 -0
  17. data/cookbooks/cucumber-chef/files/default/lxc-controller-network-config +5 -0
  18. data/cookbooks/cucumber-chef/files/default/lxc-lucid-chef +377 -0
  19. data/cookbooks/cucumber-chef/files/default/permissive-ssh-config +3 -0
  20. data/cookbooks/cucumber-chef/metadata.rb +6 -0
  21. data/cookbooks/cucumber-chef/recipes/controller.rb +50 -0
  22. data/cookbooks/cucumber-chef/recipes/lxc.rb +35 -0
  23. data/cookbooks/cucumber-chef/recipes/test_lab.rb +23 -0
  24. data/cookbooks/cucumber-chef/recipes/testrunner.rb +46 -0
  25. data/cookbooks/cucumber-chef/roles/controller.rb +7 -0
  26. data/cookbooks/cucumber-chef/roles/test_lab_test.rb +9 -0
  27. data/cookbooks/cucumber-chef/templates/default/controller-client.erb +5 -0
  28. data/cookbooks/cucumber-chef/templates/default/lxc-lucid-chef +385 -0
  29. data/cucumber-chef.gemspec +118 -0
  30. data/features/installing.feature +10 -0
  31. data/features/steps/installing_steps.rb +34 -0
  32. data/features/steps/setup_steps.rb +32 -0
  33. data/features/steps/upload_steps.rb +11 -0
  34. data/features/steps/usage_steps.rb +62 -0
  35. data/features/support/env.rb +25 -0
  36. data/features/support/filetools.rb +9 -0
  37. data/features/support/silent_system.rb +4 -0
  38. data/features/usage.feature +26 -0
  39. data/lib/cucumber-chef.rb +1 -0
  40. data/lib/cucumber/chef.rb +195 -0
  41. data/lib/cucumber/chef/handy.rb +87 -0
  42. data/lib/cucumber/chef/templates/controller.erb +35 -0
  43. data/lib/cucumber/chef/templates/env.rb +16 -0
  44. data/lib/cucumber/chef/templates/example_feature.erb +11 -0
  45. data/lib/cucumber/chef/templates/example_step.erb +19 -0
  46. data/lib/cucumber/chef/templates/readme.erb +28 -0
  47. data/lib/cucumber/chef/templates/ubuntu10.04-gems.erb +43 -0
  48. data/lib/cucumber/chef/version.rb +5 -0
  49. data/lib/cucumber/ec2_server_create.rb +99 -0
  50. data/spec/unit/cucumber_chef_spec.rb +270 -0
  51. metadata +213 -0
@@ -0,0 +1,118 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{cucumber-chef}
8
+ s.version = "0.4.0"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Stephen Nelson-Smith"]
12
+ s.date = %q{2011-06-06}
13
+ s.default_executable = %q{cucumber-chef}
14
+ s.description = %q{Framework for behaviour-drive infrastructure development.}
15
+ s.email = %q{stephen@atalanta-systems.com}
16
+ s.executables = ["cucumber-chef"]
17
+ s.extra_rdoc_files = [
18
+ "LICENSE",
19
+ "README.md"
20
+ ]
21
+ s.files = [
22
+ ".document",
23
+ ".gitignore",
24
+ "Gemfile",
25
+ "LICENSE",
26
+ "README.md",
27
+ "Rakefile",
28
+ "VERSION",
29
+ "bin/cucumber-chef",
30
+ "cookbooks/cucumber-chef/README.rdoc",
31
+ "cookbooks/cucumber-chef/files/default/add-git-identity",
32
+ "cookbooks/cucumber-chef/files/default/controller-first-boot",
33
+ "cookbooks/cucumber-chef/files/default/cucumber-net",
34
+ "cookbooks/cucumber-chef/files/default/cucumber-private-key",
35
+ "cookbooks/cucumber-chef/files/default/cucumber-run_list",
36
+ "cookbooks/cucumber-chef/files/default/git-private-key",
37
+ "cookbooks/cucumber-chef/files/default/install-chef",
38
+ "cookbooks/cucumber-chef/files/default/lxc-controller-network-config",
39
+ "cookbooks/cucumber-chef/files/default/lxc-lucid-chef",
40
+ "cookbooks/cucumber-chef/files/default/permissive-ssh-config",
41
+ "cookbooks/cucumber-chef/metadata.rb",
42
+ "cookbooks/cucumber-chef/recipes/controller.rb",
43
+ "cookbooks/cucumber-chef/recipes/lxc.rb",
44
+ "cookbooks/cucumber-chef/recipes/test_lab.rb",
45
+ "cookbooks/cucumber-chef/recipes/testrunner.rb",
46
+ "cookbooks/cucumber-chef/roles/controller.rb",
47
+ "cookbooks/cucumber-chef/roles/test_lab_test.rb",
48
+ "cookbooks/cucumber-chef/templates/default/controller-client.erb",
49
+ "cookbooks/cucumber-chef/templates/default/lxc-lucid-chef",
50
+ "cucumber-chef.gemspec",
51
+ "features/installing.feature",
52
+ "features/steps/installing_steps.rb",
53
+ "features/steps/setup_steps.rb",
54
+ "features/steps/upload_steps.rb",
55
+ "features/steps/usage_steps.rb",
56
+ "features/support/env.rb",
57
+ "features/support/filetools.rb",
58
+ "features/support/silent_system.rb",
59
+ "features/usage.feature",
60
+ "lib/cucumber-chef.rb",
61
+ "lib/cucumber/chef.rb",
62
+ "lib/cucumber/chef/handy.rb",
63
+ "lib/cucumber/chef/templates/controller.erb",
64
+ "lib/cucumber/chef/templates/env.rb",
65
+ "lib/cucumber/chef/templates/example_feature.erb",
66
+ "lib/cucumber/chef/templates/example_step.erb",
67
+ "lib/cucumber/chef/templates/readme.erb",
68
+ "lib/cucumber/chef/templates/ubuntu10.04-gems.erb",
69
+ "lib/cucumber/chef/version.rb",
70
+ "lib/cucumber/ec2_server_create.rb",
71
+ "spec/unit/cucumber_chef_spec.rb"
72
+ ]
73
+ s.homepage = %q{http://github.com/atalanta/cucumber-chef}
74
+ s.licenses = ["MIT"]
75
+ s.require_paths = ["lib"]
76
+ s.rubygems_version = %q{1.6.2}
77
+ s.summary = %q{Tests Chef-built infrastructure}
78
+
79
+ if s.respond_to? :specification_version then
80
+ s.specification_version = 3
81
+
82
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
83
+ s.add_runtime_dependency(%q<chef>, [">= 0.10.0"])
84
+ s.add_runtime_dependency(%q<cucumber>, [">= 0"])
85
+ s.add_runtime_dependency(%q<cucumber-nagios>, [">= 0"])
86
+ s.add_runtime_dependency(%q<rspec>, [">= 0"])
87
+ s.add_runtime_dependency(%q<fog>, [">= 0"])
88
+ s.add_runtime_dependency(%q<thor>, [">= 0"])
89
+ s.add_runtime_dependency(%q<awesome_print>, [">= 0"])
90
+ s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
91
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.2"])
92
+ s.add_development_dependency(%q<rcov>, [">= 0"])
93
+ else
94
+ s.add_dependency(%q<chef>, [">= 0.10.0"])
95
+ s.add_dependency(%q<cucumber>, [">= 0"])
96
+ s.add_dependency(%q<cucumber-nagios>, [">= 0"])
97
+ s.add_dependency(%q<rspec>, [">= 0"])
98
+ s.add_dependency(%q<fog>, [">= 0"])
99
+ s.add_dependency(%q<thor>, [">= 0"])
100
+ s.add_dependency(%q<awesome_print>, [">= 0"])
101
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
102
+ s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
103
+ s.add_dependency(%q<rcov>, [">= 0"])
104
+ end
105
+ else
106
+ s.add_dependency(%q<chef>, [">= 0.10.0"])
107
+ s.add_dependency(%q<cucumber>, [">= 0"])
108
+ s.add_dependency(%q<cucumber-nagios>, [">= 0"])
109
+ s.add_dependency(%q<rspec>, [">= 0"])
110
+ s.add_dependency(%q<fog>, [">= 0"])
111
+ s.add_dependency(%q<thor>, [">= 0"])
112
+ s.add_dependency(%q<awesome_print>, [">= 0"])
113
+ s.add_dependency(%q<bundler>, ["~> 1.0.0"])
114
+ s.add_dependency(%q<jeweler>, ["~> 1.6.2"])
115
+ s.add_dependency(%q<rcov>, [">= 0"])
116
+ end
117
+ end
118
+
@@ -0,0 +1,10 @@
1
+ Feature: Installation
2
+ So that I can run cucumber-chef to test my Chef recipes
3
+ As a user
4
+ I can install the gem
5
+
6
+ Scenario: Installing the gem
7
+ When I build the gem
8
+ And I install the latest gem
9
+ Then I should have cucumber-chef on my path
10
+ And I can get help about the cucumber-chef binary on the command line
@@ -0,0 +1,34 @@
1
+ When /^I build the gem$/ do
2
+ project_root = Pathname.new(File.dirname(__FILE__)).parent.parent.expand_path
3
+ rakefile = File.join(project_root, 'Rakefile')
4
+ File.exist?(rakefile).should be_true
5
+
6
+ # For some unknown reason, the following fails with
7
+ # Don't know how to build task 'default'
8
+ # Even though running the below in irb, and rake -f Rakefile build
9
+ # works fine
10
+ #
11
+ # silent_system('rake -f #{rakefile} build').should be_true
12
+
13
+ # HACK: using no path for now
14
+
15
+ silent_system('rake build').should be_true
16
+
17
+ end
18
+
19
+ When /^I install the latest gem$/ do
20
+ project_root = Pathname.new(File.dirname(__FILE__)).parent.parent.expand_path
21
+ pkg_dir = project_root.join('pkg')
22
+ glob = File.join(pkg_dir, '*.gem')
23
+ latest = Dir.glob(glob).sort {|a, b| File.ctime(a) <=> File.ctime(b) }.last
24
+ silent_system("gem install #{latest} --no-ri --no-rdoc").should be_true
25
+ end
26
+
27
+ Then /^I should have cucumber\-chef on my path$/ do
28
+ silent_system("which cucumber-chef").should be_true
29
+ end
30
+
31
+ Then /^I can get help about the cucumber\-chef binary on the command line$/ do
32
+ help_text = %x[cucumber-chef help]
33
+ help_text.include?("cucumber-chef help [TASK]").should be_true
34
+ end
@@ -0,0 +1,32 @@
1
+ require 'rubygems'
2
+ require 'fog'
3
+
4
+ Given /^I have an Opscode Platform account$/ do
5
+ silent_system("cucumber-chef genconfig")
6
+ file_should_exist( "~/.cucumber-chef-sample" )
7
+ config = YAML::load( File.open( File.expand_path('~/.cucumber-chef-sample') ) )
8
+ username = config['chef_node_name']
9
+ req = Net::HTTP.new('community.opscode.com', 80)
10
+ req.request_head("/users/#{username}").code.should == "200"
11
+ end
12
+
13
+ Given /^an EC2 account$/ do
14
+ config = YAML::load( File.open( File.expand_path('~/.cucumber-chef-sample') ) )
15
+ access_key = config["aws_access_key"]
16
+ secret_key = config["aws_secret_key"]
17
+ compute = Fog::Compute.new(:provider => 'AWS', :aws_access_key_id => access_key, :aws_secret_access_key => secret_key)
18
+ compute.describe_availability_zones.should_not be_nil
19
+ end
20
+
21
+ Given /^I have chef installed on my machine$/ do
22
+ silent_system("which chef-client").should be_true
23
+ end
24
+
25
+ When /^I run cucumber\-chef setup$/ do
26
+ @output = %x[cucumber-chef setup --config=#{File.expand_path('~/.cucumber-chef-sample')}]
27
+ end
28
+
29
+ Then /^I should be told the instance id and IP address$/ do
30
+ @output.should match(/i-[0-9a-f]{8}/)
31
+ @instance_ip_address = @output[/IP Address ([\d|\.]+)/, 1]
32
+ end
@@ -0,0 +1,11 @@
1
+ Given /^I have a cucumber\-chef project$/ do
2
+ pending # express the regexp above with the code you wish you had
3
+ end
4
+
5
+ When /^I run cucumber\-chef upload$/ do
6
+ pending # express the regexp above with the code you wish you had
7
+ end
8
+
9
+ Then /^my tests should be available on the test lab$/ do
10
+ pending # express the regexp above with the code you wish you had
11
+ end
@@ -0,0 +1,62 @@
1
+ Given /^that cucumber\-chef is installed$/ do
2
+ When 'I build the gem'
3
+ And 'I install the latest gem'
4
+ Then 'I should have cucumber-chef on my path'
5
+ end
6
+
7
+ When /^I display the config$/ do
8
+ @output = %x[cucumber-chef displayconfig 2>&1]
9
+ end
10
+
11
+ Then /^I should see config settings from knife\.rb$/ do
12
+ @output.should match /^chef_server_url: https:\/\/api.opscode.com\/organization/im
13
+ end
14
+
15
+ When /^I run a cucumber\-chef subcommand requiring Opscode and AWS credentials$/ do
16
+ @output = %x[cucumber-chef setup 2>&1]
17
+ end
18
+
19
+ When /^the config file contains invalid credentials$/ do
20
+ # see support/env.rb Around block
21
+ true
22
+ end
23
+
24
+ Then /^I should be alerted that my credentials are invalid$/ do
25
+ @output.should == "Invalid Opscode platform credentials. Please check.\n"
26
+ end
27
+
28
+ When /^I create a project called test_project$/ do
29
+ @project_name = "test_project"
30
+ project = "/tmp/cucumber-chef/#{@project_name}"
31
+ if File.exist?(project)
32
+ FileUtils.rm_rf(project)
33
+ end
34
+ silent_system("cd /tmp ; cucumber-chef project #{@project_name}").should be_true
35
+ end
36
+
37
+ project_dir = '/tmp/cucumber-chef/test_project'
38
+ features_dir = "#{project_dir}/features"
39
+
40
+ Then /^a new directory will be created named test_project$/ do
41
+ file_should_exist(project_dir)
42
+ end
43
+
44
+ Then /^it will contain directories for features, step_definitions, and support$/ do
45
+ %w[support step_definitions].each { |dir| file_should_exist("#{features_dir}/#{dir}") }
46
+ end
47
+
48
+ Then /^the support directory will contain essential libraries and helper imports$/ do
49
+ file_should_exist( "#{features_dir}/support/env.rb" )
50
+ file_should_contain( "#{features_dir}/support/env.rb",
51
+ "require 'cucumber/chef'\n" )
52
+ end
53
+
54
+ Then /^examples and documentation will be included$/ do
55
+ file_should_contain("#{project_dir}/README",
56
+ 'Welcome to the test_project suite of cucumber-chef tests')
57
+ file_should_contain("#{features_dir}/example.feature",
58
+ 'Feature: Example feature for test_project')
59
+ file_should_contain("#{features_dir}/step_definitions/example_step.rb",
60
+ 'Given /^I apply the test_project role\/recipe$/ do')
61
+ end
62
+
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $: << File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
4
+ $: << File.expand_path(File.dirname(__FILE__))
5
+
6
+ require 'rspec/expectations'
7
+ require 'chef'
8
+ require 'cucumber/chef'
9
+ require 'cucumber/nagios/steps'
10
+
11
+ class CustomWorld
12
+ include Cucumber::Chef
13
+ end
14
+
15
+ World do
16
+ CustomWorld.new
17
+ end
18
+
19
+ Around('@invalid_credentials') do |scenario, block|
20
+ FileUtils.mkdir_p(".chef")
21
+ config = "chef_node_name 'REALLYBOGUSORGNAME'"
22
+ File.open(".chef/knife.rb", 'w') { |f| f.puts config }
23
+ block.call
24
+ FileUtils.rm_rf(".chef")
25
+ end
@@ -0,0 +1,9 @@
1
+ def file_should_exist(file)
2
+ File.exists?(File.expand_path(file)).should be_true
3
+ end
4
+
5
+ def file_should_contain(file, pattern)
6
+ lines = File.foreach(File.expand_path(file)).map { |line| line.chomp }
7
+ lines.find_index(pattern.chomp).should_not be_nil
8
+ end
9
+
@@ -0,0 +1,4 @@
1
+ def silent_system(cmd)
2
+ silent_cmd = cmd + " 2>&1 > /dev/null"
3
+ system(silent_cmd)
4
+ end
@@ -0,0 +1,26 @@
1
+ Feature: Usage of cucumber-chef command line tool
2
+ So that I can make use of cucumber-chef functionality
3
+ As a user
4
+ I can do really vague shit
5
+
6
+ Scenario: Show config
7
+ Given that cucumber-chef is installed
8
+ When I display the config
9
+ Then I should see config settings from knife.rb
10
+
11
+ @invalid_credentials
12
+ Scenario: Warn on bad credentials
13
+ Given that cucumber-chef is installed
14
+ But the config file contains invalid credentials
15
+ When I run a cucumber-chef subcommand requiring Opscode and AWS credentials
16
+ Then I should be alerted that my credentials are invalid
17
+
18
+ Scenario: Create a project
19
+ Given that cucumber-chef is installed
20
+ When I create a project called test_project
21
+ Then a new directory will be created named test_project
22
+ And it will contain directories for features, step_definitions, and support
23
+ And the support directory will contain essential libraries and helper imports
24
+ And examples and documentation will be included
25
+
26
+
@@ -0,0 +1 @@
1
+ require 'cucumber/chef' # compat
@@ -0,0 +1,195 @@
1
+ require "chef"
2
+ require "chef/cookbook_uploader"
3
+ require 'chef/knife'
4
+ require 'chef/knife/bootstrap'
5
+ require 'chef/knife/core/bootstrap_context'
6
+ require 'chef/knife/ssh'
7
+ require 'socket'
8
+ require 'net/ssh/multi'
9
+ require "fog"
10
+ require 'readline'
11
+ require 'stringio'
12
+
13
+ module Cucumber
14
+ module Chef
15
+ class Error < StandardError ; end
16
+
17
+ class ConfigError < Error ; end
18
+ class Config
19
+ KEYS = %w[node_name chef_server_url client_key validation_key validation_client_name]
20
+ KNIFE_KEYS = %w[aws_access_key_id aws_secret_access_key region availability_zone aws_ssh_key_id identity_file]
21
+
22
+ def config
23
+ full_path = Dir.pwd.split(File::SEPARATOR)
24
+ (full_path.length - 1).downto(0) do |i|
25
+ knife_file = File.join(full_path[0..i] + [".chef", "knife.rb"])
26
+ if File.exist?(knife_file)
27
+ ::Chef::Config.from_file(knife_file)
28
+ return ::Chef::Config
29
+ end
30
+ end
31
+ raise ConfigError.new("Couldn't find knife.rb")
32
+ end
33
+
34
+ def display
35
+ current_config = config
36
+ values, missing_keys = [], []
37
+ KEYS.each do |key|
38
+ value = current_config[key]
39
+ if value && value != ""
40
+ values << "#{key}: #{value}"
41
+ else
42
+ missing_keys << key
43
+ end
44
+ end
45
+ KNIFE_KEYS.each do |key|
46
+ if value = current_config[:knife][key.to_sym]
47
+ values << "knife[:#{key}]: #{value}"
48
+ else
49
+ missing_keys << "knife[:#{key}]"
50
+ end
51
+ end
52
+ [values, missing_keys]
53
+ end
54
+ end
55
+
56
+ class ProvisionerError < Error ; end
57
+ class Provisioner
58
+ def initialize
59
+ @cookbook_path = File.join(File.dirname(__FILE__), "../../cookbooks/cucumber-chef")
60
+ end
61
+
62
+ def config
63
+ Config.new.config
64
+ end
65
+
66
+ def running_labs(connection, mode)
67
+ connection.servers.select {|s| s.tags['cucumber-chef'] == mode && s.state == 'running'}
68
+ end
69
+
70
+ def lab_exists?(connection, mode)
71
+ number_of_labs = running_labs(connection, mode).size
72
+ if number_of_labs > 0
73
+ return true
74
+ else
75
+ return false
76
+ end
77
+ end
78
+
79
+ def tag_server(connection, id, tag)
80
+ t = connection.tags.new
81
+ t.resource_id = id
82
+ t.key = "cucumber-chef"
83
+ t.value = tag
84
+ t.save
85
+ end
86
+
87
+ def bootstrap_node(dns_name, config)
88
+ template_file = File.join(File.dirname(__FILE__),
89
+ "chef/templates/ubuntu10.04-gems.erb")
90
+ bootstrap = ::Chef::Knife::Bootstrap.new
91
+ @stdout, @stderr, @stdout = StringIO.new, StringIO.new, StringIO.new
92
+ ui = ::Chef::Knife::UI.new(@stdout, @stderr, @stdout, bootstrap.config)
93
+ bootstrap.ui = ui
94
+ bootstrap.name_args = [dns_name]
95
+ bootstrap.config[:run_list] = "role[test_lab_test]"
96
+ bootstrap.config[:ssh_user] = "ubuntu"
97
+ bootstrap.config[:identity_file] = config[:knife][:identity_file]
98
+ bootstrap.config[:chef_node_name] = "cucumber-chef-test-lab"
99
+ bootstrap.config[:use_sudo] = true
100
+ bootstrap.config[:template_file] = template_file
101
+ bootstrap.config[:validation_client_name] = config["validation_client_name"]
102
+ bootstrap.config[:validation_key] = config["validation_key"]
103
+ bootstrap.config[:chef_server_url] = config["chef_server_url"]
104
+ bootstrap
105
+ end
106
+
107
+ def build_controller(dns_name, config)
108
+ template_file = File.join(File.dirname(__FILE__),
109
+ "chef/templates/controller.erb")
110
+ bootstrap = ::Chef::Knife::Bootstrap.new
111
+ @stdout, @stderr, @stdout = StringIO.new, StringIO.new, StringIO.new
112
+ ui = ::Chef::Knife::UI.new(@stdout, @stderr, @stdout, bootstrap.config)
113
+ bootstrap.ui = ui
114
+ bootstrap.name_args = [dns_name]
115
+ bootstrap.config[:ssh_user] = "ubuntu"
116
+ bootstrap.config[:identity_file] = config[:knife][:identity_file]
117
+ bootstrap.config[:chef_node_name] = "cucumber-chef-controller"
118
+ bootstrap.config[:use_sudo] = true
119
+ bootstrap.config[:template_file] = template_file
120
+ bootstrap.config[:validation_client_name] = config["validation_client_name"]
121
+ bootstrap.config[:validation_key] = config["validation_key"]
122
+ bootstrap.config[:chef_server_url] = config["chef_server_url"]
123
+ bootstrap
124
+ end
125
+
126
+ def verify_opscode_platform_credentials(config)
127
+ username = config['node_name']
128
+ if username
129
+ req = Net::HTTP.new('community.opscode.com', 80)
130
+ code = req.request_head("/users/#{username}").code
131
+ end
132
+ if username == "" || code != "200"
133
+ raise ProvisionerError.new("Invalid Opscode platform credentials. Please check.")
134
+ end
135
+ end
136
+
137
+ def verify_aws_credentials(config)
138
+ compute = Fog::Compute.new(:provider => 'AWS',
139
+ :aws_access_key_id => config[:knife][:aws_access_key_id],
140
+ :aws_secret_access_key => config[:knife][:aws_secret_access_key])
141
+ compute.describe_availability_zones
142
+ rescue Fog::Service::Error => err
143
+ raise ProvisionerError.new("Invalid AWS credentials. Please check.")
144
+ end
145
+
146
+ def upload_cookbook(config)
147
+ version_loader = ::Chef::Cookbook::CookbookVersionLoader.new(@cookbook_path)
148
+ version_loader.load_cookbooks
149
+ uploader = ::Chef::CookbookUploader.new(version_loader.cookbook_version,
150
+ @cookbook_path)
151
+ uploader.upload_cookbook
152
+ end
153
+
154
+ def upload_role(config)
155
+ role_path = File.join(@cookbook_path, "roles")
156
+ ::Chef::Config[:role_path] = role_path
157
+ role = ::Chef::Role.from_disk("test_lab_test")
158
+ role.save
159
+ role = ::Chef::Role.from_disk("controller")
160
+ role.save
161
+ end
162
+
163
+ def build_test_lab(config, output)
164
+ connection = Fog::Compute.new(:provider => 'AWS',
165
+ :aws_access_key_id => config[:knife][:aws_access_key_id],
166
+ :aws_secret_access_key => config[:knife][:aws_secret_access_key],
167
+ :region => config[:knife][:region])
168
+ mode = config["mode"]
169
+ if lab_exists?(connection, mode)
170
+ raise ProvisionerError.new("A test lab already exists using the AWS credentials you supplied")
171
+ end
172
+ ami = connection.images.get("ami-339ca947")
173
+ server_def = { :image_id => "ami-339ca947", :groups => "default", :flavor_id => "m1.small", :key_name => config[:knife][:aws_ssh_key_id], :availability_zone => config[:knife][:availability_zone], :tags => {"purpose" => "cucumber-chef"}, :identity_file => config[:knife][:identity_file] }
174
+ server = connection.servers.create(server_def)
175
+ output.puts "Provisioning cucumber-chef test lab platform."
176
+ output.print "Waiting for server"
177
+ server.wait_for { output.print "."; ready? }
178
+ output.puts("\n")
179
+ tag_server(connection, server.id, config["mode"])
180
+ output.puts "Instance ID: #{server.id} ; IP Address #{server.public_ip_address}"
181
+ output.puts "Platform provisioned. Run cucumber-chef project to get started."
182
+ server
183
+ end
184
+ end
185
+ end
186
+ end
187
+
188
+ begin
189
+ require 'cucumber/chef/version'
190
+ rescue LoadError => e
191
+ dep = e.message.split.last
192
+ puts "You don't appear to have #{dep} installed."
193
+ puts "Perhaps run `gem bundle` or `gem install #{dep}`?"
194
+ exit 2
195
+ end