pact_broker 2.84.0 → 2.85.0
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/CHANGELOG.md +11 -0
- data/db/migrations/20210913_add_pending_to_verifications.rb +7 -0
- data/lib/pact/doc/markdown/consumer_contract_renderer.rb +3 -3
- data/lib/pact_broker/api/decorators/reason_decorator.rb +2 -2
- data/lib/pact_broker/api/decorators/verification_summary_decorator.rb +1 -2
- data/lib/pact_broker/api/middleware/configuration.rb +33 -0
- data/lib/pact_broker/api/pact_broker_urls.rb +5 -1
- data/lib/pact_broker/api/renderers/html_pact_renderer.rb +15 -11
- data/lib/pact_broker/api/resources/pact_versions_for_branch.rb +40 -0
- data/lib/pact_broker/api/resources/verifications.rb +5 -1
- data/lib/pact_broker/api.rb +1 -0
- data/lib/pact_broker/app.rb +2 -0
- data/lib/pact_broker/badges/service.rb +3 -1
- data/lib/pact_broker/configuration.rb +33 -29
- data/lib/pact_broker/domain/verification.rb +9 -0
- data/lib/pact_broker/domain/webhook.rb +22 -10
- data/lib/pact_broker/domain/webhook_request.rb +2 -2
- data/lib/pact_broker/index/service.rb +73 -22
- data/lib/pact_broker/locale/en.yml +2 -0
- data/lib/pact_broker/pacts/metadata.rb +4 -2
- data/lib/pact_broker/pacts/pact_publication.rb +37 -0
- data/lib/pact_broker/pacts/pact_publication_dataset_module.rb +39 -0
- data/lib/pact_broker/pacts/repository.rb +2 -1
- data/lib/pact_broker/test/http_test_data_builder.rb +1 -1
- data/lib/pact_broker/test/test_data_builder.rb +5 -1
- data/lib/pact_broker/ui/app.rb +7 -1
- data/lib/pact_broker/ui/controllers/dashboard.rb +80 -0
- data/lib/pact_broker/ui/controllers/groups.rb +23 -8
- data/lib/pact_broker/ui/helpers/url_helper.rb +5 -1
- data/lib/pact_broker/ui/view_models/index_item.rb +49 -7
- data/lib/pact_broker/ui/view_models/matrix_branch.rb +1 -1
- data/lib/pact_broker/ui/view_models/matrix_tag.rb +0 -1
- data/lib/pact_broker/ui/views/dashboard/show.haml +195 -0
- data/lib/pact_broker/ui/views/groups/show.html.erb +60 -14
- data/lib/pact_broker/ui/views/index/_dashboard_navbar.haml +7 -0
- data/lib/pact_broker/ui/views/index/_navbar.haml +0 -7
- data/lib/pact_broker/ui/views/index/show-with-tags.haml +3 -1
- data/lib/pact_broker/ui/views/index/show.haml +35 -13
- data/lib/pact_broker/ui/views/matrix/show.haml +7 -3
- data/lib/pact_broker/verifications/pseudo_branch_status.rb +2 -0
- data/lib/pact_broker/verifications/service.rb +1 -0
- data/lib/pact_broker/version.rb +1 -1
- data/lib/pact_broker/webhooks/event_listener.rb +3 -3
- data/lib/pact_broker/webhooks/execution_configuration.rb +16 -0
- data/lib/pact_broker/webhooks/execution_configuration_creator.rb +3 -0
- data/lib/pact_broker/webhooks/job.rb +1 -1
- data/lib/pact_broker/webhooks/trigger_service.rb +2 -2
- data/lib/pact_broker/webhooks/webhook_execution_result.rb +3 -7
- data/lib/pact_broker/webhooks/webhook_request_logger.rb +4 -12
- data/lib/pact_broker/webhooks/webhook_request_template.rb +6 -8
- data/pact_broker.gemspec +4 -0
- data/public/javascripts/index.js +75 -68
- data/public/javascripts/pact.js +14 -14
- data/public/stylesheets/index.css +1 -2
- data/public/stylesheets/pact.css +11 -0
- data/script/data/auto-create-things-for-tags.rb +2 -0
- data/script/data/branches.rb +2 -2
- data/script/data/contract-published-requiring-verification.rb +1 -1
- data/script/data/environments.rb +0 -0
- data/script/data/pending.rb +26 -0
- data/script/data/tags.rb +35 -0
- data/script/data/webhook.rb +22 -0
- data/script/seed.rb +50 -89
- data/spec/features/delete_pact_versions_for_branch_spec.rb +34 -0
- data/spec/fixtures/approvals/modifiable_resources.approved.json +4 -0
- data/spec/integration/app_spec.rb +6 -6
- data/spec/lib/pact/doc/markdown/consumer_contract_renderer_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/reason_decorator_spec.rb +2 -2
- data/spec/lib/pact_broker/api/decorators/verification_summary_decorator_spec.rb +2 -0
- data/spec/lib/pact_broker/api/decorators/webhook_execution_result_decorator_spec.rb +1 -1
- data/spec/lib/pact_broker/api/middleware/configuration_spec.rb +43 -0
- data/spec/lib/pact_broker/api/resources/verifications_spec.rb +2 -3
- data/spec/lib/pact_broker/api/resources/webhook_execution_spec.rb +1 -1
- data/spec/lib/pact_broker/badges/service_spec.rb +22 -0
- data/spec/lib/pact_broker/domain/webhook_request_spec.rb +2 -1
- data/spec/lib/pact_broker/domain/webhook_spec.rb +15 -5
- data/spec/lib/pact_broker/index/service_spec.rb +1 -5
- data/spec/lib/pact_broker/index/service_view_spec.rb +144 -0
- data/spec/lib/pact_broker/pacts/metadata_spec.rb +11 -2
- data/spec/lib/pact_broker/pacts/pact_publication_latest_verification_spec.rb +29 -0
- data/spec/lib/pact_broker/pacts/repository_spec.rb +15 -2
- data/spec/lib/pact_broker/ui/view_models/index_item_spec.rb +11 -8
- data/spec/lib/pact_broker/verifications/pseudo_branch_status_spec.rb +9 -1
- data/spec/lib/pact_broker/verifications/service_spec.rb +4 -2
- data/spec/lib/pact_broker/webhooks/job_spec.rb +4 -4
- data/spec/lib/pact_broker/webhooks/trigger_service_spec.rb +9 -5
- data/spec/lib/pact_broker/webhooks/webhook_request_logger_spec.rb +6 -12
- data/spec/lib/pact_broker/webhooks/webhook_request_template_spec.rb +3 -2
- data/spec/support/generated_markdown.md +3 -3
- metadata +47 -4
- data/spec/lib/pact_broker/api/resources/webhook_execution_result_spec.rb +0 -56
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 78ca6573c59b514f1527988079ebeecc19f3fc33b66c7abe7fc9bf00b099c7a1
|
|
4
|
+
data.tar.gz: 742f05a5b5348b22aa1efd10dfe2068d76d1259182cfd533442beec8c06e764f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: af16f324d2022596b678ff7c53e1ab4bcae836e12cf376fd415e581fda38e874fbf33094a21bf04c6c8545c534edd78d181326e34d7865898c52bb1915df4d14
|
|
7
|
+
data.tar.gz: 1c33d08f629c7db7f2ef12589c0982a5e78a1896c24d400467e26bca8389912ecc305d67ca6ea174132ff8e7c03b67b0d4f3d14a241e3355e79e612cb8cb04c5
|
data/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,14 @@
|
|
|
1
|
+
<a name="v2.85.0"></a>
|
|
2
|
+
### v2.85.0 (2021-09-13)
|
|
3
|
+
|
|
4
|
+
#### Features
|
|
5
|
+
|
|
6
|
+
* show in the UI whether or not a pact was pending when verification failed ([326c068e](/../../commit/326c068e))
|
|
7
|
+
* thread safe configuration overrides (#500) ([50900231](/../../commit/50900231))
|
|
8
|
+
* allow dashboard pacts to be viewed by branch, tag, environment or all ([1ec8fc82](/../../commit/1ec8fc82))
|
|
9
|
+
* support deleting pacts by branch in the UI ([bc8fef1d](/../../commit/bc8fef1d))
|
|
10
|
+
* update UI ([0ba5eda3](/../../commit/0ba5eda3))
|
|
11
|
+
|
|
1
12
|
<a name="v2.84.0"></a>
|
|
2
13
|
### v2.84.0 (2021-09-10)
|
|
3
14
|
|
|
@@ -24,7 +24,7 @@ module Pact
|
|
|
24
24
|
attr_reader :consumer_contract
|
|
25
25
|
|
|
26
26
|
def title
|
|
27
|
-
"
|
|
27
|
+
"# A pact between #{consumer_name} and #{provider_name}\n\n"
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
def interaction_renderers
|
|
@@ -32,11 +32,11 @@ module Pact
|
|
|
32
32
|
end
|
|
33
33
|
|
|
34
34
|
def summaries_title
|
|
35
|
-
"
|
|
35
|
+
"### Requests from #{consumer_name} to #{provider_name}\n\n"
|
|
36
36
|
end
|
|
37
37
|
|
|
38
38
|
def interactions_title
|
|
39
|
-
"
|
|
39
|
+
"### Interactions\n\n"
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
def summaries
|
|
@@ -45,9 +45,9 @@ module PactBroker
|
|
|
45
45
|
when PactBroker::Matrix::IgnoreSelectorDoesNotExist
|
|
46
46
|
"WARN: Cannot ignore #{reason.selector.description}"
|
|
47
47
|
when PactBroker::Matrix::SelectorWithoutPacticipantVersionNumberSpecified
|
|
48
|
-
"WARN:
|
|
48
|
+
"WARN: It is recommended to specify the version number (rather than the tag or branch) of the pacticipant you wish to deploy to avoid race conditions. Without a version number, this result will not be reliable."
|
|
49
49
|
when PactBroker::Matrix::NoEnvironmentSpecified
|
|
50
|
-
"WARN:
|
|
50
|
+
"WARN: It is recommended to specify the environment into which you are deploying. Without the environment, this result will not be reliable."
|
|
51
51
|
else
|
|
52
52
|
reason
|
|
53
53
|
end
|
|
@@ -6,9 +6,9 @@ require "ostruct"
|
|
|
6
6
|
module PactBroker
|
|
7
7
|
module Api
|
|
8
8
|
module Decorators
|
|
9
|
-
|
|
10
9
|
class VerificationSummaryDecorator < BaseDecorator
|
|
11
10
|
|
|
11
|
+
# TODO count pending failures?
|
|
12
12
|
property :success
|
|
13
13
|
property :provider_summary, as: :providerSummary do
|
|
14
14
|
property :successful
|
|
@@ -30,7 +30,6 @@ module PactBroker
|
|
|
30
30
|
successful: represented.select(&:success).collect(&:provider_name),
|
|
31
31
|
failed: represented.select{|verification| !verification.success }.collect(&:provider_name))
|
|
32
32
|
end
|
|
33
|
-
|
|
34
33
|
end
|
|
35
34
|
end
|
|
36
35
|
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "pact_broker/logging"
|
|
2
|
+
|
|
3
|
+
module PactBroker
|
|
4
|
+
module Api
|
|
5
|
+
module Middleware
|
|
6
|
+
class Configuration
|
|
7
|
+
include PactBroker::Logging
|
|
8
|
+
|
|
9
|
+
def initialize(app, configuration)
|
|
10
|
+
@app = app
|
|
11
|
+
@configuration = configuration
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def call(env)
|
|
15
|
+
if (overrides = env["pactbroker.configuration_overrides"])&.any?
|
|
16
|
+
dupped_configuration = configuration.dup
|
|
17
|
+
dupped_configuration.override_runtime_configuration!(overrides)
|
|
18
|
+
dupped_configuration.freeze
|
|
19
|
+
PactBroker.set_configuration(dupped_configuration)
|
|
20
|
+
app.call(env)
|
|
21
|
+
else
|
|
22
|
+
PactBroker.set_configuration(configuration)
|
|
23
|
+
app.call(env)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
private
|
|
28
|
+
|
|
29
|
+
attr_reader :app, :configuration
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -115,6 +115,10 @@ module PactBroker
|
|
|
115
115
|
"#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/tag/#{url_encode(tag)}"
|
|
116
116
|
end
|
|
117
117
|
|
|
118
|
+
def pact_versions_for_branch_url consumer_name, provider_name, branch_name, base_url = ""
|
|
119
|
+
"#{base_url}/pacts/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}/branch/#{url_encode(branch_name)}"
|
|
120
|
+
end
|
|
121
|
+
|
|
118
122
|
def integration_url consumer_name, provider_name, base_url = ""
|
|
119
123
|
"#{base_url}/integrations/provider/#{url_encode(provider_name)}/consumer/#{url_encode(consumer_name)}"
|
|
120
124
|
end
|
|
@@ -311,7 +315,7 @@ module PactBroker
|
|
|
311
315
|
end
|
|
312
316
|
|
|
313
317
|
def group_url(pacticipant_name, base_url = "")
|
|
314
|
-
"#{base_url}/
|
|
318
|
+
"#{base_url}/pacticipants/#{url_encode(pacticipant_name)}"
|
|
315
319
|
end
|
|
316
320
|
|
|
317
321
|
def environments_url(base_url = "")
|
|
@@ -29,7 +29,7 @@ module PactBroker
|
|
|
29
29
|
"<html>
|
|
30
30
|
<head>#{head}</head>
|
|
31
31
|
<body>
|
|
32
|
-
#{pact_metadata}#{html}
|
|
32
|
+
#{breadcrumbs}#{pact_metadata}#{html}
|
|
33
33
|
</body>
|
|
34
34
|
</html>"
|
|
35
35
|
end
|
|
@@ -39,10 +39,10 @@ module PactBroker
|
|
|
39
39
|
def head
|
|
40
40
|
"<title>#{title}</title>
|
|
41
41
|
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github.css'>
|
|
42
|
-
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/pact.css'>
|
|
43
42
|
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/github-json.css'>
|
|
44
43
|
<link rel='stylesheet' type='text/css' href='#{base_url}/css/bootstrap.min.css'>
|
|
45
44
|
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/material-menu.css'>
|
|
45
|
+
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/pact.css'>
|
|
46
46
|
<link rel='stylesheet' type='text/css' href='#{base_url}/stylesheets/jquery-confirm.min.css'>
|
|
47
47
|
<script src='#{base_url}/javascripts/highlight.pack.js'></script>
|
|
48
48
|
<script src='#{base_url}/javascripts/jquery-3.5.1.min.js'></script>
|
|
@@ -53,6 +53,17 @@ module PactBroker
|
|
|
53
53
|
<script>hljs.initHighlightingOnLoad();</script>"
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
+
def breadcrumbs
|
|
57
|
+
"
|
|
58
|
+
<nav aria-label=\"breadcrumb\">
|
|
59
|
+
<ol class=\"breadcrumb\" style=\"margin:0; margin-bottom:1rem\">
|
|
60
|
+
<li class=\"breadcrumb-item\" style=\"margin:0;\"><a href=\"#{base_url}/\">Home</a></li>
|
|
61
|
+
<li class=\"breadcrumb-item active\" aria-current=\"page\" style=\"margin:0;\">Pact</li>
|
|
62
|
+
</ol>
|
|
63
|
+
</nav>
|
|
64
|
+
"
|
|
65
|
+
end
|
|
66
|
+
|
|
56
67
|
def pact_metadata
|
|
57
68
|
"<div class='pact-metadata'>
|
|
58
69
|
<ul>
|
|
@@ -66,19 +77,12 @@ module PactBroker
|
|
|
66
77
|
<span class='name' title='#{published_date}'>Date published:</span>
|
|
67
78
|
<span class='value' title='#{published_date}'>#{published_date_in_words}</span>
|
|
68
79
|
</li>
|
|
69
|
-
<li>
|
|
70
|
-
<a href=\"#{json_url}\">View in API Browser</a>
|
|
71
|
-
</li>
|
|
72
|
-
<li>
|
|
73
|
-
<a href=\"#{matrix_url}\">View Matrix</a>
|
|
74
|
-
</li>
|
|
75
|
-
<li>
|
|
76
|
-
<a href=\"#{base_url}/\">Home</a>
|
|
77
|
-
</li>
|
|
78
80
|
<li>
|
|
79
81
|
<span data-consumer-name=\"#{consumer_name}\"
|
|
80
82
|
data-provider-name=\"#{provider_name}\"
|
|
81
83
|
data-consumer-version-number=\"#{consumer_version_number}\"
|
|
84
|
+
data-api-browser-url=\"#{json_url}\"
|
|
85
|
+
data-matrix-url=\"#{matrix_url}\"
|
|
82
86
|
data-pact-url=\"#{pact_url}\"
|
|
83
87
|
class='more-options kebab-horizontal'
|
|
84
88
|
aria-hidden='true'></span>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require "pact_broker/api/resources/base_resource"
|
|
2
|
+
require "pact_broker/configuration"
|
|
3
|
+
require "pact_broker/api/decorators/tagged_pact_versions_decorator"
|
|
4
|
+
require "pact_broker/api/resources/pact_resource_methods"
|
|
5
|
+
|
|
6
|
+
module PactBroker
|
|
7
|
+
module Api
|
|
8
|
+
module Resources
|
|
9
|
+
class PactVersionsForBranch < BaseResource
|
|
10
|
+
include PactResourceMethods
|
|
11
|
+
|
|
12
|
+
def content_types_provided
|
|
13
|
+
[["application/hal+json", :to_json]]
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def allowed_methods
|
|
17
|
+
["DELETE", "OPTIONS"]
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def resource_exists?
|
|
21
|
+
consumer && provider
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def delete_resource
|
|
25
|
+
pact_service.delete_all_pact_publications_between consumer_name, and: provider_name, branch_name: identifier_from_path[:branch_name]
|
|
26
|
+
set_post_deletion_response
|
|
27
|
+
true
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def policy_name
|
|
31
|
+
:'pacts::pacts'
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def policy_pacticipant
|
|
35
|
+
consumer
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -84,12 +84,16 @@ module PactBroker
|
|
|
84
84
|
metadata[:wip] == "true"
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
def pending?
|
|
88
|
+
metadata[:pending]
|
|
89
|
+
end
|
|
90
|
+
|
|
87
91
|
def event_context
|
|
88
92
|
metadata
|
|
89
93
|
end
|
|
90
94
|
|
|
91
95
|
def verification_params
|
|
92
|
-
params(symbolize_names: false).merge("wip" => wip?)
|
|
96
|
+
params(symbolize_names: false).merge("wip" => wip?, "pending" => pending?)
|
|
93
97
|
end
|
|
94
98
|
end
|
|
95
99
|
end
|
data/lib/pact_broker/api.rb
CHANGED
|
@@ -32,6 +32,7 @@ module PactBroker
|
|
|
32
32
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "versions"], Api::Resources::PactVersions, {resource_name: "pact_publications"}
|
|
33
33
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "versions", :consumer_version_number], Api::Resources::Pact, {resource_name: "pact_publication", deprecated: true} # Not the standard URL, but keep for backwards compatibility
|
|
34
34
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "tag", :tag], Api::Resources::TaggedPactVersions, {resource_name: "tagged_pact_publications"}
|
|
35
|
+
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "branch", :branch_name], Api::Resources::PactVersionsForBranch, {resource_name: "pact_publications_for_branch"}
|
|
35
36
|
|
|
36
37
|
# Pacts
|
|
37
38
|
add ["pacts", "provider", :provider_name, "consumer", :consumer_name, "version", :consumer_version_number], Api::Resources::Pact, {resource_name: "pact_publication"}
|
data/lib/pact_broker/app.rb
CHANGED
|
@@ -25,6 +25,7 @@ require "rack/pact_broker/reset_thread_data"
|
|
|
25
25
|
require "rack/pact_broker/add_vary_header"
|
|
26
26
|
require "rack/pact_broker/use_when"
|
|
27
27
|
require "sucker_punch"
|
|
28
|
+
require "pact_broker/api/middleware/configuration"
|
|
28
29
|
require "pact_broker/api/middleware/basic_auth"
|
|
29
30
|
require "pact_broker/config/basic_auth_configuration"
|
|
30
31
|
require "pact_broker/api/authorization/resource_access_policy"
|
|
@@ -51,6 +52,7 @@ module PactBroker
|
|
|
51
52
|
load_configuration_from_database
|
|
52
53
|
seed_example_data
|
|
53
54
|
print_startup_message
|
|
55
|
+
@configuration.freeze
|
|
54
56
|
end
|
|
55
57
|
|
|
56
58
|
# Allows middleware to be inserted at the bottom of the shared middlware stack
|
|
@@ -87,6 +87,7 @@ module PactBroker
|
|
|
87
87
|
case pseudo_branch_verification_status
|
|
88
88
|
when :success then "verified"
|
|
89
89
|
when :failed then "failed"
|
|
90
|
+
when :failed_pending then "failed (pending)"
|
|
90
91
|
when :stale then "changed"
|
|
91
92
|
else "unknown"
|
|
92
93
|
end
|
|
@@ -96,6 +97,7 @@ module PactBroker
|
|
|
96
97
|
case pseudo_branch_verification_status
|
|
97
98
|
when :success then "brightgreen"
|
|
98
99
|
when :failed then "red"
|
|
100
|
+
when :failed_pending then "red"
|
|
99
101
|
when :stale then "orange"
|
|
100
102
|
else "lightgrey"
|
|
101
103
|
end
|
|
@@ -151,7 +153,7 @@ module PactBroker
|
|
|
151
153
|
def static_svg pact, pseudo_branch_verification_status
|
|
152
154
|
file_name = case pseudo_branch_verification_status
|
|
153
155
|
when :success then "pact-verified-brightgreen.svg"
|
|
154
|
-
when :failed then "pact-failed-red.svg"
|
|
156
|
+
when :failed, :failed_pending then "pact-failed-red.svg"
|
|
155
157
|
when :stale then "pact-changed-orange.svg"
|
|
156
158
|
else "pact-unknown-lightgrey.svg"
|
|
157
159
|
end
|
|
@@ -4,10 +4,15 @@ require "semantic_logger"
|
|
|
4
4
|
require "forwardable"
|
|
5
5
|
require "pact_broker/config/runtime_configuration"
|
|
6
6
|
require "anyway/auto_cast"
|
|
7
|
+
require "request_store"
|
|
7
8
|
|
|
8
9
|
module PactBroker
|
|
9
10
|
def self.configuration
|
|
10
|
-
|
|
11
|
+
RequestStore.store[:pact_broker_configuration] ||= Configuration.default_configuration
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.set_configuration(configuration)
|
|
15
|
+
RequestStore.store[:pact_broker_configuration] = configuration
|
|
11
16
|
end
|
|
12
17
|
|
|
13
18
|
def self.with_runtime_configuration_overrides(overrides, &block)
|
|
@@ -16,7 +21,7 @@ module PactBroker
|
|
|
16
21
|
|
|
17
22
|
# @private, for testing only
|
|
18
23
|
def self.reset_configuration
|
|
19
|
-
|
|
24
|
+
RequestStore.store[:pact_broker_configuration] = Configuration.default_configuration
|
|
20
25
|
end
|
|
21
26
|
|
|
22
27
|
class Configuration
|
|
@@ -83,12 +88,36 @@ module PactBroker
|
|
|
83
88
|
|
|
84
89
|
def with_runtime_configuration_overrides(overrides)
|
|
85
90
|
original_runtime_configuration = runtime_configuration
|
|
86
|
-
self.runtime_configuration = override_runtime_configuration(overrides
|
|
91
|
+
self.runtime_configuration = override_runtime_configuration!(overrides)
|
|
87
92
|
yield
|
|
88
93
|
ensure
|
|
89
94
|
self.runtime_configuration = original_runtime_configuration
|
|
90
95
|
end
|
|
91
96
|
|
|
97
|
+
def override_runtime_configuration!(overrides)
|
|
98
|
+
new_runtime_configuration = runtime_configuration.dup
|
|
99
|
+
valid_overrides = {}
|
|
100
|
+
invalid_overrides = {}
|
|
101
|
+
|
|
102
|
+
overrides.each do | key, value |
|
|
103
|
+
if new_runtime_configuration.respond_to?("#{key}=")
|
|
104
|
+
valid_overrides[key] = Anyway::AutoCast.call(value)
|
|
105
|
+
else
|
|
106
|
+
invalid_overrides[key] = Anyway::AutoCast.call(value)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
if logger.debug?
|
|
111
|
+
logger.debug("Overridding runtime configuration", payload: { overrides: valid_overrides, ignoring: invalid_overrides })
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
valid_overrides.each do | key, value |
|
|
115
|
+
new_runtime_configuration.public_send("#{key}=", value)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
self.runtime_configuration = new_runtime_configuration
|
|
119
|
+
end
|
|
120
|
+
|
|
92
121
|
def logger_from_runtime_configuration
|
|
93
122
|
@logger_from_runtime_configuration ||= begin
|
|
94
123
|
runtime_configuration.validate_logging_attributes!
|
|
@@ -193,7 +222,7 @@ module PactBroker
|
|
|
193
222
|
end
|
|
194
223
|
|
|
195
224
|
def show_webhook_response?
|
|
196
|
-
webhook_host_whitelist
|
|
225
|
+
webhook_host_whitelist&.any?
|
|
197
226
|
end
|
|
198
227
|
|
|
199
228
|
def enable_badge_resources= enable_badge_resources
|
|
@@ -206,30 +235,5 @@ module PactBroker
|
|
|
206
235
|
require "pact_broker/config/load"
|
|
207
236
|
PactBroker::Config::Load.call(runtime_configuration)
|
|
208
237
|
end
|
|
209
|
-
|
|
210
|
-
private
|
|
211
|
-
|
|
212
|
-
def override_runtime_configuration(overrides, new_runtime_configuration)
|
|
213
|
-
valid_overrides = {}
|
|
214
|
-
invalid_overrides = {}
|
|
215
|
-
|
|
216
|
-
overrides.each do | key, value |
|
|
217
|
-
if new_runtime_configuration.respond_to?("#{key}=")
|
|
218
|
-
valid_overrides[key] = Anyway::AutoCast.call(value)
|
|
219
|
-
else
|
|
220
|
-
invalid_overrides[key] = Anyway::AutoCast.call(value)
|
|
221
|
-
end
|
|
222
|
-
end
|
|
223
|
-
|
|
224
|
-
if logger.debug?
|
|
225
|
-
logger.debug("Overridding runtime configuration", payload: { overrides: valid_overrides, ignoring: invalid_overrides })
|
|
226
|
-
end
|
|
227
|
-
|
|
228
|
-
valid_overrides.each do | key, value |
|
|
229
|
-
new_runtime_configuration.public_send("#{key}=", value)
|
|
230
|
-
end
|
|
231
|
-
|
|
232
|
-
new_runtime_configuration
|
|
233
|
-
end
|
|
234
238
|
end
|
|
235
239
|
end
|
|
@@ -206,6 +206,15 @@ module PactBroker
|
|
|
206
206
|
@pact_content_with_test_results = PactBroker::Pacts::Content.from_json(pact_version.content).with_test_results(test_results)
|
|
207
207
|
end
|
|
208
208
|
|
|
209
|
+
# Whether the pact content was pending at the time the verification was run
|
|
210
|
+
def pact_pending?
|
|
211
|
+
pact_pending
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def failed_and_pact_pending?
|
|
215
|
+
!success && pact_pending
|
|
216
|
+
end
|
|
217
|
+
|
|
209
218
|
# So consumer_version_tag_name can be accessed by method name
|
|
210
219
|
def method_missing(m, *args, &block)
|
|
211
220
|
if values.key?(m) && args.size == 0
|
|
@@ -50,17 +50,12 @@ module PactBroker
|
|
|
50
50
|
def execute pact, verification, event_context, options
|
|
51
51
|
logger.info "Executing #{self} event_context=#{event_context}"
|
|
52
52
|
template_params = template_parameters(pact, verification, event_context, options)
|
|
53
|
-
webhook_request = request.build(template_params)
|
|
53
|
+
webhook_request = request.build(template_params, options.fetch(:user_agent))
|
|
54
54
|
http_response, error = execute_request(webhook_request)
|
|
55
|
-
|
|
56
|
-
logs = generate_logs(webhook_request, http_response, error, event_context, options.fetch(:logging_options))
|
|
55
|
+
success = success?(http_response, options)
|
|
57
56
|
http_request = webhook_request.http_request
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
http_response,
|
|
61
|
-
logs,
|
|
62
|
-
error
|
|
63
|
-
)
|
|
57
|
+
logs = generate_logs(webhook_request, http_response, success, error, event_context, options.fetch(:logging_options))
|
|
58
|
+
result(http_request, http_response, success, logs, error)
|
|
64
59
|
end
|
|
65
60
|
|
|
66
61
|
def to_s
|
|
@@ -116,16 +111,33 @@ module PactBroker
|
|
|
116
111
|
PactBroker::Webhooks::PactAndVerificationParameters.new(pact, verification, event_context).to_hash
|
|
117
112
|
end
|
|
118
113
|
|
|
119
|
-
def
|
|
114
|
+
def success?(http_response, options)
|
|
115
|
+
!http_response.nil? && options.fetch(:http_success_codes).include?(http_response.code.to_i)
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# rubocop: disable Metrics/ParameterLists
|
|
119
|
+
def generate_logs(webhook_request, http_response, success, error, event_context, logging_options)
|
|
120
120
|
webhook_request_logger = PactBroker::Webhooks::WebhookRequestLogger.new(logging_options)
|
|
121
121
|
webhook_request_logger.log(
|
|
122
122
|
uuid,
|
|
123
123
|
webhook_request,
|
|
124
124
|
http_response,
|
|
125
|
+
success,
|
|
125
126
|
error,
|
|
126
127
|
event_context
|
|
127
128
|
)
|
|
128
129
|
end
|
|
130
|
+
# robocop: enable Metrics/ParameterLists
|
|
131
|
+
|
|
132
|
+
def result(http_request, http_response, success, logs, error)
|
|
133
|
+
PactBroker::Webhooks::WebhookExecutionResult.new(
|
|
134
|
+
http_request,
|
|
135
|
+
http_response,
|
|
136
|
+
success,
|
|
137
|
+
logs,
|
|
138
|
+
error
|
|
139
|
+
)
|
|
140
|
+
end
|
|
129
141
|
end
|
|
130
142
|
end
|
|
131
143
|
end
|