-
Notifications
You must be signed in to change notification settings - Fork 136
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add support for the Certbot Gandi plugin #295
base: master
Are you sure you want to change the base?
Changes from 10 commits
de30daa
bf81b49
863985a
471c64e
37200dc
f062f57
2d89536
b51de96
d62ea76
09ba2f7
e010968
9323fb2
0287c8b
b2fe5ce
6c82c1a
ed0cfca
f8457b7
17c1b61
47824f6
ef0d4f5
a513b57
1e65a10
3996f08
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
--- | ||
letsencrypt::plugin::dns_gandi::package_provider: apt | ||
letsencrypt::plugin::dns_gandi::package_name: python3-certbot-dns-gandi |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
--- | ||
letsencrypt::plugin::dns_gandi::package_name: python3-certbot-dns-gandi | ||
letsencrypt::plugin::dns_gandi::package_provider: apt |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
# @summary Installs and configures the dns-gandi plugin | ||
# | ||
# This class installs and configures the Let's Encrypt dns-gandi plugin. | ||
# https://pypi.org/project/certbot-plugin-gandi/ | ||
# | ||
# @param api_key Gandi production api key secret. You can get it in you security tab of your account | ||
# @param package_name The name of the package to install when $manage_package is true. | ||
# @param config_file The path to the configuration file. | ||
# @param manage_package Manage the plugin package. | ||
# | ||
class letsencrypt::plugin::dns_gandi ( | ||
String[1] $api_key, | ||
String[1] $package_name, | ||
Optional[String[1]] $package_provider = undef, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is an unused parameter. Shouldn't it be passed to the |
||
Stdlib::Absolutepath $config_file = "${letsencrypt::config_dir}/dns-gandi.ini", | ||
Boolean $manage_package = true, | ||
) { | ||
require letsencrypt | ||
|
||
if $manage_package { | ||
package { $package_name: | ||
ensure => installed, | ||
before => File[$config_file], | ||
} | ||
} | ||
|
||
$ini_vars = { | ||
'certbot_plugin_gandi:dns_api_key' => $api_key, | ||
} | ||
|
||
file { $config_file: | ||
ensure => file, | ||
owner => 'root', | ||
group => 'root', | ||
mode => '0400', | ||
content => epp('letsencrypt/ini.epp', { | ||
vars => { '' => $ini_vars }, | ||
}), | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'spec_helper_acceptance' | ||
|
||
describe 'letsencrypt::plugin::dns_gandi', if: supported_os_gandi(fact('os')) do | ||
it_behaves_like 'an idempotent resource' do | ||
let(:manifest) do | ||
<<-PUPPET | ||
include letsencrypt | ||
class { 'letsencrypt::plugin::dns_gandi': | ||
api_key => 'dummy-gandi-api-token', | ||
} | ||
PUPPET | ||
end | ||
end | ||
|
||
describe file('/etc/letsencrypt/dns-gandi.ini') do | ||
it { is_expected.to be_file } | ||
it { is_expected.to be_owned_by 'root' } | ||
it { is_expected.to be_grouped_into 'root' } | ||
it { is_expected.to be_mode 400 } | ||
end | ||
end |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,59 @@ | ||||||
# frozen_string_literal: true | ||||||
|
||||||
require 'spec_helper' | ||||||
|
||||||
describe 'letsencrypt::plugin::dns_gandi' do | ||||||
on_supported_os.each do |os, facts| | ||||||
next if supported_os_gandi(facts[:os]) | ||||||
cible marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
|
||||||
context "on #{os} based operating systems" do | ||||||
let(:facts) { facts } | ||||||
let(:params) { { 'api_key' => 'dummy-gandi-api-token' } } | ||||||
let(:pre_condition) do | ||||||
<<-PUPPET | ||||||
class { 'letsencrypt': | ||||||
email => '[email protected]', | ||||||
} | ||||||
PUPPET | ||||||
end | ||||||
let(:package_name) do | ||||||
osname = facts[:os]['name'] | ||||||
osrelease = facts[:os]['release']['major'] | ||||||
osfull = "#{osname}-#{osrelease}" | ||||||
case osfull | ||||||
when 'Debian-11', 'Ubuntu-20.04' | ||||||
'python3-certbot-dns-gandi' | ||||||
end | ||||||
cible marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
end | ||||||
|
||||||
context 'with required parameters' do | ||||||
it do | ||||||
if package_name.nil? | ||||||
is_expected.not_to compile | ||||||
cible marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||
else | ||||||
is_expected.to compile.with_all_deps | ||||||
end | ||||||
end | ||||||
|
||||||
describe 'with manage_package => true' do | ||||||
let(:params) { super().merge(manage_package: true) } | ||||||
|
||||||
it do | ||||||
if package_name.nil? | ||||||
is_expected.not_to compile | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. A better way is to test for the error:
Suggested change
|
||||||
else | ||||||
is_expected.to contain_class('letsencrypt::plugin::dns_gandi').with_package_name(package_name) | ||||||
is_expected.to contain_package(package_name).with_ensure('installed') | ||||||
end | ||||||
end | ||||||
end | ||||||
|
||||||
describe 'with manage_package => false' do | ||||||
let(:params) { super().merge(manage_package: false, package_name: 'dns-gandi-package') } | ||||||
|
||||||
it { is_expected.not_to contain_package('dns-gandi-package') } | ||||||
end | ||||||
end | ||||||
end | ||||||
end | ||||||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -207,6 +207,45 @@ class { 'letsencrypt::plugin::dns_cloudflare': | |
it { is_expected.to contain_exec('letsencrypt certonly foo.example.com').with_command "letsencrypt --text --agree-tos --non-interactive certonly --rsa-key-size 4096 -a dns-cloudflare --cert-name 'foo.example.com' -d 'foo.example.com' --dns-cloudflare --dns-cloudflare-credentials /etc/letsencrypt/dns-cloudflare.ini --dns-cloudflare-propagation-seconds 10" } | ||
end | ||
|
||
context 'with dns-gandi plugin' do | ||
let(:title) { 'foo.example.com' } | ||
let(:params) { { plugin: 'dns-gandi', letsencrypt_command: 'letsencrypt' } } | ||
let(:pre_condition) do | ||
<<-PUPPET | ||
class { 'letsencrypt': | ||
email => '[email protected]', | ||
config_dir => '/etc/letsencrypt', | ||
} | ||
class { 'letsencrypt::plugin::dns_gandi': | ||
package_name => 'irrelevant', | ||
api_key => 'dummy-gandi-api-token', | ||
} | ||
PUPPET | ||
end | ||
|
||
it { is_expected.to compile.with_all_deps } | ||
it { is_expected.to contain_class('letsencrypt::plugin::dns_gandi') } | ||
it { is_expected.to contain_exec('letsencrypt certonly foo.example.com').with_command "letsencrypt --text --agree-tos --non-interactive certonly --rsa-key-size 4096 -a dns-gandi --cert-name 'foo.example.com' -d 'foo.example.com' -a certbot-plugin-gandi:dns --certbot-plugin-gandi:dns-credentials /etc/letsencrypt/dns-gandi.ini" } | ||
end | ||
|
||
context 'with dns-gandi plugin without apy_key' do | ||
let(:title) { 'foo.example.com' } | ||
let(:params) { { plugin: 'dns-gandi', letsencrypt_command: 'letsencrypt' } } | ||
let(:pre_condition) do | ||
<<-PUPPET | ||
class { 'letsencrypt': | ||
email => '[email protected]', | ||
config_dir => '/etc/letsencrypt', | ||
} | ||
class { 'letsencrypt::plugin::dns_gandi': | ||
package_name => 'irrelevant', | ||
} | ||
PUPPET | ||
end | ||
|
||
it { is_expected.not_to compile.with_all_deps } | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Here too it's better to compile and test for a specific error There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. For this one, the module won't work with an empty api_key and I don't know how to handle the error:
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The |
||
end | ||
|
||
context 'with custom plugin' do | ||
let(:title) { 'foo.example.com' } | ||
let(:params) { { plugin: 'apache' } } | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
# frozen_string_literal: true | ||
|
||
def supported_os_gandi(os) | ||
# Gandi plugin is only supported on debian 11 and ubuntu 20.04 and superiors | ||
(os['name'] == 'Debian' && os['release']['major'].to_i >= 11) || (os['name'] == 'Ubuntu' && os['release']['major'].to_i >= 20) | ||
end |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,5 +8,6 @@ | |
'dns-google', | ||
'dns-cloudflare', | ||
'dns-rfc2136', | ||
'dns-gandi', | ||
'manual', | ||
] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why do you need to set the package provider? That's rarely needed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You're right, I will remove it