vagrant-berkshelf 3.0.1 → 4.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +36 -17
- data/.travis.yml +6 -4
- data/CONTRIBUTING.md +4 -4
- data/Gemfile +2 -2
- data/{LICENSE.txt → LICENSE} +1 -1
- data/README.md +67 -24
- data/Rakefile +14 -0
- data/lib/vagrant-berkshelf.rb +17 -1
- data/lib/vagrant-berkshelf/action/base.rb +48 -0
- data/lib/vagrant-berkshelf/action/check.rb +44 -0
- data/lib/vagrant-berkshelf/action/clean.rb +29 -0
- data/lib/vagrant-berkshelf/action/install.rb +35 -0
- data/lib/vagrant-berkshelf/action/load.rb +59 -0
- data/lib/vagrant-berkshelf/action/share.rb +38 -0
- data/lib/vagrant-berkshelf/action/upload.rb +99 -0
- data/lib/vagrant-berkshelf/config.rb +87 -0
- data/lib/vagrant-berkshelf/env.rb +14 -0
- data/lib/vagrant-berkshelf/errors.rb +79 -0
- data/lib/vagrant-berkshelf/helpers.rb +180 -0
- data/lib/vagrant-berkshelf/plugin.rb +40 -0
- data/lib/vagrant-berkshelf/version.rb +5 -0
- data/spec/spec_helper.rb +1 -4
- data/spec/unit/vagrant-berkshelf/config_spec.rb +119 -0
- data/vagrant-berkshelf.gemspec +26 -14
- metadata +35 -52
- data/Thorfile +0 -59
- data/integration/Berksfile +0 -3
- data/integration/Gemfile +0 -10
- data/integration/Vagrantfile +0 -19
- data/lib/berkshelf/vagrant.rb +0 -68
- data/lib/berkshelf/vagrant/action.rb +0 -64
- data/lib/berkshelf/vagrant/action/clean.rb +0 -27
- data/lib/berkshelf/vagrant/action/configure_chef.rb +0 -27
- data/lib/berkshelf/vagrant/action/install.rb +0 -69
- data/lib/berkshelf/vagrant/action/load_shelf.rb +0 -52
- data/lib/berkshelf/vagrant/action/upload.rb +0 -53
- data/lib/berkshelf/vagrant/berks_config.rb +0 -48
- data/lib/berkshelf/vagrant/chef_config.rb +0 -88
- data/lib/berkshelf/vagrant/config.rb +0 -113
- data/lib/berkshelf/vagrant/env.rb +0 -16
- data/lib/berkshelf/vagrant/env_helpers.rb +0 -160
- data/lib/berkshelf/vagrant/errors.rb +0 -71
- data/lib/berkshelf/vagrant/plugin.rb +0 -41
- data/lib/berkshelf/vagrant/version.rb +0 -5
- data/spec/unit/berkshelf/vagrant/config_spec.rb +0 -97
- data/spec/unit/berkshelf/vagrant/errors_spec.rb +0 -12
- data/spec/unit/berkshelf/vagrant_spec.rb +0 -31
@@ -1,88 +0,0 @@
|
|
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,113 +0,0 @@
|
|
1
|
-
require 'vagrant/util/hash_with_indifferent_access'
|
2
|
-
|
3
|
-
module Berkshelf
|
4
|
-
module Vagrant
|
5
|
-
class Config < ::Vagrant.plugin("2", :config)
|
6
|
-
# @return [String]
|
7
|
-
# path to the Berksfile to use with Vagrant
|
8
|
-
attr_reader :berksfile_path
|
9
|
-
|
10
|
-
# @return [Boolean]
|
11
|
-
# disable of use Berks in Vagrant
|
12
|
-
attr_accessor :enabled
|
13
|
-
|
14
|
-
# @return [Array<Symbol>]
|
15
|
-
# only cookbooks in these groups will be installed and copied to
|
16
|
-
# Vagrant's shelf
|
17
|
-
attr_accessor :only
|
18
|
-
|
19
|
-
# @return [Array<Symbol>]
|
20
|
-
# cookbooks in all other groups except for these will be installed
|
21
|
-
# and copied to Vagrant's shelf
|
22
|
-
attr_accessor :except
|
23
|
-
|
24
|
-
# @return [String]
|
25
|
-
# the Chef node name (client name) to use to authenticate with the remote
|
26
|
-
# chef server to upload cookbooks when using the chef client provisioner
|
27
|
-
attr_accessor :node_name
|
28
|
-
|
29
|
-
# @return [String]
|
30
|
-
# a filepath to a chef client key to use to authenticate with the remote
|
31
|
-
# chef server to upload cookbooks when using the chef client provisioner
|
32
|
-
attr_accessor :client_key
|
33
|
-
|
34
|
-
def initialize
|
35
|
-
super
|
36
|
-
|
37
|
-
@berksfile_path = UNSET_VALUE
|
38
|
-
@except = Array.new
|
39
|
-
@only = Array.new
|
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
|
48
|
-
end
|
49
|
-
|
50
|
-
# @param [String] value
|
51
|
-
def berksfile_path=(value)
|
52
|
-
@berksfile_path = value
|
53
|
-
end
|
54
|
-
|
55
|
-
# @param [String] value
|
56
|
-
def client_key=(value)
|
57
|
-
@client_key = value
|
58
|
-
end
|
59
|
-
|
60
|
-
def to_hash
|
61
|
-
::Vagrant::Util::HashWithIndifferentAccess.new(instance_variables_hash)
|
62
|
-
end
|
63
|
-
|
64
|
-
def validate(machine)
|
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
|
72
|
-
|
73
|
-
unless [TrueClass, FalseClass].include?(enabled.class)
|
74
|
-
errors << "A value for berkshelf.enabled can be true or false."
|
75
|
-
end
|
76
|
-
|
77
|
-
if enabled
|
78
|
-
if machine.config.berkshelf.berksfile_path.nil?
|
79
|
-
errors << "berkshelf.berksfile_path cannot be nil."
|
80
|
-
end
|
81
|
-
|
82
|
-
unless File.exist?(machine.config.berkshelf.berksfile_path)
|
83
|
-
errors << "No Berksfile was found at #{machine.config.berkshelf.berksfile_path}."
|
84
|
-
end
|
85
|
-
|
86
|
-
if !except.empty? && !only.empty?
|
87
|
-
errors << "A value for berkshelf.empty and berkshelf.only cannot both be defined."
|
88
|
-
end
|
89
|
-
|
90
|
-
if global_provisioners(machine).any? { |prov| prov.name == :chef_client }
|
91
|
-
if machine.config.berkshelf.node_name.nil?
|
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."
|
94
|
-
end
|
95
|
-
|
96
|
-
if machine.config.berkshelf.client_key.nil?
|
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."
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
{"berkshelf configuration" => errors}
|
104
|
-
end
|
105
|
-
|
106
|
-
private
|
107
|
-
|
108
|
-
def global_provisioners(machine)
|
109
|
-
machine.env.vagrantfile.config.vm.provisioners
|
110
|
-
end
|
111
|
-
end
|
112
|
-
end
|
113
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Berkshelf
|
2
|
-
module Vagrant
|
3
|
-
# Environment data to build up and persist through the middleware chain
|
4
|
-
class Env
|
5
|
-
# @return [Vagrant::UI::Colored]
|
6
|
-
attr_accessor :ui
|
7
|
-
# @return [String]
|
8
|
-
attr_accessor :shelf
|
9
|
-
|
10
|
-
def initialize
|
11
|
-
@ui = ::Vagrant::UI::Colored.new
|
12
|
-
@ui.opts[:target] = 'Berkshelf'
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,160 +0,0 @@
|
|
1
|
-
require 'buff/shell_out'
|
2
|
-
require 'json'
|
3
|
-
require 'vagrant/util/which'
|
4
|
-
|
5
|
-
module Berkshelf
|
6
|
-
module Vagrant
|
7
|
-
# A module of common helper functions that can be mixed into Berkshelf::Vagrant actions
|
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
|
-
|
45
|
-
# A file to persist vagrant-berkshelf specific information in between
|
46
|
-
# Vagrant runs.
|
47
|
-
#
|
48
|
-
# @return [String]
|
49
|
-
def cache_file(env)
|
50
|
-
File.expand_path(File.join('.vagrant', 'machines', env[:machine].name.to_s, 'berkshelf'), env[:root_path].to_s)
|
51
|
-
end
|
52
|
-
|
53
|
-
# Filter all of the provisioners of the given vagrant environment with the given name
|
54
|
-
#
|
55
|
-
# @param [Symbol] name
|
56
|
-
# name of provisioner to filter
|
57
|
-
# @param [Vagrant::Environment, Hash] env
|
58
|
-
# environment to inspect
|
59
|
-
#
|
60
|
-
# @return [Array]
|
61
|
-
def provisioners(name, env)
|
62
|
-
env[:machine].config.vm.provisioners.select { |prov| prov.name == name }
|
63
|
-
end
|
64
|
-
|
65
|
-
# Determine if the given vagrant environment contains a chef_solo provisioner
|
66
|
-
#
|
67
|
-
# @param [Vagrant::Environment] env
|
68
|
-
#
|
69
|
-
# @return [Boolean]
|
70
|
-
def chef_solo?(env)
|
71
|
-
provisioners(:chef_solo, env).any?
|
72
|
-
end
|
73
|
-
|
74
|
-
# Determine if the given vagrant environment contains a chef_client provisioner
|
75
|
-
#
|
76
|
-
# @param [Vagrant::Environment] env
|
77
|
-
#
|
78
|
-
# @return [Boolean]
|
79
|
-
def chef_client?(env)
|
80
|
-
provisioners(:chef_client, env).any?
|
81
|
-
end
|
82
|
-
|
83
|
-
# Determine if the Berkshelf plugin should be run for the given environment
|
84
|
-
#
|
85
|
-
# @param [Vagrant::Environment] env
|
86
|
-
#
|
87
|
-
# @return [Boolean]
|
88
|
-
def berkshelf_enabled?(env)
|
89
|
-
env[:machine].config.berkshelf.enabled
|
90
|
-
end
|
91
|
-
|
92
|
-
# Determine if --no-provision was specified
|
93
|
-
#
|
94
|
-
# @param [Vagrant::Environment] env
|
95
|
-
#
|
96
|
-
# @return [Boolean]
|
97
|
-
def provision_disabled?(env)
|
98
|
-
env.has_key?(:provision_enabled) && !env[:provision_enabled]
|
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
|
158
|
-
end
|
159
|
-
end
|
160
|
-
end
|
@@ -1,71 +0,0 @@
|
|
1
|
-
require 'vagrant/errors'
|
2
|
-
|
3
|
-
module Berkshelf
|
4
|
-
# A wrapper for a BerkshelfError for Vagrant. All Berkshelf exceptions should be
|
5
|
-
# wrapped in this proxy object so they are properly handled when Vagrant encounters
|
6
|
-
# an exception.
|
7
|
-
#
|
8
|
-
# @example wrapping an error encountered within the Vagrant plugin
|
9
|
-
# rescue BerkshelfError => e
|
10
|
-
# VagrantWrapperError.new(e)
|
11
|
-
# end
|
12
|
-
class VagrantWrapperError < ::Vagrant::Errors::VagrantError
|
13
|
-
# @param [BerkshelfError]
|
14
|
-
attr_reader :original
|
15
|
-
|
16
|
-
# @param [BerkshelfError] original
|
17
|
-
def initialize(original)
|
18
|
-
@original = original
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
"#{original.class}: #{original.to_s}"
|
23
|
-
end
|
24
|
-
|
25
|
-
private
|
26
|
-
|
27
|
-
def method_missing(fun, *args, &block)
|
28
|
-
original.send(fun, *args, &block)
|
29
|
-
end
|
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
|
71
|
-
end
|