From a90e6cfe4c64eab13b3d9350c935e603254113a4 Mon Sep 17 00:00:00 2001 From: Seth Vargo Date: Thu, 19 Nov 2015 14:57:01 -0800 Subject: [PATCH] Use the new Chef installation channel and options This deprecates "prerelease", which will be removed in the next release. --- .../chef/cap/debian/chef_install.rb | 4 +- .../chef/cap/omnios/chef_install.rb | 10 ++--- .../chef/cap/redhat/chef_install.rb | 4 +- plugins/provisioners/chef/config/base.rb | 41 ++++++++++++++----- plugins/provisioners/chef/installer.rb | 11 ++--- plugins/provisioners/chef/provisioner/base.rb | 7 ++-- .../provisioners/chef/config/base_test.rb | 21 ++++++++-- .../v2/provisioning/chef_common.html.md | 11 +++-- 8 files changed, 76 insertions(+), 33 deletions(-) diff --git a/plugins/provisioners/chef/cap/debian/chef_install.rb b/plugins/provisioners/chef/cap/debian/chef_install.rb index 3d9302d80..e1cf9470d 100644 --- a/plugins/provisioners/chef/cap/debian/chef_install.rb +++ b/plugins/provisioners/chef/cap/debian/chef_install.rb @@ -5,11 +5,11 @@ module VagrantPlugins module Cap module Debian module ChefInstall - def self.chef_install(machine, version, prerelease, download_path) + def self.chef_install(machine, project, version, channel, options = {}) machine.communicate.sudo("apt-get update -y -qq") machine.communicate.sudo("apt-get install -y -qq curl") - command = Omnibus.build_command(version, prerelease, download_path) + command = Omnibus.sh_command(project, version, channel, options) machine.communicate.sudo(command) end end diff --git a/plugins/provisioners/chef/cap/omnios/chef_install.rb b/plugins/provisioners/chef/cap/omnios/chef_install.rb index b20332638..034b2ff5a 100644 --- a/plugins/provisioners/chef/cap/omnios/chef_install.rb +++ b/plugins/provisioners/chef/cap/omnios/chef_install.rb @@ -5,13 +5,13 @@ module VagrantPlugins module Cap module OmniOS module ChefInstall - def self.chef_install(machine, version, prerelease, download_path) - su_cmd = machine.config.solaris.suexec_cmd + def self.chef_install(machine, project, version, channel, options = {}) + su = machine.config.solaris.suexec_cmd - machine.communicate.execute("#{su_cmd} pkg list --no-refresh web/curl > /dev/null 2>&1 || pkg install -q --accept web/curl") + machine.communicate.execute("#{su} pkg list --no-refresh web/curl > /dev/null 2>&1 || pkg install -q --accept web/curl") - command = VagrantPlugins::Chef::Omnibus.build_command(version, prerelease, download_path) - machine.communicate.execute(su_cmd + ' ' + command) + command = Omnibus.sh_command(project, version, channel, options) + machine.communicate.execute("#{su} #{command}") end end end diff --git a/plugins/provisioners/chef/cap/redhat/chef_install.rb b/plugins/provisioners/chef/cap/redhat/chef_install.rb index 7d376e7d0..f91356d13 100644 --- a/plugins/provisioners/chef/cap/redhat/chef_install.rb +++ b/plugins/provisioners/chef/cap/redhat/chef_install.rb @@ -5,14 +5,14 @@ module VagrantPlugins module Cap module Redhat module ChefInstall - def self.chef_install(machine, version, prerelease, download_path) + def self.chef_install(machine, project, version, channel, options = {}) if dnf?(machine) machine.communicate.sudo("dnf install -y -q curl") else machine.communicate.sudo("yum install -y -q curl") end - command = Omnibus.build_command(version, prerelease, download_path) + command = Omnibus.sh_command(project, version, channel, options) machine.communicate.sudo(command) end diff --git a/plugins/provisioners/chef/config/base.rb b/plugins/provisioners/chef/config/base.rb index 370736fd6..2c46198e9 100644 --- a/plugins/provisioners/chef/config/base.rb +++ b/plugins/provisioners/chef/config/base.rb @@ -11,6 +11,12 @@ module VagrantPlugins # @return [String] attr_accessor :binary_env + # The name of the Chef project to install. This is "chef" for the Chef + # Client or "chefdk" for the Chef Development Kit. Other product names + # may be available as well. + # @return [String] + attr_accessor :product + # Install Chef on the system if it does not exist. Default is true. # This is a trinary attribute (it can have three values): # @@ -26,9 +32,11 @@ module VagrantPlugins # @return [String, Symbol] attr_accessor :log_level - # Install a prerelease version of Chef. - # @return [true, false] - attr_accessor :prerelease + # The channel from which to download Chef. Currently known values are + # "current" and "stable", but more may be added in the future. The + # default is "current". + # @return [String] + attr_accessor :channel # The version of Chef to install. If Chef is already installed on the # system, the installed version is compared with the requested version. @@ -52,25 +60,38 @@ module VagrantPlugins # @return [String] attr_accessor :installer_download_path + # @deprecated + def prerelease=(value) + STDOUT.puts <<-EOH +[DEPRECATED] The configuration `chef.prerelease' has been deprecated. Please use +`chef.channel' instead. The default value for channel is "current", which +includes prelease versions of Chef Client and the Chef Development Kit. You can +probably just remove the `prerelease' setting from your Vagrantfile and things +will continue working as expected. +EOH + end + def initialize super @binary_path = UNSET_VALUE @binary_env = UNSET_VALUE + @product = UNSET_VALUE @install = UNSET_VALUE @log_level = UNSET_VALUE - @prerelease = UNSET_VALUE + @channel = UNSET_VALUE @version = UNSET_VALUE @installer_download_path = UNSET_VALUE end def finalize! - @binary_path = nil if @binary_path == UNSET_VALUE - @binary_env = nil if @binary_env == UNSET_VALUE - @install = true if @install == UNSET_VALUE - @log_level = :info if @log_level == UNSET_VALUE - @prerelease = false if @prerelease == UNSET_VALUE - @version = :latest if @version == UNSET_VALUE + @binary_path = nil if @binary_path == UNSET_VALUE + @binary_env = nil if @binary_env == UNSET_VALUE + @product = "chef" if @product == UNSET_VALUE + @install = true if @install == UNSET_VALUE + @log_level = :info if @log_level == UNSET_VALUE + @channel = "current" if @channel == UNSET_VALUE + @version = :latest if @version == UNSET_VALUE @installer_download_path = nil if @installer_download_path == UNSET_VALUE # Make sure the install is a symbol if it's not a boolean diff --git a/plugins/provisioners/chef/installer.rb b/plugins/provisioners/chef/installer.rb index 16467111c..3dc5efadc 100644 --- a/plugins/provisioners/chef/installer.rb +++ b/plugins/provisioners/chef/installer.rb @@ -3,10 +3,11 @@ module VagrantPlugins class Installer def initialize(machine, options = {}) @machine = machine - @version = options.fetch(:version, :latest) - @prerelease = options.fetch(:prerelease, :latest) - @force = options.fetch(:force, false) - @download_path = options.fetch(:download_path, nil) + @product = options.fetch(:product) + @channel = options.fetch(:channel) + @version = options.fetch(:version) + @force = options.fetch(:force) + @options = options.dup end # This handles verifying the Chef installation, installing it if it was @@ -28,7 +29,7 @@ module VagrantPlugins @machine.ui.detail(I18n.t("vagrant.chef_installing", version: @version.to_s)) - @machine.guest.capability(:chef_install, @version, @prerelease, @download_path) + @machine.guest.capability(:chef_install, @product, @version, @channel, @options) if !@machine.guest.capability(:chef_installed, @version) raise Provisioner::Base::ChefError, :install_failed diff --git a/plugins/provisioners/chef/provisioner/base.rb b/plugins/provisioners/chef/provisioner/base.rb index 525e98a9e..4f3636ae2 100644 --- a/plugins/provisioners/chef/provisioner/base.rb +++ b/plugins/provisioners/chef/provisioner/base.rb @@ -42,9 +42,10 @@ module VagrantPlugins @logger.info("Checking for Chef installation...") installer = Installer.new(@machine, - force: config.install == :force, - version: config.version, - prerelease: config.prerelease, + product: config.product, + channel: config.channel, + version: config.version, + force: config.install == :force, download_path: config.installer_download_path ) installer.ensure_installed diff --git a/test/unit/plugins/provisioners/chef/config/base_test.rb b/test/unit/plugins/provisioners/chef/config/base_test.rb index 4b018f11b..4c1a31321 100644 --- a/test/unit/plugins/provisioners/chef/config/base_test.rb +++ b/test/unit/plugins/provisioners/chef/config/base_test.rb @@ -23,6 +23,13 @@ describe VagrantPlugins::Chef::Config::Base do end end + describe "#product" do + it "defaults to \"chef\"" do + subject.finalize! + expect(subject.product).to eq("chef") + end + end + describe "#install" do it "defaults to true" do subject.finalize! @@ -49,10 +56,18 @@ describe VagrantPlugins::Chef::Config::Base do end end - describe "#prerelease" do - it "defaults to true" do + describe "#channel" do + it "defaults to \"current\"" do subject.finalize! - expect(subject.prerelease).to be(false) + expect(subject.channel).to eq("current") + end + end + + describe "#prerelease" do + it "should not exist in Vagrant 1.9" do + if Vagrant::VERSION >= "1.9" + raise "This option should be removed!" + end end end diff --git a/website/docs/source/v2/provisioning/chef_common.html.md b/website/docs/source/v2/provisioning/chef_common.html.md index b5347d522..48d3f12cf 100644 --- a/website/docs/source/v2/provisioning/chef_common.html.md +++ b/website/docs/source/v2/provisioning/chef_common.html.md @@ -30,13 +30,18 @@ their purpose. - `installer_download_path` (string) - The path where the Chef installer will be downloaded to. This option is only honored if the `install` attribute is `true` or `"force"`. The default value is to use the path provided by Chef's - Omnibus installer, which varies between releases. + Omnibus installer, which varies between releases. This value has no effect on + Windows because Chef's omnibus installer lacks the option on Windows. - `log_level` (string) - The Chef log level. See the Chef docs for acceptable values. -- `prerelease` (boolean) - Install a prerelease version of Chef. The default - value is false. +- `product` (string) - The name of the Chef product to install. The default + value is "chef", which corresponds to the Chef Client. You can also specify + "chefdk", which will install the Chef Development Kit. + +- `channel` (string) - The release channel from which to pull the Chef Client + or the Chef Development Kit. The default value is `"current"`. - `version` (string) - The version of Chef to install on the guest. If Chef is already installed on the system, the installed version is compared with the