Skip to content

Commit

Permalink
Add yum::copr resource to handle COPR repositories.
Browse files Browse the repository at this point in the history
COPR (Cool Other Package Repo) is a Fedora project
for third-party package repositories.
  • Loading branch information
olifre committed Jun 28, 2021
1 parent 1f96aa5 commit b152e50
Show file tree
Hide file tree
Showing 3 changed files with 196 additions and 0 deletions.
14 changes: 14 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
74 changes: 74 additions & 0 deletions manifests/copr.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
# @summary This definition manages COPR (Cool Other Package Repo) repositories.
#
# @param repo [String]
# Name of repository.
#
# @param ensure
# Specifies if repo should be enabled, disabled or removed.
#
# @example Add a COPR repository:
# ---
# yum::copr { 'copart/restic':
# ensure => 'enabled',
# }
#
define yum::copr (
String $repo = $title,
Enum['enabled', 'disabled', 'removed'] $ensure = 'enabled',
) {
$prereq_plugin = $facts['package_provider'] ? {
'yum' => 'yum-plugin-copr',
default => 'dnf-plugins-core',
}
ensure_packages([$prereq_plugin])

if $facts['package_provider'] == 'yum' {
$repo_name_part = regsubst($repo, '/', '-', 'G')
case $ensure {
'enabled': {
exec { "yum -y copr enable ${repo}":
path => '/bin:/usr/bin:/sbin/:/usr/sbin',
onlyif => "test ! -e /etc/yum.repos.d/_copr_${repo_name_part}.repo",
require => Package[$prereq_plugin],
}
}
'disabled', 'removed': {
exec { "yum -y copr disable ${repo}":
path => '/bin:/usr/bin:/sbin/:/usr/sbin',
onlyif => "test -e /etc/yum.repos.d/_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}.")
}
}
} else {
case $ensure {
'enabled': {
exec { "dnf -y copr enable ${repo}":
path => '/bin:/usr/bin:/sbin/:/usr/sbin',
unless => "dnf copr list | egrep -q '${repo}\$'",
require => Package[$prereq_plugin],
}
}
'disabled': {
exec { "dnf -y copr disable ${repo}":
path => '/bin:/usr/bin:/sbin/:/usr/sbin',
unless => "dnf copr list | egrep -q '${repo} (disabled)\$'",
require => Package[$prereq_plugin],
}
}
'removed': {
exec { "dnf -y copr remove ${repo}":
path => '/bin:/usr/bin:/sbin/:/usr/sbin',
unless => "dnf copr list | egrep -q '${repo}'",
require => Package[$prereq_plugin],
}
}
default: {
fail("The value for ensure for `yum::copr` must be enabled, disabled or removed, but it is ${ensure}.")
}
}
}
}
108 changes: 108 additions & 0 deletions spec/defines/copr_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
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(: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}")
}
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_#{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_#{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_#{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}")
}
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',
'unless' => "dnf copr list | egrep -q '#{title}'",
'require' => "Package[#{prereq_plugin}]"
)
}
end
end
end

0 comments on commit b152e50

Please sign in to comment.