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.
- data/berkshelf.gemspec +1 -1
- data/features/config.feature +10 -10
- data/features/configure_command.feature +60 -0
- data/features/install.feature +6 -6
- data/features/step_definitions/cli_steps.rb +2 -2
- data/features/step_definitions/configure_cli_steps.rb +6 -0
- data/features/step_definitions/filesystem_steps.rb +6 -10
- data/features/support/env.rb +1 -0
- data/generator_files/Vagrantfile.erb +18 -38
- data/lib/berkshelf.rb +0 -19
- data/lib/berkshelf/cli.rb +82 -17
- data/lib/berkshelf/config.rb +77 -28
- data/lib/berkshelf/errors.rb +5 -2
- data/lib/berkshelf/locations/chef_api_location.rb +16 -11
- data/lib/berkshelf/vagrant/action/install.rb +4 -8
- data/lib/berkshelf/vagrant/action/upload.rb +5 -11
- data/lib/berkshelf/vagrant/config.rb +4 -28
- data/lib/berkshelf/version.rb +1 -1
- data/spec/unit/berkshelf/config_spec.rb +28 -68
- data/spec/unit/berkshelf/locations/chef_api_location_spec.rb +0 -6
- data/spec/unit/berkshelf_spec.rb +0 -20
- metadata +7 -10
- data/features/config_command.feature +0 -10
- data/generator_files/config.json +0 -22
- data/lib/berkshelf/config_generator.rb +0 -8
- data/lib/berkshelf/config_validator.rb +0 -78
- data/spec/unit/berkshelf/config_validator_spec.rb +0 -68
data/berkshelf.gemspec
CHANGED
@@ -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
|
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'
|
data/features/config.feature
CHANGED
@@ -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
|
-
"
|
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 "
|
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"
|
data/features/install.feature
CHANGED
@@ -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: :
|
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 :
|
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: :
|
217
|
+
cookbook "artifact", chef_api: :config
|
218
218
|
"""
|
219
219
|
When I run the install command with flags:
|
220
|
-
| -c /tmp/
|
220
|
+
| -c /tmp/notthere.lol |
|
221
221
|
Then the output should contain:
|
222
222
|
"""
|
223
|
-
|
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 "
|
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
|
70
|
-
|
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|
|
@@ -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
|
-
|
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
|
-
|
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
|
data/features/support/env.rb
CHANGED
@@ -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
|
-
|
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
|
-
|
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]
|
49
|
+
<% options[:berkshelf_config].vagrant.vm.forward_port.each do |guest, host| %>
|
70
50
|
config.vm.forward_port <%= guest %>, <%= host %>
|
71
|
-
<% end
|
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]
|
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]
|
84
|
-
chef.validation_client_name = "<%= options[:berkshelf_config]
|
85
|
-
chef.validation_key_path = "<%= options[:berkshelf_config]
|
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
|
-
<%
|
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',
|
data/lib/berkshelf.rb
CHANGED
@@ -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.
|
data/lib/berkshelf/cli.rb
CHANGED
@@ -14,7 +14,14 @@ module Berkshelf
|
|
14
14
|
|
15
15
|
def initialize(*args)
|
16
16
|
super(*args)
|
17
|
-
|
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
|
-
|
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:
|
126
|
-
client_name:
|
127
|
-
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
|
|