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 Feb 8, 2023
1 parent 1f96aa5 commit 04316a8
Show file tree
Hide file tree
Showing 3 changed files with 211 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
79 changes: 79 additions & 0 deletions manifests/copr.pp
Original file line number Diff line number Diff line change
@@ -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}.")
}
}
}
}
118 changes: 118 additions & 0 deletions spec/defines/copr_spec.rb
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 04316a8

Please sign in to comment.