Merge branch 'sethvargo/chef_and_tests'
This commit is contained in:
commit
67bf170040
|
@ -1,7 +1,7 @@
|
||||||
require File.expand_path("../base", __FILE__)
|
|
||||||
|
|
||||||
require "vagrant/util/which"
|
require "vagrant/util/which"
|
||||||
|
|
||||||
|
require_relative "base"
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Chef
|
module Chef
|
||||||
module Config
|
module Config
|
||||||
|
@ -38,10 +38,14 @@ module VagrantPlugins
|
||||||
def validate(machine)
|
def validate(machine)
|
||||||
errors = _detected_errors
|
errors = _detected_errors
|
||||||
errors.concat(validate_base(machine))
|
errors.concat(validate_base(machine))
|
||||||
errors << I18n.t("vagrant.config.chef.server_url_empty") if \
|
|
||||||
!chef_server_url || chef_server_url.strip == ""
|
if chef_server_url.to_s.strip.empty?
|
||||||
errors << I18n.t("vagrant.config.chef.validation_key_path") if \
|
errors << I18n.t("vagrant.config.chef.server_url_empty")
|
||||||
!validation_key_path
|
end
|
||||||
|
|
||||||
|
if validation_key_path.to_s.strip.empty?
|
||||||
|
errors << I18n.t("vagrant.config.chef.validation_key_path")
|
||||||
|
end
|
||||||
|
|
||||||
if delete_client || delete_node
|
if delete_client || delete_node
|
||||||
if !Vagrant::Util::Which.which("knife")
|
if !Vagrant::Util::Which.which("knife")
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
require File.expand_path("../base", __FILE__)
|
require_relative "base"
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Chef
|
module Chef
|
||||||
|
@ -65,10 +65,14 @@ module VagrantPlugins
|
||||||
def validate(machine)
|
def validate(machine)
|
||||||
errors = _detected_errors
|
errors = _detected_errors
|
||||||
errors.concat(validate_base(machine))
|
errors.concat(validate_base(machine))
|
||||||
errors << I18n.t("vagrant.config.chef.cookbooks_path_empty") if \
|
|
||||||
!cookbooks_path || [cookbooks_path].flatten.empty?
|
if [cookbooks_path].flatten.compact.empty?
|
||||||
errors << I18n.t("vagrant.config.chef.environment_path_required") if \
|
errors << I18n.t("vagrant.config.chef.cookbooks_path_empty")
|
||||||
environment && environments_path.empty?
|
end
|
||||||
|
|
||||||
|
if environment && environments_path.empty?
|
||||||
|
errors << I18n.t("vagrant.config.chef.environment_path_required")
|
||||||
|
end
|
||||||
|
|
||||||
environments_path.each do |type, raw_path|
|
environments_path.each do |type, raw_path|
|
||||||
next if type != :host
|
next if type != :host
|
||||||
|
@ -76,7 +80,8 @@ module VagrantPlugins
|
||||||
path = Pathname.new(raw_path).expand_path(machine.env.root_path)
|
path = Pathname.new(raw_path).expand_path(machine.env.root_path)
|
||||||
if !path.directory?
|
if !path.directory?
|
||||||
errors << I18n.t("vagrant.config.chef.environment_path_missing",
|
errors << I18n.t("vagrant.config.chef.environment_path_missing",
|
||||||
path: raw_path.to_s)
|
path: raw_path.to_s
|
||||||
|
)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -93,6 +98,8 @@ module VagrantPlugins
|
||||||
# Make sure the path is an array
|
# Make sure the path is an array
|
||||||
config = [config] if !config.is_a?(Array) || config.first.is_a?(Symbol)
|
config = [config] if !config.is_a?(Array) || config.first.is_a?(Symbol)
|
||||||
|
|
||||||
|
return [] if config.flatten.compact.empty?
|
||||||
|
|
||||||
# Make sure all the paths are in the proper format
|
# Make sure all the paths are in the proper format
|
||||||
config.map do |path|
|
config.map do |path|
|
||||||
path = [:host, path] if !path.is_a?(Array)
|
path = [:host, path] if !path.is_a?(Array)
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
require_relative "chef_solo"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module Chef
|
||||||
|
module Config
|
||||||
|
class ChefZero < ChefSolo
|
||||||
|
attr_accessor :nodes_path
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
super
|
||||||
|
|
||||||
|
@nodes_path = UNSET_VALUE
|
||||||
|
end
|
||||||
|
|
||||||
|
def finalize!
|
||||||
|
super
|
||||||
|
|
||||||
|
@nodes_path = [] if @nodes_path == UNSET_VALUE
|
||||||
|
|
||||||
|
# Make sure the path is an array.
|
||||||
|
@nodes_path = prepare_folders_config(@nodes_path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def validate(machine)
|
||||||
|
{ "chef zero provisioner" => super["chef solo provisioner"] }
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -2,11 +2,10 @@ require "pathname"
|
||||||
|
|
||||||
require "vagrant"
|
require "vagrant"
|
||||||
|
|
||||||
|
require_relative "command_builder"
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Chef
|
module Chef
|
||||||
root = Pathname.new(File.expand_path("../", __FILE__))
|
|
||||||
autoload :CommandBuilder, root.join("command_builder")
|
|
||||||
|
|
||||||
class Plugin < Vagrant.plugin("2")
|
class Plugin < Vagrant.plugin("2")
|
||||||
name "chef"
|
name "chef"
|
||||||
description <<-DESC
|
description <<-DESC
|
||||||
|
@ -15,24 +14,34 @@ module VagrantPlugins
|
||||||
DESC
|
DESC
|
||||||
|
|
||||||
config(:chef_solo, :provisioner) do
|
config(:chef_solo, :provisioner) do
|
||||||
require File.expand_path("../config/chef_solo", __FILE__)
|
require_relative "config/chef_solo"
|
||||||
Config::ChefSolo
|
Config::ChefSolo
|
||||||
end
|
end
|
||||||
|
|
||||||
config(:chef_client, :provisioner) do
|
config(:chef_client, :provisioner) do
|
||||||
require File.expand_path("../config/chef_client", __FILE__)
|
require_relative "config/chef_client"
|
||||||
Config::ChefClient
|
Config::ChefClient
|
||||||
end
|
end
|
||||||
|
|
||||||
|
config(:chef_zero, :provisioner) do
|
||||||
|
require_relative "config/chef_zero"
|
||||||
|
Config::ChefZero
|
||||||
|
end
|
||||||
|
|
||||||
provisioner(:chef_solo) do
|
provisioner(:chef_solo) do
|
||||||
require File.expand_path("../provisioner/chef_solo", __FILE__)
|
require_relative "provisioner/chef_solo"
|
||||||
Provisioner::ChefSolo
|
Provisioner::ChefSolo
|
||||||
end
|
end
|
||||||
|
|
||||||
provisioner(:chef_client) do
|
provisioner(:chef_client) do
|
||||||
require File.expand_path("../provisioner/chef_client", __FILE__)
|
require_relative "provisioner/chef_client"
|
||||||
Provisioner::ChefClient
|
Provisioner::ChefClient
|
||||||
end
|
end
|
||||||
|
|
||||||
|
provisioner(:chef_zero) do
|
||||||
|
require_relative "provisioner/chef_zero"
|
||||||
|
Provisioner::ChefZero
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -3,7 +3,7 @@ require 'pathname'
|
||||||
require 'vagrant'
|
require 'vagrant'
|
||||||
require 'vagrant/util/subprocess'
|
require 'vagrant/util/subprocess'
|
||||||
|
|
||||||
require File.expand_path("../base", __FILE__)
|
require_relative "base"
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Chef
|
module Chef
|
||||||
|
|
|
@ -2,7 +2,7 @@ require "log4r"
|
||||||
|
|
||||||
require "vagrant/util/counter"
|
require "vagrant/util/counter"
|
||||||
|
|
||||||
require File.expand_path("../base", __FILE__)
|
require_relative "base"
|
||||||
|
|
||||||
module VagrantPlugins
|
module VagrantPlugins
|
||||||
module Chef
|
module Chef
|
||||||
|
@ -19,6 +19,7 @@ module VagrantPlugins
|
||||||
def initialize(machine, config)
|
def initialize(machine, config)
|
||||||
super
|
super
|
||||||
@logger = Log4r::Logger.new("vagrant::provisioners::chef_solo")
|
@logger = Log4r::Logger.new("vagrant::provisioners::chef_solo")
|
||||||
|
@shared_folders = []
|
||||||
end
|
end
|
||||||
|
|
||||||
def configure(root_config)
|
def configure(root_config)
|
||||||
|
@ -36,14 +37,12 @@ module VagrantPlugins
|
||||||
def provision
|
def provision
|
||||||
# Verify that the proper shared folders exist.
|
# Verify that the proper shared folders exist.
|
||||||
check = []
|
check = []
|
||||||
[@cookbook_folders, @role_folders, @data_bags_folders, @environments_folders].each do |folders|
|
@shared_folders.each do |type, local_path, remote_path|
|
||||||
folders.each do |type, local_path, remote_path|
|
|
||||||
# We only care about checking folders that have a local path, meaning
|
# We only care about checking folders that have a local path, meaning
|
||||||
# they were shared from the local machine, rather than assumed to
|
# they were shared from the local machine, rather than assumed to
|
||||||
# exist on the VM.
|
# exist on the VM.
|
||||||
check << remote_path if local_path
|
check << remote_path if local_path
|
||||||
end
|
end
|
||||||
end
|
|
||||||
|
|
||||||
chown_provisioning_folder
|
chown_provisioning_folder
|
||||||
verify_shared_folders(check)
|
verify_shared_folders(check)
|
||||||
|
@ -113,20 +112,21 @@ module VagrantPlugins
|
||||||
root_config.vm.synced_folder(local_path, remote_path, opts)
|
root_config.vm.synced_folder(local_path, remote_path, opts)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@shared_folders += folders
|
||||||
end
|
end
|
||||||
|
|
||||||
def setup_solo_config
|
def setup_solo_config
|
||||||
cookbooks_path = guest_paths(@cookbook_folders)
|
setup_config("provisioners/chef_solo/solo", "solo.rb", solo_config)
|
||||||
roles_path = guest_paths(@role_folders)
|
end
|
||||||
data_bags_path = guest_paths(@data_bags_folders).first
|
|
||||||
environments_path = guest_paths(@environments_folders).first
|
def solo_config
|
||||||
setup_config("provisioners/chef_solo/solo", "solo.rb", {
|
{
|
||||||
cookbooks_path: cookbooks_path,
|
cookbooks_path: guest_paths(@cookbook_folders),
|
||||||
recipe_url: @config.recipe_url,
|
recipe_url: @config.recipe_url,
|
||||||
roles_path: roles_path,
|
roles_path: guest_paths(@role_folders),
|
||||||
data_bags_path: data_bags_path,
|
data_bags_path: guest_paths(@data_bags_folders).first,
|
||||||
environments_path: environments_path,
|
environments_path: guest_paths(@environments_folders).first
|
||||||
})
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
def run_chef_solo
|
def run_chef_solo
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
require "log4r"
|
||||||
|
|
||||||
|
require_relative "chef_solo"
|
||||||
|
|
||||||
|
module VagrantPlugins
|
||||||
|
module Chef
|
||||||
|
module Provisioner
|
||||||
|
# This class implements provisioning via chef-zero.
|
||||||
|
class ChefZero < ChefSolo
|
||||||
|
attr_reader :node_folders
|
||||||
|
|
||||||
|
def initialize(machine, config)
|
||||||
|
super
|
||||||
|
@logger = Log4r::Logger.new("vagrant::provisioners::chef_zero")
|
||||||
|
end
|
||||||
|
|
||||||
|
def configure(root_config)
|
||||||
|
super
|
||||||
|
|
||||||
|
@node_folders = expanded_folders(@config.nodes_path, "nodes")
|
||||||
|
|
||||||
|
share_folders(root_config, "csn", @node_folders)
|
||||||
|
end
|
||||||
|
|
||||||
|
def solo_config
|
||||||
|
super.merge(
|
||||||
|
local_mode: true,
|
||||||
|
node_path: guest_paths(@node_folders).first
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -1310,8 +1310,8 @@ en:
|
||||||
Cookbook path doesn't exist: %{path}
|
Cookbook path doesn't exist: %{path}
|
||||||
custom_config_path_missing: |-
|
custom_config_path_missing: |-
|
||||||
Path specified for "custom_config_path" does not exist.
|
Path specified for "custom_config_path" does not exist.
|
||||||
server_url_empty: "Chef server URL must be populated."
|
server_url_empty: "Chef Server URL must be populated."
|
||||||
validation_key_path: "Validation key path must be valid path to your chef server validation key."
|
validation_key_path: "Validation key path must be valid path to your Chef Server validation key."
|
||||||
loader:
|
loader:
|
||||||
bad_v1_key: |-
|
bad_v1_key: |-
|
||||||
Unknown configuration section '%{key}'. If this section was part of
|
Unknown configuration section '%{key}'. If this section was part of
|
||||||
|
|
|
@ -32,6 +32,13 @@ environment_path <%= environments_path.inspect %>
|
||||||
environment "<%= environment %>"
|
environment "<%= environment %>"
|
||||||
<% end -%>
|
<% end -%>
|
||||||
|
|
||||||
|
<% if local_mode -%>
|
||||||
|
local_mode true
|
||||||
|
<% end -%>
|
||||||
|
<% if node_path -%>
|
||||||
|
node_path <%= node_path.inspect %>
|
||||||
|
<% end -%>
|
||||||
|
|
||||||
http_proxy <%= http_proxy.inspect %>
|
http_proxy <%= http_proxy.inspect %>
|
||||||
http_proxy_user <%= http_proxy_user.inspect %>
|
http_proxy_user <%= http_proxy_user.inspect %>
|
||||||
http_proxy_pass <%= http_proxy_pass.inspect %>
|
http_proxy_pass <%= http_proxy_pass.inspect %>
|
||||||
|
|
|
@ -0,0 +1,262 @@
|
||||||
|
require_relative "../../../../base"
|
||||||
|
|
||||||
|
require Vagrant.source_root.join("plugins/provisioners/chef/config/base")
|
||||||
|
|
||||||
|
describe VagrantPlugins::Chef::Config::Base do
|
||||||
|
include_context "unit"
|
||||||
|
|
||||||
|
subject { described_class.new }
|
||||||
|
|
||||||
|
let(:machine) { double("machine") }
|
||||||
|
|
||||||
|
describe "#arguments" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.arguments).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#attempts" do
|
||||||
|
it "defaults to 1" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.attempts).to eq(1)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#binary_path" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.binary_path).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#binary_env" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.binary_env).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#custom_config_path" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.custom_config_path).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#environment" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.environment).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#formatter" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.formatter).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#http_proxy" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.http_proxy).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#http_proxy_user" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.http_proxy_user).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#http_proxy_pass" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.http_proxy_pass).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#https_proxy" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.https_proxy).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#https_proxy_user" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.https_proxy_user).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#https_proxy_pass" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.https_proxy_pass).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#log_level" do
|
||||||
|
it "defaults to :info" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.log_level).to be(:info)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "is converted to a symbol" do
|
||||||
|
subject.log_level = "foo"
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.log_level).to eq(:foo)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#no_proxy" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.no_proxy).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#node_name" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.node_name).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#provisioning_path" do
|
||||||
|
it "defaults to a tmp_path" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.provisioning_path).to match(%r{/tmp/vagrant-chef-\d+})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#file_backup_path" do
|
||||||
|
it "defaults to /var/chef/backup" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.file_backup_path).to eq("/var/chef/backup")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#file_cache_path" do
|
||||||
|
it "defaults to /var/chef/cache" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.file_cache_path).to eq("/var/chef/cache")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#verbose_logging" do
|
||||||
|
it "defaults to false" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.verbose_logging).to be(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#run_list" do
|
||||||
|
it "defaults to an empty array" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.run_list).to be_a(Array)
|
||||||
|
expect(subject.run_list).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#json" do
|
||||||
|
it "defaults to an empty hash" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.json).to be_a(Hash)
|
||||||
|
expect(subject.json).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#add_recipe" do
|
||||||
|
context "when the prefix is given" do
|
||||||
|
it "adds the value to the run_list" do
|
||||||
|
subject.add_recipe("recipe[foo::bar]")
|
||||||
|
expect(subject.run_list).to eq %w(recipe[foo::bar])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the prefix is not given" do
|
||||||
|
it "adds the prefixed value to the run_list" do
|
||||||
|
subject.add_recipe("foo::bar")
|
||||||
|
expect(subject.run_list).to eq %w(recipe[foo::bar])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#add_role" do
|
||||||
|
context "when the prefix is given" do
|
||||||
|
it "adds the value to the run_list" do
|
||||||
|
subject.add_role("role[foo]")
|
||||||
|
expect(subject.run_list).to eq %w(role[foo])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the prefix is not given" do
|
||||||
|
it "adds the prefixed value to the run_list" do
|
||||||
|
subject.add_role("foo")
|
||||||
|
expect(subject.run_list).to eq %w(role[foo])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#validate_base" do
|
||||||
|
context "when #custom_config_path does not exist" do
|
||||||
|
let(:path) { "/path/to/file" }
|
||||||
|
|
||||||
|
before do
|
||||||
|
allow(File).to receive(:file?)
|
||||||
|
.with(path)
|
||||||
|
.and_return(false)
|
||||||
|
|
||||||
|
allow(machine).to receive(:env)
|
||||||
|
.and_return(double("env",
|
||||||
|
root_path: "",
|
||||||
|
))
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns an error" do
|
||||||
|
subject.custom_config_path = path
|
||||||
|
subject.finalize!
|
||||||
|
|
||||||
|
expect(subject.validate_base(machine))
|
||||||
|
.to eq ['Path specified for "custom_config_path" does not exist.']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#merge" do
|
||||||
|
it "merges the json hash" do
|
||||||
|
a = described_class.new.tap do |i|
|
||||||
|
i.json = { "foo" => "bar" }
|
||||||
|
end
|
||||||
|
b = described_class.new.tap do |i|
|
||||||
|
i.json = { "zip" => "zap" }
|
||||||
|
end
|
||||||
|
|
||||||
|
result = a.merge(b)
|
||||||
|
expect(result.json).to eq(
|
||||||
|
"foo" => "bar",
|
||||||
|
"zip" => "zap",
|
||||||
|
)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "appends the run_list array" do
|
||||||
|
a = described_class.new.tap do |i|
|
||||||
|
i.run_list = ["recipe[foo::bar]"]
|
||||||
|
end
|
||||||
|
b = described_class.new.tap do |i|
|
||||||
|
i.run_list = ["recipe[zip::zap]"]
|
||||||
|
end
|
||||||
|
|
||||||
|
result = a.merge(b)
|
||||||
|
expect(result.run_list).to eq %w(
|
||||||
|
recipe[foo::bar]
|
||||||
|
recipe[zip::zap]
|
||||||
|
)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,136 @@
|
||||||
|
require_relative "../../../../base"
|
||||||
|
|
||||||
|
require Vagrant.source_root.join("plugins/provisioners/chef/config/chef_client")
|
||||||
|
|
||||||
|
describe VagrantPlugins::Chef::Config::ChefClient do
|
||||||
|
include_context "unit"
|
||||||
|
|
||||||
|
subject { described_class.new }
|
||||||
|
|
||||||
|
let(:machine) { double("machine") }
|
||||||
|
|
||||||
|
describe "#chef_server_url" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.chef_server_url).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#client_key_path" do
|
||||||
|
it "defaults to /etc/chef/client.pem" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.client_key_path).to eq("/etc/chef/client.pem")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#delete_client" do
|
||||||
|
it "defaults to false" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.delete_client).to be(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#delete_node" do
|
||||||
|
it "defaults to false" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.delete_node).to be(false)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#validation_key_path" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.validation_key_path).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#validation_client_name" do
|
||||||
|
it "defaults to chef-validator" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.validation_client_name).to eq("chef-validator")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#validate" do
|
||||||
|
before do
|
||||||
|
allow(machine).to receive(:env)
|
||||||
|
.and_return(double("env",
|
||||||
|
root_path: "",
|
||||||
|
))
|
||||||
|
|
||||||
|
subject.chef_server_url = "https://example.com"
|
||||||
|
subject.validation_key_path = "/path/to/key.pem"
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:result) { subject.validate(machine) }
|
||||||
|
let(:errors) { result["chef client provisioner"] }
|
||||||
|
|
||||||
|
context "when the chef_server_url is nil" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.chef_server_url = nil
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq([I18n.t("vagrant.config.chef.server_url_empty")])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the chef_server_url is blank" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.chef_server_url = " "
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq([I18n.t("vagrant.config.chef.server_url_empty")])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the validation_key_path is nil" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.validation_key_path = nil
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq([I18n.t("vagrant.config.chef.validation_key_path")])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the validation_key_path is blank" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.validation_key_path = " "
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq([I18n.t("vagrant.config.chef.validation_key_path")])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when #delete_client is given" do
|
||||||
|
before { subject.delete_client = true }
|
||||||
|
|
||||||
|
context "when knife does not exist" do
|
||||||
|
before do
|
||||||
|
allow(Vagrant::Util::Which)
|
||||||
|
.to receive(:which)
|
||||||
|
.with("knife")
|
||||||
|
.and_return(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns an error" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq([I18n.t("vagrant.chef_config_knife_not_found")])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when #delete_node is given" do
|
||||||
|
before { subject.delete_node = true }
|
||||||
|
|
||||||
|
context "when knife does not exist" do
|
||||||
|
before do
|
||||||
|
allow(Vagrant::Util::Which)
|
||||||
|
.to receive(:which)
|
||||||
|
.with("knife")
|
||||||
|
.and_return(nil)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "returns an error" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq([I18n.t("vagrant.chef_config_knife_not_found")])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,147 @@
|
||||||
|
require_relative "../../../../base"
|
||||||
|
|
||||||
|
require Vagrant.source_root.join("plugins/provisioners/chef/config/chef_solo")
|
||||||
|
|
||||||
|
describe VagrantPlugins::Chef::Config::ChefSolo do
|
||||||
|
include_context "unit"
|
||||||
|
|
||||||
|
subject { described_class.new }
|
||||||
|
|
||||||
|
let(:machine) { double("machine") }
|
||||||
|
|
||||||
|
describe "#cookbooks_path" do
|
||||||
|
it "defaults to something" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.cookbooks_path).to eq([
|
||||||
|
[:host, "cookbooks"],
|
||||||
|
[:vm, "cookbooks"],
|
||||||
|
])
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#data_bags_path" do
|
||||||
|
it "defaults to an empty array" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.data_bags_path).to be_a(Array)
|
||||||
|
expect(subject.data_bags_path).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#environments_path" do
|
||||||
|
it "defaults to an empty array" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.environments_path).to be_a(Array)
|
||||||
|
expect(subject.environments_path).to be_empty
|
||||||
|
end
|
||||||
|
|
||||||
|
it "merges deeply nested paths" do
|
||||||
|
subject.environments_path = ["/foo", "/bar", ["/zip"]]
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.environments_path)
|
||||||
|
.to eq([:host, :host, :host].zip %w(/foo /bar /zip))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#recipe_url" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.recipe_url).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#roles_path" do
|
||||||
|
it "defaults to an empty array" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.roles_path).to be_a(Array)
|
||||||
|
expect(subject.roles_path).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#synced_folder_type" do
|
||||||
|
it "defaults to nil" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.synced_folder_type).to be(nil)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe "#validate" do
|
||||||
|
before do
|
||||||
|
allow(machine).to receive(:env)
|
||||||
|
.and_return(double("env",
|
||||||
|
root_path: "",
|
||||||
|
))
|
||||||
|
|
||||||
|
subject.cookbooks_path = ["/cookbooks", "/more/cookbooks"]
|
||||||
|
end
|
||||||
|
|
||||||
|
let(:result) { subject.validate(machine) }
|
||||||
|
let(:errors) { result["chef solo provisioner"] }
|
||||||
|
|
||||||
|
context "when the cookbooks_path is nil" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.cookbooks_path = nil
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [I18n.t("vagrant.config.chef.cookbooks_path_empty")]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the cookbooks_path is an empty array" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.cookbooks_path = []
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [I18n.t("vagrant.config.chef.cookbooks_path_empty")]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the cookbooks_path is an array with nil" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.cookbooks_path = [nil, nil]
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [I18n.t("vagrant.config.chef.cookbooks_path_empty")]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when environments is given" do
|
||||||
|
before do
|
||||||
|
subject.environment = "production"
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the environments_path is nil" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.environments_path = nil
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [I18n.t("vagrant.config.chef.environment_path_required")]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the environments_path is an empty array" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.environments_path = []
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [I18n.t("vagrant.config.chef.environment_path_required")]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the environments_path is an array with nil" do
|
||||||
|
it "returns an error" do
|
||||||
|
subject.environments_path = [nil, nil]
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [I18n.t("vagrant.config.chef.environment_path_required")]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context "when the environments_path does not exist" do
|
||||||
|
it "returns an error" do
|
||||||
|
env_path = "/path/to/environments/that/will/never/exist"
|
||||||
|
subject.environments_path = env_path
|
||||||
|
subject.finalize!
|
||||||
|
expect(errors).to eq [
|
||||||
|
I18n.t("vagrant.config.chef.environment_path_missing",
|
||||||
|
path: env_path
|
||||||
|
)
|
||||||
|
]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,19 @@
|
||||||
|
require_relative "../../../../base"
|
||||||
|
|
||||||
|
require Vagrant.source_root.join("plugins/provisioners/chef/config/chef_zero")
|
||||||
|
|
||||||
|
describe VagrantPlugins::Chef::Config::ChefZero do
|
||||||
|
include_context "unit"
|
||||||
|
|
||||||
|
subject { described_class.new }
|
||||||
|
|
||||||
|
let(:machine) { double("machine") }
|
||||||
|
|
||||||
|
describe "#nodes_path" do
|
||||||
|
it "defaults to an array" do
|
||||||
|
subject.finalize!
|
||||||
|
expect(subject.nodes_path).to be_a(Array)
|
||||||
|
expect(subject.nodes_path).to be_empty
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -5,11 +5,11 @@ sidebar_current: "provisioning-chefcommon"
|
||||||
|
|
||||||
# Shared Chef Options
|
# Shared Chef Options
|
||||||
|
|
||||||
This page documents the list of available options that are available in
|
This page documents the list of available options that are available in the
|
||||||
both the
|
[Chef Solo](/v2/provisioning/chef_solo.html),
|
||||||
[Chef solo](/v2/provisioning/chef_solo.html)
|
[Chef Zero](/v2/provisioning/chef_zero.html)
|
||||||
and
|
and
|
||||||
[Chef client](/v2/provisioning/chef_client.html)
|
[Chef Client](/v2/provisioning/chef_client.html)
|
||||||
provisioners.
|
provisioners.
|
||||||
|
|
||||||
* `arguments` (string) - A list of additional arguments to pass on the
|
* `arguments` (string) - A list of additional arguments to pass on the
|
||||||
|
|
|
@ -34,7 +34,7 @@ available below this section.
|
||||||
|
|
||||||
Note that only the Chef-solo specific options are shown below. There is
|
Note that only the Chef-solo specific options are shown below. There is
|
||||||
also a large set of [common options](/v2/provisioning/chef_common.html)
|
also a large set of [common options](/v2/provisioning/chef_common.html)
|
||||||
that are available with both the Chef Solo and Chef client provisioners.
|
that are available with all Chef provisioners.
|
||||||
|
|
||||||
* `cookbooks_path` (string or array) - A list of paths to where cookbooks
|
* `cookbooks_path` (string or array) - A list of paths to where cookbooks
|
||||||
are stored. By default this is "cookbooks", expecting a cookbooks folder
|
are stored. By default this is "cookbooks", expecting a cookbooks folder
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
---
|
||||||
|
page_title: "Chef Zero - Provisioning"
|
||||||
|
sidebar_current: "provisioning-chefzero"
|
||||||
|
---
|
||||||
|
|
||||||
|
# Chef Zero Provisioner
|
||||||
|
|
||||||
|
**Provisioner name: `chef_zero`**
|
||||||
|
|
||||||
|
The Chef Zero provisioner allows you to provision the guest using
|
||||||
|
[Chef](https://www.getchef.com/chef/), specifically with
|
||||||
|
[Chef Zero/local mode](https://docs.getchef.com/ctl_chef_client.html#run-in-local-mode).
|
||||||
|
|
||||||
|
This new provisioner is a middle ground between running a full blown
|
||||||
|
Chef Server and using the limited [Chef Solo](/v2/provisioning/chef_solo.html)
|
||||||
|
provisioner. It runs a local in-memory Chef Server and fakes the validation
|
||||||
|
and client key registration.
|
||||||
|
|
||||||
|
<div class="alert alert-warn">
|
||||||
|
<p>
|
||||||
|
<strong>Warning:</strong> If you're not familiar with Chef and Vagrant already,
|
||||||
|
I recommend starting with the <a href="/v2/provisioning/shell.html">shell
|
||||||
|
provisioner</a>. However, if you're comfortable with Vagrant already, Vagrant
|
||||||
|
is the best way to learn Chef.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
## Options
|
||||||
|
|
||||||
|
This section lists the complete set of available options for the Chef Zero
|
||||||
|
provisioner. More detailed examples of how to use the provisioner are
|
||||||
|
available below this section.
|
||||||
|
|
||||||
|
Note that only the Chef Zero specific options are shown below, but all [Chef
|
||||||
|
Solo options](/v2/provisioning/chef_solo.html), including the [common Chef
|
||||||
|
provisioner options](/v2/provisioning/chef_common.html), are also inherited.
|
||||||
|
|
||||||
|
* `nodes_path` (string) - A path where the Chef nodes are stored. Be default,
|
||||||
|
no node path is set.
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
The Chef Zero provisioner is configured basically the same way as the Chef Solo
|
||||||
|
provisioner. See the [Chef Solo documentations](/v2/provisioning/chef_solo.html)
|
||||||
|
for more information.
|
||||||
|
|
||||||
|
A basic example could look like this:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
Vagrant.configure("2") do |config|
|
||||||
|
config.vm.provision "chef_zero" do |chef|
|
||||||
|
# Specify the local paths where Chef data is stored
|
||||||
|
chef.cookbooks_path = "cookbooks"
|
||||||
|
chef.roles_path = "roles"
|
||||||
|
chef.nodes_path = "nodes"
|
||||||
|
|
||||||
|
# Add a recipe
|
||||||
|
chef.add_recipe "apache"
|
||||||
|
|
||||||
|
# Or maybe a role
|
||||||
|
chef.add_role "web"
|
||||||
|
end
|
||||||
|
end
|
||||||
|
```
|
Loading…
Reference in New Issue