Skip to content

Commit 468a9fe

Browse files
committed
run foreman in a container
1 parent 8e69979 commit 468a9fe

File tree

8 files changed

+95
-23
lines changed

8 files changed

+95
-23
lines changed

.fixtures.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ fixtures:
66
concat: 'https://github.com/puppetlabs/puppetlabs-concat'
77
cron_core: 'https://github.com/puppetlabs/puppetlabs-cron_core'
88
extlib: 'https://github.com/voxpupuli/puppet-extlib'
9+
podman:
10+
repo: 'https://github.com/evgeni/puppet-podman'
11+
branch: 'quadlet'
912
postgresql: 'https://github.com/puppetlabs/puppetlabs-postgresql'
1013
puppet: 'https://github.com/theforeman/puppet-puppet'
1114
redis: 'https://github.com/voxpupuli/puppet-redis'

manifests/config.pp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -98,11 +98,13 @@
9898
)
9999
)
100100
$min_puma_threads = pick($foreman::foreman_service_puma_threads_min, $foreman::foreman_service_puma_threads_max)
101-
systemd::dropin_file { 'foreman-service':
102-
filename => 'installer.conf',
103-
unit => "${foreman::foreman_service}.service",
104-
content => template('foreman/foreman.service-overrides.erb'),
105-
notify_service => true,
101+
if $foreman::deployment_mode == 'package' {
102+
systemd::dropin_file { 'foreman-service':
103+
filename => 'installer.conf',
104+
unit => "${foreman::foreman_service}.service",
105+
content => template('foreman/foreman.service-overrides.erb'),
106+
notify_service => true,
107+
}
106108
}
107109

108110
if ! defined(File[$foreman::app_root]) {
@@ -153,7 +155,13 @@
153155
}
154156

155157
if $foreman::apache {
156-
$listen_socket = '/run/foreman.sock'
158+
if $foreman::deployment_mode == 'container' {
159+
$listen_socket = 'localhost:3000/'
160+
$backend_protocol = 'http'
161+
} else {
162+
$listen_socket = '/run/foreman.sock'
163+
$backend_protocol = 'unix'
164+
}
157165

158166
class { 'foreman::config::apache':
159167
app_root => $foreman::app_root,
@@ -162,7 +170,7 @@
162170
serveraliases => $foreman::serveraliases,
163171
server_port => $foreman::server_port,
164172
server_ssl_port => $foreman::server_ssl_port,
165-
proxy_backend => "unix://${listen_socket}",
173+
proxy_backend => "${backend_protocol}://${listen_socket}",
166174
ssl => $foreman::ssl,
167175
ssl_ca => $foreman::server_ssl_ca,
168176
ssl_chain => $foreman::server_ssl_chain,
@@ -280,11 +288,13 @@
280288
$foreman_socket_override = undef
281289
}
282290

283-
systemd::dropin_file { 'foreman-socket':
284-
ensure => bool2str($foreman_socket_override =~ Undef, 'absent', 'present'),
285-
filename => 'installer.conf',
286-
unit => "${foreman::foreman_service}.socket",
287-
content => $foreman_socket_override,
288-
notify_service => true,
291+
if $foreman::deployment_mode == 'package' {
292+
systemd::dropin_file { 'foreman-socket':
293+
ensure => bool2str($foreman_socket_override =~ Undef, 'absent', 'present'),
294+
filename => 'installer.conf',
295+
unit => "${foreman::foreman_service}.socket",
296+
content => $foreman_socket_override,
297+
notify_service => true,
298+
}
289299
}
290300
}

manifests/init.pp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,8 @@
189189
#
190190
# $provisioning_fcct_location:: The location of the binary to call when transpiling Fedora CoreOS templates.
191191
#
192+
# $deployment_mode:: The way foreman is deployed: packages or container
193+
#
192194
# === Dynflow parameters:
193195
#
194196
# $dynflow_manage_services:: Whether to manage the dynflow services
@@ -307,6 +309,7 @@
307309
Boolean $register_in_foreman = true,
308310
Optional[Stdlib::Absolutepath] $provisioning_ct_location = undef,
309311
Optional[Stdlib::Absolutepath] $provisioning_fcct_location = undef,
312+
Enum['package', 'container'] $deployment_mode = 'package',
310313
) inherits foreman::params {
311314
assert_type(Array[Stdlib::IP::Address], $trusted_proxies)
312315

manifests/service.pp

Lines changed: 37 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
Enum['present', 'absent'] $dynflow_orchestrator_ensure = $foreman::dynflow_orchestrator_ensure,
1111
Integer[0] $dynflow_worker_instances = $foreman::dynflow_worker_instances,
1212
Integer[0] $dynflow_worker_concurrency = $foreman::dynflow_worker_concurrency,
13+
Enum['package', 'container'] $deployment_mode = $foreman::deployment_mode,
14+
String[1] $container_image = 'quay.io/evgeni/foreman-rpm:latest',
1315
) {
1416
if $dynflow_manage_services {
1517
foreman::dynflow::worker { 'orchestrator':
@@ -35,14 +37,41 @@
3537
}
3638
}
3739

38-
service { "${foreman_service}.socket":
39-
ensure => $foreman_service_ensure,
40-
enable => $foreman_service_enable,
41-
}
40+
if $deployment_mode == 'package' {
41+
service { "${foreman_service}.socket":
42+
ensure => $foreman_service_ensure,
43+
enable => $foreman_service_enable,
44+
}
4245

43-
service { $foreman_service:
44-
ensure => $foreman_service_ensure,
45-
enable => $foreman_service_enable,
46-
before => Service["${foreman_service}.socket"],
46+
service { $foreman_service:
47+
ensure => $foreman_service_ensure,
48+
enable => $foreman_service_enable,
49+
before => Service["${foreman_service}.socket"],
50+
}
51+
} else {
52+
file {'/etc/containers/systemd':
53+
ensure => directory,
54+
}
55+
podman::quadlet { 'foreman.container':
56+
ensure => present,
57+
unit_entry => {
58+
'Description' => 'Foreman',
59+
},
60+
service_entry => {
61+
'TimeoutStartSec' => '900',
62+
},
63+
container_entry => {
64+
'Image' => $container_image,
65+
'Volume' => ['/etc/foreman/:/etc/foreman/'],
66+
'AddCapability' => ['CAP_DAC_OVERRIDE', 'CAP_IPC_OWNER'],
67+
'Network' => 'host',
68+
'HostName' => $foreman::servername,
69+
'Notify' => true,
70+
},
71+
install_entry => {
72+
'WantedBy' => 'default.target',
73+
},
74+
active => true,
75+
}
4776
}
4877
}

metadata.json

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
{
4444
"name": "puppet/redis",
4545
"version_requirement": ">= 5.0.0 < 12.0.0"
46+
},
47+
{
48+
"name": "southalc/podman",
49+
"version_requirement": ">= 0.6.7 < 1.0.0"
4650
}
4751
],
4852
"requirements": [

spec/acceptance/foreman_basic_spec.rb

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,24 @@ class { 'foreman':
5555

5656
it_behaves_like 'the foreman application', { expected_login_url_path: '/users/extlogin' }
5757
end
58+
59+
# needs to happen after GSSAPI, something is wrong with its cleanup
60+
context 'in a Container' do
61+
before(:context) { purge_foreman }
62+
describe 'in a Container' do
63+
it_behaves_like 'an idempotent resource' do
64+
let(:manifest) do
65+
<<~PUPPET
66+
class { 'foreman':
67+
deployment_mode => 'container',
68+
db_host => 'localhost',
69+
db_manage_rake => false,
70+
}
71+
PUPPET
72+
end
73+
end
74+
75+
it_behaves_like 'the foreman application', { deployment_mode: 'container' }
76+
end
77+
end
5878
end

spec/support/acceptance/examples.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,10 @@
1919
it { is_expected.to be_listening }
2020
end
2121

22-
describe file('/run/foreman.sock') do
23-
it { should be_socket }
22+
if params.fetch(:deployment_mode, 'package') == 'package'
23+
describe file('/run/foreman.sock') do
24+
it { should be_socket }
25+
end
2426
end
2527

2628
describe command("curl -s --cacert /etc/foreman-certs/certificate.pem https://#{host_inventory['fqdn']} -w '\%{redirect_url}' -o /dev/null") do

spec/support/acceptance/purge.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ def purge_foreman
66
on default, 'apt-get purge -y foreman*', { :acceptable_exit_codes => [0, 100] }
77
on default, 'apt-get purge -y ruby-hammer-cli-*', { :acceptable_exit_codes => [0, 100] }
88
end
9+
on default, 'rm -rf /etc/systemd/system/foreman* /etc/containers/systemd/foreman*'
910

1011
apache_service_name = ['debian', 'ubuntu'].include?(os[:family]) ? 'apache2' : 'httpd'
1112
on default, "systemctl stop #{apache_service_name}", { :acceptable_exit_codes => [0, 5] }

0 commit comments

Comments
 (0)