berkshelf 0.6.0.beta4 → 1.0.0.rc1

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.
@@ -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