Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add upgrade action to chef_ingredient #10

Merged
merged 2 commits into from
Jun 24, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .kitchen.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,7 @@ suites:
- name: chefdk
run_list:
- recipe[test::chefdk]

- name: upgrade
run_list:
- recipe[test::upgrade]
28 changes: 8 additions & 20 deletions libraries/chef_ingredient_provider.rb
Original file line number Diff line number Diff line change
Expand Up @@ -34,27 +34,15 @@ def whyrun_supported?
end

action :install do
# We need Mixlib::Versioning in the library helpers for
# parsing the version string.
chef_gem "#{new_resource.product_name}-mixlib-versioning" do #~FC009 foodcritic needs an update
package_name 'mixlib-versioning'
compile_time true
end

require 'mixlib/versioning'

cleanup_old_repo_config if ::File.exist?(old_ingredient_repo_file)
include_recipe "#{package_repo_type}-chef" if new_resource.package_source.nil?

package_resource = new_resource.package_source.nil? ? :package : local_package_resource
install_mixlib_versioning
create_repository
package_resource(:install)
end

declare_resource package_resource, new_resource.product_name do
package_name ingredient_package_name
options new_resource.options
version install_version if Mixlib::Versioning.parse(version_string(new_resource.version)) > '0.0.0'
source new_resource.package_source
timeout new_resource.timeout
end
action :upgrade do
install_mixlib_versioning
create_repository
package_resource(:upgrade)
end

action :uninstall do
Expand Down
2 changes: 1 addition & 1 deletion libraries/chef_ingredient_resource.rb
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ class Resource
class ChefIngredient < Chef::Resource::LWRPBase
self.resource_name = 'chef_ingredient'

actions :install, :uninstall, :remove, :reconfigure
actions :install, :uninstall, :remove, :reconfigure, :upgrade
default_action :install
state_attrs :installed

Expand Down
29 changes: 29 additions & 0 deletions libraries/helpers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,35 @@ def local_package_resource
:package # fallback if there's no platform match
end

def package_resource(ingredient_action)
presource = new_resource.package_source.nil? ? :package : local_package_resource

declare_resource presource, new_resource.product_name do
package_name ingredient_package_name
options new_resource.options
version install_version if Mixlib::Versioning.parse(version_string(new_resource.version)) > '0.0.0'
source new_resource.package_source
timeout new_resource.timeout
action ingredient_action
end
end

def install_mixlib_versioning
# We need Mixlib::Versioning in the library helpers for
# parsing the version string.
chef_gem "#{new_resource.product_name}-mixlib-versioning" do # ~FC009 foodcritic needs an update
package_name 'mixlib-versioning'
compile_time true
end

require 'mixlib/versioning'
end

def create_repository
cleanup_old_repo_config if ::File.exist?(old_ingredient_repo_file)
include_recipe "#{package_repo_type}-chef" if new_resource.package_source.nil?
end

def package_repo_type
return 'apt' if node['platform_family'] == 'debian'
return 'yum' if node['platform_family'] == 'rhel'
Expand Down
4 changes: 4 additions & 0 deletions libraries/matchers.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@ def install_chef_ingredient(pkg)
ChefSpec::Matchers::ResourceMatcher.new(:chef_ingredient, :install, pkg)
end

def upgrade_chef_ingredient(pkg)
ChefSpec::Matchers::ResourceMatcher.new(:chef_ingredient, :upgrade, pkg)
end

def uninstall_chef_ingredient(pkg)
ChefSpec::Matchers::ResourceMatcher.new(:chef_ingredient, :uninstall, pkg)
end
Expand Down
2 changes: 1 addition & 1 deletion spec/unit/recipes/test_repo_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

describe 'test::repo' do
[{ platform: 'ubuntu', version: '14.04' },
{ platform: 'centos', version: '6.5' }].each do |platform|
{ platform: 'centos', version: '6.5' }].each do |platform|
context "non-platform specific resources on #{platform[:platform]}" do
cached(:chef_run) do
ChefSpec::SoloRunner.new(
Expand Down
50 changes: 50 additions & 0 deletions spec/unit/recipes/test_upgrade_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
require 'spec_helper'

describe 'test::upgrade' do
[{ platform: 'ubuntu', version: '14.04' },
{ platform: 'centos', version: '6.5' }].each do |platform|
context "non-platform specific resources on #{platform[:platform]}" do
cached(:chef_run) do
ChefSpec::SoloRunner.new(
platform.merge(step_into: ['chef_ingredient'])
).converge(described_recipe)
end

it 'upgrades the chef_ingredient[chef-server]' do
expect(chef_run).to upgrade_chef_ingredient('chef-server')
end
end
end

context 'upgrade packages with yum on centos' do
cached(:centos_65) do
ChefSpec::SoloRunner.new(
platform: 'centos',
version: '6.5',
step_into: %w(chef_ingredient)
) do |node|
node.set['chef-server-core']['version'] = :latest
end.converge(described_recipe)
end

it 'upgrades yum_package[chef-server]' do
expect(centos_65).to upgrade_yum_package('chef-server-core')
end
end

context 'upgrade packages with apt on ubuntu' do
cached(:ubuntu_1404) do
ChefSpec::SoloRunner.new(
platform: 'ubuntu',
version: '14.04',
step_into: %w(chef_ingredient)
) do |node|
node.set['chef-server-core']['version'] = :latest
end.converge(described_recipe)
end

it 'upgrades apt_package[chef-server]' do
expect(ubuntu_1404).to upgrade_apt_package('chef-server-core')
end
end
end
3 changes: 3 additions & 0 deletions test/fixtures/cookbooks/test/recipes/upgrade.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
chef_ingredient 'chef-server' do
action [:install, :upgrade]
end