Skip to content

Commit f070d28

Browse files
authored
OS package install support (#743)
* OS package install support * Increase testing for OS package install
1 parent 75dda54 commit f070d28

File tree

14 files changed

+314
-40
lines changed

14 files changed

+314
-40
lines changed

.github/workflows/ci.yml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ jobs:
3232
- "rockylinux-8"
3333
- "ubuntu-2004"
3434
- "ubuntu-2204"
35-
3635
suite:
3736
- "access-11"
3837
- "access-12"
@@ -58,6 +57,10 @@ jobs:
5857
- "server-install-13"
5958
- "server-install-14"
6059
- "server-install-15"
60+
- "server-install-os"
61+
exclude:
62+
- os: "centos-7"
63+
suite: "server-install-os"
6164
fail-fast: false
6265

6366
steps:

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ This file is used to list changes made in the last 3 major versions of the postg
44

55
## Unreleased
66

7+
- Allow package installation from OS distribution repository
8+
79
## 11.2.12 - *2023-05-16*
810

911
## 11.2.11 - *2023-05-04*

documentation/postgresql_install.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
| ---------------------------------- | ----- | --------------- | ------- | ------------------------------------------------ | -------------- |
2222
| `sensitive` | | true, false | | | |
2323
| `version` | | String, Integer | | Version to install | |
24-
| `source` | | String, Symbol | | Installation source | repo |
24+
| `source` | | String, Symbol | | Installation source | repo, os |
2525
| `client_packages` | | String, Array | | Client packages to install | |
2626
| `server_packages` | | String, Array | | Server packages to install | |
2727
| `repo_pgdg` | | true, false | | Create pgdg repo | |

kitchen.yml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ platforms:
3333
- name: ubuntu-22.04
3434

3535
suites:
36+
- name: server_install_os
37+
verifier:
38+
inspec_tests:
39+
- path: test/integration/server_install_os/
40+
run_list:
41+
- recipe[test::server_install_os]
42+
3643
- name: access_15
3744
attributes:
3845
test:

libraries/helpers.rb

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -28,33 +28,58 @@ def installed_postgresql_major_version
2828

2929
raise 'Unable to determine installed PostgreSQL version' if nil_or_empty?(pgsql_package)
3030

31-
pgsql_package_version = pgsql_package.first[1].fetch('version').to_i
32-
Chef::Log.info("Deteched PostgreSQL version: #{pgsql_package_version}")
31+
pgsql_package = pgsql_package.values.first
32+
pgsql_package_version = pgsql_package.fetch('version').to_i
33+
pgsql_package_source = if pgsql_package.key?('release')
34+
pgsql_package.fetch('release').match?('PGDG') ? :repo : :os
35+
else
36+
pgsql_package.fetch('version').match?('pgdg') ? :repo : :os
37+
end
38+
39+
Chef::Log.info("Detected installed PostgreSQL version: #{pgsql_package_version} installed from #{pgsql_package_source}")
3340

3441
pgsql_package_version
3542
end
3643

37-
def data_dir(version = installed_postgresql_major_version)
44+
def installed_postgresql_package_source
45+
pgsql_package = node['packages'].filter { |p| p.match?(/postgresql-?(\d+)?$/) }
46+
47+
raise 'Unable to determine installed PostgreSQL version' if nil_or_empty?(pgsql_package)
48+
49+
pgsql_package = pgsql_package.values.first
50+
pgsql_package_version = pgsql_package.fetch('version').to_i
51+
pgsql_package_source = if pgsql_package.key?('release')
52+
pgsql_package.fetch('release').match?('PGDG') ? :repo : :os
53+
else
54+
pgsql_package.fetch('version').match?('pgdg') ? :repo : :os
55+
end
56+
57+
Chef::Log.info("Detected installed PostgreSQL version: #{pgsql_package_version} installed from #{pgsql_package_source}")
58+
59+
pgsql_package_source
60+
end
61+
62+
def data_dir(version: installed_postgresql_major_version, source: installed_postgresql_package_source)
3863
case node['platform_family']
3964
when 'rhel', 'fedora', 'amazon'
40-
"/var/lib/pgsql/#{version}/data"
65+
source.eql?(:repo) ? "/var/lib/pgsql/#{version}/data" : '/var/lib/pgsql/data'
4166
when 'debian'
4267
"/var/lib/postgresql/#{version}/main"
4368
end
4469
end
4570

46-
def conf_dir(version = installed_postgresql_major_version)
71+
def conf_dir(version: installed_postgresql_major_version, source: installed_postgresql_package_source)
4772
case node['platform_family']
4873
when 'rhel', 'fedora', 'amazon'
49-
"/var/lib/pgsql/#{version}/data"
74+
source.eql?(:repo) ? "/var/lib/pgsql/#{version}/data" : '/var/lib/pgsql/data'
5075
when 'debian'
5176
"/etc/postgresql/#{version}/main"
5277
end
5378
end
5479

5580
# determine the platform specific service name
56-
def default_platform_service_name(version = installed_postgresql_major_version)
57-
if platform_family?('rhel', 'fedora', 'amazon')
81+
def default_platform_service_name(version: installed_postgresql_major_version, source: installed_postgresql_package_source)
82+
if platform_family?('rhel', 'fedora', 'amazon') && source.eql?(:repo)
5883
"postgresql-#{version}"
5984
else
6085
'postgresql'
@@ -73,24 +98,37 @@ def initialized?
7398
def secure_random
7499
r = SecureRandom.hex
75100
Chef::Log.debug "Generated password: #{r}"
101+
76102
r
77103
end
78104

79-
def default_server_packages
105+
def default_server_packages(version: nil, source: :os)
80106
case node['platform_family']
81107
when 'rhel', 'fedora', 'amazon'
82-
%W(postgresql#{version.delete('.')}-contrib postgresql#{version.delete('.')}-libs postgresql#{version.delete('.')}-server)
108+
{
109+
os: %w(postgresql-contrib postgresql-server),
110+
repo: %W(postgresql#{version.delete('.')}-contrib postgresql#{version.delete('.')}-server),
111+
}.fetch(source, nil)
83112
when 'debian'
84-
%W(postgresql-#{version} postgresql-common)
113+
{
114+
os: %w(postgresql postgresql-common),
115+
repo: %W(postgresql-#{version} postgresql-common),
116+
}.fetch(source, nil)
85117
end
86118
end
87119

88-
def default_client_packages
120+
def default_client_packages(version: nil, source: :os)
89121
case node['platform_family']
90122
when 'rhel', 'fedora', 'amazon'
91-
%W(postgresql#{version.delete('.')} postgresql#{version.delete('.')}-libs)
123+
{
124+
os: %w(postgresql),
125+
repo: %W(postgresql#{version.delete('.')}),
126+
}.fetch(source, nil)
92127
when 'debian'
93-
%W(postgresql-client-#{version})
128+
{
129+
os: %w(postgresql-client),
130+
repo: %W(postgresql-client-#{version}),
131+
}.fetch(source, nil)
94132
end
95133
end
96134

@@ -102,11 +140,11 @@ def dnf_module_platform?
102140
# initdb defaults to the execution environment.
103141
# https://www.postgresql.org/docs/9.5/static/locale.html
104142
def rhel_init_db_command(new_resource)
105-
cmd = "/usr/pgsql-#{new_resource.version}/bin/initdb"
143+
cmd = new_resource.source.eql?(:repo) ? "/usr/pgsql-#{new_resource.version}/bin/initdb" : '/usr/bin/initdb'
106144
cmd << " --locale '#{new_resource.initdb_locale}'" if new_resource.initdb_locale
107145
cmd << " -E '#{new_resource.initdb_encoding}'" if new_resource.initdb_encoding
108146
cmd << " #{new_resource.initdb_additional_options}" if new_resource.initdb_additional_options
109-
cmd << " -D '#{data_dir(new_resource.version)}'"
147+
cmd << " -D '#{data_dir}'"
110148
end
111149

112150
# Given the base URL build the complete URL string for a yum repo

libraries/sql/_connection.rb

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,13 @@ module Connection
2727
include PostgreSQL::Cookbook::Utils
2828
include PostgreSQL::Cookbook::Helpers
2929

30-
def postgresql_devel_pkg_name(version = installed_postgresql_major_version)
31-
platform_family?('debian') ? 'libpq-dev' : "postgresql#{version}-devel"
30+
def postgresql_devel_pkg_name(version: installed_postgresql_major_version, source: installed_postgresql_package_source)
31+
case node['platform_family']
32+
when 'rhel', 'fedora', 'amazon'
33+
source.eql?(:repo) ? "postgresql#{version}-devel" : 'postgresql-devel'
34+
when 'debian'
35+
'libpq-dev'
36+
end
3237
end
3338

3439
def postgresql_devel_path(suffix = nil, version: installed_postgresql_major_version)
@@ -65,11 +70,13 @@ def install_pg_gem
6570
declare_resource(:package, 'epel-release') { compile_time(true) }
6671
declare_resource(:package, 'centos-release-scl') { compile_time(true) }
6772
when 8
73+
declare_resource(:package, 'libpq') { compile_time(true) }
6874
declare_resource(:package, 'perl-IPC-Run') do
6975
compile_time(true)
7076
options('--enablerepo=powertools')
7177
end
7278
when 9
79+
declare_resource(:package, 'libpq') { compile_time(true) }
7380
declare_resource(:package, 'perl-IPC-Run') do
7481
compile_time(true)
7582
options('--enablerepo=crb')

resources/config.rb

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,15 +94,24 @@
9494
action :create
9595
end
9696

97+
service_dir = case installed_postgresql_package_source
98+
when :os
99+
'/etc/systemd/system/postgresql.service.d'
100+
when :repo
101+
"/etc/systemd/system/postgresql-#{new_resource.version}.service.d"
102+
else
103+
raise ArgumentError, "Unknown installation source: #{installed_postgresql_package_source}"
104+
end
105+
97106
if new_resource.external_pid_file
98-
directory "/etc/systemd/system/postgresql-#{new_resource.version}.service.d" do
107+
directory service_dir do
99108
owner 'root'
100109
group 'root'
101110
mode '0755'
102111
action :create
103112
end
104113

105-
template "/etc/systemd/system/postgresql-#{new_resource.version}.service.d/10-pid.conf" do
114+
template "#{service_dir}/10-pid.conf" do
106115
cookbook new_resource.cookbook
107116
source 'systemd/10-pid.conf.erb'
108117

@@ -117,8 +126,8 @@
117126
action :create
118127
end
119128
else
120-
directory("/etc/systemd/system/postgresql-#{new_resource.version}.service.d") { action(:delete) }
121-
file("/etc/systemd/system/postgresql-#{new_resource.version}.service.d") { action(:delete) }
129+
directory(service_dir) { action(:delete) }
130+
file("#{service_dir}/10-pid.conf") { action(:delete) }
122131
end
123132
end
124133
end

resources/install.rb

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@
3030
property :source, [String, Symbol],
3131
default: :repo,
3232
coerce: proc { |p| p.to_sym },
33-
equal_to: %i(repo),
33+
equal_to: %i(repo os),
3434
description: 'Installation source'
3535

3636
property :client_packages, [String, Array],
37-
default: lazy { default_client_packages },
37+
default: lazy { default_client_packages(version: version, source: source) },
3838
coerce: proc { |p| Array(p) },
3939
description: 'Client packages to install'
4040

4141
property :server_packages, [String, Array],
42-
default: lazy { default_server_packages },
42+
default: lazy { default_server_packages(version: version, source: source) },
4343
coerce: proc { |p| Array(p) },
4444
description: 'Server packages to install'
4545

@@ -187,6 +187,8 @@ def do_client_package_action(package_action)
187187
end
188188

189189
ohai 'postgresql_client_packages' do
190+
plugin 'packages'
191+
190192
action :nothing
191193
end
192194
end
@@ -205,6 +207,8 @@ def do_server_package_action(package_action)
205207
end
206208

207209
ohai 'postgresql_server_packages' do
210+
plugin 'packages'
211+
208212
action :nothing
209213
end
210214
end
@@ -267,7 +271,7 @@ def do_server_package_action(package_action)
267271
action :init_server do
268272
return if initialized? || !platform_family?('rhel', 'fedora', 'amazon')
269273

270-
converge_by('Init Postgresql DB') do
274+
converge_by('Init PostgreSQL') do
271275
execute 'init_db' do
272276
command rhel_init_db_command(new_resource)
273277
user new_resource.initdb_user

0 commit comments

Comments
 (0)