foreman_webhooks 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/controllers/api/v2/webhook_templates_controller.rb +2 -6
- data/app/controllers/api/v2/webhooks_controller.rb +3 -2
- data/app/lib/foreman_webhooks/renderer/scope/webhook_template.rb +3 -1
- data/app/models/webhook.rb +1 -10
- data/app/services/foreman_webhooks/webhook_service.rb +11 -6
- data/app/views/api/v2/webhooks/show.json.rabl +3 -1
- data/app/views/foreman_webhooks/webhook_templates/remote_execution_-_host_job.erb +21 -0
- data/db/seeds.d/62_shellhooks_proxy_feature.rb +6 -0
- data/lib/foreman_webhooks/engine.rb +11 -2
- data/lib/foreman_webhooks/version.rb +1 -1
- data/lib/tasks/foreman_webhooks_tasks.rake +3 -1
- metadata +13 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a9463b5bd544237c5746c80546263831614867cd514146ec019332759618e2b8
|
4
|
+
data.tar.gz: ee3c69e62926cd35b9ed665b5dc09199052fb7d72556040851d571cdbd0a01de
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b3580cd4a8987e5ad9e3410bf87be6b9c84c299f0e38bcc68db14dfe97c7458f4976621f19d614d39b56380be8a7ba8cefbf7a42d358bbe91a417b05603d153
|
7
|
+
data.tar.gz: ef59e908b1f0c9cad872b73bd86922064f01552a8f8287b720d040f0a9b4f44fbf066d752492637aff633752db5453b35e07cf376f7e86838d756cb4d8fd1dcb
|
@@ -28,7 +28,8 @@ module Api
|
|
28
28
|
param :snippet, :bool, allow_nil: true
|
29
29
|
param :audit_comment, String, allow_nil: true
|
30
30
|
param :locked, :bool, desc: N_('Whether or not the template is locked for editing')
|
31
|
-
param :default, :bool,
|
31
|
+
param :default, :bool,
|
32
|
+
desc: N_('Whether or not the template is added automatically to new organizations and locations')
|
32
33
|
param_group :taxonomies, ::Api::V2::BaseController
|
33
34
|
end
|
34
35
|
end
|
@@ -90,11 +91,6 @@ module Api
|
|
90
91
|
|
91
92
|
private
|
92
93
|
|
93
|
-
# Overload this method to avoid using search_for method
|
94
|
-
def resource_scope_for_index(options = {})
|
95
|
-
resource_scope(options).paginate(paginate_options)
|
96
|
-
end
|
97
|
-
|
98
94
|
def action_permission
|
99
95
|
case params[:action]
|
100
96
|
when 'clone', 'import'
|
@@ -5,12 +5,12 @@ module Api
|
|
5
5
|
class WebhooksController < V2::BaseController
|
6
6
|
include Api::Version2
|
7
7
|
include ForemanWebhooks::Controller::Parameters::Webhook
|
8
|
-
include Foreman::Controller::TemplateImport
|
9
8
|
|
10
9
|
before_action :find_resource, only: %i[show update destroy]
|
11
10
|
|
12
11
|
api :GET, '/webhooks/', N_('List Webhooks')
|
13
12
|
param_group :search_and_pagination, ::Api::V2::BaseController
|
13
|
+
add_scoped_search_description_for(Webhook)
|
14
14
|
def index
|
15
15
|
@webhooks = resource_scope_for_index
|
16
16
|
end
|
@@ -25,7 +25,8 @@ module Api
|
|
25
25
|
param :target_url, String, required: true
|
26
26
|
param :http_method, Webhook::ALLOWED_HTTP_METHODS
|
27
27
|
param :http_content_type, String
|
28
|
-
|
28
|
+
events = Webhook.available_events.sort.map { |e| e.delete_suffix(Webhook::EVENT_POSTFIX) }
|
29
|
+
param :event, events, required: true
|
29
30
|
param :webhook_template_id, :identifier
|
30
31
|
param :enabled, :boolean
|
31
32
|
param :verify_ssl, :boolean
|
@@ -24,7 +24,9 @@ module ForemanWebhooks
|
|
24
24
|
required :hash, Hash, 'Key=value object with with data that should be present in payload'
|
25
25
|
keyword :with_defaults, [true, false], 'If set to true, adds default entries to the payload', default: true
|
26
26
|
returns String, 'JSON string with the final payload'
|
27
|
-
example 'payload({ id: @object.id, name: @object.name }) #=>
|
27
|
+
example 'payload({ id: @object.id, name: @object.name }) #=> ' \
|
28
|
+
'"{ "id": 1, "name": "host.example.com", "context": { ... }, ' \
|
29
|
+
'"event_name": "host_created.event.foreman" }"'
|
28
30
|
end
|
29
31
|
def payload(hash, with_defaults: true)
|
30
32
|
hash.merge!(@defaults) if with_defaults
|
data/app/models/webhook.rb
CHANGED
@@ -11,15 +11,6 @@ class Webhook < ApplicationRecord
|
|
11
11
|
|
12
12
|
EVENT_POSTFIX = ".#{Foreman::Observable::DEFAULT_NAMESPACE}"
|
13
13
|
|
14
|
-
EVENT_ALLOWLIST = %w[
|
15
|
-
host_created host_updated host_destroyed
|
16
|
-
hostgroup_created hostgroup_updated hostgroup_destroyed
|
17
|
-
user_created user_updated user_destroyed
|
18
|
-
domain_created domain_updated domain_destroyed
|
19
|
-
subnet_created subnet_updated subnet_destroyed
|
20
|
-
build_entered build_exited status_changed
|
21
|
-
].map { |e| e + EVENT_POSTFIX }.freeze
|
22
|
-
|
23
14
|
DEFAULT_PAYLOAD_TEMPLATE = 'Webhook Template - Payload Default'
|
24
15
|
|
25
16
|
ALLOWED_HTTP_METHODS = %w[POST GET PUT DELETE PATCH].freeze
|
@@ -47,7 +38,7 @@ class Webhook < ApplicationRecord
|
|
47
38
|
scoped_search on: :enabled, complete_value: { true: true, false: false }
|
48
39
|
|
49
40
|
def self.available_events
|
50
|
-
::Foreman::EventSubscribers.all_observable_events
|
41
|
+
::Foreman::EventSubscribers.all_observable_events
|
51
42
|
end
|
52
43
|
|
53
44
|
def self.deliver(event_name:, payload:)
|
@@ -25,7 +25,7 @@ module ForemanWebhooks
|
|
25
25
|
logger.debug("Headers: #{rendered_headers}")
|
26
26
|
end
|
27
27
|
|
28
|
-
response = self.class.request(url:
|
28
|
+
response = self.class.request(url: rendered_url,
|
29
29
|
payload: payload,
|
30
30
|
http_method: webhook.http_method,
|
31
31
|
user: webhook.user,
|
@@ -50,7 +50,8 @@ module ForemanWebhooks
|
|
50
50
|
message: response.message,
|
51
51
|
http_status: response.code.to_i
|
52
52
|
}
|
53
|
-
rescue SocketError, OpenSSL::SSL::SSLError, Errno::ECONNREFUSED, Errno::ECONNRESET,
|
53
|
+
rescue SocketError, OpenSSL::SSL::SSLError, Errno::ECONNREFUSED, Errno::ECONNRESET,
|
54
|
+
Errno::EHOSTUNREACH, Net::OpenTimeout, Net::ReadTimeout => e
|
54
55
|
Foreman::Logging.exception("Failed to execute the webhook #{webhook.name} -> #{event_name}", e)
|
55
56
|
{
|
56
57
|
status: :error,
|
@@ -58,7 +59,9 @@ module ForemanWebhooks
|
|
58
59
|
}
|
59
60
|
end
|
60
61
|
|
61
|
-
def self.request(url:, payload: '', http_method: :GET, user: nil, password: nil,
|
62
|
+
def self.request(url:, payload: '', http_method: :GET, user: nil, password: nil,
|
63
|
+
content_type: 'application/json', headers: {}, ca_string: nil,
|
64
|
+
ca_verify: false, follow_redirects: true, redirect_limit: 3)
|
62
65
|
uri = URI.parse(url)
|
63
66
|
|
64
67
|
request = Object.const_get("Net::HTTP::#{http_method.to_s.capitalize}").new(uri.request_uri)
|
@@ -86,11 +89,13 @@ module ForemanWebhooks
|
|
86
89
|
end
|
87
90
|
http.request(request) do |response|
|
88
91
|
case response
|
89
|
-
when Net::HTTPRedirection
|
92
|
+
when Net::HTTPRedirection
|
90
93
|
new_location = response['location']
|
91
94
|
Rails.logger.debug "Redirected to #{new_location} (redirects left: #{redirect_limit})"
|
92
|
-
|
93
|
-
|
95
|
+
if redirect_limit <= 0
|
96
|
+
raise(::Foreman::Exception,
|
97
|
+
N_(format('Too many HTTP redirects when calling %{uri}', uri: uri, code: response.code)))
|
98
|
+
end
|
94
99
|
self.request(url: new_location,
|
95
100
|
payload: payload,
|
96
101
|
http_method: http_method,
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%#
|
2
|
+
name: Remote Execution Host Job
|
3
|
+
description: Example payload for actions.remote_execution.run_host_job_succeeded
|
4
|
+
snippet: false
|
5
|
+
model: WebhookTemplate
|
6
|
+
-%>
|
7
|
+
#
|
8
|
+
# Example webhook template, @object carries Action instance.
|
9
|
+
# For more information about available helpers visit /templates_doc
|
10
|
+
#
|
11
|
+
# Run job host name <%= @object.host_name %>
|
12
|
+
# Run job host id <%= @object.host_id %>
|
13
|
+
# Run job full host object <%= @object.host %>
|
14
|
+
# Run job job_invocation_id <%= @object.job_invocation_id %>
|
15
|
+
# Run job job_invocation <%= @object.job_invocation %>
|
16
|
+
# Task label <%= @object.task.label %>
|
17
|
+
# Task started at <%= @object.task.started_at %>
|
18
|
+
# Task ended at <%= @object.task.ended_at %>
|
19
|
+
# Task resulted with <%= @object.task.result %>
|
20
|
+
# Task state <%= @object.task.state %>
|
21
|
+
# Task action output <%= @object.task.action_output %>
|
@@ -35,8 +35,8 @@ module ForemanWebhooks
|
|
35
35
|
'api/v2/webhooks': [:update] }, resource_type: 'Webhook'
|
36
36
|
permission :destroy_webhooks, { webhooks: [:destroy],
|
37
37
|
'api/v2/webhooks': [:destroy] }, resource_type: 'Webhook'
|
38
|
-
permission :view_webhook_templates,
|
39
|
-
|
38
|
+
permission :view_webhook_templates, { webhook_templates: %i[index show auto_complete_search preview export],
|
39
|
+
'api/v2/webhook_templates': %i[index show export] },
|
40
40
|
resource_type: 'WebhookTemplate'
|
41
41
|
permission :create_webhook_templates, { webhook_templates: %i[new create clone_template],
|
42
42
|
'api/v2/webhook_templates': %i[create clone import] },
|
@@ -52,6 +52,15 @@ module ForemanWebhooks
|
|
52
52
|
resource_type: 'WebhookTemplate'
|
53
53
|
end
|
54
54
|
|
55
|
+
role 'Webhooks Reader',
|
56
|
+
%i[view_webhooks view_webhook_templates]
|
57
|
+
|
58
|
+
role 'Webhooks Manager',
|
59
|
+
%i[view_webhooks create_webhooks edit_webhooks destroy_webhooks
|
60
|
+
view_webhook_templates create_webhook_templates
|
61
|
+
edit_webhook_templates destroy_webhook_templates
|
62
|
+
lock_webhook_templates]
|
63
|
+
|
55
64
|
# add menu entry
|
56
65
|
divider :admin_menu, caption: N_('Webhook'), parent: :administer_menu
|
57
66
|
menu :admin_menu, :webhooks, url: '/webhooks',
|
@@ -44,4 +44,6 @@ end
|
|
44
44
|
Rake::Task[:test].enhance ['test:foreman_webhooks']
|
45
45
|
|
46
46
|
load 'tasks/jenkins.rake'
|
47
|
-
|
47
|
+
if Rake::Task.task_defined?(:'jenkins:unit')
|
48
|
+
Rake::Task['jenkins:unit'].enhance ['test:foreman_webhooks', 'foreman_webhooks:rubocop']
|
49
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: foreman_webhooks
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Timo Goebel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rdoc
|
@@ -28,14 +28,14 @@ dependencies:
|
|
28
28
|
name: rubocop
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 0.71.0
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 0.71.0
|
41
41
|
description: Plugin for Foreman that allows to configure Webhooks.
|
@@ -74,6 +74,7 @@ files:
|
|
74
74
|
- app/views/api/v2/webhooks/update.json.rabl
|
75
75
|
- app/views/foreman_webhooks/webhook_templates/ansible_tower_-_host_in_inventory.erb
|
76
76
|
- app/views/foreman_webhooks/webhook_templates/empty_payload.erb
|
77
|
+
- app/views/foreman_webhooks/webhook_templates/remote_execution_-_host_job.erb
|
77
78
|
- app/views/foreman_webhooks/webhook_templates/webhook_template_-_payload_default.erb
|
78
79
|
- app/views/webhook_templates/_alerts.html.erb
|
79
80
|
- app/views/webhook_templates/_custom_tab_headers.html.erb
|
@@ -93,6 +94,7 @@ files:
|
|
93
94
|
- db/migrate/20200908004234_add_columns_to_webhooks.rb
|
94
95
|
- db/migrate/20201014115147_rename_ca_file_column.rb
|
95
96
|
- db/migrate/20201109135301_add_http_headers.rb
|
97
|
+
- db/seeds.d/62_shellhooks_proxy_feature.rb
|
96
98
|
- db/seeds.d/95_webhook_templates.rb
|
97
99
|
- lib/foreman_webhooks.rb
|
98
100
|
- lib/foreman_webhooks/engine.rb
|
@@ -165,27 +167,27 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
165
167
|
requirements:
|
166
168
|
- - ">="
|
167
169
|
- !ruby/object:Gem::Version
|
168
|
-
version:
|
170
|
+
version: 2.5.0
|
169
171
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
170
172
|
requirements:
|
171
173
|
- - ">="
|
172
174
|
- !ruby/object:Gem::Version
|
173
175
|
version: '0'
|
174
176
|
requirements: []
|
175
|
-
rubygems_version: 3.1.
|
177
|
+
rubygems_version: 3.1.4
|
176
178
|
signing_key:
|
177
179
|
specification_version: 4
|
178
180
|
summary: Configure webhooks for Foreman.
|
179
181
|
test_files:
|
180
|
-
- test/
|
181
|
-
- test/
|
182
|
-
- test/unit/foreman_webhooks/webhook_service_test.rb
|
182
|
+
- test/controllers/api/v2/webhook_templates_controller_test.rb
|
183
|
+
- test/controllers/api/v2/webhooks_controller_test.rb
|
183
184
|
- test/factories/webhook.rb
|
184
185
|
- test/factories/webhook_target.rb
|
185
186
|
- test/factories/webhook_template.rb
|
186
|
-
- test/
|
187
|
-
- test/controllers/api/v2/webhooks_controller_test.rb
|
187
|
+
- test/jobs/foreman_webhooks/deliver_webhook_job_test.rb
|
188
188
|
- test/models/webhook_test.rb
|
189
|
+
- test/unit/foreman_webhooks/webhook_service_test.rb
|
190
|
+
- test/test_plugin_helper.rb
|
189
191
|
- webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/Formatters/__tests__/enabledCellFormatter.test.js
|
190
192
|
- webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/Components/__tests__/EnabledCell.test.js
|
191
193
|
- webpack/ForemanWebhooks/Routes/Webhooks/WebhooksIndexPage/Components/WebhooksTable/__tests__/WebhooksTable.test.js
|