lamont-cookbooks/multipackage

View on GitHub
resources/internal.rb

Summary

Maintainability
A
2 hrs
Test Coverage
# need build_resource
include Chef::DSL::Recipe

default_action :install

provides :multipackage_internal

property :package_name, [String, Array], name_property: true
property :version, [String, Array]
property :options, String
property :per_package_timeout, [String, Integer]

action :install do
  do_action(new_resource, :install)
end

action :upgrade do
  do_action(new_resource, :upgrade)
end

action :reconfig do
  do_action(new_resource, :reconfig)
end

action :remove do
  do_action(new_resource, :remove)
end

action :purge do
  do_action(new_resource, :purge)
end

# FIXME: can we get rid of new_resource everywhere?
def multipackage_resource(new_resource, action)
  package_name_array = package_name.is_a?(Array) ? package_name : package_name.split(", ")
  version_array = [new_resource.version].flatten if new_resource.version
  if new_resource.per_package_timeout
    total_timeout = new_resource.per_package_timeout *
      package_name_array.count
  end
  package new_resource.name do
    package_name package_name_array
    version version_array if version_array
    options new_resource.options if new_resource.options
    timeout total_timeout if total_timeout
    action action
  end
end

def singlepackage_resources(new_resource, action)
  package_name_array = package_name.is_a?(Array) ? package_name : package_name.split(", ")
  version_array = [new_resource.version].flatten if new_resource.version
  package_name_array.each_with_index do |package_name, i|
    version = version_array[i] if version_array
    package package_name do
      version version if version
      options new_resource.options if new_resource.options
      if new_resource.per_package_timeout
        timeout new_resource.per_package_timeout
      end
      action action
    end
  end
end

def do_action(new_resource, action)
  if multipackage_supported?(action)
    begin
      multipackage_resource(new_resource, action)
    rescue Chef::Exceptions::ValidationFailed
      singlepackage_resources(new_resource, action)
    end
  else
    singlepackage_resources(new_resource, action)
  end
end

def multipackage_supported?(action)
  klass = Chef::Resource.resource_for_node(:package, node)
  (klass == Chef::Resource::YumPackage && action != :remove) ||
    klass == Chef::Resource::AptPackage
end