Skip to content

Commit 2915f1e

Browse files
committed
Refs #39694 - Update exception generator to modify wiki directly
1 parent 1c2ef33 commit 2915f1e

1 file changed

Lines changed: 117 additions & 3 deletions

File tree

lib/tasks/exception.rake

Lines changed: 117 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,71 @@
1+
require 'net/http'
2+
require 'json'
3+
require 'erb'
4+
15
desc 'Exception utilities'
26
namespace :exception do
37
desc 'List all error codes'
4-
task :codes => :environment do
8+
task codes: :environment do
9+
puts generate_error_codes_list
10+
end
11+
12+
desc 'Update the ErrorCodes wiki page on projects.theforeman.org'
13+
task wiki: :environment do
14+
api_key = ENV['FOREMAN_REDMINE_API_KEY']
15+
raise "FOREMAN_REDMINE_API_KEY environment variable is not set" unless api_key
16+
17+
I18n.with_locale(:en) do
18+
# Get existing error codes from wiki
19+
existing_error_codes = fetch_existing_error_codes(api_key)
20+
puts "Found #{existing_error_codes.size} existing error codes on wiki"
21+
22+
# Collect current error codes from codebase
23+
current_error_codes = collect_error_codes.to_h
24+
puts "Found #{current_error_codes.size} error codes in current instance"
25+
26+
# Merge: current overrides existing, but keep orphaned existing ones
27+
merged_error_codes = existing_error_codes.merge(current_error_codes).sort
28+
29+
content = generate_error_codes_wiki_content(merged_error_codes)
30+
update_wiki_page(api_key, 'ErrorCodes', content)
31+
puts "Successfully updated ErrorCodes wiki page (#{merged_error_codes.size} total codes)"
32+
end
33+
end
34+
35+
task default: :codes
36+
37+
private
38+
39+
def fetch_existing_error_codes(api_key)
40+
uri = URI("https://projects.theforeman.org/projects/foreman/wiki/ErrorCodes.json")
41+
request = Net::HTTP::Get.new(uri)
42+
request['X-Redmine-API-Key'] = api_key
43+
44+
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
45+
http.request(request)
46+
end
47+
48+
unless response.code.to_i >= 200 && response.code.to_i < 300
49+
raise "Failed to fetch ErrorCodes wiki page: #{response.code} #{response.message}"
50+
end
51+
52+
data = JSON.parse(response.body)
53+
text = data.dig('wiki_page', 'text') || ''
54+
55+
# Parse lines like: * [[ERF12-1234]] - Error message here
56+
error_codes = {}
57+
text.each_line do |line|
58+
if line =~ /\* \[\[([^\]]+)\]\] - (.+)$/
59+
code = Regexp.last_match(1)
60+
message = Regexp.last_match(2).strip
61+
error_codes[code] = message
62+
end
63+
end
64+
65+
error_codes
66+
end
67+
68+
def collect_error_codes
569
exceptions = [
670
'Foreman::Exception',
771
'WrappedException',
@@ -18,8 +82,58 @@ namespace :exception do
1882
end
1983
end
2084

21-
result.sort.each do |k, v|
22-
puts " * [[#{k}]] - #{v}"
85+
result.sort
86+
end
87+
88+
def generate_error_codes_list
89+
error_codes = collect_error_codes
90+
91+
template = ERB.new(<<~TEMPLATE, trim_mode: '-')
92+
<% error_codes.each do |code, message| -%>
93+
* [[<%= code %>]] - <%= message %>
94+
<% end -%>
95+
TEMPLATE
96+
97+
template.result(binding)
98+
end
99+
100+
def generate_error_codes_wiki_content(error_codes)
101+
template = ERB.new(<<~TEMPLATE, trim_mode: '-')
102+
h1. Foreman error codes
103+
104+
Most error messages in Foreman include error code. Find additional information by clicking on individual codes on this page.
105+
106+
If you have an ERF12-* error, do check [[Proxy_communication_errors]] first for SSL or communication errors, which aren't specific to particular proxy actions.
107+
108+
<% error_codes.each do |code, message| -%>
109+
* [[<%= code %>]] - <%= message %>
110+
<% end -%>
111+
112+
Do not edit. Generated via _rake exception:wiki_.
113+
TEMPLATE
114+
115+
template.result(binding)
116+
end
117+
118+
def update_wiki_page(api_key, page_name, content)
119+
uri = URI("https://projects.theforeman.org/projects/foreman/wiki/#{page_name}.json")
120+
request = Net::HTTP::Put.new(uri)
121+
request['Content-Type'] = 'application/json'
122+
request['X-Redmine-API-Key'] = api_key
123+
124+
wiki_page_data = {
125+
text: content,
126+
comments: "Generated via rake exception:wiki",
127+
}
128+
129+
request.body = { wiki_page: wiki_page_data }.to_json
130+
131+
response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
132+
http.request(request)
133+
end
134+
135+
unless response.code.to_i >= 200 && response.code.to_i < 300
136+
raise "Failed to update wiki page #{page_name}: #{response.code} #{response.message}\n#{response.body}"
23137
end
24138
end
25139
end

0 commit comments

Comments
 (0)