berkshelf 0.6.0.beta4 → 1.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
@@ -26,7 +26,7 @@ Gem::Specification.new do |s|
26
26
  s.version = Berkshelf::VERSION
27
27
  s.required_ruby_version = ">= 1.9.1"
28
28
 
29
- s.add_runtime_dependency 'chozo', '>= 0.1.0'
29
+ s.add_runtime_dependency 'chozo', '>= 0.2.1'
30
30
  s.add_runtime_dependency 'ridley', '>= 0.0.5'
31
31
  s.add_runtime_dependency 'solve', '>= 0.4.0.rc1'
32
32
  s.add_runtime_dependency 'chef', '~> 10.12'
@@ -7,7 +7,6 @@ Feature: cookbook creation with a config file
7
7
  Given I do not have a Berkshelf config file
8
8
  When I run the cookbook command to create "sparkle_motion"
9
9
  Then the resulting "sparkle_motion" Vagrantfile should contain:
10
- | config.vm.host_name = "sparkle_motion-berkshelf" |
11
10
  | config.vm.box = "Berkshelf-CentOS-6.3-x86_64-minimal" |
12
11
  | config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box" |
13
12
  And the exit status should be 0
@@ -23,7 +22,6 @@ Feature: cookbook creation with a config file
23
22
  "forward_port": {
24
23
  "12345": "54321"
25
24
  },
