diff --git a/README.md b/README.md index c0da4689..5f7b3e82 100644 --- a/README.md +++ b/README.md @@ -61,6 +61,20 @@ yum::config { 'debuglevel': } ``` +### Manage COPR repositories + +This module also supports managing +COPR ([Cool Other Package Repo](https://fedoraproject.org/wiki/Category:Copr)) +repositories via the `yum::copr` resource. The resource title specifies +the COPR repository name, and `ensure` accepts the values `enabled`, `disabled` +or `removed`. Example usage: + +```puppet +yum::copr { 'copart/restic': + ensure => enabled, +} +``` + ### Manage a custom repo via Hiera data Using Hiera and automatic parameter lookup (APL), this module can manage diff --git a/manifests/copr.pp b/manifests/copr.pp new file mode 100644 index 00000000..289ce9dd --- /dev/null +++ b/manifests/copr.pp @@ -0,0 +1,79 @@ +# Define: yum::copr +# +# This definition manages Copr (Cool Other Package Repo) repositories. +# +# Parameters: +# [*copr_repo*] - name of repository, defaults to title +# [*ensure*] - specifies if repo should be enabled, +# disabled or removed +# +# Actions: +# +# Requires: +# RPM based system +# +# Sample usage: +# yum::copr { 'copart/restic': +# ensure => 'enabled', +# } +# +define yum::copr ( + String $copr_repo = $title, + Enum['enabled', 'disabled', 'removed'] $ensure = 'enabled', +) { + $prereq_plugin = $facts['package_provider'] ? { + 'dnf' => 'dnf-plugins-core', + default => 'yum-plugin-copr', + } + ensure_packages([$prereq_plugin]) + + if $facts['package_provider'] == 'dnf' { + case $ensure { + 'enabled': { + exec { "dnf -y copr enable ${copr_repo}": + path => '/bin:/usr/bin:/sbin/:/usr/sbin', + unless => "dnf copr list | egrep -q '${copr_repo}\$'", + require => Package[$prereq_plugin], + } + } + 'disabled': { + exec { "dnf -y copr disable ${copr_repo}": + path => '/bin:/usr/bin:/sbin/:/usr/sbin', + unless => "dnf copr list | egrep -q '${copr_repo} (disabled)\$'", + require => Package[$prereq_plugin], + } + } + 'removed': { + exec { "dnf -y copr remove ${copr_repo}": + path => '/bin:/usr/bin:/sbin/:/usr/sbin', + onlyif => "dnf copr list | egrep -q '${copr_repo}'", + require => Package[$prereq_plugin], + } + } + default: { + fail("The value for ensure for `yum::copr` must be enabled, disabled or removed, but it is ${ensure}.") + } + } + } else { + $copr_repo_name_part = regsubst($copr_repo, '/', '-', 'G') + case $ensure { + 'enabled': { + exec { "yum -y copr enable ${copr_repo}": + path => '/bin:/usr/bin:/sbin/:/usr/sbin', + onlyif => "test ! -e /etc/yum.repos.d/_copr_${copr_repo_name_part}.repo", + require => Package[$prereq_plugin], + } + } + 'disabled', 'removed': { + exec { "yum -y copr disable ${copr_repo}": + path => '/bin:/usr/bin:/sbin/:/usr/sbin', + onlyif => "test -e /etc/yum.repos.d/_copr_${copr_repo_name_part}.repo", + require => Package[$prereq_plugin], + } + } + default: { + fail("The value for ensure for `yum::copr` must be enabled, disabled or removed, but it is ${ensure}.") + } + } + } +} diff --git a/spec/defines/copr_spec.rb b/spec/defines/copr_spec.rb new file mode 100644 index 00000000..ca4b05ef --- /dev/null +++ b/spec/defines/copr_spec.rb @@ -0,0 +1,118 @@ +# frozen_string_literal: true + +require 'spec_helper' + +describe 'yum::copr' do + context 'with package_provider set to yum' do + let(:facts) { { package_provider: 'yum' } } + let(:prereq_plugin) { 'yum-plugin-copr' } + let(:title) { 'copart/restic' } + let(:copr_repo_name_part) { title.gsub('/', '-') } + + context 'package provider plugin installed' do + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_package(prereq_plugin.to_s) + } + end + + context 'with ensure = enabled' do + let(:params) { { ensure: 'enabled' } } + + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_exec("yum -y copr enable #{title}").with( + 'path' => '/bin:/usr/bin:/sbin/:/usr/sbin', + 'onlyif' => "test ! -e /etc/yum.repos.d/_copr_#{copr_repo_name_part}.repo", + 'require' => "Package[#{prereq_plugin}]" + ) + } + end + + context 'with ensure = disabled' do + let(:params) { { ensure: 'disabled' } } + + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_exec("yum -y copr disable #{title}").with( + 'path' => '/bin:/usr/bin:/sbin/:/usr/sbin', + 'onlyif' => "test -e /etc/yum.repos.d/_copr_#{copr_repo_name_part}.repo", + 'require' => "Package[#{prereq_plugin}]" + ) + } + end + + context 'with ensure = removed' do + let(:params) { { ensure: 'removed' } } + + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_exec("yum -y copr disable #{title}").with( + 'path' => '/bin:/usr/bin:/sbin/:/usr/sbin', + 'onlyif' => "test -e /etc/yum.repos.d/_copr_#{copr_repo_name_part}.repo", + 'require' => "Package[#{prereq_plugin}]" + ) + } + end + end + + context 'with package_provider set to dnf' do + let(:facts) { { package_provider: 'dnf' } } + let(:prereq_plugin) { 'dnf-plugins-core' } + let(:title) { 'copart/restic' } + + context 'package provider plugin installed' do + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_package(prereq_plugin.to_s) + } + end + + context 'with ensure = enabled' do + let(:params) { { ensure: 'enabled' } } + + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_exec("dnf -y copr enable #{title}").with( + 'path' => '/bin:/usr/bin:/sbin/:/usr/sbin', + 'unless' => "dnf copr list | egrep -q '#{title}\$'", + 'require' => "Package[#{prereq_plugin}]" + ) + } + end + + context 'with ensure = disabled' do + let(:params) { { ensure: 'disabled' } } + + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_exec("dnf -y copr disable #{title}").with( + 'path' => '/bin:/usr/bin:/sbin/:/usr/sbin', + 'unless' => "dnf copr list | egrep -q '#{title} (disabled)\$'", + 'require' => "Package[#{prereq_plugin}]" + ) + } + end + + context 'with ensure = removed' do + let(:params) { { ensure: 'removed' } } + + it { is_expected.to compile.with_all_deps } + + it { + is_expected.to contain_exec("dnf -y copr remove #{title}").with( + 'path' => '/bin:/usr/bin:/sbin/:/usr/sbin', + 'onlyif' => "dnf copr list | egrep -q '#{title}'", + 'require' => "Package[#{prereq_plugin}]" + ) + } + end + end +end