berkshelf 0.6.0.beta2 → 0.6.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. data/.gitignore +1 -2
  2. data/.travis.yml +7 -0
  3. data/Gemfile +1 -1
  4. data/README.md +1 -0
  5. data/Thorfile +7 -0
  6. data/berkshelf.gemspec +4 -1
  7. data/features/config.feature +97 -0
  8. data/features/config_command.feature +10 -0
  9. data/features/cookbook_command.feature +12 -12
  10. data/features/default_locations.feature +5 -0
  11. data/features/install.feature +16 -0
  12. data/features/json_formatter.feature +1 -1
  13. data/features/step_definitions/cli_steps.rb +5 -1
  14. data/features/step_definitions/filesystem_steps.rb +45 -23
  15. data/features/upload_command.feature +4 -4
  16. data/generator_files/Gemfile.erb +2 -2
  17. data/generator_files/Vagrantfile.erb +34 -13
  18. data/generator_files/config.json +22 -0
  19. data/lib/berkshelf/cli.rb +24 -9
  20. data/lib/berkshelf/config.rb +51 -0
  21. data/lib/berkshelf/config_generator.rb +8 -0
  22. data/lib/berkshelf/config_validator.rb +78 -0
  23. data/lib/berkshelf/cookbook_generator.rb +2 -2
  24. data/lib/berkshelf/core_ext/file_utils.rb +36 -0
  25. data/lib/berkshelf/downloader.rb +41 -14
  26. data/lib/berkshelf/errors.rb +20 -0
  27. data/lib/berkshelf/formatters/human_readable.rb +7 -0
  28. data/lib/berkshelf/git.rb +13 -3
  29. data/lib/berkshelf/init_generator.rb +17 -4
  30. data/lib/berkshelf/locations/chef_api_location.rb +1 -1
  31. data/lib/berkshelf/locations/git_location.rb +1 -1
  32. data/lib/berkshelf/locations/site_location.rb +1 -1
  33. data/lib/berkshelf/version.rb +1 -1
  34. data/lib/berkshelf.rb +17 -10
  35. data/spec/support/knife.rb +1 -1
  36. data/spec/support/matchers/file_system_matchers.rb +16 -1
  37. data/spec/unit/berkshelf/config_spec.rb +91 -0
  38. data/spec/unit/berkshelf/config_validator_spec.rb +68 -0
  39. data/spec/unit/berkshelf/cookbook_source_spec.rb +4 -4
  40. data/spec/unit/berkshelf/core_ext/file_utils_spec.rb +23 -0
  41. data/spec/unit/berkshelf/init_generator_spec.rb +34 -32
  42. data/spec/unit/berkshelf/locations/chef_api_location_spec.rb +1 -1
  43. data/spec/unit/berkshelf/lockfile_spec.rb +2 -2
  44. data/spec/unit/berkshelf/resolver_spec.rb +1 -1
  45. data/spec/unit/berkshelf/uploader_spec.rb +1 -1
  46. metadata +68 -5
  47. data/lib/vagrant_init.rb +0 -2
data/.gitignore CHANGED
@@ -16,8 +16,7 @@ tmp
16
16
  \#*
17
17
  .DS_Store
18
18
  /spec/knife.rb