26
- "host_name": "my_host",
27
25
  "network": {
28
26
  "bridged": true,
29
27
  "hostonly": "12.34.56.78"
@@ -37,7 +35,6 @@ Feature: cookbook creation with a config file
37
35
  | config.vm.box = "my_box" |
38
36
  | config.vm.box_url = "http://files.vagrantup.com/lucid64.box" |
39
37
  | config.vm.forward_port 12345, 54321 |
40
- | config.vm.host_name = "my_host" |
41
38
  | config.vm.network :hostonly, "12.34.56.78" |
42
39
  | config.vm.network :bridged |
43
40
  And the exit status should be 0
@@ -64,24 +61,27 @@ Feature: cookbook creation with a config file
64
61
  Given I have a Berkshelf config file containing:
65
62
  """
66
63
  {
67
- "wat": null
64
+ "vagrant": null
68
65
  }
69
66
  """
70
67
  When I run the cookbook command to create "sparkle_motion"
71
68
  Then the output should contain "Invalid configuration"
72
- And the output should contain "wat is not a valid key"
69
+ And the output should contain "vagrant.vm.box Expected attribute: 'vagrant.vm.box' to be a type of: 'String'"
70
+ And the output should contain "vagrant.vm.box A value is required for attribute: 'vagrant.vm.box'"
71
+ And the output should contain "vagrant.vm.box_url Expected attribute: 'vagrant.vm.box_url' to be a type of: 'String'"
72
+ And the output should contain "vagrant.vm.box_url A value is required for attribute: 'vagrant.vm.box_url'"
73
73
  And the CLI should exit with the status code for error "InvalidConfiguration"
74
74
 
75
75
  Scenario: creating a new cookbook with a chef client config
76
76
  Given I have a Berkshelf config file containing:
77
77
  """
78
78
  {
79
+ "chef": {
80
+ "chef_server_url": "localhost:4000",
81
+ "validation_client_name": "my_client-validator",
82
+ "validation_key_path": "/a/b/c/my_client-validator.pem"
83
+ },
79
84
  "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
85
  "vm": {
86
86
  "provision": "chef_client"
87
87
  }
@@ -0,0 +1,60 @@
1
+ Feature: configure command
2
+ As CLI user of Berkshelf
3
+ I want a command to generate a Berkshelf configuration file based on my input
4
+ So I can quickly get up and running with the least amount of resistance
5
+
6
+ Scenario: generating a new config file
7
+ Given I do not have a Berkshelf config file
8
+ When I run the "configure" command interactively
9
+ And I type "https://api.opscode.com/organizations/vialstudios"
10
+ And I type "node_name"
11
+ And I type "client_key"
12
+ And I type "reset"
13
+ And I type "/Users/reset/.chef/reset.pem"
14
+ And I type "Berkshelf-minimal"
15
+ And I type "https://dl.dropbox.com/Berkshelf.box"
16
+ Then the output should contain:
17
+ """
18
+ Config written to:
19
+ """
20
+ And the exit status should be 0
21
+ And a Berkshelf config file should exist and contain:
22
+ | chef.chef_server_url | https://api.opscode.com/organizations/vialstudios |
23
+ | chef.validation_client_name | reset |
24
+ | chef.node_name | node_name |
25
+ | chef.client_key | client_key |
26
+ | chef.validation_key_path | /Users/reset/.chef/reset.pem |
27
+ | vagrant.vm.box | Berkshelf-minimal |
28
+ | vagrant.vm.box_url | https://dl.dropbox.com/Berkshelf.box |
29
+
30
+ Scenario: generating a config with default values
31
+ Given I do not have a Berkshelf config file
32
+ When I run the "configure" command interactively
33
+ And I type ""
34
+ And I type ""
35
+ And I type ""
36
+ And I type ""
37
+ And I type ""
38
+ And I type ""
39
+ And I type ""
40
+ Then the output should contain:
41
+ """
42
+ Config written to:
43
+ """
44
+ And the exit status should be 0
45
+ And a Berkshelf config file should exist and contain:
46
+ | chef.chef_server_url | http://localhost:4000 |
47
+ | chef.validation_client_name | chef-validator |
48
+ | chef.client_key | /etc/chef/client.pem |
49
+ | chef.validation_key_path | /etc/chef/validation.pem |
50
+ | vagrant.vm.box | Berkshelf-CentOS-6.3-x86_64-minimal |
51
+ | vagrant.vm.box_url | https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box |
52
+
53
+ Scenario: attempting to generate a new config when one already exists
54
+ Given I have a default Berkshelf config file
55
+ When I run the "configure" command interactively
56
+ Then the output should contain:
57
+ """
58
+ A configuration file already exists. Re-run with the --force flag if you wish to overwrite it.
59
+ """
60
+ And the CLI should exit with the status code for error "ConfigExists"
@@ -198,7 +198,7 @@ Feature: install cookbooks from a Berksfile
198
198
  Scenario: with a cookbook definition containing a chef_api source location
199
199
  Given I write to "Berksfile" with:
200
200
  """
201
- cookbook "artifact", "= 0.10.2", chef_api: :knife
201
+ cookbook "artifact", "= 0.10.2", chef_api: :config
202
202
  """
203
203
  And the Chef server has cookbooks:
204
204
  | artifact | 0.10.2 |
@@ -211,18 +211,18 @@ Feature: install cookbooks from a Berksfile
211
211
  | artifact | 0.10.2 |
212
212
  And the exit status should be 0
213
213
 
214
- Scenario: with a chef_api source location specifying :knife when a Knife config is not found at the given path
214
+ Scenario: with a chef_api source location specifying :config when a Berkshelf config is not found at the given path
215
215
  Given I write to "Berksfile" with:
216
216
  """
217
- cookbook "artifact", chef_api: :knife
217
+ cookbook "artifact", chef_api: :config
218
218
  """
219
219
  When I run the install command with flags:
220
- | -c /tmp/nothere.lol |
220
+ | -c /tmp/notthere.lol |
221
221
  Then the output should contain:
222
222
  """
223
- A Knife config is required when ':knife' is given for the value of a 'chef_api' location. Attempted to load configuration from: '/tmp/nothere.lol' but not found.
223
+ You specified a path to a configuration file that did not exist: '/tmp/notthere.lol'
224
224
  """
225
- And the CLI should exit with the status code for error "KnifeConfigNotFound"
225
+ And the CLI should exit with the status code for error "BerksConfigNotFound"
226
226
 
227
227
  Scenario: with a chef_api source location specifying a Chef API URL but missing a node_name option
228
228
  Given I write to "Berksfile" with:
@@ -66,8 +66,8 @@ When /^I run the cookbook command to create "(.*?)" with options:$/ do |name, op
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")
69
+ When /^I run the "(.*?)" command interactively$/ do |command|
70
+ run_interactive("berks #{command}")
71
71
  end
72
72
 
73
73
  Then /^the CLI should exit with the status code for error "(.*?)"$/ do |error_constant|
@@ -0,0 +1,6 @@
1
+ Then /^a Berkshelf config file should exist and contain:$/ do |table|
2
+ config = Berkshelf::Config.from_file(Berkshelf::Config.path)
3
+ table.raw.each do |key, value|
4
+ config.get_attribute(key).should eql(value)
5
+ end
6
+ end
@@ -18,14 +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 default Berkshelf config file$/ do
22
+ Berkshelf::Config.new.save
23
+ end
24
+
21
25
  Given /^I have a Berkshelf config file containing:$/ do |contents|
22
- write_file File.expand_path("~/.berkshelf/config.json"), contents
26
+ Berkshelf::Config.new.from_json(contents).save
23
27
  end
24
28
 
25
29
  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
30
+ remove_file Berkshelf::Config.path if File.exists? Berkshelf::Config.path
29
31
  end
30
32
 
31
33
  Given /^the cookbook "(.*?)" has the file "(.*?)" with:$/ do |cookbook_name, file_name, content|
@@ -234,9 +236,3 @@ end
234
236
  Then /^the current directory should not have the following files:$/ do |files|
235
237
  check_file_presence(files.raw.map{|file_row| file_row[0]}, false)
236
238
  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
@@ -12,6 +12,7 @@ Spork.prefork do
12
12
  APP_ROOT = File.expand_path('../../../', __FILE__)
13
13
 
14
14
  ENV["BERKSHELF_PATH"] = File.join(APP_ROOT, "tmp", "berkshelf")
15
+ ENV["BERKSHELF_CHEF_CONFIG"] = File.join(APP_ROOT, "tmp", "knife.rb")
15
16
 
16
17
  Dir[File.join(APP_ROOT, "spec/support/**/*.rb")].each {|f| require f}
17
18
 
@@ -8,17 +8,6 @@ Vagrant::Config.run do |config|
8
8
  # The path to the Berksfile to use with Vagrant Berkshelf
9
9
  # config.berkshelf.berksfile_path = "./Berksfile"
10
10
 
11
- # The path to the Knife config to use with Vagrant Berkshelf
12
- # config.berkshelf.config_path = "~/.chef/knife.rb"
13
-
14
- # A client name (node_name) to use with the Chef Client provisioner to upload
15
- # cookbooks installed by Berkshelf.
16
- # config.berkshelf.node_name = "reset"
17
-
18
- # A path to a client key on disk to use with the Chef Client provisioner to
19
- # upload cookbooks installed by Berkshelf.
20
- # config.berkshelf.client_key = "~/.chef/reset.pem"
21
-
22
11
  # An array of symbols representing groups of cookbook described in the Vagrantfile
23
12
  # to skip installing and copying to Vagrant's shelf.
24
13
  # config.berkshelf.only = []
@@ -27,24 +16,10 @@ Vagrant::Config.run do |config|
27
16
  # to skip installing and copying to Vagrant's shelf.
28
17
  # config.berkshelf.except = []
29
18
 
30
- <% if options[:berkshelf_config][:vagrant][:vm][:box].present? -%>
31
- config.vm.host_name = "<%= options[:berkshelf_config][:vagrant][:vm][:host_name] %>"
32
- <% else -%>
33
19
  config.vm.host_name = "<%= "#{cookbook_name}-berkshelf" %>"
34
- <% end -%>
35
20
 
36
-
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 %>
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 %>
46
- config.vm.box_url = "https://dl.dropbox.com/u/31081437/Berkshelf-CentOS-6.3-x86_64-minimal.box"
47
- <% end -%>
21
+ config.vm.box = "<%= options[:berkshelf_config].vagrant.vm.box %>"
22
+ config.vm.box_url = "<%= options[:berkshelf_config].vagrant.vm.box_url %>"
48
23
 
49
24
  # Boot with a GUI so you can see the screen. (Default is headless)
50
25
  # config.vm.boot_mode = :gui
@@ -53,22 +28,27 @@ Vagrant::Config.run do |config|
53
28
  # via the IP. Host-only networks can talk to the host machine as well as
54
29
  # any other machines on the same network, but cannot be accessed (through this
55
30
  # network interface) by any external networks.
31
+ <% if options[:berkshelf_config].vagrant.vm.network.hostonly.present? -%>
32
+ config.vm.network :hostonly, "<%= options[:berkshelf_config].vagrant.vm.network.hostonly %>"
33
+ <% else %>
56
34
  # 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
35
  <% end -%>
60
36
 
61
37
  # Assign this VM to a bridged network, allowing you to connect directly to a
62
38
  # network using the host's network device. This makes the VM appear as another
63
39
  # physical device on your network.
64
- <% unless options[:berkshelf_config][:vagrant][:vm][:network][:bridged].present? %># <% end %>config.vm.network :bridged
40
+ <% if options[:berkshelf_config].vagrant.vm.network.bridged -%>
41
+ config.vm.network :bridged
42
+ <% else %>
43
+ # config.vm.network :bridged
44
+ <% end -%>
65
45
 
66
46
  # Forward a port from the guest to the host, which allows for outside
67
47
  # computers to access the VM, whereas host only networking does not.
68
48
  # config.vm.forward_port 80, 8080
69
- <% options[:berkshelf_config][:vagrant][:vm][:forward_port].each do |guest, host| %>
49
+ <% options[:berkshelf_config].vagrant.vm.forward_port.each do |guest, host| %>
70
50
  config.vm.forward_port <%= guest %>, <%= host %>
71
- <% end if options[:berkshelf_config][:vagrant][:vm][:forward_port].present? %>
51
+ <% end -%>
72
52
 
73
53
  # Share an additional folder to the guest VM. The first argument is
74
54
  # an identifier, the second is the path on the guest to mount the
@@ -78,18 +58,18 @@ Vagrant::Config.run do |config|
78
58
  config.ssh.max_tries = 40
79
59
  config.ssh.timeout = 120
80
60
 
81
- <% if options[:berkshelf_config][:vagrant][:vm][:provision] == "chef_client" -%>
61
+ <% if options[:berkshelf_config].vagrant.vm.provision == "chef_client" -%>
82
62
  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] %>"
63
+ chef.chef_server_url = "<%= options[:berkshelf_config].chef.chef_server_url %>"
64
+ chef.validation_client_name = "<%= options[:berkshelf_config].chef.validation_client_name %>"
65
+ chef.validation_key_path = "<%= options[:berkshelf_config].chef.validation_key_path %>"
86
66
 
87
67
  chef.run_list = [
88
68
  "recipe[<%= cookbook_name %>::default]"
89
69
  ]
90
70
  end
91
- <% else -%>
92
- config.vm.provision :chef_solo do |chef|
71
+ <% elsif options[:berkshelf_config].vagrant.vm.provision == "chef_solo" -%>
72
+ config.vm.provision :chef_solo do |chef|
93
73
  chef.json = {
94
74
  :mysql => {
95
75
  :server_root_password => 'rootpass',
@@ -25,7 +25,6 @@ require 'thor/monkies'
25
25
  Chef::Config[:cache_options][:path] = Dir.mktmpdir
26
26
 
27
27
  module Berkshelf
28
- DEFAULT_CONFIG = File.expand_path(ENV["CHEF_CONFIG"] || "~/.chef/knife.rb")
29
28
  DEFAULT_STORE_PATH = File.expand_path("~/.berkshelf").freeze
30
29
  DEFAULT_FILENAME = 'Berksfile'.freeze
31
30
 
@@ -44,15 +43,12 @@ module Berkshelf
44
43
  autoload :Uploader, 'berkshelf/uploader'
45
44
  autoload :Resolver, 'berkshelf/resolver'
46
45
  autoload :Config, 'berkshelf/config'
47
- autoload :ConfigGenerator, 'berkshelf/config_generator'
48
- autoload :ConfigValidator, 'berkshelf/config_validator'
49
46
 
50
47
  require 'berkshelf/location'
51
48
 
52
49
  class << self
53
50
  attr_accessor :ui
54
51
 
55
- attr_writer :config_path
56
52
  attr_writer :cookbook_store
57
53
 
58
54
  # @return [Pathname]
@@ -99,21 +95,6 @@ module Berkshelf
99
95
  @cookbook_store ||= CookbookStore.new(cookbooks_dir)
100
96
  end
101
97
 
102
- # @return [String]
103
- def config_path
104
- @config_path ||= DEFAULT_CONFIG
105
- end
106
-
107
- # Load the config found at the given path as the Chef::Config. If no path is specified
108
- # the value of Berkshelf.chef_config will be used.
109
- #
110
- # @param [String] path
111
- def load_config(path = config_path)
112
- Chef::Config.from_file(File.expand_path(path))
113
- rescue Errno::ENOENT
114
- raise KnifeConfigNotFound, "Attempted to load configuration from: '#{path}' but not found."
115
- end
116
-
117
98
  # Ascend the directory structure from the given path to find a
118
99
  # metadata.rb file of a Chef Cookbook. If no metadata.rb file
119
100
  # was found, nil is returned.
@@ -14,7 +14,14 @@ module Berkshelf
14
14
 
15
15
  def initialize(*args)
16
16
  super(*args)
17
- Berkshelf.config_path = @options[:config]
17
+
18
+ if @options[:config]
19
+ unless File.exist?(@options[:config])
20
+ raise BerksConfigNotFound, "You specified a path to a configuration file that did not exist: '#{@options[:config]}'"
21
+ end
22
+ Berkshelf::Config.path = @options[:config]
23
+ end
24
+
18
25
  Berkshelf.set_format @options[:format]
19
26
  @options = options.dup # unfreeze frozen options Hash from Thor
20
27
  end
@@ -27,15 +34,9 @@ module Berkshelf
27
34
  map 'ver' => :version
28
35
  map 'book' => :cookbook
29
36
 
30
- desc "config", "Generate a default Berkshelf configuration file"
31
- def config
32
- ConfigGenerator.new.invoke_all
33
- end
34
-
35
37
  class_option :config,
36
38
  type: :string,
37
- default: Berkshelf::DEFAULT_CONFIG,
38
- desc: "Path to Knife or Chef configuration to use.",
39
+ desc: "Path to Berkshelf configuration to use.",
39
40
  aliases: "-c",
40
41
  banner: "PATH"
41
42
  class_option :format,
@@ -45,6 +46,51 @@ module Berkshelf
45
46
  aliases: "-F",
46
47
  banner: "FORMAT"
47
48
 
49
+ method_option :force,
50
+ type: :boolean,
51
+ default: false,
52
+ desc: "create a new configuration file even if one already exists."
53
+ desc "configure", "Create a new configuration file to customize Berkshelf's behavior"
54
+ def configure(path = Berkshelf::Config.path)
55
+ path = File.expand_path(path)
56
+
57
+ if File.exist?(path) && !options[:force]
58
+ raise Berkshelf::ConfigExists, "A configuration file already exists. Re-run with the --force flag if you wish to overwrite it."
59
+ end
60
+
61
+ @config = Berkshelf::Config.new(path)
62
+
63
+ [
64
+ "chef.chef_server_url",
65
+ "chef.node_name",
66
+ "chef.client_key",
67
+ "chef.validation_client_name",
68
+ "chef.validation_key_path",
69
+ "vagrant.vm.box",
70
+ "vagrant.vm.box_url",
71
+ ].each do |attribute|
72
+ default = @config.get_attribute(attribute)
73
+
74
+ message = "Enter value for #{attribute}"
75
+ message << " (default: '#{default}')" if default
76
+ message << ": "
77
+
78
+ input = Berkshelf.ui.ask(message)
79
+
80
+ if input.present?
81
+ @config.set_attribute(attribute, input)
82
+ end
83
+ end
84
+
85
+ unless @config.valid?
86
+ raise InvalidConfiguration.new(@config.errors)
87
+ end
88
+
89
+ @config.save
90
+
91
+ Berkshelf.formatter.msg "Config written to: '#{path}'"
92
+ end
93
+
48
94
  method_option :except,
49
95
  type: :array,
50
96
  desc: "Exclude cookbooks that are in these groups.",
@@ -64,7 +110,7 @@ module Berkshelf
64
110
  desc: "Path to install cookbooks to (i.e. vendor/cookbooks).",
65
111
  aliases: "-p",
66
112
  banner: "PATH"
67
- desc "install", "Install the Cookbooks specified by a Berksfile or a Berksfile.lock."
113
+ desc "install", "Install the Cookbooks specified by a Berksfile or a Berksfile.lock"
68
114
  def install
69
115
  berksfile = ::Berkshelf::Berksfile.from_file(options[:berksfile])
70
116
  berksfile.install(options)
@@ -84,7 +130,7 @@ module Berkshelf
84
130
  type: :array,
85
131
  desc: "Only cookbooks that are in these groups.",
86
132
  aliases: "-o"
87
- desc "update", "Update all Cookbooks and their dependencies specified by a Berksfile to their latest versions."
133
+ desc "update", "Update all Cookbooks and their dependencies specified by a Berksfile to their latest versions"
88
134
  def update
89
135
  Lockfile.remove!
90
136
  invoke :install
@@ -116,19 +162,34 @@ module Berkshelf
116
162
  type: :boolean,
117
163
  default: true,
118
164
  desc: "Disable/Enable SSL verification when uploading cookbooks"
119
- desc "upload", "Upload the Cookbooks specified by a Berksfile or a Berksfile.lock to a Chef Server."
165
+ desc "upload", "Upload the Cookbooks specified by a Berksfile or a Berksfile.lock to a Chef Server"
120
166
  def upload
121
- Berkshelf.load_config
122
167
  berksfile = ::Berkshelf::Berksfile.from_file(options[:berksfile])
123
168
 
169
+ unless Berkshelf::Config.instance.chef.chef_server_url.present?
170
+ msg = "Could not upload cookbooks: Missing Chef server_url."
171
+ msg << " Generate or update your Berkshelf configuration that contains a valid Chef Server URL."
172
+ raise UploadFailure, msg
173
+ end
174
+
175
+ unless Berkshelf::Config.instance.chef.node_name.present?
176
+ msg = "Could not upload cookbooks: Missing Chef node_name."
177
+ msg << " Generate or update your Berkshelf configuration that contains a valid Chef node_name."
178
+ raise UploadFailure, msg
179
+ end
180
+
124
181
  berksfile.upload(
125
- server_url: Chef::Config[:chef_server_url],
126
- client_name: Chef::Config[:node_name],
127
- client_key: Chef::Config[:client_key],
182
+ server_url: Berkshelf::Config.instance.chef.chef_server_url,
183
+ client_name: Berkshelf::Config.instance.chef.node_name,
184
+ client_key: Berkshelf::Config.instance.chef.client_key,
128
185
  ssl: {
129
- verify: options[:ssl_verify]
186
+ verify: (options[:ssl_verify] || Berkshelf::Config.instance.ssl.verify)
130
187
  }
131
188
  )
189
+ rescue Ridley::Errors::ClientKeyFileNotFound => e
190
+ msg = "Could not upload cookbooks: Missing Chef client key: '#{Berkshelf::Config.instance.chef.client_key}'."
191
+ msg << " Generate or update your Berkshelf configuration that contains a valid path to a Chef client key."
192
+ raise UploadFailure, msg
132
193
  end
133
194
 
134
195
  method_option :foodcritic,
@@ -152,7 +213,7 @@ module Berkshelf
152
213
  method_option :skip_git,
153
214
  type: :boolean,
154
215
  desc: "Skips adding a .gitignore and running git init in the cookbook directory"
155
- desc "init [PATH]", "Prepare a local path to have its Cookbook dependencies managed by Berkshelf."
216
+ desc "init [PATH]", "Prepare a local path to have its Cookbook dependencies managed by Berkshelf"
156
217
  def init(path = Dir.pwd)
157
218
  Berkshelf.formatter.deprecation "--git is now the default" if options[:git]
158
219
  Berkshelf.formatter.deprecation "--vagrant is now the default" if options[:vagrant]
@@ -213,6 +274,10 @@ module Berkshelf
213
274
  Berkshelf.formatter.deprecation "--git is now the default" if options[:git]
214
275
  Berkshelf.formatter.deprecation "--vagrant is now the default" if options[:vagrant]
215
276
 
277
+ unless Config.instance.valid?
278
+ raise InvalidConfiguration.new(Config.instance.errors)
279
+ end
280
+
216
281
  ::Berkshelf::CookbookGenerator.new([name, File.join(Dir.pwd, name)], options).invoke_all
217
282
  end
218
283