vagrant-berkshelf 2.0.1 → 3.0.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
[![Gem Version](https://badge.fury.io/rb/vagrant-berkshelf.png)](http://badge.fury.io/rb/vagrant-berkshelf)
|
4
4
|
[![Build Status](https://travis-ci.org/berkshelf/vagrant-berkshelf.png?branch=master)](https://travis-ci.org/berkshelf/vagrant-berkshelf)
|
5
|
-
[![Dependency Status](https://gemnasium.com/berkshelf/vagrant-berkshelf.png)](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
|