berkshelf 0.6.0.beta2 → 0.6.0.beta3

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 (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