pact_broker-client 1.15.1 → 1.16.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 +9 -0
- data/README.md +5 -0
- data/doc/pacts/markdown/Pact Broker Client - Pact Broker.md +12 -6
- data/doc/pacts/markdown/README.md +1 -1
- data/lib/pact_broker/client/can_i_deploy.rb +51 -11
- data/lib/pact_broker/client/cli/broker.rb +4 -1
- data/lib/pact_broker/client/create_tag.rb +1 -1
- data/lib/pact_broker/client/hal/http_client.rb +1 -1
- data/lib/pact_broker/client/matrix.rb +3 -2
- data/lib/pact_broker/client/matrix/resource.rb +34 -0
- data/lib/pact_broker/client/publish_pacts.rb +2 -2
- data/lib/pact_broker/client/retry.rb +32 -4
- data/lib/pact_broker/client/version.rb +1 -1
- data/lib/pact_broker/client/webhooks/create.rb +1 -1
- data/spec/lib/pact_broker/client/can_i_deploy_spec.rb +43 -6
- data/spec/lib/pact_broker/client/cli/broker_can_i_deploy_spec.rb +4 -2
- data/spec/lib/pact_broker/client/hal/http_client_spec.rb +4 -4
- data/spec/lib/pact_broker/client/matrix/resource_spec.rb +70 -0
- data/spec/lib/pact_broker/client/retry_spec.rb +119 -0
- data/spec/lib/pact_broker/client/webhooks/create_spec.rb +1 -1
- data/spec/pacts/pact_broker_client-pact_broker.json +12 -6
- data/spec/support/matrix.json +2 -1
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 86e1090888410192cf087270229f3b0542850d81
|
4
|
+
data.tar.gz: a4f841135438cdb6e5520dccf9fa812d2884f4a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb5a27dd769ebb1e68ad2b0959a10f6af8ce00f1995f95bbfa5ee14ecf306536c0994d95db2aa7c84c52417b2a318231880b6f60d47357542525528d4e5600c1
|
7
|
+
data.tar.gz: 6e22a6ce47412481e76ea8834caa40c793b70c1d7fbfd2855da16384ae715339c5a52b8100090ba96dae54e375a932666316f951ada164bccf16c2903974d331
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
<a name="v1.16.0"></a>
|
2
|
+
### v1.16.0 (2018-07-09)
|
3
|
+
|
4
|
+
|
5
|
+
#### Features
|
6
|
+
|
7
|
+
* add retries to can-i-deploy to allow the command to wait for missing results to arrive ([e44f88d](/../../commit/e44f88d))
|
8
|
+
|
9
|
+
|
1
10
|
<a name="v1.15.1"></a>
|
2
11
|
### v1.15.1 (2018-06-28)
|
3
12
|
|
data/README.md
CHANGED
@@ -67,12 +67,17 @@ Options:
|
|
67
67
|
-a, --pacticipant=PACTICIPANT # The pacticipant name. Use once for each pacticipant being checked.
|
68
68
|
-e, [--version=VERSION] # The pacticipant version. Must be entered after the --pacticipant that it relates to.
|
69
69
|
-l, [--latest=[TAG]] # Use the latest pacticipant version. Optionally specify a TAG to use the latest version with the specified tag.
|
70
|
+
[--to=TAG] # This is too hard to explain in a short sentence. Look at the examples.
|
70
71
|
-b, --broker-base-url=BROKER_BASE_URL # The base URL of the Pact Broker
|
71
72
|
-u, [--broker-username=BROKER_USERNAME] # Pact Broker basic auth username
|
72
73
|
-p, [--broker-password=BROKER_PASSWORD] # Pact Broker basic auth password
|
73
74
|
-o, [--output=OUTPUT] # json or table
|
74
75
|
# Default: table
|
75
76
|
-v, [--verbose], [--no-verbose] # Verbose output. Default: false
|
77
|
+
[--retry-while-unknown=TIMES] # The number of times to retry while there is an unknown verification result (ie. the provider verification is likely still running)
|
78
|
+
# Default: 0
|
79
|
+
[--retry-interval=SECONDS] # The time between retries in seconds. Use in conjuction with --retry-while-unknown
|
80
|
+
# Default: 10
|
76
81
|
|
77
82
|
Description:
|
78
83
|
Returns exit code 0 or 1, indicating whether or not the specified pacticipant versions are compatible. Prints out the relevant pact/verification details.
|
@@ -196,7 +196,8 @@ Pact Broker will respond with:
|
|
196
196
|
"body": {
|
197
197
|
"summary": {
|
198
198
|
"deployable": true,
|
199
|
-
"reason": "some text"
|
199
|
+
"reason": "some text",
|
200
|
+
"unknown": 1
|
200
201
|
},
|
201
202
|
"matrix": [
|
202
203
|
{
|
@@ -243,7 +244,8 @@ Pact Broker will respond with:
|
|
243
244
|
"body": {
|
244
245
|
"summary": {
|
245
246
|
"deployable": true,
|
246
|
-
"reason": "some text"
|
247
|
+
"reason": "some text",
|
248
|
+
"unknown": 1
|
247
249
|
},
|
248
250
|
"matrix": [
|
249
251
|
{
|
@@ -290,7 +292,8 @@ Pact Broker will respond with:
|
|
290
292
|
"body": {
|
291
293
|
"summary": {
|
292
294
|
"deployable": true,
|
293
|
-
"reason": "some text"
|
295
|
+
"reason": "some text",
|
296
|
+
"unknown": 1
|
294
297
|
},
|
295
298
|
"matrix": [
|
296
299
|
{
|
@@ -373,7 +376,8 @@ Pact Broker will respond with:
|
|
373
376
|
"body": {
|
374
377
|
"summary": {
|
375
378
|
"deployable": true,
|
376
|
-
"reason": "some text"
|
379
|
+
"reason": "some text",
|
380
|
+
"unknown": 1
|
377
381
|
},
|
378
382
|
"matrix": [
|
379
383
|
{
|
@@ -443,7 +447,8 @@ Pact Broker will respond with:
|
|
443
447
|
"body": {
|
444
448
|
"summary": {
|
445
449
|
"deployable": true,
|
446
|
-
"reason": "some text"
|
450
|
+
"reason": "some text",
|
451
|
+
"unknown": 1
|
447
452
|
},
|
448
453
|
"matrix": [
|
449
454
|
{
|
@@ -629,7 +634,8 @@ Pact Broker will respond with:
|
|
629
634
|
"body": {
|
630
635
|
"summary": {
|
631
636
|
"deployable": true,
|
632
|
-
"reason": "some text"
|
637
|
+
"reason": "some text",
|
638
|
+
"unknown": 1
|
633
639
|
},
|
634
640
|
"matrix": [
|
635
641
|
{
|
@@ -30,11 +30,7 @@ module PactBroker
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def call
|
33
|
-
|
34
|
-
Result.new(true, success_message(matrix))
|
35
|
-
else
|
36
|
-
Result.new(false, failure_message(matrix))
|
37
|
-
end
|
33
|
+
create_result(fetch_matrix_with_retries)
|
38
34
|
rescue PactBroker::Client::Error => e
|
39
35
|
Result.new(false, e.message)
|
40
36
|
rescue StandardError => e
|
@@ -45,10 +41,18 @@ module PactBroker
|
|
45
41
|
|
46
42
|
attr_reader :pact_broker_base_url, :version_selectors, :matrix_options, :options, :pact_broker_client_options
|
47
43
|
|
44
|
+
def create_result(matrix)
|
45
|
+
if matrix.deployable?
|
46
|
+
Result.new(true, success_message(matrix))
|
47
|
+
else
|
48
|
+
Result.new(false, failure_message(matrix))
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
48
52
|
def success_message(matrix)
|
49
53
|
message = format_matrix(matrix)
|
50
54
|
if format != 'json'
|
51
|
-
message = 'Computer says yes \o/ ' + "\n\n" + message + "\n\n#{Term::ANSIColor.green(reason
|
55
|
+
message = 'Computer says yes \o/ ' + "\n\n" + message + "\n\n#{Term::ANSIColor.green(matrix.reason)}"
|
52
56
|
end
|
53
57
|
message
|
54
58
|
end
|
@@ -56,7 +60,7 @@ module PactBroker
|
|
56
60
|
def failure_message(matrix)
|
57
61
|
message = format_matrix(matrix)
|
58
62
|
if format != 'json'
|
59
|
-
message = 'Computer says no ¯\_(ツ)_/¯ ' + "\n\n" + message + "\n\n#{Term::ANSIColor.red(reason
|
63
|
+
message = 'Computer says no ¯\_(ツ)_/¯ ' + "\n\n" + message + "\n\n#{Term::ANSIColor.red(matrix.reason)}"
|
60
64
|
end
|
61
65
|
message
|
62
66
|
end
|
@@ -69,17 +73,53 @@ module PactBroker
|
|
69
73
|
options[:output]
|
70
74
|
end
|
71
75
|
|
72
|
-
def
|
73
|
-
matrix
|
76
|
+
def fetch_matrix
|
77
|
+
Retry.while_error { pact_broker_client.matrix.get(version_selectors, matrix_options) }
|
74
78
|
end
|
75
79
|
|
76
|
-
def
|
77
|
-
|
80
|
+
def fetch_matrix_with_retries
|
81
|
+
matrix = fetch_matrix
|
82
|
+
if retry_while_unknown?
|
83
|
+
check_if_retry_while_unknown_supported(matrix)
|
84
|
+
if matrix.any_unknown?
|
85
|
+
matrix = Retry.until_truthy_or_max_times(retry_options) do
|
86
|
+
fetch_matrix
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
matrix
|
78
91
|
end
|
79
92
|
|
80
93
|
def pact_broker_client
|
81
94
|
@pact_broker_client ||= PactBroker::Client::PactBrokerClient.new(base_url: pact_broker_base_url, client_options: pact_broker_client_options)
|
82
95
|
end
|
96
|
+
|
97
|
+
def retry_while_unknown?
|
98
|
+
options[:retry_while_unknown] > 0
|
99
|
+
end
|
100
|
+
|
101
|
+
def retry_options
|
102
|
+
{
|
103
|
+
condition: lambda { |matrix| !matrix.any_unknown? },
|
104
|
+
tries: retry_tries,
|
105
|
+
sleep: retry_interval,
|
106
|
+
sleep_first: true
|
107
|
+
}
|
108
|
+
end
|
109
|
+
|
110
|
+
def retry_interval
|
111
|
+
options[:retry_interval]
|
112
|
+
end
|
113
|
+
|
114
|
+
def retry_tries
|
115
|
+
options[:retry_while_unknown]
|
116
|
+
end
|
117
|
+
|
118
|
+
def check_if_retry_while_unknown_supported(matrix)
|
119
|
+
if !matrix.supports_unknown_count?
|
120
|
+
raise PactBroker::Client::Error.new("This version of the Pact Broker does not provide a count of the unknown verification results. Please upgrade your Broker to >= v2.23.4")
|
121
|
+
end
|
122
|
+
end
|
83
123
|
end
|
84
124
|
end
|
85
125
|
end
|
@@ -29,11 +29,14 @@ module PactBroker
|
|
29
29
|
method_option :broker_password, aliases: "-p", desc: "Pact Broker basic auth password"
|
30
30
|
method_option :output, aliases: "-o", desc: "json or table", default: 'table'
|
31
31
|
method_option :verbose, aliases: "-v", type: :boolean, default: false, required: false, desc: "Verbose output. Default: false"
|
32
|
+
method_option :retry_while_unknown, banner: 'TIMES', type: :numeric, default: 0, required: false, desc: "The number of times to retry while there is an unknown verification result (ie. the provider verification is likely still running)"
|
33
|
+
method_option :retry_interval, banner: 'SECONDS', type: :numeric, default: 10, required: false, desc: "The time between retries in seconds. Use in conjuction with --retry-while-unknown"
|
32
34
|
|
33
35
|
def can_i_deploy(*ignored_but_necessary)
|
34
36
|
selectors = VersionSelectorOptionsParser.call(ARGV)
|
35
37
|
validate_can_i_deploy_selectors(selectors)
|
36
|
-
|
38
|
+
can_i_deploy_options = { output: options.output, retry_while_unknown: options.retry_while_unknown, retry_interval: options.retry_interval }
|
39
|
+
result = CanIDeploy.call(options.broker_base_url, selectors, {to_tag: options.to}, can_i_deploy_options, pact_broker_client_options)
|
37
40
|
$stdout.puts result.message
|
38
41
|
exit(1) unless result.success
|
39
42
|
end
|
@@ -31,7 +31,7 @@ module PactBroker
|
|
31
31
|
tags.each do | tag |
|
32
32
|
# todo check that pacticipant exists first
|
33
33
|
$stdout.puts "Tagging #{pacticipant_name} version #{version} as #{tag}"
|
34
|
-
Retry.
|
34
|
+
Retry.while_error do
|
35
35
|
pact_broker_client.pacticipants.versions.tag pacticipant: pacticipant_name, version: version, tag: tag
|
36
36
|
end
|
37
37
|
end
|
@@ -43,7 +43,7 @@ module PactBroker
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def perform_request request, uri
|
46
|
-
response = Retry.
|
46
|
+
response = Retry.while_error do
|
47
47
|
http = Net::HTTP.new(uri.host, uri.port, :ENV)
|
48
48
|
http.set_debug_output($stderr) if verbose
|
49
49
|
http.use_ssl = (uri.scheme == 'https')
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'base_client'
|
2
|
+
require 'pact_broker/client/matrix/resource'
|
2
3
|
|
3
4
|
module PactBroker
|
4
5
|
module Client
|
@@ -11,7 +12,7 @@ module PactBroker
|
|
11
12
|
}.merge(query_options(options))
|
12
13
|
response = self.class.get("/matrix", query: query, headers: default_get_headers)
|
13
14
|
response = handle_response(response) do
|
14
|
-
JSON.parse(response.body, symbolize_names: true)
|
15
|
+
Matrix::Resource.new(JSON.parse(response.body, symbolize_names: true))
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
@@ -21,7 +22,7 @@ module PactBroker
|
|
21
22
|
elsif response.code == 401
|
22
23
|
raise Error.new("Authentication failed")
|
23
24
|
elsif response.code == 404
|
24
|
-
raise Error.new("Matrix resource not found at #{base_url}/matrix. Please upgrade your
|
25
|
+
raise Error.new("Matrix resource not found at #{base_url}/matrix. Please upgrade your Broker to the latest version.")
|
25
26
|
else
|
26
27
|
error_message = nil
|
27
28
|
begin
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'pact_broker/client/base_client'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Client
|
5
|
+
class Matrix < BaseClient
|
6
|
+
class Resource < Hash
|
7
|
+
|
8
|
+
def initialize hash
|
9
|
+
self.merge!(hash)
|
10
|
+
end
|
11
|
+
|
12
|
+
def any_unknown?
|
13
|
+
if supports_unknown_count?
|
14
|
+
self[:summary][:unknown] > 0
|
15
|
+
else
|
16
|
+
false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def supports_unknown_count?
|
21
|
+
!!(self[:summary] && Integer === self[:summary][:unknown] )
|
22
|
+
end
|
23
|
+
|
24
|
+
def reason
|
25
|
+
self[:summary][:reason]
|
26
|
+
end
|
27
|
+
|
28
|
+
def deployable?
|
29
|
+
self[:summary][:deployable]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -71,7 +71,7 @@ module PactBroker
|
|
71
71
|
|
72
72
|
def tag_consumer_version tag
|
73
73
|
versions = pact_broker_client.pacticipants.versions
|
74
|
-
Retry.
|
74
|
+
Retry.while_error do
|
75
75
|
$stdout.puts "Tagging version #{consumer_version} of #{consumer_name} as #{tag.inspect}"
|
76
76
|
versions.tag(pacticipant: consumer_name, version: consumer_version, tag: tag)
|
77
77
|
true
|
@@ -82,7 +82,7 @@ module PactBroker
|
|
82
82
|
end
|
83
83
|
|
84
84
|
def publish_pact_contents(pact)
|
85
|
-
Retry.
|
85
|
+
Retry.while_error do
|
86
86
|
pacts = pact_broker_client.pacticipants.versions.pacts
|
87
87
|
if pacts.version_published?(consumer: pact.consumer_name, provider: pact.provider_name, consumer_version: consumer_version)
|
88
88
|
$stdout.puts ::Term::ANSIColor.yellow("The given version of pact is already published. Overwriting...")
|
@@ -14,7 +14,7 @@ module PactBroker
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.
|
17
|
+
def self.while_error options = {}
|
18
18
|
max_tries = options.fetch(:times, 3)
|
19
19
|
tries = 0
|
20
20
|
while true
|
@@ -24,13 +24,41 @@ module PactBroker
|
|
24
24
|
tries += 1
|
25
25
|
$stderr.puts "Error making request - #{e.class} #{e.message} #{e.backtrace.find{|l| l.include?('pact_broker-client')}}, attempt #{tries} of #{max_tries}"
|
26
26
|
raise e if max_tries == tries
|
27
|
-
sleep options
|
27
|
+
sleep options.fetch(:sleep, 5)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
def self.
|
33
|
-
|
32
|
+
def self.until_truthy_or_max_times options = {}
|
33
|
+
max_tries = options.fetch(:times, 3)
|
34
|
+
tries = 0
|
35
|
+
verbose = options[:verbose]
|
36
|
+
sleep_interval = options.fetch(:sleep, 5)
|
37
|
+
sleep(sleep_interval) if options[:sleep_first]
|
38
|
+
while true
|
39
|
+
begin
|
40
|
+
result = yield
|
41
|
+
return result if max_tries < 2
|
42
|
+
if options[:condition]
|
43
|
+
condition_result = options[:condition].call(result)
|
44
|
+
return result if condition_result
|
45
|
+
else
|
46
|
+
return result if result
|
47
|
+
end
|
48
|
+
tries += 1
|
49
|
+
return result if max_tries == tries
|
50
|
+
sleep sleep_interval
|
51
|
+
rescue RescuableError => e
|
52
|
+
tries += 1
|
53
|
+
$stderr.puts "ERROR: Error making request - #{e.class} #{e.message} #{e.backtrace.find{|l| l.include?('pact_broker-client')}}, attempt #{tries} of #{max_tries}"
|
54
|
+
raise e if max_tries == tries
|
55
|
+
sleep sleep_interval
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def self.sleep seconds
|
61
|
+
Kernel.sleep seconds
|
34
62
|
end
|
35
63
|
end
|
36
64
|
end
|
@@ -9,7 +9,7 @@ module PactBroker
|
|
9
9
|
module Webhooks
|
10
10
|
class Create
|
11
11
|
|
12
|
-
WEBHOOKS_WITH_OPTIONAL_PACTICICPANTS_NOT_SUPPORTED = "
|
12
|
+
WEBHOOKS_WITH_OPTIONAL_PACTICICPANTS_NOT_SUPPORTED = "This version of the Pact Broker requires that both consumer and provider are specified for a webhook. Please upgrade your broker to >= 2.22.0 to create a webhook with optional consumer and provider."
|
13
13
|
|
14
14
|
attr_reader :params, :pact_broker_base_url, :basic_auth_options, :verbose
|
15
15
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'pact_broker/client/can_i_deploy'
|
2
|
+
require 'pact_broker/client/matrix/resource'
|
2
3
|
|
3
4
|
module PactBroker
|
4
5
|
module Client
|
@@ -8,8 +9,12 @@ module PactBroker
|
|
8
9
|
let(:matrix_options) { {} }
|
9
10
|
let(:pact_broker_client_options) { { foo: 'bar' } }
|
10
11
|
let(:matrix_client) { instance_double('PactBroker::Client::Matrix') }
|
11
|
-
let(:matrix) {
|
12
|
-
let(:
|
12
|
+
let(:matrix) { instance_double('Matrix::Resource', deployable?: true, reason: 'some reason', any_unknown?: any_unknown, supports_unknown_count?: supports_unknown_count) }
|
13
|
+
let(:any_unknown) { false }
|
14
|
+
let(:supports_unknown_count) { true }
|
15
|
+
let(:retry_while_unknown) { 0 }
|
16
|
+
let(:options) { { output: 'text', retry_while_unknown: retry_while_unknown, retry_interval: 5} }
|
17
|
+
|
13
18
|
|
14
19
|
before do
|
15
20
|
allow_any_instance_of(PactBroker::Client::PactBrokerClient).to receive(:matrix).and_return(matrix_client)
|
@@ -29,7 +34,7 @@ module PactBroker
|
|
29
34
|
subject
|
30
35
|
end
|
31
36
|
|
32
|
-
context "when
|
37
|
+
context "when the versions are deployable" do
|
33
38
|
it "returns a success response" do
|
34
39
|
expect(subject.success).to be true
|
35
40
|
end
|
@@ -44,8 +49,8 @@ module PactBroker
|
|
44
49
|
end
|
45
50
|
end
|
46
51
|
|
47
|
-
context "when
|
48
|
-
let(:matrix) {
|
52
|
+
context "when the versions are not deployable" do
|
53
|
+
let(:matrix) { instance_double('Matrix::Resource', deployable?: false, reason: 'some reason', any_unknown?: false) }
|
49
54
|
|
50
55
|
it "returns a failure response" do
|
51
56
|
expect(subject.success).to be false
|
@@ -60,6 +65,38 @@ module PactBroker
|
|
60
65
|
end
|
61
66
|
end
|
62
67
|
|
68
|
+
context "when retry_while_unknown is greater than 0" do
|
69
|
+
let(:retry_while_unknown) { 1 }
|
70
|
+
|
71
|
+
context "when any_unknown? is false" do
|
72
|
+
it "does not retry the request" do
|
73
|
+
expect(Retry).to_not receive(:until_truthy_or_max_times)
|
74
|
+
subject
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "when any_unknown? is true" do
|
79
|
+
let(:any_unknown) { true }
|
80
|
+
|
81
|
+
it "retries the request" do
|
82
|
+
expect(Retry).to receive(:until_truthy_or_max_times).with(hash_including(tries: 1, sleep: 5, sleep_first: true))
|
83
|
+
subject
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
context "when the matrix does not support the unknown count" do
|
88
|
+
let(:supports_unknown_count) { false }
|
89
|
+
|
90
|
+
it "returns a failure response" do
|
91
|
+
expect(subject.success).to be false
|
92
|
+
end
|
93
|
+
|
94
|
+
it "returns a failure message" do
|
95
|
+
expect(subject.message).to match /does not provide a count/
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
63
100
|
context "when a PactBroker::Client::Error is raised" do
|
64
101
|
before do
|
65
102
|
allow(matrix_client).to receive(:get).and_raise(PactBroker::Client::Error.new('error text'))
|
@@ -76,7 +113,7 @@ module PactBroker
|
|
76
113
|
|
77
114
|
context "when a StandardError is raised" do
|
78
115
|
before do
|
79
|
-
allow(Retry).to receive(:
|
116
|
+
allow(Retry).to receive(:while_error) { |&block| block.call }
|
80
117
|
allow($stderr).to receive(:puts)
|
81
118
|
allow(matrix_client).to receive(:get).and_raise(StandardError.new('error text'))
|
82
119
|
end
|
@@ -20,7 +20,9 @@ module PactBroker
|
|
20
20
|
{
|
21
21
|
broker_base_url: 'http://pact-broker',
|
22
22
|
output: 'table',
|
23
|
-
verbose: 'verbose'
|
23
|
+
verbose: 'verbose',
|
24
|
+
retry_while_unknown: 1,
|
25
|
+
retry_interval: 2
|
24
26
|
}
|
25
27
|
end
|
26
28
|
|
@@ -32,7 +34,7 @@ module PactBroker
|
|
32
34
|
end
|
33
35
|
|
34
36
|
it "invokes the CanIDeploy service" do
|
35
|
-
expect(CanIDeploy).to receive(:call).with('http://pact-broker', version_selectors, {to_tag: nil}, {output: 'table'}, {verbose: 'verbose'})
|
37
|
+
expect(CanIDeploy).to receive(:call).with('http://pact-broker', version_selectors, {to_tag: nil}, {output: 'table', retry_while_unknown: 1, retry_interval: 2}, {verbose: 'verbose'})
|
36
38
|
invoke_can_i_deploy
|
37
39
|
end
|
38
40
|
|
@@ -4,7 +4,7 @@ module PactBroker::Client
|
|
4
4
|
module Hal
|
5
5
|
describe HttpClient do
|
6
6
|
before do
|
7
|
-
allow(Retry).to receive(:
|
7
|
+
allow(Retry).to receive(:while_error) { |&block| block.call }
|
8
8
|
end
|
9
9
|
|
10
10
|
subject { HttpClient.new(username: 'foo', password: 'bar') }
|
@@ -43,7 +43,7 @@ module PactBroker::Client
|
|
43
43
|
|
44
44
|
|
45
45
|
it "retries on failure" do
|
46
|
-
expect(Retry).to receive(:
|
46
|
+
expect(Retry).to receive(:while_error)
|
47
47
|
do_get
|
48
48
|
end
|
49
49
|
|
@@ -74,8 +74,8 @@ module PactBroker::Client
|
|
74
74
|
expect(request).to have_been_made
|
75
75
|
end
|
76
76
|
|
77
|
-
it "calls Retry.
|
78
|
-
expect(Retry).to receive(:
|
77
|
+
it "calls Retry.while_error" do
|
78
|
+
expect(Retry).to receive(:while_error)
|
79
79
|
do_post
|
80
80
|
end
|
81
81
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'pact_broker/client/matrix/resource'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Client
|
5
|
+
class Matrix
|
6
|
+
describe Resource do
|
7
|
+
|
8
|
+
let(:matrix_hash) { JSON.parse(File.read('spec/support/matrix.json'), symbolize_names: true) }
|
9
|
+
|
10
|
+
subject { Resource.new(matrix_hash) }
|
11
|
+
|
12
|
+
describe "any_unknown?" do
|
13
|
+
context "when $summary.unknown is greater than 0" do
|
14
|
+
it "is true" do
|
15
|
+
expect(subject.any_unknown?).to be true
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
context "when $summary.unknown is 0" do
|
20
|
+
before do
|
21
|
+
matrix_hash[:summary][:unknown] = 0
|
22
|
+
end
|
23
|
+
|
24
|
+
it "is false" do
|
25
|
+
expect(subject.any_unknown?).to be false
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe "supports_unknown_count?" do
|
31
|
+
context "when $summary.unknown is present" do
|
32
|
+
it "is true" do
|
33
|
+
expect(subject.supports_unknown_count?).to be true
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context "when $summary.unknown is nil" do
|
38
|
+
before do
|
39
|
+
matrix_hash[:summary][:unknown] = nil
|
40
|
+
end
|
41
|
+
|
42
|
+
it "is false" do
|
43
|
+
expect(subject.supports_unknown_count?).to be false
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "when $summary.unknown is not an Integer" do
|
48
|
+
before do
|
49
|
+
matrix_hash[:summary][:unknown] = true
|
50
|
+
end
|
51
|
+
|
52
|
+
it "is false" do
|
53
|
+
expect(subject.supports_unknown_count?).to be false
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
context "when $summary.unknown is not present" do
|
58
|
+
before do
|
59
|
+
matrix_hash[:summary].delete(:unknown)
|
60
|
+
end
|
61
|
+
|
62
|
+
it "is false" do
|
63
|
+
expect(subject.supports_unknown_count?).to be false
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,119 @@
|
|
1
|
+
require 'pact_broker/client/retry'
|
2
|
+
|
3
|
+
module PactBroker
|
4
|
+
module Client
|
5
|
+
describe Retry do
|
6
|
+
describe ".until_truthy_or_max_times" do
|
7
|
+
before do
|
8
|
+
allow(service).to receive(:get_result).and_return(1, 2, 3)
|
9
|
+
allow(condition).to receive(:call).and_return(false, false, true)
|
10
|
+
allow(Retry).to receive(:sleep)
|
11
|
+
end
|
12
|
+
|
13
|
+
let(:service) { double('service') }
|
14
|
+
let(:condition) { double('condition') }
|
15
|
+
let(:times) { 4 }
|
16
|
+
let(:sleep_first) { nil }
|
17
|
+
|
18
|
+
subject do
|
19
|
+
Retry.until_truthy_or_max_times(condition: condition, times: times, sleep: 3, sleep_first: sleep_first) do
|
20
|
+
service.get_result
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "times is 0 (which it shouldn't be, but just to be sure...)" do
|
25
|
+
let(:times) { 0 }
|
26
|
+
|
27
|
+
it "only executes the block once" do
|
28
|
+
subject
|
29
|
+
expect(service).to have_received(:get_result).exactly(1).times
|
30
|
+
end
|
31
|
+
|
32
|
+
it "does not execute the condition" do
|
33
|
+
expect(condition).to_not receive(:call)
|
34
|
+
subject
|
35
|
+
end
|
36
|
+
|
37
|
+
it "returns the result" do
|
38
|
+
expect(subject).to eq 1
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context "times is 1" do
|
43
|
+
let(:times) { 1 }
|
44
|
+
|
45
|
+
it "only executes the block once" do
|
46
|
+
subject
|
47
|
+
expect(service).to have_received(:get_result).exactly(1).times
|
48
|
+
end
|
49
|
+
|
50
|
+
it "does not execute the condition" do
|
51
|
+
expect(condition).to_not receive(:call)
|
52
|
+
subject
|
53
|
+
end
|
54
|
+
|
55
|
+
it "returns the result" do
|
56
|
+
expect(subject).to eq 1
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
context "when the condition becomes true before the max tries" do
|
61
|
+
it "stops retrying when the condition becomes true" do
|
62
|
+
subject
|
63
|
+
expect(condition).to have_received(:call).exactly(3).times
|
64
|
+
expect(service).to have_received(:get_result).exactly(3).times
|
65
|
+
end
|
66
|
+
|
67
|
+
it "returns the most recent result" do
|
68
|
+
expect(subject).to eq 3
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "when the max tries is reached before the condition becomes true" do
|
73
|
+
let(:times) { 2 }
|
74
|
+
|
75
|
+
it "stops retrying once the max tries is reached" do
|
76
|
+
subject
|
77
|
+
expect(condition).to have_received(:call).exactly(2).times
|
78
|
+
expect(service).to have_received(:get_result).exactly(2).times
|
79
|
+
end
|
80
|
+
|
81
|
+
it "returns the most recent result" do
|
82
|
+
expect(subject).to eq 2
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
context "when an error is raised each time" do
|
87
|
+
TestError = Class.new(StandardError)
|
88
|
+
|
89
|
+
before do
|
90
|
+
allow(service).to receive(:get_result).and_raise(TestError)
|
91
|
+
allow($stderr).to receive(:puts)
|
92
|
+
end
|
93
|
+
|
94
|
+
it "stops retrying once the max tries is reached" do
|
95
|
+
begin
|
96
|
+
subject
|
97
|
+
rescue TestError
|
98
|
+
end
|
99
|
+
expect(service).to have_received(:get_result).exactly(4).times
|
100
|
+
end
|
101
|
+
|
102
|
+
it "raises the error" do
|
103
|
+
expect { subject }.to raise_error TestError
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
context "when sleep_first is true" do
|
108
|
+
let(:sleep_first) { true }
|
109
|
+
|
110
|
+
it "sleeps before it executes the block" do
|
111
|
+
expect(Retry).to receive(:sleep).ordered
|
112
|
+
expect(service).to receive(:get_result).ordered
|
113
|
+
subject
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -39,7 +39,7 @@ module PactBroker
|
|
39
39
|
context "when a 405 is returned from the webhook creation request" do
|
40
40
|
|
41
41
|
it "raises an error with a message to upgrade the Pact Broker" do
|
42
|
-
expect { subject }.to raise_error PactBroker::Client::Error, /
|
42
|
+
expect { subject }.to raise_error PactBroker::Client::Error, /This version of the Pact Broker/
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
@@ -202,7 +202,8 @@
|
|
202
202
|
"body": {
|
203
203
|
"summary": {
|
204
204
|
"deployable": true,
|
205
|
-
"reason": "some text"
|
205
|
+
"reason": "some text",
|
206
|
+
"unknown": 1
|
206
207
|
},
|
207
208
|
"matrix": [
|
208
209
|
{
|
@@ -251,7 +252,8 @@
|
|
251
252
|
"body": {
|
252
253
|
"summary": {
|
253
254
|
"deployable": true,
|
254
|
-
"reason": "some text"
|
255
|
+
"reason": "some text",
|
256
|
+
"unknown": 1
|
255
257
|
},
|
256
258
|
"matrix": [
|
257
259
|
{
|
@@ -300,7 +302,8 @@
|
|
300
302
|
"body": {
|
301
303
|
"summary": {
|
302
304
|
"deployable": true,
|
303
|
-
"reason": "some text"
|
305
|
+
"reason": "some text",
|
306
|
+
"unknown": 1
|
304
307
|
},
|
305
308
|
"matrix": [
|
306
309
|
{
|
@@ -473,7 +476,8 @@
|
|
473
476
|
"body": {
|
474
477
|
"summary": {
|
475
478
|
"deployable": true,
|
476
|
-
"reason": "some text"
|
479
|
+
"reason": "some text",
|
480
|
+
"unknown": 1
|
477
481
|
},
|
478
482
|
"matrix": [
|
479
483
|
{
|
@@ -522,7 +526,8 @@
|
|
522
526
|
"body": {
|
523
527
|
"summary": {
|
524
528
|
"deployable": true,
|
525
|
-
"reason": "some text"
|
529
|
+
"reason": "some text",
|
530
|
+
"unknown": 1
|
526
531
|
},
|
527
532
|
"matrix": [
|
528
533
|
{
|
@@ -571,7 +576,8 @@
|
|
571
576
|
"body": {
|
572
577
|
"summary": {
|
573
578
|
"deployable": true,
|
574
|
-
"reason": "some text"
|
579
|
+
"reason": "some text",
|
580
|
+
"unknown": 1
|
575
581
|
},
|
576
582
|
"matrix": [
|
577
583
|
{
|
data/spec/support/matrix.json
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pact_broker-client
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Beth Skurrie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-07-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -214,6 +214,7 @@ files:
|
|
214
214
|
- lib/pact_broker/client/matrix.rb
|
215
215
|
- lib/pact_broker/client/matrix/formatter.rb
|
216
216
|
- lib/pact_broker/client/matrix/json_formatter.rb
|
217
|
+
- lib/pact_broker/client/matrix/resource.rb
|
217
218
|
- lib/pact_broker/client/matrix/text_formatter.rb
|
218
219
|
- lib/pact_broker/client/merge_pacts.rb
|
219
220
|
- lib/pact_broker/client/pact_broker_client.rb
|
@@ -249,12 +250,14 @@ files:
|
|
249
250
|
- spec/lib/pact_broker/client/hal/entity_spec.rb
|
250
251
|
- spec/lib/pact_broker/client/hal/http_client_spec.rb
|
251
252
|
- spec/lib/pact_broker/client/hal/link_spec.rb
|
253
|
+
- spec/lib/pact_broker/client/matrix/resource_spec.rb
|
252
254
|
- spec/lib/pact_broker/client/matrix/text_formatter_spec.rb
|
253
255
|
- spec/lib/pact_broker/client/matrix_spec.rb
|
254
256
|
- spec/lib/pact_broker/client/merge_pacts_spec.rb
|
255
257
|
- spec/lib/pact_broker/client/pact_broker_client_spec.rb
|
256
258
|
- spec/lib/pact_broker/client/pacticipants_spec.rb
|
257
259
|
- spec/lib/pact_broker/client/publish_pacts_spec.rb
|
260
|
+
- spec/lib/pact_broker/client/retry_spec.rb
|
258
261
|
- spec/lib/pact_broker/client/tasks/publication_task_spec.rb
|
259
262
|
- spec/lib/pact_broker/client/versions/describe_spec.rb
|
260
263
|
- spec/lib/pact_broker/client/versions_spec.rb
|
@@ -320,12 +323,14 @@ test_files:
|
|
320
323
|
- spec/lib/pact_broker/client/hal/entity_spec.rb
|
321
324
|
- spec/lib/pact_broker/client/hal/http_client_spec.rb
|
322
325
|
- spec/lib/pact_broker/client/hal/link_spec.rb
|
326
|
+
- spec/lib/pact_broker/client/matrix/resource_spec.rb
|
323
327
|
- spec/lib/pact_broker/client/matrix/text_formatter_spec.rb
|
324
328
|
- spec/lib/pact_broker/client/matrix_spec.rb
|
325
329
|
- spec/lib/pact_broker/client/merge_pacts_spec.rb
|
326
330
|
- spec/lib/pact_broker/client/pact_broker_client_spec.rb
|
327
331
|
- spec/lib/pact_broker/client/pacticipants_spec.rb
|
328
332
|
- spec/lib/pact_broker/client/publish_pacts_spec.rb
|
333
|
+
- spec/lib/pact_broker/client/retry_spec.rb
|
329
334
|
- spec/lib/pact_broker/client/tasks/publication_task_spec.rb
|
330
335
|
- spec/lib/pact_broker/client/versions/describe_spec.rb
|
331
336
|
- spec/lib/pact_broker/client/versions_spec.rb
|