Skip to content

Commit d42b821

Browse files
committed
Merge pull request puppetlabs#521 from raphink/dev/server_extension
Add postgresql::server::extension definition
2 parents 7a5a298 + 807fefe commit d42b821

File tree

3 files changed

+158
-0
lines changed

3 files changed

+158
-0
lines changed

README.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,7 @@ Resources:
235235
* [postgresql::server::db](#resource-postgresqlserverdb)
236236
* [postgresql::server::database](#resource-postgresqlserverdatabase)
237237
* [postgresql::server::database_grant](#resource-postgresqlserverdatabase_grant)
238+
* [postgresql::server::extension](#resource-postgresqlserverextension)
238239
* [postgresql::server::pg_hba_rule](#resource-postgresqlserverpg_hba_rule)
239240
* [postgresql::server::pg_ident_rule](#resource-postgresqlserverpg_ident_rule)
240241
* [postgresql::server::role](#resource-postgresqlserverrole)
@@ -668,6 +669,21 @@ Database to execute the grant against. This should not ordinarily be changed fro
668669
OS user for running `psql`. Defaults to the default user for the module, usually `postgres`.
669670

670671

672+
###Resource: postgresql::server::extension
673+
Manages a postgresql extension.
674+
675+
####`database`
676+
The database on which to activate the extension.
677+
678+
####`ensure`
679+
Whether to activate (`present`) or deactivate (`absent`) the extension.
680+
681+
####`package_name`
682+
If provided, this will install the given package prior to activating the extension.
683+
684+
####`package_ensure`
685+
By default, the package specified with `package_name` will be installed when the extension is activated, and removed when the extension is deactivated. You can override this behavior by setting the `ensure` value for the package.
686+
671687
###Resource: postgresql::server::pg\_hba\_rule
672688
This defined type allows you to create an access rule for `pg_hba.conf`. For more details see the [PostgreSQL documentation](http://www.postgresql.org/docs/8.2/static/auth-pg-hba-conf.html).
673689

manifests/server/extension.pp

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Activate an extension on a postgresql database
2+
define postgresql::server::extension (
3+
$database,
4+
$ensure = 'present',
5+
$package_name = undef,
6+
$package_ensure = undef,
7+
) {
8+
case $ensure {
9+
'present': {
10+
$command = "CREATE EXTENSION ${name}"
11+
$unless_comp = '='
12+
$package_require = undef
13+
$package_before = Postgresql_psql["Add ${title} extension to ${database}"]
14+
}
15+
16+
'absent': {
17+
$command = "DROP EXTENSION ${name}"
18+
$unless_comp = '!='
19+
$package_require = Postgresql_psql["Add ${title} extension to ${database}"]
20+
$package_before = undef
21+
}
22+
23+
default: {
24+
fail("Unknown value for ensure '${ensure}'.")
25+
}
26+
}
27+
28+
postgresql_psql {"Add ${title} extension to ${database}":
29+
db => $database,
30+
command => $command,
31+
unless => "SELECT t.count FROM (SELECT count(extname) FROM pg_extension WHERE extname = '${name}') as t WHERE t.count ${unless_comp} 1",
32+
require => Postgresql::Server::Database[$database],
33+
}
34+
35+
if $package_name {
36+
$_package_ensure = $package_ensure ? {
37+
undef => $ensure,
38+
default => $package_ensure,
39+
}
40+
41+
package { "Postgresql extension ${title}":
42+
ensure => $_package_ensure,
43+
name => $package_name,
44+
tag => 'postgresql',
45+
require => $package_require,
46+
before => $package_before,
47+
}
48+
}
49+
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
require 'spec_helper'
2+
3+
describe 'postgresql::server::extension', :type => :define do
4+
let :pre_condition do
5+
"class { 'postgresql::server': }
6+
postgresql::server::database { 'template_postgis':
7+
template => 'template1',
8+
}"
9+
end
10+
11+
let :facts do
12+
{
13+
:osfamily => 'Debian',
14+
:operatingsystem => 'Debian',
15+
:operatingsystemrelease => '6.0',
16+
:kernel => 'Linux',
17+
:concat_basedir => tmpfilename('postgis'),
18+
:id => 'root',
19+
:path => '/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin',
20+
}
21+
end
22+
23+
let (:title) { 'postgis' }
24+
let (:params) { {
25+
:database => 'template_postgis',
26+
} }
27+
28+
context "with mandatory arguments only" do
29+
it {
30+
is_expected.to contain_postgresql_psql('Add postgis extension to template_postgis').with({
31+
:db => 'template_postgis',
32+
:command => 'CREATE EXTENSION postgis',
33+
:unless => "SELECT t.count FROM (SELECT count(extname) FROM pg_extension WHERE extname = 'postgis') as t WHERE t.count = 1",
34+
}).that_requires('Postgresql::Server::Database[template_postgis]')
35+
}
36+
end
37+
38+
context "when setting package name" do
39+
let (:params) { super().merge({
40+
:package_name => 'postgis',
41+
}) }
42+
43+
it {
44+
is_expected.to contain_package('Postgresql extension postgis').with({
45+
:ensure => 'present',
46+
:name => 'postgis',
47+
}).that_comes_before('Postgresql_psql[Add postgis extension to template_postgis]')
48+
}
49+
end
50+
51+
context "when ensuring absence" do
52+
let (:params) { super().merge({
53+
:ensure => 'absent',
54+
:package_name => 'postgis',
55+
}) }
56+
57+
it {
58+
is_expected.to contain_postgresql_psql('Add postgis extension to template_postgis').with({
59+
:db => 'template_postgis',
60+
:command => 'DROP EXTENSION postgis',
61+
:unless => "SELECT t.count FROM (SELECT count(extname) FROM pg_extension WHERE extname = 'postgis') as t WHERE t.count != 1",
62+
}).that_requires('Postgresql::Server::Database[template_postgis]')
63+
}
64+
65+
it {
66+
is_expected.to contain_package('Postgresql extension postgis').with({
67+
:ensure => 'absent',
68+
:name => 'postgis',
69+
})
70+
}
71+
72+
context "when keeping package installed" do
73+
let (:params) { super().merge({
74+
:package_ensure => 'present',
75+
}) }
76+
77+
it {
78+
is_expected.to contain_postgresql_psql('Add postgis extension to template_postgis').with({
79+
:db => 'template_postgis',
80+
:command => 'DROP EXTENSION postgis',
81+
:unless => "SELECT t.count FROM (SELECT count(extname) FROM pg_extension WHERE extname = 'postgis') as t WHERE t.count != 1",
82+
}).that_requires('Postgresql::Server::Database[template_postgis]')
83+
}
84+
85+
it {
86+
is_expected.to contain_package('Postgresql extension postgis').with({
87+
:ensure => 'present',
88+
:name => 'postgis',
89+
}).that_requires('Postgresql_psql[Add postgis extension to template_postgis]')
90+
}
91+
end
92+
end
93+
end

0 commit comments

Comments
 (0)