vagrant-berkshelf 2.0.1 → 3.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/CHANGELOG.md +11 -0
- data/Gemfile +1 -1
- data/README.md +10 -4
- data/integration/Berksfile +3 -0
- data/integration/Gemfile +10 -0
- data/integration/Vagrantfile +19 -0
- data/lib/berkshelf/vagrant/action/install.rb +12 -16
- data/lib/berkshelf/vagrant/action/upload.rb +17 -13
- data/lib/berkshelf/vagrant/action.rb +0 -2
- data/lib/berkshelf/vagrant/berks_config.rb +57 -0
- data/lib/berkshelf/vagrant/chef_config.rb +88 -0
- data/lib/berkshelf/vagrant/config.rb +25 -10
- data/lib/berkshelf/vagrant/env.rb +1 -6
- data/lib/berkshelf/vagrant/env_helpers.rb +98 -0
- data/lib/berkshelf/vagrant/errors.rb +40 -0
- data/lib/berkshelf/vagrant/version.rb +1 -1
- data/lib/berkshelf/vagrant.rb +15 -2
- data/spec/unit/berkshelf/vagrant/config_spec.rb +7 -7
- data/spec/unit/berkshelf/vagrant_spec.rb +0 -2
- data/vagrant-berkshelf.gemspec +4 -3
- metadata +17 -39
- data/lib/berkshelf/vagrant/action/set_ui.rb +0 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62de20b48013f967082c65d1aedb9f29292e694c
|
4
|
+
data.tar.gz: 1172289f2a081195c6fbf72d8311954a6c8b238c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: edd6b97e93c2a74463c16b1bdca1fce19575f94506d8a690625f233ab5e4e5fb52e4b8c14f904db222ca2a24b14d515e13f15a3f66f66a0a72809cf731eb8b7a
|
7
|
+
data.tar.gz: 877fdae6ba5e16e5a3b6920af4759b88cd5288d42ecf65d6bf6ba1dae7a4e83fe9bae5fac6594216c8258669245ef740c99bb33557a34838dcf4d57ffeecd72b
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
# 3.0.0
|
2
|
+
|
3
|
+
* Enhancements
|
4
|
+
* Now leverages the Berkshelf version installed by ChefDK
|
5
|
+
* Installation process of plugin should be many, many times faster
|
6
|
+
|
7
|
+
* Bug Fixes
|
8
|
+
* Fix many installation issues for Windows users
|
9
|
+
* Fix warning output of berkshelf path when berkshelf is disabled but a Berksfile is present
|
10
|
+
* Ensure default values for configuration are properly set
|
11
|
+
|
1
12
|
# 2.0.1
|
2
13
|
|
3
14
|
* Bug Fixes
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -2,15 +2,14 @@
|
|
2
2
|
|
3
3
|
[](http://badge.fury.io/rb/vagrant-berkshelf)
|
4
4
|
[](https://travis-ci.org/berkshelf/vagrant-berkshelf)
|
5
|
-
[](https://gemnasium.com/berkshelf/vagrant-berkshelf)
|
6
5
|
|
7
6
|
A Vagrant plugin to add Berkshelf integration to the Chef provisioners
|
8
7
|
|
9
8
|
## Installation
|
10
9
|
|
11
|
-
|
12
|
-
|
13
|
-
Install the Vagrant Berkshelf plugin
|
10
|
+
1. Install [Vagrant](http://www.vagrantup.com/downloads.html) ">= 1.5.2"
|
11
|
+
2. Install [ChefDK](http://getchef.com/downloads/chef-dk) ">= 0.2.0"
|
12
|
+
3. Install the Vagrant Berkshelf plugin
|
14
13
|
|
15
14
|
$ vagrant plugin install vagrant-berkshelf
|
16
15
|
|
@@ -26,6 +25,13 @@ Once the Vagrant Berkshelf plugin is installed it can be enabled in your Vagrant
|
|
26
25
|
|
27
26
|
The plugin will look in your current working directory for your `Berksfile` by default. Just ensure that your Berksfile exists and when you run `vagrant up`, `vagrant provision`, or `vagrant destroy` the Berkshelf integration will automatically kick in!
|
28
27
|
|
28
|
+
> The Vagrant Berkshelf plugin does not support multi-machine Vagrantfiles.
|
29
|
+
|
30
|
+
## Getting Help
|
31
|
+
|
32
|
+
* If you have an issue: report it on the [issue tracker](https://github.com/berkshelf/berkshelf/issues)
|
33
|
+
* If you have a question: visit the #chef or #berkshelf channel on irc.freenode.net
|
34
|
+
|
29
35
|
# Authors
|
30
36
|
|
31
37
|
- Jamie Winsor (<jamie@vialstudios.com>)
|
data/integration/Gemfile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# -*- mode: ruby -*-
|
2
|
+
# vi: set ft=ruby :
|
3
|
+
Vagrant.require_version ">= 1.5.0"
|
4
|
+
|
5
|
+
Vagrant.configure("2") do |config|
|
6
|
+
config.vm.hostname = "vagrant-builder-int"
|
7
|
+
config.vm.box = "opscode-ubuntu-14.04"
|
8
|
+
config.vm.box_url = "https://vagrantcloud.com/chef/ubuntu-14.04/version/1/provider/virtualbox.box"
|
9
|
+
|
10
|
+
config.vm.network :private_network, type: "dhcp"
|
11
|
+
|
12
|
+
config.omnibus.chef_version = :latest
|
13
|
+
|
14
|
+
config.vm.provision :chef_client do |chef|
|
15
|
+
chef.chef_server_url = "https://api.opscode.com/organizations/undeadlabs"
|
16
|
+
chef.validation_key_path = File.expand_path("~/.chef/undeadlabs-validator.pem")
|
17
|
+
chef.run_list = ["apt::default"]
|
18
|
+
end
|
19
|
+
end
|
@@ -23,50 +23,46 @@ module Berkshelf
|
|
23
23
|
return @app.call(env)
|
24
24
|
end
|
25
25
|
|
26
|
-
opts = env[:machine].config.berkshelf.to_hash.symbolize_keys
|
27
|
-
opts.delete(:except) if opts[:except].empty?
|
28
|
-
opts.delete(:only) if opts[:only].empty?
|
29
|
-
env[:berkshelf].berksfile = Berkshelf::Berksfile.from_file(berksfile_path(env), opts)
|
30
|
-
|
31
26
|
if chef_solo?(env)
|
32
|
-
|
27
|
+
vendor(env)
|
33
28
|
end
|
34
29
|
|
35
30
|
@app.call(env)
|
36
|
-
rescue
|
37
|
-
raise Berkshelf::VagrantWrapperError.new(
|
31
|
+
rescue => ex
|
32
|
+
raise Berkshelf::VagrantWrapperError.new(ex)
|
38
33
|
end
|
39
34
|
|
40
35
|
private
|
41
36
|
|
42
|
-
def
|
37
|
+
def vendor(env)
|
43
38
|
check_vagrant_version(env)
|
44
39
|
env[:berkshelf].ui.info "Updating Vagrant's berkshelf: '#{env[:berkshelf].shelf}'"
|
45
40
|
FileUtils.rm_rf(env[:berkshelf].shelf)
|
46
41
|
|
47
|
-
env[:
|
42
|
+
opts = env[:machine].config.berkshelf.to_hash
|
43
|
+
berks_opts = { berksfile: opts[:berksfile_path] }
|
44
|
+
berks_opts[:except] = opts[:except] if opts.has_key?(:except) && !opts[:except].empty?
|
45
|
+
berks_opts[:only] = opts[:only] if opts.has_key?(:only) && !opts[:only].empty?
|
46
|
+
|
47
|
+
env[:berkshelf].ui.info berks("vendor", env[:berkshelf].shelf, berks_opts)
|
48
48
|
end
|
49
49
|
|
50
50
|
def warn_disabled_but_berksfile_exists(env)
|
51
51
|
env[:berkshelf].ui.warn "Berkshelf plugin is disabled but a Berksfile was found at" +
|
52
|
-
" your configured path: #{env
|
52
|
+
" your configured path: #{berksfile_path(env)}"
|
53
53
|
env[:berkshelf].ui.warn "Enable the Berkshelf plugin by setting 'config.berkshelf.enabled = true'" +
|
54
54
|
" in your vagrant config"
|
55
55
|
end
|
56
56
|
|
57
57
|
def check_vagrant_version(env)
|
58
58
|
unless vagrant_version_satisfies?(">= 1.5")
|
59
|
-
raise
|
59
|
+
raise UnsupportedVagrantVersion.new(">= 1.5")
|
60
60
|
end
|
61
61
|
end
|
62
62
|
|
63
63
|
def vagrant_version_satisfies?(requirements)
|
64
64
|
Gem::Requirement.new(requirements).satisfied_by? Gem::Version.new(::Vagrant::VERSION)
|
65
65
|
end
|
66
|
-
|
67
|
-
def berksfile_path(env)
|
68
|
-
env[:machine].env.vagrantfile.config.berkshelf.berksfile_path
|
69
|
-
end
|
70
66
|
end
|
71
67
|
end
|
72
68
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'tempfile'
|
2
|
+
|
1
3
|
module Berkshelf
|
2
4
|
module Vagrant
|
3
5
|
module Action
|
@@ -22,25 +24,27 @@ module Berkshelf
|
|
22
24
|
end
|
23
25
|
|
24
26
|
@app.call(env)
|
25
|
-
rescue Berkshelf::BerkshelfError => e
|
26
|
-
raise Berkshelf::VagrantWrapperError.new(e)
|
27
27
|
end
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def upload(env)
|
32
32
|
provisioners(:chef_client, env).each do |provisioner|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
33
|
+
begin
|
34
|
+
# Temporarily generate a berkshelf configuration to pass to the CLI since not all versions
|
35
|
+
# of the CLI allow overriding all options needed for upload.
|
36
|
+
tmp_config = Tempfile.new("berks-config")
|
37
|
+
config = BerksConfig.instance.dup
|
38
|
+
config[:chef][:chef_server_url] = provisioner.config.chef_server_url
|
39
|
+
tmp_config.write(config.to_json)
|
40
|
+
tmp_config.flush
|
41
|
+
|
42
|
+
env[:berkshelf].ui.info "Uploading cookbooks to '#{provisioner.config.chef_server_url}'"
|
43
|
+
berks("upload", config: tmp_config.path, berksfile: berksfile_path(env), force: true,
|
44
|
+
freeze: false)
|
45
|
+
ensure
|
46
|
+
tmp_config.close! unless tmp_config.nil?
|
47
|
+
end
|
44
48
|
end
|
45
49
|
end
|
46
50
|
end
|
@@ -8,7 +8,6 @@ module Berkshelf
|
|
8
8
|
require_relative 'action/configure_chef'
|
9
9
|
require_relative 'action/install'
|
10
10
|
require_relative 'action/load_shelf'
|
11
|
-
require_relative 'action/set_ui'
|
12
11
|
require_relative 'action/upload'
|
13
12
|
|
14
13
|
class << self
|
@@ -55,7 +54,6 @@ module Berkshelf
|
|
55
54
|
def setup
|
56
55
|
@setup ||= ::Vagrant::Action::Builder.new.tap do |b|
|
57
56
|
b.use ::Vagrant::Action::Builtin::EnvSet, berkshelf: Berkshelf::Vagrant::Env.new
|
58
|
-
b.use Berkshelf::Vagrant::Action::SetUI
|
59
57
|
b.use Berkshelf::Vagrant::Action::LoadShelf
|
60
58
|
b.use Berkshelf::Vagrant::Action::ConfigureChef
|
61
59
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'vagrant/util/hash_with_indifferent_access'
|
2
|
+
|
3
|
+
module Berkshelf::Vagrant
|
4
|
+
class BerksConfig < ::Vagrant::Util::HashWithIndifferentAccess
|
5
|
+
class << self
|
6
|
+
# @return [String]
|
7
|
+
def store_location
|
8
|
+
File.join(Berkshelf.berkshelf_path, 'config.json')
|
9
|
+
end
|
10
|
+
|
11
|
+
# @return [String]
|
12
|
+
def local_location
|
13
|
+
ENV['BERKSHELF_CONFIG'] || File.join('.', '.berkshelf', 'config.json')
|
14
|
+
end
|
15
|
+
|
16
|
+
# @return [String]
|
17
|
+
def path
|
18
|
+
path = File.exists?(local_location) ? local_location : store_location
|
19
|
+
File.expand_path(path)
|
20
|
+
end
|
21
|
+
|
22
|
+
# @return [String, nil]
|
23
|
+
# the contents of the file
|
24
|
+
def file
|
25
|
+
File.read(path) if File.exists?(path)
|
26
|
+
end
|
27
|
+
|
28
|
+
def from_json(path)
|
29
|
+
JSON.parse(File.read(path))
|
30
|
+
end
|
31
|
+
|
32
|
+
# Instantiate and return or just return the currently instantiated Berkshelf
|
33
|
+
# configuration
|
34
|
+
#
|
35
|
+
# @return [Config]
|
36
|
+
def instance
|
37
|
+
@instance ||= if file
|
38
|
+
from_json file
|
39
|
+
else
|
40
|
+
new
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def initialize
|
46
|
+
super(chef: ChefConfig.instance, ssl: ::Vagrant::Util::HashWithIndifferentAccess.new(verify: false))
|
47
|
+
end
|
48
|
+
|
49
|
+
def chef
|
50
|
+
self[:chef]
|
51
|
+
end
|
52
|
+
|
53
|
+
def ssl
|
54
|
+
self[:ssl]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require 'vagrant/util/hash_with_indifferent_access'
|
2
|
+
require 'pathname'
|
3
|
+
|
4
|
+
module Berkshelf::Vagrant
|
5
|
+
class ChefConfig < ::Vagrant::Util::HashWithIndifferentAccess
|
6
|
+
class << self
|
7
|
+
# Return the most sensible path to the Chef configuration file. This can
|
8
|
+
# be configured by setting a value for the 'CHEF_CONFIG' environment
|
9
|
+
# variable.
|
10
|
+
#
|
11
|
+
# @return [String, nil]
|
12
|
+
def location
|
13
|
+
possibles = []
|
14
|
+
|
15
|
+
possibles << ENV['CHEF_CONFIG'] if ENV['CHEF_CONFIG']
|
16
|
+
possibles << File.join(ENV['KNIFE_HOME'], 'knife.rb') if ENV['KNIFE_HOME']
|
17
|
+
possibles << File.join(Dir.pwd, 'knife.rb')
|
18
|
+
|
19
|
+
# Ascending search for .chef directory siblings
|
20
|
+
Pathname.new(Dir.pwd).ascend do |file|
|
21
|
+
sibling_chef = File.join(file, '.chef')
|
22
|
+
possibles << File.join(sibling_chef, 'knife.rb')
|
23
|
+
end
|
24
|
+
|
25
|
+
possibles << File.join(ENV['HOME'], '.chef', 'knife.rb') if ENV['HOME']
|
26
|
+
possibles.compact!
|
27
|
+
|
28
|
+
location = possibles.find { |loc| File.exists?(File.expand_path(loc)) }
|
29
|
+
|
30
|
+
File.expand_path(location) unless location.nil?
|
31
|
+
end
|
32
|
+
|
33
|
+
def instance
|
34
|
+
@instance ||= from_file(location)
|
35
|
+
end
|
36
|
+
|
37
|
+
def from_file(file = nil)
|
38
|
+
file = file.nil? ? location : file
|
39
|
+
if !file.nil? && File.exist?(file) && File.readable?(file)
|
40
|
+
contents = File.read(file)
|
41
|
+
return parse(contents, file)
|
42
|
+
end
|
43
|
+
|
44
|
+
new
|
45
|
+
end
|
46
|
+
|
47
|
+
def parse(contents, path = nil)
|
48
|
+
new(contents, path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize(contents = "", path = "")
|
53
|
+
instance_eval(contents, path)
|
54
|
+
end
|
55
|
+
|
56
|
+
def chef_server_url(value = nil)
|
57
|
+
set_or_return(:chef_server_url, value)
|
58
|
+
end
|
59
|
+
|
60
|
+
def client_key(value = nil)
|
61
|
+
set_or_return(:client_key, value)
|
62
|
+
end
|
63
|
+
|
64
|
+
def node_name(value = nil)
|
65
|
+
set_or_return(:node_name, value)
|
66
|
+
end
|
67
|
+
|
68
|
+
def method_missing(m, *args, &block)
|
69
|
+
Proxy.new
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def set_or_return(key, value)
|
75
|
+
if value.nil?
|
76
|
+
return self[key]
|
77
|
+
else
|
78
|
+
self[key] = value
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
class Proxy
|
83
|
+
def method_missing(m, *args, &block)
|
84
|
+
self
|
85
|
+
end
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'vagrant/util/hash_with_indifferent_access'
|
2
|
+
|
1
3
|
module Berkshelf
|
2
4
|
module Vagrant
|
3
5
|
class Config < ::Vagrant.plugin("2", :config)
|
@@ -32,12 +34,17 @@ module Berkshelf
|
|
32
34
|
def initialize
|
33
35
|
super
|
34
36
|
|
35
|
-
@berksfile_path =
|
37
|
+
@berksfile_path = UNSET_VALUE
|
36
38
|
@except = Array.new
|
37
39
|
@only = Array.new
|
38
|
-
@node_name =
|
39
|
-
@client_key =
|
40
|
-
@enabled =
|
40
|
+
@node_name = BerksConfig.instance.chef[:node_name]
|
41
|
+
@client_key = BerksConfig.instance.chef[:client_key]
|
42
|
+
@enabled = UNSET_VALUE
|
43
|
+
end
|
44
|
+
|
45
|
+
def finalize!
|
46
|
+
@berksfile_path = File.join(Dir.pwd, "Berksfile") if @berksfile_path == UNSET_VALUE
|
47
|
+
@enabled = File.exist?(@berksfile_path) if @enabled == UNSET_VALUE
|
41
48
|
end
|
42
49
|
|
43
50
|
# @param [String] value
|
@@ -50,12 +57,18 @@ module Berkshelf
|
|
50
57
|
@client_key = value
|
51
58
|
end
|
52
59
|
|
53
|
-
|
60
|
+
def to_hash
|
61
|
+
::Vagrant::Util::HashWithIndifferentAccess.new(instance_variables_hash)
|
62
|
+
end
|
54
63
|
|
55
64
|
def validate(machine)
|
56
|
-
@berksfile_path = File.expand_path(@berksfile_path, machine.env.root_path.to_s)
|
57
|
-
@client_key = File.expand_path(@client_key, machine.env.root_path.to_s)
|
58
65
|
errors = Array.new
|
66
|
+
unless @berksfile_path.nil?
|
67
|
+
@berksfile_path = File.expand_path(@berksfile_path, machine.env.root_path.to_s)
|
68
|
+
end
|
69
|
+
unless @client_key.nil?
|
70
|
+
@client_key = File.expand_path(@client_key, machine.env.root_path.to_s)
|
71
|
+
end
|
59
72
|
|
60
73
|
unless [TrueClass, FalseClass].include?(enabled.class)
|
61
74
|
errors << "A value for berkshelf.enabled can be true or false."
|
@@ -76,16 +89,18 @@ module Berkshelf
|
|
76
89
|
|
77
90
|
if global_provisioners(machine).any? { |prov| prov.name == :chef_client }
|
78
91
|
if machine.config.berkshelf.node_name.nil?
|
79
|
-
errors << "A configuration must be set
|
92
|
+
errors << "A configuration must be set node_name when using the chef_client provisioner." +
|
93
|
+
" Edit your berkshelf configuration and add a value for chef.node_name."
|
80
94
|
end
|
81
95
|
|
82
96
|
if machine.config.berkshelf.client_key.nil?
|
83
|
-
errors << "A configuration must be set for
|
97
|
+
errors << "A configuration must be set for client_key when using the chef_client provisioner." +
|
98
|
+
" Edit your berkshelf configuration and add a value for chef.client_key."
|
84
99
|
end
|
85
100
|
end
|
86
101
|
end
|
87
102
|
|
88
|
-
{
|
103
|
+
{"berkshelf configuration" => errors}
|
89
104
|
end
|
90
105
|
|
91
106
|
private
|
@@ -4,17 +4,12 @@ module Berkshelf
|
|
4
4
|
class Env
|
5
5
|
# @return [Vagrant::UI::Colored]
|
6
6
|
attr_accessor :ui
|
7
|
-
# @return [Berkshelf::Berksfile]
|
8
|
-
attr_accessor :berksfile
|
9
7
|
# @return [String]
|
10
8
|
attr_accessor :shelf
|
11
|
-
# @return [Berkshelf::Config]
|
12
|
-
attr_accessor :config
|
13
9
|
|
14
10
|
def initialize
|
15
|
-
@ui
|
11
|
+
@ui = ::Vagrant::UI::Colored.new
|
16
12
|
@ui.opts[:target] = 'Berkshelf'
|
17
|
-
@config = Berkshelf::Config.instance
|
18
13
|
end
|
19
14
|
end
|
20
15
|
end
|
@@ -1,7 +1,47 @@
|
|
1
|
+
require 'buff/shell_out'
|
2
|
+
require 'json'
|
3
|
+
require 'vagrant/util/which'
|
4
|
+
|
1
5
|
module Berkshelf
|
2
6
|
module Vagrant
|
3
7
|
# A module of common helper functions that can be mixed into Berkshelf::Vagrant actions
|
4
8
|
module EnvHelpers
|
9
|
+
BERKS_CONSTRAINT = ">= 3.0.0"
|
10
|
+
|
11
|
+
include Buff::ShellOut
|
12
|
+
include ::Vagrant::Util
|
13
|
+
|
14
|
+
# Execute a berkshelf command with the given arguments and flags.
|
15
|
+
#
|
16
|
+
# @overload berks(command, args)
|
17
|
+
# @param [String] berks CLI command to run
|
18
|
+
# @param [Object] any number of arguments to pass to CLI
|
19
|
+
# @overload berks(command, args, options)
|
20
|
+
# @param [String] berks CLI command to run
|
21
|
+
# @param [Object] any number of arguments to pass to CLI
|
22
|
+
# @param [Hash] options to convert to flags for the CLI
|
23
|
+
#
|
24
|
+
# @return [String]
|
25
|
+
# output of the command
|
26
|
+
#
|
27
|
+
# @raise [UnsupportedBerksVersion]
|
28
|
+
# version of Berks installed does not satisfy the application's constraint
|
29
|
+
# @raise [BerksNotFound]
|
30
|
+
# berks command is not found in the user's path
|
31
|
+
# @raise [BerksError]
|
32
|
+
# CLI command failed
|
33
|
+
def berks(command, *args)
|
34
|
+
if defined?(Bundler)
|
35
|
+
Bundler.with_clean_env { run_berks(command, *args) }
|
36
|
+
else
|
37
|
+
run_berks(command, *args)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def berksfile_path(env)
|
42
|
+
env[:machine].env.vagrantfile.config.berkshelf.berksfile_path
|
43
|
+
end
|
44
|
+
|
5
45
|
# A file to persist vagrant-berkshelf specific information in between
|
6
46
|
# Vagrant runs.
|
7
47
|
#
|
@@ -57,6 +97,64 @@ module Berkshelf
|
|
57
97
|
def provision_disabled?(env)
|
58
98
|
env.has_key?(:provision_enabled) && !env[:provision_enabled]
|
59
99
|
end
|
100
|
+
|
101
|
+
private
|
102
|
+
|
103
|
+
def berks_version_check!
|
104
|
+
if (exec = Which.which("berks")).nil?
|
105
|
+
raise BerksNotFound
|
106
|
+
end
|
107
|
+
|
108
|
+
unless (response = shell_out("#{exec} version -F json")).success?
|
109
|
+
raise "Couldn't determine Berks version: #{response.inspect}"
|
110
|
+
end
|
111
|
+
|
112
|
+
begin
|
113
|
+
version = Gem::Version.new(JSON.parse(response.stdout)["version"])
|
114
|
+
Gem::Requirement.new(BERKS_CONSTRAINT).satisfied_by?(version)
|
115
|
+
exec
|
116
|
+
rescue => ex
|
117
|
+
raise UnsupportedBerksVersion.new(exec, BERKS_CONSTRAINT, version)
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def options_to_flags(opts)
|
122
|
+
opts.map do |key, value|
|
123
|
+
if value.is_a?(TrueClass)
|
124
|
+
"--#{key_to_flag(key)}"
|
125
|
+
next
|
126
|
+
end
|
127
|
+
|
128
|
+
if value.is_a?(FalseClass)
|
129
|
+
"--no-#{key_to_flag(key)}"
|
130
|
+
next
|
131
|
+
end
|
132
|
+
|
133
|
+
if value.is_a?(Array)
|
134
|
+
"--#{key_to_flag(key)}=#{value.join(" ")}"
|
135
|
+
next
|
136
|
+
end
|
137
|
+
|
138
|
+
"--#{key_to_flag(key)}=#{value}"
|
139
|
+
end.join(" ")
|
140
|
+
end
|
141
|
+
|
142
|
+
def run_berks(command, *args)
|
143
|
+
exec = berks_version_check!
|
144
|
+
options = args.last.is_a?(Hash) ? args.pop : Hash.new
|
145
|
+
arguments = args.join(" ")
|
146
|
+
flags = options_to_flags(options)
|
147
|
+
|
148
|
+
command = "#{exec} #{command} #{arguments} #{flags}"
|
149
|
+
unless (response = shell_out(command)).success?
|
150
|
+
raise BerksError.new("Berks command Failed: #{command}, reason: #{response.stderr}")
|
151
|
+
end
|
152
|
+
response.stdout
|
153
|
+
end
|
154
|
+
|
155
|
+
def key_to_flag(key)
|
156
|
+
"#{key.to_s.gsub("_", "-")}"
|
157
|
+
end
|
60
158
|
end
|
61
159
|
end
|
62
160
|
end
|
@@ -28,4 +28,44 @@ module Berkshelf
|
|
28
28
|
original.send(fun, *args, &block)
|
29
29
|
end
|
30
30
|
end
|
31
|
+
|
32
|
+
class BerksError < ::Vagrant::Errors::VagrantError
|
33
|
+
attr_reader :error_message
|
34
|
+
|
35
|
+
def initialize(message)
|
36
|
+
@error_message = message
|
37
|
+
super
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
class BerksNotFound < ::Vagrant::Errors::VagrantError
|
42
|
+
def error_message
|
43
|
+
"Berks not found. Download the ChefDK from http://downloads.getchef.com/chef-dk and add it to your $PATH."
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class UnsupportedBerksVersion < ::Vagrant::Errors::VagrantError
|
48
|
+
def initialize(bin, constraint, version)
|
49
|
+
@bin = bin
|
50
|
+
@constraint = constraint
|
51
|
+
@version = version
|
52
|
+
super
|
53
|
+
end
|
54
|
+
|
55
|
+
def error_message
|
56
|
+
"Unsupported Berkshelf version at: #{@bin}. Requires #{@constraint} and got #{@version}." +
|
57
|
+
" Download the latest version of the ChefDK from http://downloads.getchef.com/chef-dk and add it to your $PATH."
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
class UnsupportedVagrantVersion < ::Vagrant::Errors::VagrantError
|
62
|
+
def initialize(constraint)
|
63
|
+
@constraint = constraint
|
64
|
+
super
|
65
|
+
end
|
66
|
+
|
67
|
+
def error_message
|
68
|
+
"vagrant-berkshelf requires Vagrant #{@constraint}."
|
69
|
+
end
|
70
|
+
end
|
31
71
|
end
|
data/lib/berkshelf/vagrant.rb
CHANGED
@@ -4,7 +4,6 @@ rescue LoadError
|
|
4
4
|
raise 'The Vagrant Berkshelf plugin must be run within Vagrant.'
|
5
5
|
end
|
6
6
|
|
7
|
-
require 'berkshelf'
|
8
7
|
require 'fileutils'
|
9
8
|
require 'json'
|
10
9
|
require 'tmpdir'
|
@@ -13,7 +12,22 @@ require_relative 'vagrant/errors'
|
|
13
12
|
require_relative 'vagrant/version'
|
14
13
|
|
15
14
|
module Berkshelf
|
15
|
+
class << self
|
16
|
+
# Returns the filepath to the location Berkshelf will use for
|
17
|
+
# storage; temp files will go here, Cookbooks will be downloaded
|
18
|
+
# to or uploaded from here. By default this is '~/.berkshelf' but
|
19
|
+
# can be overridden by specifying a value for the ENV variable
|
20
|
+
# 'BERKSHELF_PATH'.
|
21
|
+
#
|
22
|
+
# @return [String]
|
23
|
+
def berkshelf_path
|
24
|
+
ENV['BERKSHELF_PATH'] || File.expand_path('~/.berkshelf')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
16
28
|
module Vagrant
|
29
|
+
require_relative 'vagrant/chef_config'
|
30
|
+
require_relative 'vagrant/berks_config'
|
17
31
|
require_relative 'vagrant/action'
|
18
32
|
require_relative 'vagrant/config'
|
19
33
|
require_relative 'vagrant/env'
|
@@ -35,7 +49,6 @@ module Berkshelf
|
|
35
49
|
# @return [String]
|
36
50
|
# path to the generated shelf
|
37
51
|
def mkshelf(machine_name = nil)
|
38
|
-
|
39
52
|
unless File.exist?(shelf_path)
|
40
53
|
FileUtils.mkdir_p(shelf_path)
|
41
54
|
end
|
@@ -2,7 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Berkshelf::Vagrant::Config do
|
4
4
|
let(:unset_value) { described_class::UNSET_VALUE }
|
5
|
-
|
5
|
+
subject { described_class.new.tap {|s| s.finalize! } }
|
6
6
|
|
7
7
|
it "sets a path to a Berksfile in the current working directory for berksfile_path" do
|
8
8
|
subject.berksfile_path.should eql(File.join(Dir.pwd, "Berksfile"))
|
@@ -14,7 +14,7 @@ describe Berkshelf::Vagrant::Config do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
it "it sets the value of enabled to true" do
|
17
|
-
|
17
|
+
subject.enabled.should be true
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
@@ -24,7 +24,7 @@ describe Berkshelf::Vagrant::Config do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
it "set the value of enabled to false" do
|
27
|
-
|
27
|
+
subject.enabled.should be false
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -38,12 +38,12 @@ describe Berkshelf::Vagrant::Config do
|
|
38
38
|
subject.except.should be_empty
|
39
39
|
end
|
40
40
|
|
41
|
-
it "sets the value of node_name to the value in the Berkshelf::
|
42
|
-
subject.node_name.should eql(Berkshelf::
|
41
|
+
it "sets the value of node_name to the value in the Berkshelf::Vagrant::BerksConfig.instance" do
|
42
|
+
subject.node_name.should eql(Berkshelf::Vagrant::BerksConfig.instance.chef.node_name)
|
43
43
|
end
|
44
44
|
|
45
|
-
it "sets the value of client_key to the value in Berkshelf::
|
46
|
-
subject.client_key.should eql(Berkshelf::
|
45
|
+
it "sets the value of client_key to the value in Berkshelf::Vagrant::BerksConfig.instance" do
|
46
|
+
subject.client_key.should eql(Berkshelf::Vagrant::BerksConfig.instance.chef.client_key)
|
47
47
|
end
|
48
48
|
|
49
49
|
describe "#validate" do
|
@@ -13,7 +13,6 @@ describe Berkshelf::Vagrant do
|
|
13
13
|
end
|
14
14
|
|
15
15
|
describe "::mkshelf" do
|
16
|
-
|
17
16
|
it "returns a String" do
|
18
17
|
subject.mkshelf().should be_a(String)
|
19
18
|
end
|
@@ -27,7 +26,6 @@ describe Berkshelf::Vagrant do
|
|
27
26
|
machine_name = 'fantastic_machine'
|
28
27
|
subject.mkshelf(machine_name).should include(machine_name)
|
29
28
|
end
|
30
|
-
|
31
29
|
end
|
32
30
|
end
|
33
31
|
end
|
data/vagrant-berkshelf.gemspec
CHANGED
@@ -19,9 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.require_paths = ['lib']
|
20
20
|
spec.required_ruby_version = '>= 1.9.1'
|
21
21
|
|
22
|
-
spec.
|
23
|
-
|
24
|
-
|
22
|
+
spec.post_install_message = "In order to use the Vagrant-Berkshelf plugin, you must have ChefDK installed.\n" +
|
23
|
+
"To download the latest ChefDK visit http://getchef.com/downloads/chef-dk."
|
24
|
+
|
25
|
+
spec.add_dependency "buff-shell_out"
|
25
26
|
|
26
27
|
spec.add_development_dependency 'spork', '~> 0.9'
|
27
28
|
spec.add_development_dependency 'rspec', '~> 2.13'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vagrant-berkshelf
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 3.0.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamie Winsor
|
@@ -9,50 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-
|
12
|
+
date: 2014-07-23 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
15
|
+
name: buff-shell_out
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version: '
|
20
|
+
version: '0'
|
21
21
|
type: :runtime
|
22
22
|
prerelease: false
|
23
23
|
version_requirements: !ruby/object:Gem::Requirement
|
24
24
|
requirements:
|
25
|
-
- - "
|
26
|
-
- !ruby/object:Gem::Version
|
27
|
-
version: '3.1'
|
28
|
-
- !ruby/object:Gem::Dependency
|
29
|
-
name: celluloid
|
30
|
-
requirement: !ruby/object:Gem::Requirement
|
31
|
-
requirements:
|
32
|
-
- - "~>"
|
33
|
-
- !ruby/object:Gem::Version
|
34
|
-
version: 0.16.0.pre
|
35
|
-
type: :runtime
|
36
|
-
prerelease: false
|
37
|
-
version_requirements: !ruby/object:Gem::Requirement
|
38
|
-
requirements:
|
39
|
-
- - "~>"
|
25
|
+
- - ">="
|
40
26
|
- !ruby/object:Gem::Version
|
41
|
-
version: 0
|
42
|
-
- !ruby/object:Gem::Dependency
|
43
|
-
name: celluloid-io
|
44
|
-
requirement: !ruby/object:Gem::Requirement
|
45
|
-
requirements:
|
46
|
-
- - "~>"
|
47
|
-
- !ruby/object:Gem::Version
|
48
|
-
version: 0.16.0.pre
|
49
|
-
type: :runtime
|
50
|
-
prerelease: false
|
51
|
-
version_requirements: !ruby/object:Gem::Requirement
|
52
|
-
requirements:
|
53
|
-
- - "~>"
|
54
|
-
- !ruby/object:Gem::Version
|
55
|
-
version: 0.16.0.pre
|
27
|
+
version: '0'
|
56
28
|
- !ruby/object:Gem::Dependency
|
57
29
|
name: spork
|
58
30
|
requirement: !ruby/object:Gem::Requirement
|
@@ -112,14 +84,18 @@ files:
|
|
112
84
|
- LICENSE.txt
|
113
85
|
- README.md
|
114
86
|
- Thorfile
|
87
|
+
- integration/Berksfile
|
88
|
+
- integration/Gemfile
|
89
|
+
- integration/Vagrantfile
|
115
90
|
- lib/berkshelf/vagrant.rb
|
116
91
|
- lib/berkshelf/vagrant/action.rb
|
117
92
|
- lib/berkshelf/vagrant/action/clean.rb
|
118
93
|
- lib/berkshelf/vagrant/action/configure_chef.rb
|
119
94
|
- lib/berkshelf/vagrant/action/install.rb
|
120
95
|
- lib/berkshelf/vagrant/action/load_shelf.rb
|
121
|
-
- lib/berkshelf/vagrant/action/set_ui.rb
|
122
96
|
- lib/berkshelf/vagrant/action/upload.rb
|
97
|
+
- lib/berkshelf/vagrant/berks_config.rb
|
98
|
+
- lib/berkshelf/vagrant/chef_config.rb
|
123
99
|
- lib/berkshelf/vagrant/config.rb
|
124
100
|
- lib/berkshelf/vagrant/env.rb
|
125
101
|
- lib/berkshelf/vagrant/env_helpers.rb
|
@@ -136,7 +112,9 @@ homepage: http://berkshelf.com
|
|
136
112
|
licenses:
|
137
113
|
- Apache 2.0
|
138
114
|
metadata: {}
|
139
|
-
post_install_message:
|
115
|
+
post_install_message: |-
|
116
|
+
In order to use the Vagrant-Berkshelf plugin, you must have ChefDK installed.
|
117
|
+
To download the latest ChefDK visit http://getchef.com/downloads/chef-dk.
|
140
118
|
rdoc_options: []
|
141
119
|
require_paths:
|
142
120
|
- lib
|
@@ -147,9 +125,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
147
125
|
version: 1.9.1
|
148
126
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
149
127
|
requirements:
|
150
|
-
- - "
|
128
|
+
- - ">"
|
151
129
|
- !ruby/object:Gem::Version
|
152
|
-
version:
|
130
|
+
version: 1.3.1
|
153
131
|
requirements: []
|
154
132
|
rubyforge_project:
|
155
133
|
rubygems_version: 2.2.2
|