Skip to content

Commit 81e986a

Browse files
author
petergmurphy
committed
Add task to update PE Master group rules
This commit introduces a new private task to update the AND conditional for the pe_compiler auth role in the PE Master node group, changing it to regex match for any *_compiler role. The task ensures that the group rules are simplified and display more correctly on the PE console.
1 parent a0db439 commit 81e986a

11 files changed

+156
-31
lines changed

manifests/setup/legacy_compiler_group.pp

+11-13
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,10 @@
99
}
1010

1111
node_group { 'PE Legacy Compiler':
12-
ensure => 'present',
13-
parent => 'PE Master',
14-
purge_behavior => 'classes',
15-
rule => ['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
16-
classes => {
12+
ensure => 'present',
13+
parent => 'PE Infrastructure',
14+
rule => ['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler_legacy'],
15+
classes => {
1716
'puppet_enterprise::profile::master' => {
1817
'puppetdb_host' => [$internal_compiler_a_pool_address, $internal_compiler_b_pool_address].filter |$_| { $_ },
1918
'puppetdb_port' => [8081],
@@ -24,20 +23,19 @@
2423
}
2524

2625
node_group { 'PE Legacy Compiler Group A':
27-
ensure => 'present',
28-
parent => 'PE Legacy Compiler',
29-
purge_behavior => 'classes',
30-
rule => ['and',
31-
['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
26+
ensure => 'present',
27+
parent => 'PE Legacy Compiler',
28+
rule => ['and',
29+
['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler_legacy'],
3230
['=', ['trusted', 'extensions', peadm::oid('peadm_availability_group')], 'A'],
3331
],
34-
classes => {
32+
classes => {
3533
'puppet_enterprise::profile::master' => {
3634
'puppetdb_host' => [$internal_compiler_b_pool_address, $internal_compiler_a_pool_address].filter |$_| { $_ },
3735
'puppetdb_port' => [8081],
3836
},
3937
},
40-
data => {
38+
data => {
4139
'puppet_enterprise::profile::master::puppetdb' => {
4240
'ha_enabled_replicas' => [],
4341
},
@@ -49,7 +47,7 @@
4947
parent => 'PE Legacy Compiler',
5048
purge_behavior => 'classes',
5149
rule => ['and',
52-
['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
50+
['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler_legacy'],
5351
['=', ['trusted', 'extensions', peadm::oid('peadm_availability_group')], 'B'],
5452
],
5553
classes => {

manifests/setup/node_manager.pp

+3-7
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,6 @@
7777
parent => 'PE Infrastructure',
7878
data => $compiler_pool_address_data,
7979
variables => { 'pe_master' => true },
80-
rule => ['or',
81-
['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
82-
['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler'],
83-
],
8480
}
8581

8682
# PE Compiler group comes from default PE and already has the pe compiler role
@@ -205,7 +201,7 @@
205201

206202
node_group { 'PE Legacy Compiler':
207203
parent => 'PE Master',
208-
rule => ['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
204+
rule => ['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler_legacy'],
209205
classes => {
210206
'puppet_enterprise::profile::master' => {
211207
'puppetdb_host' => [$internal_compiler_a_pool_address, $internal_compiler_b_pool_address].filter |$_| { $_ },
@@ -220,7 +216,7 @@
220216
ensure => 'present',
221217
parent => 'PE Legacy Compiler',
222218
rule => ['and',
223-
['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
219+
['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler_legacy'],
224220
['=', ['trusted', 'extensions', peadm::oid('peadm_availability_group')], 'A'],
225221
],
226222
classes => {
@@ -243,7 +239,7 @@
243239
ensure => 'present',
244240
parent => 'PE Legacy Compiler',
245241
rule => ['and',
246-
['=', ['trusted', 'extensions', 'pp_auth_role'], 'legacy_compiler'],
242+
['=', ['trusted', 'extensions', 'pp_auth_role'], 'pe_compiler_legacy'],
247243
['=', ['trusted', 'extensions', peadm::oid('peadm_availability_group')], 'B'],
248244
],
249245
classes => {

plans/convert.pp

+4-2
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@
230230
run_plan('peadm::modify_certificate', $legacy_compiler_a_targets,
231231
primary_host => $primary_target,
232232
add_extensions => {
233-
peadm::oid('pp_auth_role') => 'legacy_compiler',
233+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
234234
peadm::oid('peadm_availability_group') => 'A',
235235
},
236236
)
@@ -239,7 +239,7 @@
239239
run_plan('peadm::modify_certificate', $legacy_compiler_b_targets,
240240
primary_host => $primary_target,
241241
add_extensions => {
242-
peadm::oid('pp_auth_role') => 'legacy_compiler',
242+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
243243
peadm::oid('peadm_availability_group') => 'B',
244244
},
245245
)
@@ -333,5 +333,7 @@
333333
# lint:endignore
334334
}
335335
336+
run_task('peadm::update_pe_master_rules', $primary_target)
337+
336338
return("Conversion to peadm Puppet Enterprise ${arch['architecture']} completed.")
337339
}

plans/convert_compiler_to_legacy.pp

+3-3
Original file line numberDiff line numberDiff line change
@@ -102,15 +102,15 @@
102102
run_plan('peadm::modify_certificate', $compiler_targets,
103103
primary_host => $primary_target,
104104
add_extensions => {
105-
peadm::oid('pp_auth_role') => 'legacy_compiler',
105+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
106106
},
107107
)
108108
},
109109
background('modify-compilers-a-certs') || {
110110
run_plan('peadm::modify_certificate', $legacy_compiler_a_targets,
111111
primary_host => $primary_target,
112112
add_extensions => {
113-
peadm::oid('pp_auth_role') => 'legacy_compiler',
113+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
114114
peadm::oid('peadm_availability_group') => 'A',
115115
},
116116
)
@@ -119,7 +119,7 @@
119119
run_plan('peadm::modify_certificate', $legacy_compiler_b_targets,
120120
primary_host => $primary_target,
121121
add_extensions => {
122-
peadm::oid('pp_auth_role') => 'legacy_compiler',
122+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
123123
peadm::oid('peadm_availability_group') => 'B',
124124
},
125125
)

plans/install.pp

+2
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,8 @@
143143
final_agent_state => $final_agent_state,
144144
)
145145

146+
run_task('peadm::update_pe_master_rules', $primary_host)
147+
146148
# Return a string banner reporting on what was done
147149
return([$install_result, $configure_result])
148150
}

plans/subplans/component_install.pp

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
}
2525
} elsif $role == 'pe_compiler_legacy' {
2626
$certificate_extensions = {
27-
peadm::oid('pp_auth_role') => 'legacy_compiler',
27+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
2828
peadm::oid('peadm_availability_group') => $avail_group_letter,
2929
}
3030
} else {

plans/subplans/install.pp

+2-2
Original file line numberDiff line numberDiff line change
@@ -301,15 +301,15 @@
301301
background('compiler-a-csr.yaml') || {
302302
run_plan('peadm::util::insert_csr_extension_requests', $legacy_a_targets,
303303
extension_requests => {
304-
peadm::oid('pp_auth_role') => 'legacy_compiler',
304+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
305305
peadm::oid('peadm_availability_group') => 'A',
306306
}
307307
)
308308
},
309309
background('compiler-b-csr.yaml') || {
310310
run_plan('peadm::util::insert_csr_extension_requests', $legacy_b_targets,
311311
extension_requests => {
312-
peadm::oid('pp_auth_role') => 'legacy_compiler',
312+
peadm::oid('pp_auth_role') => 'pe_compiler_legacy',
313313
peadm::oid('peadm_availability_group') => 'B',
314314
}
315315
)

plans/upgrade.pp

+2
Original file line numberDiff line numberDiff line change
@@ -440,5 +440,7 @@
440440
441441
peadm::check_version_and_known_hosts($current_pe_version, $_version, $r10k_known_hosts)
442442
443+
run_task('peadm::update_pe_master_rules', $primary_target)
444+
443445
return("Upgrade of Puppet Enterprise ${arch['architecture']} completed.")
444446
}

spec/plans/convert_spec.rb

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
end
1010

1111
let(:params) do
12-
{ 'primary_host' => 'primary', 'legacy_compilers' => ['legacy_compiler'] }
12+
{ 'primary_host' => 'primary', 'legacy_compilers' => ['pe_compiler_legacy'] }
1313
end
1414

1515
it 'single primary no dr valid' do
@@ -21,8 +21,8 @@
2121
expect_task('peadm::cert_data').return_for_targets('primary' => trustedjson)
2222
expect_task('peadm::read_file').always_return({ 'content' => '2021.7.9' })
2323
expect_task('peadm::get_group_rules').return_for_targets('primary' => { '_output' => '{"rules": []}' })
24-
expect_task('peadm::node_group_unpin').with_targets('primary').with_params({ 'node_certnames' => ['legacy_compiler'], 'group_name' => 'PE Master' })
25-
expect_task('peadm::check_legacy_compilers').with_targets('primary').with_params({ 'legacy_compilers' => 'legacy_compiler' }).return_for_targets('primary' => { '_output' => '' })
24+
expect_task('peadm::node_group_unpin').with_targets('primary').with_params({ 'node_certnames' => ['pe_compiler_legacy'], 'group_name' => 'PE Master' })
25+
expect_task('peadm::check_legacy_compilers').with_targets('primary').with_params({ 'legacy_compilers' => 'pe_compiler_legacy' }).return_for_targets('primary' => { '_output' => '' })
2626

2727
# For some reason, expect_plan() was not working??
2828
allow_plan('peadm::modify_certificate').always_return({})

tasks/update_pe_master_rules.json

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"description": "Updates the PE Master group rules to replace pe_compiler with a regex match for any pe_compiler role",
3+
"input_method": "stdin",
4+
"private": true,
5+
"implementations": [
6+
{"name": "update_pe_master_rules.rb"}
7+
]
8+
}

tasks/update_pe_master_rules.rb

+117
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
#!/opt/puppetlabs/puppet/bin/ruby
2+
# frozen_string_literal: true
3+
4+
require 'json'
5+
require 'net/https'
6+
require 'puppet'
7+
8+
# UpdatePeMasterRules task class
9+
class UpdatePeMasterRules
10+
def initialize(params)
11+
@params = params
12+
end
13+
14+
def https_client
15+
client = Net::HTTP.new(Puppet.settings[:certname], 4433)
16+
client.use_ssl = true
17+
client.cert = @cert ||= OpenSSL::X509::Certificate.new(File.read(Puppet.settings[:hostcert]))
18+
client.key = @key ||= OpenSSL::PKey::RSA.new(File.read(Puppet.settings[:hostprivkey]))
19+
client.verify_mode = OpenSSL::SSL::VERIFY_PEER
20+
client.ca_file = Puppet.settings[:localcacert]
21+
client
22+
end
23+
24+
def get_pe_master_group_id
25+
net = https_client
26+
res = net.get('/classifier-api/v1/groups')
27+
28+
unless res.code == '200'
29+
raise "Failed to fetch groups: HTTP #{res.code} - #{res.body}"
30+
end
31+
32+
groups = JSON.parse(res.body)
33+
pe_master_group = groups.find { |group| group['name'] == 'PE Master' }
34+
35+
raise "Could not find PE Master group" unless pe_master_group
36+
pe_master_group['id']
37+
rescue JSON::ParserError => e
38+
raise "Invalid JSON response from server: #{e.message}"
39+
rescue StandardError => e
40+
raise "Error fetching PE Master group ID: #{e.message}"
41+
end
42+
43+
def get_current_rules(group_id)
44+
net = https_client
45+
url = "/classifier-api/v1/groups/#{group_id}/rules"
46+
req = Net::HTTP::Get.new(url)
47+
res = net.request(req)
48+
49+
unless res.code == '200'
50+
raise "Failed to fetch rules: HTTP #{res.code} - #{res.body}"
51+
end
52+
53+
JSON.parse(res.body)['rule']
54+
rescue JSON::ParserError => e
55+
raise "Invalid JSON response from server: #{e.message}"
56+
rescue StandardError => e
57+
raise "Error fetching rules: #{e.message}"
58+
end
59+
60+
def transform_rule(rule)
61+
return rule unless rule.is_a?(Array)
62+
63+
if rule[0] == '=' &&
64+
rule[1].is_a?(Array) &&
65+
rule[1] == ['trusted', 'extensions', 'pp_auth_role'] &&
66+
rule[2] == 'pe_compiler'
67+
return ['~', ['trusted', 'extensions', 'pp_auth_role'], '^pe_compiler(?:_legacy)?$']
68+
end
69+
70+
# Recursively transform nested rules
71+
rule.map { |element| transform_rule(element) }
72+
end
73+
74+
def update_rules(group_id)
75+
net = https_client
76+
begin
77+
current_rules = get_current_rules(group_id)
78+
79+
# Transform rules recursively to handle nested structures
80+
new_rules = transform_rule(current_rules)
81+
82+
# Update the group with the modified rules
83+
url = "/classifier-api/v1/groups/#{group_id}"
84+
req = Net::HTTP::Post.new(url)
85+
req['Content-Type'] = 'application/json'
86+
req.body = { rule: new_rules }.to_json
87+
88+
res = net.request(req)
89+
90+
case res.code
91+
when '200', '201', '204'
92+
puts "Successfully transformed pe_compiler rule to use regex match for *_compiler roles in group #{group_id}"
93+
else
94+
begin
95+
error_body = JSON.parse(res.body.to_s)
96+
raise "Failed to update rules: #{error_body['kind'] || error_body}"
97+
rescue JSON::ParserError
98+
raise "Invalid response from server (status #{res.code}): #{res.body}"
99+
end
100+
end
101+
rescue StandardError => e
102+
raise "Error during rules update: #{e.message}"
103+
end
104+
end
105+
106+
def execute!
107+
group_id = get_pe_master_group_id
108+
update_rules(group_id)
109+
end
110+
end
111+
112+
# Run the task unless an environment flag has been set
113+
unless ENV['RSPEC_UNIT_TEST_MODE']
114+
Puppet.initialize_settings
115+
task = UpdatePeMasterRules.new(JSON.parse(STDIN.read))
116+
task.execute!
117+
end

0 commit comments

Comments
 (0)