pact_broker 2.91.0 → 2.92.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c1634d0a3519aae8c805e0c8f13e2e132e86b623c92e019d37285b98ecd7574d
4
- data.tar.gz: 2652bd80a29b04e222bad6ffb0513c95618f16185feb98cffc9c7bd283858b79
3
+ metadata.gz: 24079bee3bfb14bfb86f5c9bc12d6f1110a19eb3e4098b8a1543d93a309a562c
4
+ data.tar.gz: 59ef52df7edeb89738512914f8dbaca0a500d27ce84700e2c5e3bd06f3ce1421
5
5
  SHA512:
6
- metadata.gz: 8e3bc701ea3fe67d6ffe24330faf61b5def23d7293e2c59bfa1d4c5b8874dd3ef8b622f8adbef202bdfd784804f67a5c9efd39c79c1bba54bb52a8fe2abc7661
7
- data.tar.gz: ab7a4c68f71251bbf36e3f58bb18267b28cc1bd72df5f3959caedd8fe1b776439b6ba25fd972f2a819ba5f0872d9861d22284da501a5d921f255aea368bedfab
6
+ metadata.gz: 954b6742ba7f76c9af9153c7ba05205e51993df3b97eba56219cbb7a5027df3808cabcb3a4611d72bb2bff7376a2bf3e5b7876eadccc0bda8f23e0affdaad28f
7
+ data.tar.gz: 8485529fb6980f2925892871d382376d0860b9c7ee9e72afeb3235a99dff18cb2afb08993666095fe6b084373ed79ce5396a16a22a3c70ea5a656246a0335310
data/CHANGELOG.md CHANGED
@@ -1,3 +1,18 @@
1
+ <a name="v2.92.0"></a>
2
+ ### v2.92.0 (2021-11-27)
3
+
4
+ #### Features
5
+
6
+ * allow SQL caller logging to be enabled ([861d8f21](/../../commit/861d8f21))
7
+ * use a separate table to track the successful verifications of pact versions for each provider version tag (feature toggled with "new_wip_calculation") ([df0acfa3](/../../commit/df0acfa3))
8
+
9
+ #### Bug Fixes
10
+
11
+ * **cleanup**
12
+ * Improve delete orphans SQL query (#527) ([853354ea](/../../commit/853354ea))
13
+
14
+ * cast PACT_BROKER_DATABASE_CONNECTION_VALIDATION_TIMEOUT to an integer ([8816c61f](/../../commit/8816c61f))
15
+
1
16
  <a name="v2.91.0"></a>
2
17
  ### v2.91.0 (2021-11-15)
3
18
 
@@ -8,6 +8,7 @@ Sequel.migration do
8
8
 
9
9
  down do
10
10
  alter_table(:triggered_webhooks) do
11
+ drop_index([:uuid], name: "triggered_webhooks_uuid", unique: true)
11
12
  drop_column(:uuid)
12
13
  end
13
14
  end
@@ -0,0 +1,23 @@
1
+ Sequel.migration do
2
+ up do
3
+ create_table(:pact_version_provider_tag_successful_verifications, charset: "utf8") do
4
+ primary_key :id
5
+ foreign_key :pact_version_id, :pact_versions, null: false, on_delete: :cascade, foreign_key_constraint_name: "pact_version_provider_tag_successful_verifications_pv_id_fk"
6
+ String :provider_version_tag_name, null: false
7
+ Boolean :wip, null: false
8
+ Integer :verification_id
9
+ DateTime :execution_date, null: false
10
+ index([:pact_version_id, :provider_version_tag_name, :wip], unique: true, name: "pact_version_provider_tag_verifications_pv_pvtn_wip_unique")
11
+ # The implication of the on_delete: :set_null for verification_id is
12
+ # that even if the verification result is deleted from the broker,
13
+ # the wip/pending status stays the same.
14
+ # We may or may not want this. Will have to wait and see.
15
+ # Have made the foreign key a separate declaration so it can more easily be remade.
16
+ foreign_key([:verification_id], :verifications, on_delete: :set_null, name: "pact_version_provider_tag_successful_verifications_v_id_fk")
17
+ end
18
+ end
19
+
20
+ down do
21
+ drop_table(:pact_version_provider_tag_successful_verifications)
22
+ end
23
+ end
@@ -0,0 +1,11 @@
1
+ require "pact_broker/db/data_migrations/migrate_pact_version_provider_tag_successful_verifications"
2
+
3
+ Sequel.migration do
4
+ up do
5
+ PactBroker::DB::DataMigrations::MigratePactVersionProviderTagSuccessfulVerifications.call(self)
6
+ end
7
+
8
+ down do
9
+
10
+ end
11
+ end
@@ -40,11 +40,11 @@ module PactBroker
40
40
  end
41
41
 
42
42
  def policy_name
43
- :'versions::version'
43
+ :'versions::deployed_version'
44
44
  end
45
45
 
46
46
  def policy_record
47
- version
47
+ environment
48
48
  end
49
49
 
50
50
  private
@@ -45,7 +45,11 @@ module PactBroker
45
45
  end
46
46
 
47
47
  def policy_name
48
- :'versions::versions'
48
+ :'versions::released_version'
49
+ end
50
+
51
+ def policy_record
52
+ environment
49
53
  end
50
54
 
51
55
  def finish_request
@@ -18,6 +18,7 @@ module PactBroker
18
18
  database_sslmode: nil,
19
19
  sql_log_level: :debug,
20
20
  sql_log_warn_duration: 5,
21
+ sql_enable_caller_logging: false,
21
22
  database_max_connections: nil,
22
23
  database_pool_timeout: 5,
23
24
  database_connect_max_retries: 0,
@@ -36,6 +37,7 @@ module PactBroker
36
37
  encoding: "utf8",
37
38
  sslmode: database_sslmode,
38
39
  sql_log_level: sql_log_level,
40
+ enable_caller_logging: sql_enable_caller_logging,
39
41
  log_warn_duration: sql_log_warn_duration,
40
42
  max_connections: database_max_connections,
41
43
  pool_timeout: database_pool_timeout,
@@ -65,6 +67,10 @@ module PactBroker
65
67
  super(metrics_sql_statement_timeout&.to_i)
66
68
  end
67
69
 
70
+ def database_connection_validation_timeout= database_connection_validation_timeout
71
+ super(database_connection_validation_timeout&.to_i)
72
+ end
73
+
68
74
  def postgres?
69
75
  database_credentials[:adapter] == "postgres"
70
76
  end
@@ -92,8 +92,23 @@ module PactBroker
92
92
  end
93
93
 
94
94
  def delete_orphan_pact_versions
95
- referenced_pact_version_ids = db[:pact_publications].select(:pact_version_id).union(db[:verifications].select(:pact_version_id))
96
- db[:pact_versions].where(id: referenced_pact_version_ids).invert.delete
95
+ db[:pact_versions].where(id: orphan_pact_versions).delete
96
+ rescue Sequel::DatabaseError => e
97
+ raise unless e.cause.class.name == "Mysql2::Error"
98
+
99
+ ids = orphan_pact_versions.map { |row| row[:id] }
100
+ db[:pact_versions].where(id: ids).delete
101
+ end
102
+
103
+ def orphan_pact_versions
104
+ db[:pact_versions]
105
+ .left_join(:pact_publications, pact_version_id: :id)
106
+ .left_join(:verifications, pact_version_id: :id)
107
+ .select(Sequel[:pact_versions][:id])
108
+ .where(
109
+ Sequel[:pact_publications][:id] => nil,
110
+ Sequel[:verifications][:id] => nil
111
+ )
97
112
  end
98
113
 
99
114
  def version_info(version)
@@ -0,0 +1,38 @@
1
+ require "pact_broker/db/data_migrations/helpers"
2
+
3
+ module PactBroker
4
+ module DB
5
+ module DataMigrations
6
+ class MigratePactVersionProviderTagSuccessfulVerifications
7
+ extend Helpers
8
+
9
+ def self.call(connection)
10
+ successful_verifications_join = {
11
+ Sequel[:sv][:pact_version_id] => Sequel[:verifications][:pact_version_id],
12
+ Sequel[:sv][:provider_version_tag_name] => Sequel[:tags][:name],
13
+ Sequel[:sv][:wip] => Sequel[:verifications][:wip]
14
+ }
15
+
16
+ missing_verifications = connection
17
+ .select(
18
+ Sequel[:verifications][:pact_version_id],
19
+ Sequel[:tags][:name],
20
+ Sequel[:verifications][:wip],
21
+ Sequel[:verifications][:id],
22
+ Sequel[:verifications][:execution_date]
23
+ )
24
+ .order(Sequel[:verifications][:execution_date], Sequel[:verifications][:id])
25
+ .from(:verifications)
26
+ .join(:tags, { Sequel[:verifications][:provider_version_id] => Sequel[:tags][:version_id] })
27
+ .left_outer_join(:pact_version_provider_tag_successful_verifications, successful_verifications_join, { table_alias: :sv })
28
+ .where(Sequel[:sv][:pact_version_id] => nil)
29
+ .where(Sequel[:verifications][:success] => true)
30
+
31
+ connection[:pact_version_provider_tag_successful_verifications]
32
+ .insert_ignore
33
+ .insert([:pact_version_id, :provider_version_tag_name, :wip, :verification_id, :execution_date], missing_verifications)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -28,6 +28,7 @@ module PactBroker
28
28
  DataMigrations::SetExtraColumnsForTags.call(database_connection)
29
29
  DataMigrations::CreateBranches.call(database_connection)
30
30
  DataMigrations::MigrateIntegrations.call(database_connection)
31
+ DataMigrations::MigratePactVersionProviderTagSuccessfulVerifications.call(database_connection)
31
32
  end
32
33
  end
33
34
  end
@@ -88,6 +88,15 @@ module PactBroker
88
88
  !!currently_deployed_version_id
89
89
  end
90
90
 
91
+ # target has been renamed to applicationInstance in the API.
92
+ def application_instance
93
+ target
94
+ end
95
+
96
+ def application_instance= application_instance
97
+ self.target = application_instance
98
+ end
99
+
91
100
  def version_number
92
101
  version.number
93
102
  end
@@ -100,7 +109,6 @@ module PactBroker
100
109
  self.class.where(id: id).record_undeployed
101
110
  self.refresh
102
111
  end
103
-
104
112
  end
105
113
  end
106
114
  end
@@ -9,7 +9,8 @@ module PactBroker
9
9
  sequel_config = config.dup
10
10
  max_retries = sequel_config.delete(:connect_max_retries) || 0
11
11
  connection_validation_timeout = config.delete(:connection_validation_timeout)
12
- configure_logger(sequel_config)
12
+ enable_caller_logging = config.delete(:enable_caller_logging)
13
+ configure_logger(sequel_config, logger)
13
14
  create_sqlite_database_dir(config)
14
15
 
15
16
  connection = with_retries(max_retries, logger) do
@@ -18,7 +19,7 @@ module PactBroker
18
19
 
19
20
  logger&.info "Connected to database #{sequel_config[:database]}"
20
21
 
21
- configure_connection(connection, connection_validation_timeout)
22
+ configure_connection(connection, connection_validation_timeout, enable_caller_logging)
22
23
  end
23
24
 
24
25
  private_class_method def self.with_retries(max_retries, logger)
@@ -46,7 +47,7 @@ module PactBroker
46
47
  end
47
48
  end
48
49
 
49
- private_class_method def self.configure_logger(sequel_config)
50
+ private_class_method def self.configure_logger(sequel_config, logger)
50
51
  if sequel_config[:sql_log_level] == :none
51
52
  sequel_config.delete(:sql_log_level)
52
53
  elsif logger
@@ -72,8 +73,9 @@ module PactBroker
72
73
  # when databases are restarted and connections are killed. This has a performance
73
74
  # penalty, so consider increasing this timeout if building a frequently accessed service.
74
75
 
75
- private_class_method def self.configure_connection(connection, connection_validation_timeout)
76
+ private_class_method def self.configure_connection(connection, connection_validation_timeout, enable_caller_logging)
76
77
  connection.extension(:connection_validator)
78
+ connection.extension(:caller_logging) if enable_caller_logging
77
79
  connection.pool.connection_validation_timeout = connection_validation_timeout if connection_validation_timeout
78
80
  connection
79
81
  end
@@ -140,65 +140,62 @@ module PactBroker
140
140
  end
141
141
 
142
142
  # The latest pact publication for each tag
143
+ # This uses the old logic of "the latest pact for a version that has a tag" (which always returns a pact)
144
+ # rather than "the pact for the latest version with a tag"
145
+ # Need to see about updating this.
143
146
  def latest_by_consumer_tag
144
147
  tags_join = {
145
- Sequel[:pact_publications][:consumer_version_id] => Sequel[:tags][:version_id]
148
+ Sequel[:pact_publications][:consumer_version_id] => Sequel[:tags][:version_id],
146
149
  }
147
150
 
148
- base_query = join(:tags, tags_join)
151
+ max_orders = join(:tags, tags_join)
152
+ .select_group(:consumer_id, :provider_id, Sequel[:tags][:name].as(:tag_name))
153
+ .select_append{ max(consumer_version_order).as(latest_consumer_version_order) }
154
+
155
+ max_join = {
156
+ Sequel[:max_orders][:consumer_id] => Sequel[:pact_publications][:consumer_id],
157
+ Sequel[:max_orders][:provider_id] => Sequel[:pact_publications][:provider_id],
158
+ Sequel[:max_orders][:latest_consumer_version_order] => Sequel[:pact_publications][:consumer_version_order]
159
+ }
149
160
 
161
+ base_query = self
150
162
  if no_columns_selected?
151
- base_query = base_query.select_all_qualified.select_append(Sequel[:tags][:name].as(:tag_name))
163
+ base_query = base_query.select_all_qualified.select_append(Sequel[:max_orders][:tag_name])
152
164
  end
153
165
 
154
- joined_query = base_query.select(
155
- Sequel[:pact_publications][:consumer_id],
156
- Sequel[:tags][:version_order],
157
- Sequel[:tags][:name].as(:tag_name)
158
- )
159
-
160
- self_join = {
161
- Sequel[:pact_publications][:consumer_id] => Sequel[:pp2][:consumer_id],
162
- Sequel[:tags][:name] => Sequel[:pp2][:tag_name]
163
- }
164
- base_query.left_join(joined_query, self_join, { table_alias: :pp2 } ) do
165
- Sequel[:pp2][:version_order] > Sequel[:tags][:version_order]
166
- end
167
- .where(Sequel[:pp2][:version_order] => nil)
168
- .remove_overridden_revisions_from_complete_query
166
+ base_query
167
+ .join(max_orders, max_join, { table_alias: :max_orders })
168
+ .remove_overridden_revisions_from_complete_query
169
169
  end
170
170
 
171
+ # This uses the old logic of "the latest pact for a version that has a tag" (which always returns a pact)
172
+ # rather than "the pact for the latest version with a tag"
173
+ # Need to see about updating this.
171
174
  def latest_for_consumer_tag(tag_name)
172
175
  tags_join = {
173
176
  Sequel[:pact_publications][:consumer_version_id] => Sequel[:tags][:version_id],
174
177
  Sequel[:tags][:name] => tag_name
175
178
  }
176
179
 
177
- base_query = self
178
- if no_columns_selected?
179
- base_query = base_query.select_all_qualified.select_append(Sequel[:tags][:name].as(:tag_name))
180
- end
181
-
182
- base_query = base_query
183
- .join(:tags, tags_join)
184
- .where(Sequel[:tags][:name] => tag_name)
180
+ max_orders = join(:tags, tags_join)
181
+ .select_group(:consumer_id, :provider_id, Sequel[:tags][:name].as(:tag_name))
182
+ .select_append{ max(consumer_version_order).as(latest_consumer_version_order) }
185
183
 
186
- joined_query = base_query.select(
187
- Sequel[:pact_publications][:consumer_id],
188
- Sequel[:tags][:name].as(:tag_name),
189
- Sequel[:tags][:version_order]
190
- )
191
184
 
192
- self_join = {
193
- Sequel[:pact_publications][:consumer_id] => Sequel[:pp2][:consumer_id],
194
- Sequel[:tags][:name] => Sequel[:pp2][:tag_name]
185
+ max_join = {
186
+ Sequel[:max_orders][:consumer_id] => Sequel[:pact_publications][:consumer_id],
187
+ Sequel[:max_orders][:provider_id] => Sequel[:pact_publications][:provider_id],
188
+ Sequel[:max_orders][:latest_consumer_version_order] => Sequel[:pact_publications][:consumer_version_order]
195
189
  }
196
190
 
197
- base_query.left_join(joined_query, self_join, { table_alias: :pp2 } ) do
198
- Sequel[:pp2][:version_order] > Sequel[:tags][:version_order]
191
+ base_query = self
192
+ if no_columns_selected?
193
+ base_query = base_query.select_all_qualified.select_append(Sequel[:max_orders][:tag_name])
199
194
  end
200
- .where(Sequel[:pp2][:version_order] => nil)
201
- .remove_overridden_revisions_from_complete_query
195
+
196
+ base_query
197
+ .join(max_orders, max_join, { table_alias: :max_orders })
198
+ .remove_overridden_revisions_from_complete_query
202
199
  end
203
200
 
204
201
  # The pacts for the latest versions with the specified tag (new logic)
@@ -33,6 +33,8 @@ module PactBroker
33
33
  end
34
34
 
35
35
  def successfully_verified_by_provider_tag_when_not_wip(provider_id, provider_tag)
36
+ return new_successfully_verified_by_provider_tag_when_not_wip(provider_id, provider_tag) if PactBroker.feature_enabled?(:new_wip_calculation)
37
+
36
38
  from_self(alias: :pp)
37
39
  .select(Sequel[:pp].*)
38
40
  .where(Sequel[:pp][:provider_id] => provider_id)
@@ -41,7 +43,23 @@ module PactBroker
41
43
  .distinct
42
44
  end
43
45
 
46
+ def new_successfully_verified_by_provider_tag_when_not_wip(_provider_id, provider_tag)
47
+ pact_version_provider_tag_verifications_join = {
48
+ Sequel[:sv][:pact_version_id] => Sequel[:pp][:pact_version_id],
49
+ Sequel[:sv][:provider_version_tag_name] => provider_tag,
50
+ Sequel[:sv][:wip] => false
51
+ }
52
+
53
+ from_self(alias: :pp)
54
+ .select(Sequel[:pp].*)
55
+ .join(:pact_version_provider_tag_successful_verifications, pact_version_provider_tag_verifications_join, { table_alias: :sv })
56
+ .distinct
57
+
58
+ end
59
+
44
60
  def successfully_verified_by_provider_another_tag_before_this_tag_first_created(provider_id, provider_tag)
61
+ return new_successfully_verified_by_provider_another_tag_before_this_tag_first_created(provider_id, provider_tag) if PactBroker.feature_enabled?(:new_wip_calculation)
62
+
45
63
  first_tag_with_name = PactBroker::Domain::Tag.where(pacticipant_id: provider_id, name: provider_tag).order(:created_at).first
46
64
  from_self(alias: :pp)
47
65
  .select(Sequel[:pp].*)
@@ -54,6 +72,32 @@ module PactBroker
54
72
  .distinct
55
73
  end
56
74
 
75
+ def new_successfully_verified_by_provider_another_tag_before_this_tag_first_created(provider_id, provider_tag)
76
+ first_tag_with_name = PactBroker::Domain::Tag.where(pacticipant_id: provider_id, name: provider_tag).order(:created_at).first
77
+
78
+ pact_version_provider_tag_verifications_join = {
79
+ Sequel[:sv][:pact_version_id] => Sequel[:pp][:pact_version_id],
80
+ Sequel[:sv][:wip] => false
81
+ }
82
+
83
+ created_at_criteria = if first_tag_with_name
84
+ Sequel.lit("sv.execution_date < ?", first_tag_with_name.created_at)
85
+ else
86
+ Sequel.lit("1 = 1")
87
+ end
88
+
89
+ from_self(alias: :pp)
90
+ .select(Sequel[:pp].*)
91
+ .where(Sequel[:pp][:provider_id] => provider_id)
92
+ .join(:pact_version_provider_tag_successful_verifications, pact_version_provider_tag_verifications_join, { table_alias: :sv }) do
93
+ Sequel.&(
94
+ Sequel.lit("sv.provider_version_tag_name NOT IN (?)", provider_tag),
95
+ created_at_criteria
96
+ )
97
+ end
98
+ .distinct
99
+ end
100
+
57
101
  protected
58
102
 
59
103
  def verified_before_date(date)
@@ -273,6 +273,7 @@ module PactBroker
273
273
  "eventName" => "${pactbroker.eventName}",
274
274
  "consumerVersionNumber" => "${pactbroker.consumerVersionNumber}",
275
275
  "consumerVersionTags" => "${pactbroker.consumerVersionTags}",
276
+ "consumerVersionBranch" => "${pactbroker.consumerVersionBranch}",
276
277
  "githubVerificationStatus" => "${pactbroker.githubVerificationStatus}",
277
278
  "providerVersionNumber" => "${pactbroker.providerVersionNumber}",
278
279
  "providerVersionTags" => "${pactbroker.providerVersionTags}",
@@ -31,6 +31,8 @@ require "pact_broker/deployments/deployed_version_service"
31
31
  require "pact_broker/deployments/released_version_service"
32
32
  require "pact_broker/versions/branch_version_repository"
33
33
  require "pact_broker/integrations/repository"
34
+ require "pact_broker/contracts/service"
35
+
34
36
  require "ostruct"
35
37
 
36
38
  module PactBroker
@@ -219,6 +221,27 @@ module PactBroker
219
221
  self
220
222
  end
221
223
 
224
+ def publish_pact(consumer_name:, provider_name:, consumer_version_number: , tags: nil, branch: nil, build_url: nil, json_content: nil)
225
+ json_content = json_content || random_json_content(consumer_name, provider_name)
226
+ contracts = [
227
+ PactBroker::Contracts::ContractToPublish.from_hash(consumer_name: consumer_name, provider_name: provider_name, decoded_content: json_content, content_type: "application/json", specification: "pact")
228
+ ]
229
+ contracts_to_publish = PactBroker::Contracts::ContractsToPublish.from_hash(
230
+ pacticipant_name: consumer_name,
231
+ pacticipant_version_number: consumer_version_number,
232
+ tags: tags,
233
+ branch: branch,
234
+ build_url: build_url,
235
+ contracts: contracts
236
+ )
237
+ PactBroker::Contracts::Service.publish(contracts_to_publish, base_url: "http://example.org")
238
+ @consumer = find_pacticipant(consumer_name)
239
+ @consumer_version = find_version(consumer_name, consumer_version_number)
240
+ @provider = find_pacticipant(provider_name)
241
+ @pact = PactBroker::Pacts::PactPublication.last.to_domain
242
+ self
243
+ end
244
+
222
245
  def create_pact params = {}
223
246
  params.delete(:comment)
224
247
  json_content = params[:json_content] || default_json_content
@@ -363,6 +386,7 @@ module PactBroker
363
386
  end
364
387
 
365
388
  def create_verification parameters = {}
389
+ # This should use the verification service. what a mess
366
390
  parameters.delete(:comment)
367
391
  branch = parameters.delete(:branch)
368
392
  tag_names = [parameters.delete(:tag_names), parameters.delete(:tag_name)].flatten.compact
@@ -373,20 +397,23 @@ module PactBroker
373
397
  parameters.delete(:provider_version)
374
398
  verification = PactBroker::Domain::Verification.new(parameters)
375
399
  pact_version = PactBroker::Pacts::Repository.new.find_pact_version(@consumer, @provider, pact.pact_version_sha)
376
- @verification = PactBroker::Verifications::Repository.new.create(verification, provider_version_number, pact_version)
377
- @provider_version = PactBroker::Domain::Version.where(pacticipant_id: @provider.id, number: provider_version_number).single_record
400
+ @provider_version = version_repository.find_by_pacticipant_id_and_number_or_create(provider.id, provider_version_number)
378
401
  PactBroker::Versions::BranchVersionRepository.new.add_branch(@provider_version, branch) if branch
379
402
 
380
- set_created_at_if_set(parameters[:created_at], :verifications, id: @verification.id)
381
- set_created_at_if_set(parameters[:created_at], :versions, id: @provider_version.id)
382
- set_created_at_if_set(parameters[:created_at], :latest_verification_id_for_pact_version_and_provider_version, pact_version_id: pact_version_id, provider_version_id: @provider_version.id)
383
-
384
403
  if tag_names.any?
385
404
  tag_names.each do | tag_name |
386
- PactBroker::Domain::Tag.new(name: tag_name, version: @provider_version).insert_ignore
405
+ PactBroker::Domain::Tag.new(name: tag_name, version: @provider_version, version_order: @provider_version.order).insert_ignore
387
406
  set_created_at_if_set(parameters[:created_at], :tags, version_id: @provider_version.id, name: tag_name)
388
407
  end
389
408
  end
409
+
410
+ @verification = PactBroker::Verifications::Repository.new.create(verification, provider_version_number, pact_version)
411
+
412
+ set_created_at_if_set(parameters[:created_at], :verifications, id: @verification.id)
413
+ set_created_at_if_set(parameters[:created_at], :versions, id: @provider_version.id)
414
+ set_created_at_if_set(parameters[:created_at], :latest_verification_id_for_pact_version_and_provider_version, pact_version_id: pact_version_id, provider_version_id: @provider_version.id)
415
+ set_created_at_if_set(parameters[:created_at], :pact_version_provider_tag_successful_verifications, { verification_id: @verification.id }, :execution_date)
416
+
390
417
  self
391
418
  end
392
419
 
@@ -594,10 +621,10 @@ module PactBroker
594
621
  PactBroker::Pacts::Content.from_json(json_content).with_ids(false).to_json
595
622
  end
596
623
 
597
- def set_created_at_if_set created_at, table_name, selector
624
+ def set_created_at_if_set created_at, table_name, selector, date_column_name = :created_at
598
625
  date_to_set = created_at || @now
599
626
  if date_to_set
600
- Sequel::Model.db[table_name].where(selector).update(created_at: date_to_set)
627
+ Sequel::Model.db[table_name].where(selector).update(date_column_name => date_to_set)
601
628
  if Sequel::Model.db.schema(table_name).any?{ |col| col.first == :updated_at }
602
629
  Sequel::Model.db[table_name].where(selector.keys.first => selector.values.first).update(updated_at: date_to_set)
603
630
  end
@@ -0,0 +1,11 @@
1
+ require "pact_broker/domain/verification"
2
+
3
+ # Represents a non WIP, successful verification for a provider version with a tag.
4
+
5
+ module PactBroker
6
+ module Verifications
7
+ class PactVersionProviderTagSuccessfulVerification < Sequel::Model
8
+ plugin :insert_ignore, identifying_columns: [:pact_version_id, :provider_version_tag_name, :wip]
9
+ end
10
+ end
11
+ end
@@ -2,6 +2,7 @@ require "sequel"
2
2
  require "pact_broker/domain/verification"
3
3
  require "pact_broker/verifications/sequence"
4
4
  require "pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version"
5
+ require "pact_broker/verifications/pact_version_provider_tag_successful_verification"
5
6
 
6
7
  module PactBroker
7
8
  module Verifications
@@ -27,6 +28,7 @@ module PactBroker
27
28
  verification.tag_names = version.tag_names # TODO pass this in from contracts service
28
29
  verification.save
29
30
  update_latest_verification_id(verification)
31
+ update_pact_version_provider_tag_verifications(verification, version.tag_names)
30
32
  verification
31
33
  end
32
34
 
@@ -46,6 +48,20 @@ module PactBroker
46
48
  LatestVerificationIdForPactVersionAndProviderVersion.new(params).upsert
47
49
  end
48
50
 
51
+ def update_pact_version_provider_tag_verifications(verification, tag_names)
52
+ if verification.success
53
+ tag_names&.each do | tag_name |
54
+ PactVersionProviderTagSuccessfulVerification.new(
55
+ pact_version_id: verification.pact_version_id,
56
+ provider_version_tag_name: tag_name,
57
+ wip: verification.wip,
58
+ verification_id: verification.id,
59
+ execution_date: verification.execution_date
60
+ ).insert_ignore
61
+ end
62
+ end
63
+ end
64
+
49
65
  def find consumer_name, provider_name, pact_version_sha, verification_number
50
66
  PactBroker::Domain::Verification
51
67
  .select_all_qualified
@@ -1,3 +1,3 @@
1
1
  module PactBroker
2
- VERSION = "2.91.0"
2
+ VERSION = "2.92.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pact_broker
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.91.0
4
+ version: 2.92.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Bethany Skurrie
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-11-15 00:00:00.000000000 Z
13
+ date: 2021-11-27 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: httparty
@@ -587,6 +587,8 @@ files:
587
587
  - db/migrations/20211102_create_table_temp_integrations.rb
588
588
  - db/migrations/20211103_migrate_integrations.rb
589
589
  - db/migrations/20211104_switch_integrations_and_temp_integrations.rb
590
+ - db/migrations/20211120_create_pact_version_provider_tag_successful_verifications.rb
591
+ - db/migrations/20211121_migrate_pact_version_provider_tag_successful_verifications_data.rb
590
592
  - db/migrations/migration_helper.rb
591
593
  - docs/CONFIGURATION.md
592
594
  - docs/api/WEBHOOKS.md
@@ -797,6 +799,7 @@ files:
797
799
  - lib/pact_broker/db/data_migrations/delete_deprecated_webhook_executions.rb
798
800
  - lib/pact_broker/db/data_migrations/helpers.rb
799
801
  - lib/pact_broker/db/data_migrations/migrate_integrations.rb
802
+ - lib/pact_broker/db/data_migrations/migrate_pact_version_provider_tag_successful_verifications.rb
800
803
  - lib/pact_broker/db/data_migrations/migrate_webhook_headers.rb
801
804
  - lib/pact_broker/db/data_migrations/set_consumer_ids_for_pact_publications.rb
802
805
  - lib/pact_broker/db/data_migrations/set_consumer_version_order_for_pact_publications.rb
@@ -1028,6 +1031,7 @@ files:
1028
1031
  - lib/pact_broker/verifications/latest_verification_for_consumer_and_provider.rb
1029
1032
  - lib/pact_broker/verifications/latest_verification_for_consumer_version_tag.rb
1030
1033
  - lib/pact_broker/verifications/latest_verification_id_for_pact_version_and_provider_version.rb
1034
+ - lib/pact_broker/verifications/pact_version_provider_tag_successful_verification.rb
1031
1035
  - lib/pact_broker/verifications/placeholder_verification.rb
1032
1036
  - lib/pact_broker/verifications/pseudo_branch_status.rb
1033
1037
  - lib/pact_broker/verifications/repository.rb
@@ -1220,7 +1224,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1220
1224
  - !ruby/object:Gem::Version
1221
1225
  version: '0'
1222
1226
  requirements: []
1223
- rubygems_version: 3.2.31
1227
+ rubygems_version: 3.2.32
1224
1228
  signing_key:
1225
1229
  specification_version: 4
1226
1230
  summary: See description