19
- /spec/validator.pem
20
- /spec/berkshelf.pem
19
+ /spec/*.pem
21
20
  /spec/fixtures/vcr_cassettes
22
21
  /features/config.yml
23
22
  *.sw[op]
data/.travis.yml ADDED
@@ -0,0 +1,7 @@
1
+ rvm:
2
+ - 1.9.2
3
+ - 1.9.3
4
+ matrix:
5
+ allow_failures:
6
+ - rvm: 1.9.2
7
+ script: 'bundle exec thor ci'
data/Gemfile CHANGED
@@ -1,3 +1,3 @@
1
- source "https://rubygems.org"
1
+ source :rubygems
2
2
 
3
3
  gemspec
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  # Berkshelf
2
+ [![Build Status](https://travis-ci.org/RiotGames/berkshelf.png)](https://travis-ci.org/RiotGames/berkshelf)
2
3
  [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/RiotGames/berkshelf)
3
4
 
4
5
  Manage a Cookbook or an Application's Cookbook dependencies
data/Thorfile CHANGED
@@ -36,6 +36,13 @@ class Default < Thor
36
36
  exec "cucumber --color --format progress --tags ~@no_run"
37
37
  end
38
38
 
39
+ desc "ci", "Run all test suites"
40
+ def ci
41
+ ENV['CI'] = 'true' # Travis-CI also sets this, but set it here for local testing
42
+ exec "rspec --tag ~chef_server --tag ~focus spec &&
43
+ cucumber --format progress --tags ~@chef_server"
44
+ end
45
+
39
46
  class VCR < Thor
40
47
  namespace :vcr
41
48
 
data/berkshelf.gemspec CHANGED
@@ -16,14 +16,17 @@ Gem::Specification.new do |s|
16
16
  s.version = Berkshelf::VERSION
17
17
  s.required_ruby_version = ">= 1.9.1"
18
18
 
19
+ s.add_runtime_dependency 'chozo', '>= 0.1.0'
19
20
  s.add_runtime_dependency 'ridley', '>= 0.0.5'
20
- s.add_runtime_dependency 'solve', '>= 0.3.0'
21
+ s.add_runtime_dependency 'solve', '>= 0.4.0.rc1'
21
22
  s.add_runtime_dependency 'chef', '~> 10.12'
22
23
  s.add_runtime_dependency 'minitar'
23
24
  s.add_runtime_dependency 'thor', '~> 0.16.0'
24
25
  s.add_runtime_dependency 'vagrant', '~> 1.0.5'
25
26
  s.add_runtime_dependency 'activesupport'
26
27
  s.add_runtime_dependency 'multi_json'
28
+ s.add_runtime_dependency 'hashie'
29
+ s.add_runtime_dependency 'activemodel'
27
30
 
28
31
  s.add_development_dependency 'redcarpet'
29
32
  s.add_development_dependency 'cucumber'
@@ -0,0 +1,97 @@
1
+ Feature: cookbook creation with a config file
2
+ As a Cookbook author
3
+ I want to quickly generate a cookbook with my own customizations
4
+ So that I don't have to spend time modifying the default generated output each time
5
+
6
+ Scenario: creating a new cookbook when no Berkshelf config exists
7
+ Given I do not have a Berkshelf config file
8
+ When I run the cookbook command to create "sparkle_motion"
9
+ Then the resulting "sparkle_motion" Vagrantfile should contain:
10
+ | config.vm.host_name = "sparkle_motion-berkshelf" |
11
+ | config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal" |
12
+ | config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box" |
13
+ And the exit status should be 0
14
+
15
+ Scenario: creating a new cookbook using a Berkshelf config
16
+ Given I have a Berkshelf config file containing:
17
+ """
18
+ {
19
+ "vagrant": {
20
+ "vm": {
21
+ "box": "my_box",
22
+ "box_url": "http://files.vagrantup.com/lucid64.box",
23
+ "forward_port": {
24
+ "12345": "54321"
25
+ },
26
+ "host_name": "my_host",
27
+ "network": {
28
+ "bridged": true,
29
+ "hostonly": "12.34.56.78"
30
+ }
31
+ }
32
+ }
33
+ }
34
+ """
35
+ When I run the cookbook command to create "sparkle_motion"
36
+ Then the resulting "sparkle_motion" Vagrantfile should contain:
37
+ | config.vm.box = "my_box" |
38
+ | config.vm.box_url = "http://files.vagrantup.com/lucid64.box" |
39
+ | config.vm.forward_port 12345, 54321 |
40
+ | config.vm.host_name = "my_host" |
41
+ | config.vm.network :hostonly, "12.34.56.78" |
42
+ | config.vm.network :bridged |
43
+ And the exit status should be 0
44
+
45
+ Scenario: creating a new cookbook using a partial Berkshelf config
46
+ Given I have a Berkshelf config file containing:
47
+ """
48
+ {
49
+ "vagrant": {
50
+ "vm": {
51
+ "forward_port": {
52
+ "12345": "54321"
53
+ }
54
+ }
55
+ }
56
+ }
57
+ """
58
+ When I run the cookbook command to create "sparkle_motion"
59
+ Then the resulting "sparkle_motion" Vagrantfile should contain:
60
+ | config.vm.forward_port 12345, 54321 |
61
+ And the exit status should be 0
62
+
63
+ Scenario: creating a new cookbook using an invalid Berkshelf config
64
+ Given I have a Berkshelf config file containing:
65
+ """
66
+ {
67
+ "wat": null
68
+ }
69
+ """
70
+ When I run the cookbook command to create "sparkle_motion"
71
+ Then the output should contain "Invalid configuration"
72
+ And the output should contain "wat is not a valid key"
73
+ And the CLI should exit with the status code for error "InvalidConfiguration"
74
+
75
+ Scenario: creating a new cookbook with a chef client config
76
+ Given I have a Berkshelf config file containing:
77
+ """
78
+ {
79
+ "vagrant": {
80
+ "chef": {
81
+ "chef_server_url": "localhost:4000",
82
+ "validation_client_name": "my_client-validator",
83
+ "validation_key_path": "/a/b/c/my_client-validator.pem"
84
+ },
85
+ "vm": {
86
+ "provision": "chef_client"
87
+ }
88
+ }
89
+ }
90
+ """
91
+ When I run the cookbook command to create "sparkle_motion"
92
+ Then the resulting "sparkle_motion" Vagrantfile should contain:
93
+ | config.vm.provision :chef_client |
94
+ | chef.chef_server_url = "localhost:4000" |
95
+ | chef.validation_client_name = "my_client-validator" |
96
+ | chef.validation_key_path = "/a/b/c/my_client-validator.pem" |
97
+ Then the exit status should be 0
@@ -0,0 +1,10 @@
1
+ Feature: config command
2
+ As a Cookbook author
3
+ I want to quickly generate a Berkshelf config
4
+ So I can easily tell which options are available to me
5
+
6
+ Scenario: creating a new config
7
+ Given I do not have a Berkshelf config file
8
+ When I run the config command
9
+ Then I should have a Berkshelf config file
10
+ And the exit status should be 0
@@ -8,18 +8,6 @@ Feature: cookbook command
8
8
  Then I should have a new cookbook skeleton "sparkle_motion"
9
9
  And the exit status should be 0
10
10
 
11
- Scenario: creating a new cookbook skeleton with Vagrant support
12
- When I run the cookbook command to create "sparkle_motion" with options:
13
- | --vagrant |
14
- Then I should have a new cookbook skeleton "sparkle_motion" with Vagrant support
15
- And the exit status should be 0
16
-
17
- Scenario: creating a new cookbook skeleton with Git support
18
- When I run the cookbook command to create "sparkle_motion" with options:
19
- | --git |
20
- Then I should have a new cookbook skeleton "sparkle_motion" with Git support
21
- And the exit status should be 0
22
-
23
11
  Scenario: creating a new cookbook skeleton with Foodcritic support
24
12
  When I run the cookbook command to create "sparkle_motion" with options:
25
13
  | --foodcritic |
@@ -37,3 +25,15 @@ Feature: cookbook command
37
25
  | --no-bundler |
38
26
  Then I should have a new cookbook skeleton "sparkle_motion" without Bundler support
39
27
  And the exit status should be 0
28
+
29
+ Scenario: creating a new cookbook skeleton without Git support
30
+ When I run the cookbook command to create "sparkle_motion" with options:
31
+ | --skip-git |
32
+ Then I should have a new cookbook skeleton "sparkle_motion" without Git support
33
+ And the exit status should be 0
34
+
35
+ Scenario: creating a new cookbook skeleton without Vagrant support
36
+ When I run the cookbook command to create "sparkle_motion" with options:
37
+ | --skip-vagrant |
38
+ Then I should have a new cookbook skeleton "sparkle_motion" without Vagrant support
39
+ And the exit status should be 0
@@ -4,6 +4,7 @@ Feature: Berksfile default locations
4
4
  So I can set the precedence of where cookbook sources are downloaded from or define an alternate location for all
5
5
  cookbook sources to attempt to retrieve from
6
6
 
7
+ @chef_server
7
8
  Scenario: with a default chef_api(1) and site(2) location with a cookbook source that is satisfied by the chef_api(1) location
8
9
  Given I write to "Berksfile" with:
9
10
  """
@@ -23,6 +24,7 @@ Feature: Berksfile default locations
23
24
  | artifact | 0.10.0 |
24
25
  And the exit status should be 0
25
26
 
27
+ @chef_server
26
28
  Scenario: with a default chef_api(1) and site(2) location with a cookbook source that is not satisfied by the chef_api(1) location
27
29
  Given I write to "Berksfile" with:
28
30
  """
@@ -42,6 +44,7 @@ Feature: Berksfile default locations
42
44
  | artifact | 0.10.0 |
43
45
  And the exit status should be 0
44
46
 
47
+ @chef_server
45
48
  Scenario: with a default site(1) and chef_api(2) location with a cookbook source that is satisfied by the site(1) location
46
49
  Given I write to "Berksfile" with:
47
50
  """
@@ -61,6 +64,7 @@ Feature: Berksfile default locations
61
64
  | artifact | 0.10.0 |
62
65
  And the exit status should be 0
63
66
 
67
+ @chef_server
64
68
  Scenario: with a default chef_api(1) location and a cookbook source that is satisfied by the chef_api(1) location but has an explicit location set
65
69
  Given I write to "Berksfile" with:
66
70
  """
@@ -79,6 +83,7 @@ Feature: Berksfile default locations
79
83
  | artifact | 0.10.0 |
80
84
  And the exit status should be 0
81
85
 
86
+ @chef_server
82
87
  Scenario: with a defualt chef_api(1) location and a cookbook source that is not satisfied by it
83
88
  Given I write to "Berksfile" with:
84
89
  """
@@ -194,6 +194,7 @@ Feature: install cookbooks from a Berksfile
194
194
  """
195
195
  And the CLI should exit with the status code for error "InternalError"
196
196
 
197
+ @chef_server
197
198
  Scenario: with a cookbook definition containing a chef_api source location
198
199
  Given I write to "Berksfile" with:
199
200
  """
@@ -258,3 +259,18 @@ Feature: install cookbooks from a Berksfile
258
259
  Source 'artifact' is a 'chef_api' location with a URL for it's value but is missing options: 'node_name', 'client_key'.
259
260
  """
260
261
  And the CLI should exit with the status code for error "InvalidChefAPILocation"
262
+
263
+ Scenario: with a git error during download
264
+ Given I write to "Berksfile" with:
265
+ """
266
+ cookbook "ohai"
267
+ cookbook "doesntexist", git: "git://github.com/asdjhfkljashflkjashfakljsf"
268
+ """
269
+ When I run the install command
270
+ Then the output should contain:
271
+ """
272
+ Installing ohai (1.1.2) from site: 'http://cookbooks.opscode.com/api/v1/cookbooks'
273
+ Failed to download doesntexist from git: 'git://github.com/asdjhfkljashflkjashfakljsf'
274
+ An error occured during Git execution:
275
+ """
276
+ And the CLI should exit with the status code for error "GitError"
@@ -29,7 +29,7 @@ Feature: --format json
29
29
  And the JSON at "cookbooks/0/version" should be "1.2.4"
30
30
  And the JSON should not have "cookbooks/0/location"
31
31
 
32
- @slow_process
32
+ @chef_server
33
33
  Scenario: JSON output when running the upload command
34
34
  Given a Berksfile with path location sources to fixtures:
35
35
  | example_cookbook | example_cookbook-0.5.0 |
@@ -59,13 +59,17 @@ When /^I run the upload command with flags:$/ do |flags|
59
59
  end
60
60
 
61
61
  When /^I run the cookbook command to create "(.*?)"$/ do |name|
62
- run_simple(unescape("berks cookbook #{name}"))
62
+ run_simple(unescape("berks cookbook #{name}"), false)
63
63
  end
64
64
 
65
65
  When /^I run the cookbook command to create "(.*?)" with options:$/ do |name, options|
66
66
  run_simple(unescape("berks cookbook #{name} #{options.raw.join(" ")}"))
67
67
  end
68
68
 
69
+ When /^I run the config command$/ do
70
+ run_simple unescape("berks config")
71
+ end
72
+
69
73
  Then /^the CLI should exit with the status code for error "(.*?)"$/ do |error_constant|
70
74
  exit_status = Berkshelf.const_get(error_constant).status_code
71
75
  assert_exit_status(exit_status)
@@ -18,6 +18,16 @@ Given /^I do not have a Berksfile\.lock$/ do
18
18
  in_current_dir { FileUtils.rm_f(Berkshelf::Lockfile::DEFAULT_FILENAME) }
19
19
  end
20
20
 
21
+ Given /^I have a Berkshelf config file containing:$/ do |contents|
22
+ write_file File.expand_path("~/.berkshelf/config.json"), contents
23
+ end
24
+
25
+ Given /^I do not have a Berkshelf config file$/ do
26
+ file = File.expand_path "~/.berkshelf/config.json"
27
+
28
+ remove_file file if File.exists? file
29
+ end
30
+
21
31
  Given /^the cookbook "(.*?)" has the file "(.*?)" with:$/ do |cookbook_name, file_name, content|
22
32
  write_file(File.join(cookbook_name, file_name), content)
23
33
  end
@@ -85,27 +95,17 @@ Then /^I should have a new cookbook skeleton "(.*?)"$/ do |name|
85
95
  directory "templates" do
86
96
  directory "default"
87
97
  end
88
- file "README.md"
89
- file "metadata.rb"
98
+ file ".gitignore"
99
+ file "chefignore"
90
100
  file "Berksfile" do
91
101
  contains "metadata"
92
102
  end
93
- file "chefignore"
94
- file "Berksfile"
95
103
  file "Gemfile" do
96
104
  contains "gem 'berkshelf'"
97
- end
98
- }
99
- end
100
-
101
- Then /^I should have a new cookbook skeleton "(.*?)" with Vagrant support$/ do |name|
102
- steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
103
-
104
- cb_path = Pathname.new(current_dir).join(name)
105
- cb_path.should have_structure {
106
- file "Gemfile" do
107
105
  contains "gem 'vagrant'"
108
106
  end
107
+ file "metadata.rb"
108
+ file "README.md"
109
109
  file "Vagrantfile" do
110
110
  contains "require 'berkshelf/vagrant'"
111
111
  contains "recipe[#{name}::default]"
@@ -113,15 +113,6 @@ Then /^I should have a new cookbook skeleton "(.*?)" with Vagrant support$/ do |
113
113
  }
114
114
  end
115
115
 
116
- Then /^I should have a new cookbook skeleton "(.*?)" with Git support$/ do |name|
117
- steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
118
-
119
- cb_path = Pathname.new(current_dir).join(name)
120
- cb_path.should have_structure {
121
- file ".gitignore"
122
- }
123
- end
124
-
125
116
  Then /^I should have a new cookbook skeleton "(.*?)" with Foodcritic support$/ do |name|
126
117
  steps %Q{ Then I should have a new cookbook skeleton "#{name}" }
127
118
 
@@ -178,6 +169,21 @@ Then /^I should have a new cookbook skeleton "(.*?)" without Bundler support$/ d
178
169
  }
179
170
  end
180
171
 
172
+ Then /^I should have a new cookbook skeleton "(.*?)" without Git support$/ do |name|
173
+ Pathname.new(current_dir).join(name).should have_structure {
174
+ no_file ".gitignore"
175
+ }
176
+ end
177
+
178
+ Then /^I should have a new cookbook skeleton "(.*?)" without Vagrant support$/ do |name|
179
+ Pathname.new(current_dir).join(name).should have_structure {
180
+ file "Gemfile" do
181
+ does_not_contain "gem 'vagrant'"
182
+ end
183
+ no_file "Vagrantfile"
184
+ }
185
+ end
186
+
181
187
  Then /^the cookbook "(.*?)" should have the following files:$/ do |name, files|
182
188
  check_file_presence(files.raw.map{|file_row| File.join(name, file_row[0])}, true)
183
189
  end
@@ -195,6 +201,16 @@ Then /^the file "(.*?)" in the cookbook "(.*?)" should contain:$/ do |file_name,
195
201
  }
196
202
  end
197
203
 
204
+ Then /^the resulting "(.+)" Vagrantfile should contain:$/ do |cookbook_name, content|
205
+ Pathname.new(current_dir).join(cookbook_name).should have_structure {
206
+ file "Vagrantfile" do
207
+ content.respond_to?(:raw) ?
208
+ content.raw.flatten.each { |string| contains string } :
209
+ contains(content)
210
+ end
211
+ }
212
+ end
213
+
198
214
  Then /^the directory "(.*?)" should have the following files:$/ do |name, files|
199
215
  check_file_presence(files.raw.map{|file_row| File.join(name, file_row[0])}, true)
200
216
  end
@@ -218,3 +234,9 @@ end
218
234
  Then /^the current directory should not have the following files:$/ do |files|
219
235
  check_file_presence(files.raw.map{|file_row| file_row[0]}, false)
220
236
  end
237
+
238
+ Then /^I should have a Berkshelf config file$/ do
239
+ Pathname.new(ENV['HOME']).join(".berkshelf").should have_structure {
240
+ file "config.json"
241
+ }
242
+ end
@@ -3,7 +3,7 @@ Feature: upload command
3
3
  I need a way to upload cookbooks to a Chef server that I have installed into my Bookshelf
4
4
  So they are available to Chef clients
5
5
 
6
- @no_run @slow_process
6
+ @no_run @chef_server
7
7
  Scenario: running the upload command when the Sources in the Berksfile are already installed
8
8
  Given I write to "Berksfile" with:
9
9
  """
@@ -23,7 +23,7 @@ Feature: upload command
23
23
  | openssl | 1.0.0 |
24
24
  And the exit status should be 0
25
25
 
26
- @slow_process
26
+ @chef_server
27
27
  Scenario: running the upload command when the Sources in the Berksfile have not been installed
28
28
  Given I write to "Berksfile" with:
29
29
  """
@@ -42,7 +42,7 @@ Feature: upload command
42
42
  | openssl | 1.0.0 |
43
43
  And the exit status should be 0
44
44
 
45
- @slow_process
45
+ @chef_server
46
46
  Scenario: running the upload command with a Berksfile containing a source that has a path location
47
47
  Given a Berksfile with path location sources to fixtures:
48
48
  | example_cookbook | example_cookbook-0.5.0 |
@@ -55,7 +55,7 @@ Feature: upload command
55
55
  | example_cookbook | 0.5.0 |
56
56
  And the exit status should be 0
57
57
 
58
- @slow_process
58
+ @chef_server
59
59
  Scenario: running the upload command with a Berksfile containing a source that has a Git location
60
60
  Given I write to "Berksfile" with:
61
61
  """
@@ -1,4 +1,4 @@
1
- source "http://rubygems.org"
1
+ source :rubygems
2
2
 
3
3
  gem 'berkshelf'
4
4
  <% if options[:foodcritic] -%>
@@ -7,6 +7,6 @@ gem 'thor-foodcritic'
7
7
  <% if options[:scmversion] -%>
8
8
  gem 'thor-scmversion'
9
9
  <% end -%>
10
- <% if options[:vagrant] -%>
10
+ <% unless options[:skip_vagrant] -%>
11
11
  gem 'vagrant', '~> 1.0.5'
12
12
  <% end -%>
@@ -27,11 +27,24 @@ Vagrant::Config.run do |config|
27
27
  # to skip installing and copying to Vagrant's shelf.
28
28
  # config.berkshelf.except = []
29
29
 
30
- config.vm.host_name = "<%= cookbook_name %>-berkshelf"
30
+ <% if options[:berkshelf_config][:vagrant][:vm][:box].present? -%>
31
+ config.vm.host_name = "<%= options[:berkshelf_config][:vagrant][:vm][:host_name] %>"
32
+ <% else -%>
33
+ config.vm.host_name = "<%= "#{cookbook_name}-berkshelf" %>"
34
+ <% end -%>
35
+
31
36
 
32
37
  # CentOS 6.3
38
+ <% if options[:berkshelf_config][:vagrant][:vm][:box].present? -%>
39
+ config.vm.box = "<%= options[:berkshelf_config][:vagrant][:vm][:box] %>"
40
+ <% else %>
33
41
  config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal"
42
+ <% end -%>
43
+ <% if options[:berkshelf_config][:vagrant][:vm][:box_url].present? -%>
44
+ config.vm.box_url = "<%= options[:berkshelf_config][:vagrant][:vm][:box_url] %>"
45
+ <% else %>
34
46
  config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"
47
+ <% end -%>
35
48
 
36
49
  # Boot with a GUI so you can see the screen. (Default is headless)
37
50
  # config.vm.boot_mode = :gui
@@ -40,16 +53,22 @@ Vagrant::Config.run do |config|
40
53
  # via the IP. Host-only networks can talk to the host machine as well as
41
54
  # any other machines on the same network, but cannot be accessed (through this
42
55
  # network interface) by any external networks.
43
- config.vm.network :hostonly, "33.33.33.10"
56
+ # config.vm.network :hostonly, "33.33.33.10"
57
+ <% if options[:berkshelf_config][:vagrant][:vm][:network][:hostonly].present? -%>
58
+ config.vm.network :hostonly, "<%= options[:berkshelf_config][:vagrant][:vm][:network][:hostonly] %>"
59
+ <% end -%>
44
60
 
45
61
  # Assign this VM to a bridged network, allowing you to connect directly to a
46
62
  # network using the host's network device. This makes the VM appear as another
47
63
  # physical device on your network.
48
- # config.vm.network :bridged
64
+ <% unless options[:berkshelf_config][:vagrant][:vm][:network][:bridged].present? %># <% end %>config.vm.network :bridged
49
65
 
50
66
  # Forward a port from the guest to the host, which allows for outside
51
67
  # computers to access the VM, whereas host only networking does not.
52
68
  # config.vm.forward_port 80, 8080
69
+ <% options[:berkshelf_config][:vagrant][:vm][:forward_port].each do |guest, host| %>
70
+ config.vm.forward_port <%= guest %>, <%= host %>
71
+ <% end if options[:berkshelf_config][:vagrant][:vm][:forward_port].present? %>
53
72
 
54
73
  # Share an additional folder to the guest VM. The first argument is
55
74
  # an identifier, the second is the path on the guest to mount the
@@ -59,6 +78,17 @@ Vagrant::Config.run do |config|
59
78
  config.ssh.max_tries = 40
60
79
  config.ssh.timeout = 120
61
80
 
81
+ <% if options[:berkshelf_config][:vagrant][:vm][:provision] == "chef_client" -%>
82
+ config.vm.provision :chef_client do |chef|
83
+ chef.chef_server_url = "<%= options[:berkshelf_config][:vagrant][:chef][:chef_server_url] %>"
84
+ chef.validation_client_name = "<%= options[:berkshelf_config][:vagrant][:chef][:validation_client_name] %>"
85
+ chef.validation_key_path = "<%= options[:berkshelf_config][:vagrant][:chef][:validation_key_path] %>"
86
+
87
+ chef.run_list = [
88
+ "recipe[<%= cookbook_name %>::default]"
89
+ ]
90
+ end
91
+ <% else -%>
62
92
  config.vm.provision :chef_solo do |chef|
63
93
  chef.json = {
64
94
  :mysql => {
@@ -72,14 +102,5 @@ Vagrant::Config.run do |config|
72
102
  "recipe[<%= cookbook_name %>::default]"
73
103
  ]
74
104
  end
75
-
76
- # config.vm.provision :chef_client do |chef|
77
- # chef.chef_server_url = 'https://api.opscode.com/organizations/vialstudios'
78
- # chef.validation_client_name = 'vialstudios-validator'
79
- # chef.validation_key_path = '/Users/reset/.chef/vialstudios-validator.pem'
80
- #
81
- # chef.run_list = [
82
- # "recipe[<%= cookbook_name %>::default]"
83
- # ]
84
- # end
105
+ <% end -%>
85
106
  end
@@ -0,0 +1,22 @@
1
+ {
2
+ "vagrant": {
3
+ "chef": {
4
+ "chef_server_url": "https://api.opscode.com/organizations/ORGNAME",
5
+ "validation_client_name": "ORGNAME-validator",
6
+ "validation_key_path": "~/validation.pem"
7
+ },
8
+ "vm": {
9
+ "box": "base",
10
+ "box_url": "http://files.vagrantup.com/lucid64.box",
11
+ "forward_port": {
12
+ "80": "8080"
13
+ },
14
+ "host_name": "berkshelf-cookbook",
15
+ "network": {
16
+ "bridged": true,
17
+ "hostonly": "192.168.33.10"
18
+ },
19
+ "provision": "chef_solo"
20
+ }
21
+ }
22
+ }
data/lib/berkshelf/cli.rb CHANGED
@@ -27,6 +27,11 @@ module Berkshelf
27
27
  map 'ver' => :version
28
28
  map 'book' => :cookbook
29
29
 
30
+ desc "config", "Generate a default Berkshelf configuration file"
31
+ def config
32
+ ConfigGenerator.new.invoke_all
33
+ end
34
+
30
35
  class_option :config,
31
36
  type: :string,
32
37
  default: Berkshelf::DEFAULT_CONFIG,
@@ -145,21 +150,12 @@ module Berkshelf
145
150
  Berkshelf.formatter.msg license
146
151
  end
147
152
 
148
- method_option :vagrant,
149
- type: :boolean,
150
- desc: "Creates a Vagrantfile and dynamically change other generated files to support Vagrant"
151
- method_option :git,
152
- type: :boolean,
153
- desc: "Creates additional git specific files if your project will be managed by git"
154
153
  method_option :foodcritic,
155
154
  type: :boolean,
156
155
  desc: "Creates a Thorfile with Foodcritic support to lint test your cookbook"
157
156
  method_option :scmversion,
158
157
  type: :boolean,
159
158
  desc: "Creates a Thorfile with SCMVersion support to manage versions for continuous integration"
160
- method_option :no_bundler,
161
- type: :boolean,
162
- desc: "Skips generation of a Gemfile and other Bundler specific support"
163
159
  method_option :license,
164
160
  type: :string,
165
161
  default: "reserved",
@@ -173,8 +169,27 @@ module Berkshelf
173
169
  type: :string,
174
170
  desc: "Email address of cookbook maintainer",
175
171
  aliases: "-e"
172
+ method_option :no_bundler,
173
+ type: :boolean,
174
+ desc: "Skips generation of a Gemfile and other Bundler specific support"
175
+ method_option :vagrant,
176
+ type: :boolean,
177
+ hide: true
178
+ method_option :skip_vagrant,
179
+ type: :boolean,
180
+ desc: "Skips adding a Vagrantfile and adding supporting gems to the Gemfile"
181
+ method_option :git,
182
+ type: :boolean,
183
+ hide: true
184
+ method_option :skip_git,
185
+ type: :boolean,
186
+ desc: "Skips adding a .gitignore and running git init in the cookbook directory"
187
+
176
188
  desc "cookbook NAME", "Create a skeleton for a new cookbook"
177
189
  def cookbook(name)
190
+ Berkshelf.formatter.deprecation "--git is now the default" if options[:git]
191
+ Berkshelf.formatter.deprecation "--vagrant is now the default" if options[:vagrant]
192
+
178
193
  ::Berkshelf::CookbookGenerator.new([name, File.join(Dir.pwd, name)], options).invoke_all
179
194
  end
180
195