160 lines
4.8 KiB
Ruby
160 lines
4.8 KiB
Ruby
#
|
|
# Copyright 2015-2017, Noah Kantrowitz
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
#
|
|
|
|
require 'chef/resource'
|
|
require 'chef/provider'
|
|
require 'poise'
|
|
|
|
|
|
module PoiseLanguages
|
|
module Scl
|
|
# A `poise_language_scl` resource to manage installing a language from
|
|
# SCL packages. This is an internal implementation detail of
|
|
# poise-languages.
|
|
#
|
|
# @api private
|
|
# @since 1.0
|
|
# @provides poise_languages_scl
|
|
# @action install
|
|
# @action uninstall
|
|
class Resource < Chef::Resource
|
|
include Poise
|
|
provides(:poise_languages_scl)
|
|
actions(:install, :upgrade, :uninstall)
|
|
|
|
# @!attribute package_name
|
|
# Name of the SCL package for the language.
|
|
# @return [String]
|
|
attribute(:package_name, kind_of: String, name_attribute: true)
|
|
# @!attribute dev_package
|
|
# Name of the -devel package with headers and whatnot.
|
|
# @return [String, nil]
|
|
attribute(:dev_package, kind_of: [String, NilClass])
|
|
# @!attribute version
|
|
# Version of the SCL package(s) to install. If unset, follows the same
|
|
# semantics as the core `package` resource.
|
|
# @return [String, nil]
|
|
attribute(:version, kind_of: [String, NilClass])
|
|
# @!attribute parent
|
|
# Resource for the language runtime. Used only for messages.
|
|
# @return [Chef::Resource]
|
|
attribute(:parent, kind_of: Chef::Resource, required: true)
|
|
end
|
|
|
|
# The default provider for `poise_languages_scl`.
|
|
#
|
|
# @api private
|
|
# @since 1.0
|
|
# @see Resource
|
|
# @provides poise_languages_scl
|
|
class Provider < Chef::Provider
|
|
include Poise
|
|
provides(:poise_languages_scl)
|
|
|
|
# The `install` action for the `poise_languages_scl` resource.
|
|
#
|
|
# @return [void]
|
|
def action_install
|
|
notifying_block do
|
|
install_scl_repo
|
|
flush_yum_cache
|
|
install_scl_package(:install)
|
|
install_scl_devel_package(:install) if new_resource.dev_package
|
|
end
|
|
end
|
|
|
|
# The `upgrade` action for the `poise_languages_scl` resource.
|
|
#
|
|
# @return [void]
|
|
def action_upgrade
|
|
notifying_block do
|
|
install_scl_repo
|
|
flush_yum_cache
|
|
install_scl_package(:upgrade)
|
|
install_scl_devel_package(:upgrade) if new_resource.dev_package
|
|
end
|
|
end
|
|
|
|
# The `uninstall` action for the `poise_languages_scl` resource.
|
|
#
|
|
# @return [void]
|
|
def action_uninstall
|
|
notifying_block do
|
|
uninstall_scl_devel_package if new_resource.dev_package
|
|
uninstall_scl_package
|
|
end
|
|
end
|
|
|
|
private
|
|
|
|
def install_scl_repo
|
|
if node.platform?('redhat')
|
|
# Set up the real RHSCL subscription.
|
|
# NOTE: THIS IS NOT TESTED BECAUSE REDHAT DOESN'T OFFER ANY WAY TO DO
|
|
# AUTOMATED TESTING. IF YOU USE REDHAT AND THIS BREAKS, PLEASE LET ME
|
|
# KNOW BY FILING A GITHUB ISSUE AT http://github.com/poise/poise-languages/issues/new.
|
|
repo_name = "rhel-server-rhscl-#{node['platform_version'][0]}-rpms"
|
|
execute "subscription-manager repos --enable #{repo_name}" do
|
|
not_if { shell_out!('subscription-manager repos --list-enabled').stdout.include?(repo_name) }
|
|
end
|
|
else
|
|
package 'centos-release-scl-rh' do
|
|
# Using upgrade here because changes very very rare and always
|
|
# important when they happen. If this breaks your prod infra, I'm
|
|
# sorry :-(
|
|
action :upgrade
|
|
retries 5
|
|
end
|
|
end
|
|
end
|
|
|
|
def flush_yum_cache
|
|
ruby_block 'flush_yum_cache' do
|
|
block do
|
|
# Equivalent to flush_cache after: true
|
|
Chef::Provider::Package::Yum::YumCache.instance.reload
|
|
end
|
|
end
|
|
end
|
|
|
|
def install_scl_package(action)
|
|
package new_resource.package_name do
|
|
action action
|
|
retries 5
|
|
version new_resource.version
|
|
end
|
|
end
|
|
|
|
def install_scl_devel_package(action)
|
|
package new_resource.dev_package do
|
|
action action
|
|
retries 5
|
|
version new_resource.version
|
|
end
|
|
end
|
|
|
|
def uninstall_scl_package
|
|
install_scl_package(:remove)
|
|
end
|
|
|
|
def uninstall_scl_devel_package
|
|
install_scl_devel_package(:remove)
|
|
end
|
|
|
|
end
|
|
end
|
|
end
|