1
0
mirror of https://github.com/google/nomulus synced 2026-06-09 16:33:02 +00:00

Compare commits

...

20 Commits

Author SHA1 Message Date
Lai Jiang 48cc12e016 Add logging for nameserver deletion (#1663)
The main purpose of this PR is to help debug b/234189023, where a
registrar reported that in sandbox they observed seemingly successful EPP
update responses to delete NS records, which are not actually deleted after
the commands executed.

To actually load the persisted domain resource after an update would
require us to execute another transaction immediately after the update
transaction and that can only be achieved outside the flow (i. e. in
FlowRunner or EppController) and we need to test for the type of flows
before logging, which seems unnecessarily complex.

For now we are just adding logs inside the update transaction itself to
validate that:

1. The NS records to delete are as expected.
2. The Current NS records are as expected.
3. The new NS records to persist are as expected.

The EPP success reply is the default reply when no errors are thrown in
a transaction. If we see a success reply (which means that the
transaction finished successfully) and expected logs from the transaction, the
only explanation could be that somewhere in the ORM layer the java
representation of what the entity is is different from what is being
presented to the database. I think that signals a much bigger and
fundamental problem, which is quite unlikely given how isolated the
issue under consideration is.

In any case we would like to add the logging functionality in sandbox and ask
the registrar to report again when they see similar issues.

Also made some typo and linting fixes.

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/google/nomulus/1663)
<!-- Reviewable:end -->
2022-06-09 16:56:58 -04:00
gbrodman e30b3f9e0b Fix some small transactional issues in SQL mode (#1662)
* Fix some small transactional issues in SQL mode

These weren't caught until I switched the default database type in tests
to be SQL (separate PR). Fortunately these don't seem to be catastrophic
2022-06-09 15:01:34 -04:00
gbrodman 623356b1e8 Remove functional SQL<->DS replay code (#1659)
This includes:
- removing the actions that do the replay
- removing the tests for the replay
- removing the ReplayExtension and adjusting the various tests that used
  it appropriately
- removing functionality relating to "things that happen during replay",
  e.g. beforeSqlSaveOnReplay

This does not include:
- removing the InitSqlPipeline or similar tasks
- removing e.g. SqlEntity (it's used in other places)
- removing Transforms/RegistryJpaIO and other SQL-pipeline-creation code
2022-06-09 07:44:01 -04:00
Weimin Yu 4f69e1e0a6 Remove bracket in Cloud Build script (#1658)
* Remove bracket around varname in CloudBuild script

Due to spinnaker restriction: it cannot handle variable references where the var name has brackets around it.

Added spinnaker error message to the comments
2022-06-08 13:58:56 -04:00
gbrodman 9912e35ea2 Remove Ofy code from various flow-related classes (#1653)
This included removing ofy-specific code from various tests. Also, some
of the other tests (e.g. RdapDomainActionTest) had to be configured to
use only SQL -- otherwise, as it currently stands, they were trying to
use ofy.

We also delete the CreateSyntheticHistoryEntriesAction and pipeline
because they're no longer relevant, and impossible to test (the goal of
the actions were to create objects in ofy which doesn't happen any
more).
2022-06-07 11:43:33 -04:00
gbrodman 413fd1dc94 Update bigdataoss:util dependency (#1654)
We're running into issues pulling 2.1.3 from maven, possibly due to
vulnerabilities in dependencies, so this updates it to the most recent
version of 2.2.6.
2022-06-06 13:28:49 -04:00
Ben McIlwain 2377774bf9 Add a new recurrenceLastExpansion column to the BillingRecurrence table (#1650)
* Add a new recurrenceLastExpansion column to the BillingRecurrence table

This will be used to determine which recurrences are in scope for
expansion. Anything that has already been expanded within the past year is
automatically out of scope.

Note that the default value is set to just over a year ago, so that, initially,
everything is in scope for expansion, and then will gradually be winnowed down
over time so that most recurrences at any given point are out of scope. Newly
created recurrings (after the subsequent code change goes in) will have their
last expansion time set to the same as the event time of when the recurring is
written, such that they'll first be considered in-scope precisely one year
later.
2022-06-01 14:23:56 -04:00
Weimin Yu 857cb833a5 Summarize schema related tests (#1647)
* Summarize schema related tests

Document existing schema-related tests including presubmit tests and
the schema-verify predeployment test newly added to Spinnaker.
2022-05-31 11:03:58 -04:00
Ben McIlwain 82a50862c4 Inject a DomainPricingLogic into ExpandRecurringBillingEventsAction (#1648)
* Inject a DomainPricingLogic into ExpandRecurringBillingEventsAction

This will be used in other PRs to set the renewal price correctly based on the
renewal price behavior of the BillingRecurrence event.

Note that, in order for this to work, a not-null constraint has been lifted on
the EPP flow state when the DomainPricingCustomLogic is being constructed, as
the pricing here will occur in a backend action outside the context of any EPP
flow.
2022-05-27 11:46:36 -04:00
sarahcaseybot 56d1ea71fe Remove BillingId from schema (#1641)
* Remove BillingId from schema

* Add back java changes

* Add transient tag

* Remove java

* Remove flyway files
2022-05-26 15:28:58 -04:00
Ben McIlwain fd3cec2a0f Slightly improve performance of ExpandRecurringBillingEventsAction (#1642)
* Slightly improve performance of ExpandRecurringBillingEventsAction

We don't need to log every single no-op batch of 50 Recurrences that are
processed (considering we have 1.5M total in our system), and we also don't need
to process Recurrences that already ended prior to the Cursor time (this gets us
down to 420k from 1.5M).
2022-05-25 17:27:21 -04:00
Michael Muller b9c40dd68d Disable Ofy tests. (#1644)
* Disable Ofy tests.

This change just turns off the Ofy tests at the root, by removing processing
for dual tests and disassociating the TestOfyOnly annotation from test
annotations.

This is far less comprehensive than #1631, but it's probably worth entering as
a stopgap solution just because it should speed up our test runs and unblock a
lot of other cleanup work.

* Fix DualDatabaseTestInvocationContextProviderTest
2022-05-25 09:47:05 -04:00
Lai Jiang 754958ef3a Remove an unnecessary pair of parentheses. (#1645) 2022-05-24 17:37:10 -04:00
Michael Muller 1bf7c925bc Fix style warning (#1643)
THe build is giving a style warning over the extra parens.
2022-05-24 17:22:08 -04:00
Weimin Yu eeca51667e Optimize RDAP entity event query (#1635)
* Optimize RDAP entity event query

For each EPP entity, directly load the latest HistoryEntry per event type
instead of loading all events through the HistoryEntryDao.

Although most entities have a small number of history entries, there are
a few entities with many entries, enough to cause OutOfMemory error.
2022-05-19 23:35:55 -04:00
sarahcaseybot 123d6359dc Change shouldPublish in GenerateInvoicesAction to default to false (#1640) 2022-05-19 17:51:21 -04:00
Rachel Guan 64fba55f06 Add renewal cost logic to DomainPricingLogic (#1610)
* Add renew cost calculation to DomainPricingLogic

* Fix typos and change assertions
2022-05-19 16:05:21 -04:00
gbrodman 3a7ac669f5 Set up jpaTm before loading data in the test server (#1633) 2022-05-19 12:13:43 -04:00
Michael Muller fc029b5ad2 Added info on problematic max-instances param (#1639)
We have backend max-instances set to 100, which apparently exceeds the default
quota for GAE.  Add info on updating the quota or changing this parameter to
the configuration doc.
2022-05-19 11:51:27 -04:00
Ben McIlwain ec5c2cdb68 Add batching to ExpandRecurringBillingEventsAction (#1636)
* Add batching to ExpandRecurringBillingEventsAction

It's OOMing on trying to load every single BillingRecurrence that needs to be
expanded simultaneously (which is to be expected). So this processes them in
transactional batches of 50.
2022-05-19 09:13:37 -04:00
282 changed files with 12189 additions and 18759 deletions
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,25 +26,25 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
@@ -52,7 +52,7 @@ org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.json:json:20160212
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,25 +26,25 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
@@ -52,7 +52,7 @@ org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.json:json:20160212
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,25 +26,25 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
@@ -52,7 +52,7 @@ org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.json:json:20160212
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,25 +26,25 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
@@ -52,7 +52,7 @@ org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.json:json:20160212
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,25 +26,25 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
@@ -52,7 +52,7 @@ org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.json:json:20160212
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,46 +26,46 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
com.google.truth:truth:1.1.3
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
junit:junit:4.13.2
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.hamcrest:hamcrest-core:1.3
org.json:json:20160212
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.mockito:mockito-core:4.5.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.mockito:mockito-core:4.6.1
org.objenesis:objenesis:3.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,47 +26,47 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
com.google.truth:truth:1.1.3
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
junit:junit:4.13.2
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.apiguardian:apiguardian-api:1.1.2
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.hamcrest:hamcrest-core:1.3
org.json:json:20160212
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.mockito:mockito-core:4.5.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.mockito:mockito-core:4.6.1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:7.0
org.ow2.asm:asm-commons:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,46 +26,46 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
com.google.truth:truth:1.1.3
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
junit:junit:4.13.2
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.hamcrest:hamcrest-core:1.3
org.json:json:20160212
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.mockito:mockito-core:4.5.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.mockito:mockito-core:4.6.1
org.objenesis:objenesis:3.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:7.0
@@ -3,21 +3,21 @@
# This file is expected to be part of source control.
aopalliance:aopalliance:1.0
args4j:args4j:2.0.23
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.google.api-client:google-api-client:1.34.0
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.google.api-client:google-api-client:1.34.1
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.value:auto-value-annotations:1.9
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
@@ -26,46 +26,46 @@ com.google.escapevelocity:escapevelocity:0.9.1
com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:1.0.1
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
com.google.truth:truth:1.1.3
com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.45.1
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.grpc:grpc-context:1.46.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-http-util:0.31.1
javax.annotation:javax.annotation-api:1.3.2
javax.annotation:jsr250-api:1.0
javax.inject:javax.inject:1
junit:junit:4.13.2
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
org.apache.commons:commons-lang3:3.11
org.apache.commons:commons-text:1.9
org.apache.httpcomponents:httpclient:4.5.13
org.apache.httpcomponents:httpcore:4.4.15
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.hamcrest:hamcrest-core:1.3
org.json:json:20160212
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.mockito:mockito-core:4.5.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.mockito:mockito-core:4.6.1
org.objenesis:objenesis:3.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:7.0
@@ -18,10 +18,10 @@ junit:junit:4.13.2
org.checkerframework:checker-compat-qual:2.5.3
org.checkerframework:checker-qual:3.19.0
org.hamcrest:hamcrest-core:1.3
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm:9.1
@@ -19,10 +19,10 @@ org.apiguardian:apiguardian-api:1.1.2
org.checkerframework:checker-compat-qual:2.5.3
org.checkerframework:checker-qual:3.19.0
org.hamcrest:hamcrest-core:1.3
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm:9.1
@@ -19,10 +19,10 @@ junit:junit:4.13.2
org.checkerframework:checker-compat-qual:2.5.3
org.checkerframework:checker-qual:3.19.0
org.hamcrest:hamcrest-core:1.3
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm:9.1
@@ -19,10 +19,10 @@ junit:junit:4.13.2
org.checkerframework:checker-compat-qual:2.5.3
org.checkerframework:checker-qual:3.19.0
org.hamcrest:hamcrest-core:1.3
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit:junit-bom:5.8.2
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm:9.1
-10
View File
@@ -37,7 +37,6 @@ def jsDir = "${project.projectDir}/src/main/javascript"
// TODO(weiminyu): identify cause and fix offending tests.
def outcastTestPatterns = [
// Problem seems to lie with AppEngine TaskQueue for test.
"google/registry/batch/DeleteContactsAndHostsActionTest.*",
"google/registry/batch/RefreshDnsOnHostRenameActionTest.*",
"google/registry/flows/CheckApiActionTest.*",
"google/registry/flows/EppLifecycleHostTest.*",
@@ -714,10 +713,6 @@ createToolTask(
createToolTask(
'jpaDemoPipeline', 'google.registry.beam.common.JpaDemoPipeline')
createToolTask(
'createSyntheticHistoryEntries',
'google.registry.tools.javascrap.CreateSyntheticHistoryEntriesPipeline')
// Caller must provide projectId, GCP region, runner, and the kinds to delete
// (comma-separated kind names or '*' for all). E.g.:
// nom_build :core:bulkDeleteDatastore --args="--project=domain-registry-crash \
@@ -795,11 +790,6 @@ if (environment == 'alpha') {
mainClass: 'google.registry.beam.rde.RdePipeline',
metaData : 'google/registry/beam/rde_pipeline_metadata.json'
],
validateDatabase :
[
mainClass: 'google.registry.beam.comparedb.ValidateDatabasePipeline',
metaData: 'google/registry/beam/validate_database_pipeline_metadata.json'
],
resaveAllEppResources:
[
mainClass: 'google.registry.beam.resave.ResaveAllEppResourcesPipeline',
@@ -9,10 +9,10 @@ com.google.auto.value:auto-value:1.9
com.google.auto:auto-common:1.2
com.google.code.findbugs:jFormatString:3.0.0
com.google.code.findbugs:jsr305:3.0.2
com.google.dagger:dagger-compiler:2.41
com.google.dagger:dagger-producers:2.41
com.google.dagger:dagger-spi:2.41
com.google.dagger:dagger:2.41
com.google.dagger:dagger-compiler:2.42
com.google.dagger:dagger-producers:2.42
com.google.dagger:dagger-spi:2.42
com.google.dagger:dagger:2.42
com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0
com.google.errorprone:error_prone_annotation:2.3.4
com.google.errorprone:error_prone_annotations:2.7.1
@@ -35,11 +35,11 @@ org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.12.0
org.checkerframework:dataflow:3.0.0
org.checkerframework:javacutil:3.0.0
org.jetbrains.kotlin:kotlin-stdlib-common:1.5.32
org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.32
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.32
org.jetbrains.kotlin:kotlin-stdlib:1.5.32
org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0
org.jetbrains.kotlin:kotlin-stdlib:1.6.10
org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2
org.jetbrains:annotations:13.0
org.pcollections:pcollections:2.1.2
org.plumelib:plume-util:1.0.6
+119 -105
View File
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,47 +82,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -129,58 +133,60 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
io.confluent:common-config:5.3.2
io.confluent:common-utils:5.3.2
io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -193,11 +199,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -219,21 +232,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -245,43 +258,44 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -25,22 +27,22 @@ com.github.jnr:jnr-ffi:2.2.11
com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -49,28 +51,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -78,47 +81,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -128,38 +132,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
io.confluent:common-config:5.3.2
io.confluent:common-utils:5.3.2
io.confluent:kafka-avro-serializer:5.3.2
@@ -167,16 +172,19 @@ io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.44.0
io.grpc:grpc-api:1.45.1
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.44.0
io.grpc:grpc-context:1.45.1
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.44.1
io.grpc:grpc-grpclb:1.44.0
io.grpc:grpc-netty-shaded:1.44.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.44.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.44.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -187,9 +195,17 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -210,21 +226,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -236,41 +252,42 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
+119 -105
View File
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,48 +82,49 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:postgres-socket-factory:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -130,38 +134,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -175,20 +180,21 @@ io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -201,11 +207,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -228,21 +241,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -255,46 +268,47 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:2.0.0-alpha7
org.slf4j:slf4j-jdk14:2.0.0-alpha7
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
+119 -105
View File
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,48 +82,49 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:postgres-socket-factory:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -130,38 +134,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -175,20 +180,21 @@ io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -201,11 +207,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -227,21 +240,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -254,45 +267,46 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:2.0.0-alpha7
org.slf4j:slf4j-jdk14:2.0.0-alpha7
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,47 +82,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -129,58 +133,60 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
io.confluent:common-config:5.3.2
io.confluent:common-utils:5.3.2
io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -193,11 +199,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -219,21 +232,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -245,43 +258,44 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -25,22 +27,22 @@ com.github.jnr:jnr-ffi:2.2.11
com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -49,28 +51,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -78,47 +81,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -128,38 +132,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
io.confluent:common-config:5.3.2
io.confluent:common-utils:5.3.2
io.confluent:kafka-avro-serializer:5.3.2
@@ -167,16 +172,19 @@ io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.44.0
io.grpc:grpc-api:1.45.1
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.44.0
io.grpc:grpc-context:1.45.1
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.44.1
io.grpc:grpc-grpclb:1.44.0
io.grpc:grpc-netty-shaded:1.44.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.44.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.44.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -187,9 +195,17 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -211,21 +227,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -237,42 +253,43 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,47 +82,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -129,38 +133,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -174,20 +179,21 @@ io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -200,11 +206,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -227,21 +240,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -254,45 +267,46 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,47 +82,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -129,38 +133,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -174,20 +179,21 @@ io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -200,11 +206,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -227,21 +240,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -254,45 +267,46 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
+119 -105
View File
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,47 +82,48 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -129,38 +133,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -174,20 +179,21 @@ io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -200,11 +206,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -227,21 +240,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -254,45 +267,46 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:1.3
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:1.7.35
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,48 +82,49 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:postgres-socket-factory:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -130,38 +134,39 @@ com.google.guava:failureaccess:1.0.1
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.sun.istack:istack-commons-runtime:3.0.7
com.sun.xml.fastinfoset:FastInfoset:1.2.15
com.thoughtworks.paranamer:paranamer:2.7
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -175,20 +180,21 @@ io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -201,11 +207,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -227,21 +240,21 @@ org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -254,45 +267,46 @@ org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest:2.1
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.jsoup:jsoup:1.15.1
org.jvnet.staxex:stax-ex:1.8
org.objenesis:objenesis:1.2
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:2.0.0-alpha7
org.slf4j:slf4j-jdk14:2.0.0-alpha7
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,10 +7,10 @@ com.google.auto.value:auto-value:1.9
com.google.auto:auto-common:0.10
com.google.code.findbugs:jFormatString:3.0.0
com.google.code.findbugs:jsr305:3.0.2
com.google.dagger:dagger-compiler:2.41
com.google.dagger:dagger-producers:2.41
com.google.dagger:dagger-spi:2.41
com.google.dagger:dagger:2.41
com.google.dagger:dagger-compiler:2.42
com.google.dagger:dagger-producers:2.42
com.google.dagger:dagger-spi:2.42
com.google.dagger:dagger:2.42
com.google.devtools.ksp:symbol-processing-api:1.5.30-1.0.0
com.google.errorprone:error_prone_annotation:2.3.4
com.google.errorprone:error_prone_annotations:2.7.1
@@ -33,11 +33,11 @@ org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.12.0
org.checkerframework:dataflow:3.0.0
org.checkerframework:javacutil:3.0.0
org.jetbrains.kotlin:kotlin-stdlib-common:1.5.32
org.jetbrains.kotlin:kotlin-stdlib-common:1.6.10
org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.5.32
org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.5.32
org.jetbrains.kotlin:kotlin-stdlib:1.5.32
org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.3.0
org.jetbrains.kotlin:kotlin-stdlib:1.6.10
org.jetbrains.kotlinx:kotlinx-metadata-jvm:0.4.2
org.jetbrains:annotations:13.0
org.pcollections:pcollections:2.1.2
org.plumelib:plume-util:1.0.6
+140 -126
View File
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,49 +82,50 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-api-stubs:2.0.4
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-api-stubs:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-nio:0.123.28
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-nio:0.124.2
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -132,12 +136,12 @@ com.google.guava:guava-testlib:31.1-jre
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -145,13 +149,13 @@ com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:contrib:1.0.7
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
@@ -160,6 +164,7 @@ com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okio:okio:1.14.0
com.sun.istack:istack-commons-runtime:3.0.7
@@ -169,27 +174,28 @@ com.thoughtworks.qdox:qdox:1.12.1
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
io.confluent:common-config:5.3.2
io.confluent:common-utils:5.3.2
io.confluent:kafka-avro-serializer:5.3.2
io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -202,11 +208,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -222,29 +235,29 @@ javax.xml.bind:jaxb-api:2.3.1
jline:jline:1.0
joda-time:joda-time:2.10.10
junit:junit:4.13.2
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
net.java.dev.jna:jna:5.8.0
org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-direct-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-direct-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -260,58 +273,58 @@ org.apache.mina:mina-core:2.1.6
org.apache.sshd:sshd-core:2.0.0
org.apache.sshd:sshd-scp:2.0.0
org.apache.sshd:sshd-sftp:2.0.0
org.apache.tomcat:tomcat-annotations-api:10.1.0-M14
org.apache.tomcat:tomcat-annotations-api:10.1.0-M15
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:2.2
org.hamcrest:hamcrest-library:2.2
org.hamcrest:hamcrest:2.2
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.junit-pioneer:junit-pioneer:1.7.0
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.jupiter:junit-jupiter-migrationsupport:5.8.2
org.junit.jupiter:junit-jupiter-params:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit.platform:junit-platform-launcher:1.8.2
org.junit.platform:junit-platform-runner:1.8.2
org.junit.platform:junit-platform-suite-api:1.8.2
org.junit.platform:junit-platform-suite-commons:1.8.2
org.junit:junit-bom:5.8.2
org.jsoup:jsoup:1.15.1
org.junit-pioneer:junit-pioneer:1.7.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.jupiter:junit-jupiter-migrationsupport:5.9.0-M1
org.junit.jupiter:junit-jupiter-params:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit.platform:junit-platform-launcher:1.9.0-M1
org.junit.platform:junit-platform-runner:1.9.0-M1
org.junit.platform:junit-platform-suite-api:1.9.0-M1
org.junit.platform:junit-platform-suite-commons:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.jvnet.staxex:stax-ex:1.8
org.mockito:mockito-core:4.5.1
org.mockito:mockito-junit-jupiter:4.5.1
org.mockito:mockito-core:4.6.1
org.mockito:mockito-junit-jupiter:4.6.1
org.mortbay.jetty:jetty-util:6.1.26
org.mortbay.jetty:jetty:6.1.26
org.objenesis:objenesis:3.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
@@ -324,14 +337,15 @@ org.seleniumhq.selenium:selenium-remote-driver:3.141.59
org.seleniumhq.selenium:selenium-safari-driver:3.141.59
org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:junit-jupiter:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:selenium:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:junit-jupiter:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:selenium:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -25,22 +27,22 @@ com.github.jnr:jnr-ffi:2.2.11
com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -49,28 +51,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -78,49 +81,50 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-api-stubs:2.0.4
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-api-stubs:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-nio:0.123.28
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-nio:0.124.2
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -131,12 +135,12 @@ com.google.guava:guava-testlib:31.1-jre
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -144,13 +148,13 @@ com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:contrib:1.0.7
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
@@ -159,6 +163,7 @@ com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okio:okio:1.14.0
com.sun.istack:istack-commons-runtime:3.0.7
@@ -168,7 +173,7 @@ com.thoughtworks.qdox:qdox:1.12.1
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
io.confluent:common-config:5.3.2
io.confluent:common-utils:5.3.2
io.confluent:kafka-avro-serializer:5.3.2
@@ -176,16 +181,19 @@ io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.grpc:grpc-alts:1.44.0
io.grpc:grpc-api:1.45.1
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.44.0
io.grpc:grpc-context:1.45.1
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.44.1
io.grpc:grpc-grpclb:1.44.0
io.grpc:grpc-netty-shaded:1.44.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.44.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.44.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -196,9 +204,17 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -214,29 +230,29 @@ javax.xml.bind:jaxb-api:2.3.1
jline:jline:1.0
joda-time:joda-time:2.10.10
junit:junit:4.13.2
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
net.java.dev.jna:jna:5.8.0
org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-direct-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-direct-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -252,57 +268,57 @@ org.apache.mina:mina-core:2.1.6
org.apache.sshd:sshd-core:2.0.0
org.apache.sshd:sshd-scp:2.0.0
org.apache.sshd:sshd-sftp:2.0.0
org.apache.tomcat:tomcat-annotations-api:10.1.0-M14
org.apache.tomcat:tomcat-annotations-api:10.1.0-M15
org.apiguardian:apiguardian-api:1.1.2
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:2.2
org.hamcrest:hamcrest-library:2.2
org.hamcrest:hamcrest:2.2
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.junit-pioneer:junit-pioneer:1.7.0
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.jupiter:junit-jupiter-migrationsupport:5.8.2
org.junit.jupiter:junit-jupiter-params:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit.platform:junit-platform-launcher:1.8.2
org.junit.platform:junit-platform-runner:1.8.2
org.junit.platform:junit-platform-suite-api:1.8.2
org.junit:junit-bom:5.8.2
org.jsoup:jsoup:1.15.1
org.junit-pioneer:junit-pioneer:1.7.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.jupiter:junit-jupiter-migrationsupport:5.9.0-M1
org.junit.jupiter:junit-jupiter-params:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit.platform:junit-platform-launcher:1.9.0-M1
org.junit.platform:junit-platform-runner:1.9.0-M1
org.junit.platform:junit-platform-suite-api:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.jvnet.staxex:stax-ex:1.8
org.mockito:mockito-core:4.5.1
org.mockito:mockito-junit-jupiter:4.5.1
org.mockito:mockito-core:4.6.1
org.mockito:mockito-junit-jupiter:4.6.1
org.mortbay.jetty:jetty-util:6.1.26
org.mortbay.jetty:jetty:6.1.26
org.objenesis:objenesis:1.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
@@ -315,14 +331,15 @@ org.seleniumhq.selenium:selenium-remote-driver:3.141.59
org.seleniumhq.selenium:selenium-safari-driver:3.141.59
org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:junit-jupiter:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:selenium:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:junit-jupiter:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:selenium:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
+141 -127
View File
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,50 +82,51 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-api-stubs:2.0.4
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-api-stubs:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:postgres-socket-factory:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-nio:0.123.28
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-nio:0.124.2
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -133,12 +137,12 @@ com.google.guava:guava-testlib:31.1-jre
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -146,13 +150,13 @@ com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:contrib:1.0.7
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
@@ -161,6 +165,7 @@ com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okio:okio:1.14.0
com.sun.istack:istack-commons-runtime:3.0.7
@@ -170,7 +175,7 @@ com.thoughtworks.qdox:qdox:1.12.1
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -185,20 +190,21 @@ io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.github.java-diff-utils:java-diff-utils:4.9
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -211,11 +217,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -232,29 +245,29 @@ jline:jline:1.0
joda-time:joda-time:2.10.10
junit:junit:4.13.2
net.arnx:nashorn-promise:0.1.1
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
net.java.dev.jna:jna:5.8.0
org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-direct-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-direct-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -270,58 +283,58 @@ org.apache.mina:mina-core:2.1.6
org.apache.sshd:sshd-core:2.0.0
org.apache.sshd:sshd-scp:2.0.0
org.apache.sshd:sshd-sftp:2.0.0
org.apache.tomcat:tomcat-annotations-api:10.1.0-M14
org.apache.tomcat:tomcat-annotations-api:10.1.0-M15
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:2.2
org.hamcrest:hamcrest-library:2.2
org.hamcrest:hamcrest:2.2
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.junit-pioneer:junit-pioneer:1.7.0
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.jupiter:junit-jupiter-migrationsupport:5.8.2
org.junit.jupiter:junit-jupiter-params:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit.platform:junit-platform-launcher:1.8.2
org.junit.platform:junit-platform-runner:1.8.2
org.junit.platform:junit-platform-suite-api:1.8.2
org.junit.platform:junit-platform-suite-commons:1.8.2
org.junit:junit-bom:5.8.2
org.jsoup:jsoup:1.15.1
org.junit-pioneer:junit-pioneer:1.7.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.jupiter:junit-jupiter-migrationsupport:5.9.0-M1
org.junit.jupiter:junit-jupiter-params:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit.platform:junit-platform-launcher:1.9.0-M1
org.junit.platform:junit-platform-runner:1.9.0-M1
org.junit.platform:junit-platform-suite-api:1.9.0-M1
org.junit.platform:junit-platform-suite-commons:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.jvnet.staxex:stax-ex:1.8
org.mockito:mockito-core:4.5.1
org.mockito:mockito-junit-jupiter:4.5.1
org.mockito:mockito-core:4.6.1
org.mockito:mockito-junit-jupiter:4.6.1
org.mortbay.jetty:jetty-util:6.1.26
org.mortbay.jetty:jetty:6.1.26
org.objenesis:objenesis:3.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
@@ -336,14 +349,15 @@ org.seleniumhq.selenium:selenium-support:3.141.59
org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:junit-jupiter:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:selenium:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:junit-jupiter:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:selenium:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -7,11 +7,13 @@ args4j:args4j:2.0.23
cglib:cglib-nodep:2.2
com.101tec:zkclient:0.10
com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-annotations:2.13.2
com.fasterxml.jackson.core:jackson-core:2.13.2
com.fasterxml.jackson.core:jackson-databind:2.13.2
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.2
com.fasterxml.jackson:jackson-bom:2.13.2
com.fasterxml.jackson.core:jackson-annotations:2.13.3
com.fasterxml.jackson.core:jackson-core:2.13.3
com.fasterxml.jackson.core:jackson-databind:2.13.3
com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-joda:2.13.3
com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.3
com.fasterxml.jackson:jackson-bom:2.13.3
com.fasterxml:classmate:1.5.1
com.github.ben-manes.caffeine:caffeine:2.9.3
com.github.docker-java:docker-java-api:3.2.13
@@ -26,22 +28,22 @@ com.github.jnr:jnr-posix:3.1.15
com.github.jnr:jnr-unixsocket:0.38.17
com.github.jnr:jnr-x86asm:1.0.2
com.google.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.34.0
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-jackson2:1.32.2
com.google.api-client:google-api-client-java6:1.34.0
com.google.api-client:google-api-client-servlet:1.34.0
com.google.api-client:google-api-client:1.34.0
com.google.api-client:google-api-client-java6:1.35.0
com.google.api-client:google-api-client-servlet:1.35.0
com.google.api-client:google-api-client:1.35.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta1:0.134.0
com.google.api.grpc:grpc-google-cloud-bigquerystorage-v1beta2:0.134.0
com.google.api.grpc:grpc-google-cloud-bigtable-admin-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:1.27.1
com.google.api.grpc:grpc-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:grpc-google-cloud-pubsub-v1:1.97.5
com.google.api.grpc:grpc-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:grpc-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:grpc-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:grpc-google-common-protos:2.7.2
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1:2.10.0
com.google.api.grpc:proto-google-cloud-bigquerystorage-v1beta1:0.134.0
@@ -50,28 +52,29 @@ com.google.api.grpc:proto-google-cloud-bigtable-admin-v2:2.5.3
com.google.api.grpc:proto-google-cloud-bigtable-v2:2.5.3
com.google.api.grpc:proto-google-cloud-datastore-v1:0.93.4
com.google.api.grpc:proto-google-cloud-firestore-v1:3.0.14
com.google.api.grpc:proto-google-cloud-monitoring-v3:1.64.0
com.google.api.grpc:proto-google-cloud-pubsub-v1:1.98.0
com.google.api.grpc:proto-google-cloud-pubsublite-v1:1.5.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.1.7
com.google.api.grpc:proto-google-cloud-secretmanager-v1:2.2.0
com.google.api.grpc:proto-google-cloud-secretmanager-v1beta1:2.2.0
com.google.api.grpc:proto-google-cloud-spanner-admin-database-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-admin-instance-v1:6.20.0
com.google.api.grpc:proto-google-cloud-spanner-v1:6.20.0
com.google.api.grpc:proto-google-cloud-storage-v2:2.0.1-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.1.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.91.11
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.91.11
com.google.api.grpc:proto-google-cloud-storage-v2:2.2.2-alpha
com.google.api.grpc:proto-google-cloud-tasks-v2:2.2.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta2:0.92.0
com.google.api.grpc:proto-google-cloud-tasks-v2beta3:0.92.0
com.google.api.grpc:proto-google-common-protos:2.8.3
com.google.api.grpc:proto-google-iam-v1:1.3.1
com.google.api:api-common:2.1.5
com.google.api:gax-grpc:2.16.0
com.google.api:gax-httpjson:0.101.0
com.google.api:gax:2.16.0
com.google.api.grpc:proto-google-iam-v1:1.3.4
com.google.api:api-common:2.2.0
com.google.api:gax-grpc:2.18.1
com.google.api:gax-httpjson:0.103.1
com.google.api:gax:2.18.1
com.google.apis:google-api-services-admin-directory:directory_v1-rev118-1.25.0
com.google.apis:google-api-services-appengine:v1-rev20220326-1.32.1
com.google.apis:google-api-services-appengine:v1-rev20220509-1.32.1
com.google.apis:google-api-services-bigquery:v2-rev20211129-1.32.1
com.google.apis:google-api-services-clouddebugger:v2-rev20210813-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220415-1.32.1
com.google.apis:google-api-services-cloudkms:v1-rev20220513-1.32.1
com.google.apis:google-api-services-cloudresourcemanager:v1-rev20211017-1.32.1
com.google.apis:google-api-services-dataflow:v1b3-rev20210818-1.32.1
com.google.apis:google-api-services-dns:v2beta1-rev99-1.25.0
@@ -79,50 +82,51 @@ com.google.apis:google-api-services-drive:v2-rev393-1.25.0
com.google.apis:google-api-services-groupssettings:v1-rev20210624-1.32.1
com.google.apis:google-api-services-healthcare:v1-rev20211016-1.32.1
com.google.apis:google-api-services-iamcredentials:v1-rev20210326-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220322-1.32.1
com.google.apis:google-api-services-monitoring:v3-rev20220525-1.32.1
com.google.apis:google-api-services-pubsub:v1-rev20211130-1.32.1
com.google.apis:google-api-services-sheets:v4-rev20220411-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220310-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220401-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.appengine.tools:appengine-gcs-client:0.8.1
com.google.appengine.tools:appengine-mapreduce:0.9
com.google.appengine.tools:appengine-pipeline:0.2.13
com.google.appengine:appengine-api-1.0-sdk:1.9.86
com.google.appengine:appengine-api-stubs:2.0.4
com.google.appengine:appengine-remote-api:2.0.4
com.google.appengine:appengine-api-1.0-sdk:2.0.5
com.google.appengine:appengine-api-stubs:2.0.5
com.google.appengine:appengine-remote-api:2.0.5
com.google.appengine:appengine-testing:1.9.86
com.google.auth:google-auth-library-credentials:1.6.0
com.google.auth:google-auth-library-oauth2-http:1.6.0
com.google.auth:google-auth-library-credentials:1.7.0
com.google.auth:google-auth-library-oauth2-http:1.7.0
com.google.auto.service:auto-service-annotations:1.0.1
com.google.auto.value:auto-value-annotations:1.9
com.google.auto.value:auto-value:1.9
com.google.cloud.bigdataoss:gcsio:2.2.4
com.google.cloud.bigdataoss:util:2.2.4
com.google.cloud.bigtable:bigtable-client-core:1.25.1
com.google.cloud.bigtable:bigtable-metrics-api:1.25.1
com.google.cloud.bigdataoss:gcsio:2.2.6
com.google.cloud.bigdataoss:util:2.2.6
com.google.cloud.bigtable:bigtable-client-core:1.26.3
com.google.cloud.bigtable:bigtable-metrics-api:1.26.3
com.google.cloud.datastore:datastore-v1-proto-client:2.1.3
com.google.cloud.sql:jdbc-socket-factory-core:1.5.0
com.google.cloud.sql:postgres-socket-factory:1.5.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:1.27.1
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
com.google.cloud:google-cloud-core-http:2.6.0
com.google.cloud:google-cloud-core:2.6.0
com.google.cloud:google-cloud-core-http:2.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-firestore:3.0.14
com.google.cloud:google-cloud-nio:0.123.28
com.google.cloud:google-cloud-monitoring:1.82.0
com.google.cloud:google-cloud-nio:0.124.2
com.google.cloud:google-cloud-pubsub:1.116.0
com.google.cloud:google-cloud-pubsublite:1.5.0
com.google.cloud:google-cloud-secretmanager:2.1.7
com.google.cloud:google-cloud-secretmanager:2.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.6.1
com.google.cloud:google-cloud-tasks:2.1.11
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-tasks:2.2.0
com.google.cloud:grpc-gcp:1.1.0
com.google.cloud:proto-google-cloud-firestore-bundle-v1:3.0.14
com.google.code.findbugs:jsr305:3.0.2
com.google.code.gson:gson:2.9.0
com.google.common.html.types:types:1.0.6
com.google.dagger:dagger:2.41
com.google.errorprone:error_prone_annotations:2.13.0
com.google.dagger:dagger:2.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -133,12 +137,12 @@ com.google.guava:guava-testlib:31.1-jre
com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.gwt:gwt-user:2.9.0
com.google.http-client:google-http-client-apache-v2:1.41.7
com.google.http-client:google-http-client-appengine:1.41.7
com.google.http-client:google-http-client-gson:1.41.7
com.google.http-client:google-http-client-jackson2:1.41.7
com.google.http-client:google-http-client-apache-v2:1.41.8
com.google.http-client:google-http-client-appengine:1.41.8
com.google.http-client:google-http-client-gson:1.41.8
com.google.http-client:google-http-client-jackson2:1.41.8
com.google.http-client:google-http-client-protobuf:1.40.1
com.google.http-client:google-http-client:1.41.7
com.google.http-client:google-http-client:1.41.8
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -146,13 +150,13 @@ com.google.jsinterop:jsinterop-annotations:2.0.0
com.google.monitoring-client:contrib:1.0.7
com.google.monitoring-client:metrics:1.0.7
com.google.monitoring-client:stackdriver:1.0.7
com.google.oauth-client:google-oauth-client-appengine:1.33.3
com.google.oauth-client:google-oauth-client-java6:1.33.3
com.google.oauth-client:google-oauth-client-jetty:1.33.3
com.google.oauth-client:google-oauth-client-servlet:1.33.3
com.google.oauth-client:google-oauth-client:1.33.3
com.google.protobuf:protobuf-java-util:3.19.4
com.google.protobuf:protobuf-java:3.19.4
com.google.oauth-client:google-oauth-client-appengine:1.34.0
com.google.oauth-client:google-oauth-client-java6:1.34.0
com.google.oauth-client:google-oauth-client-jetty:1.34.0
com.google.oauth-client:google-oauth-client-servlet:1.34.0
com.google.oauth-client:google-oauth-client:1.34.0
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
com.google.template:soy:2021-02-01
com.google.truth.extensions:truth-java8-extension:1.1.3
@@ -161,6 +165,7 @@ com.googlecode.charts4j:charts4j:1.3
com.googlecode.json-simple:json-simple:1.1.1
com.ibm.icu:icu4j:71.1
com.jcraft:jsch:0.1.55
com.lmax:disruptor:3.4.2
com.squareup.okhttp3:okhttp:3.11.0
com.squareup.okio:okio:1.14.0
com.sun.istack:istack-commons-runtime:3.0.7
@@ -170,7 +175,7 @@ com.thoughtworks.qdox:qdox:1.12.1
com.zaxxer:HikariCP:3.4.5
commons-codec:commons-codec:1.15
commons-logging:commons-logging:1.2
dnsjava:dnsjava:3.5.0
dnsjava:dnsjava:3.5.1
guru.nidi.com.eclipsesource.j2v8:j2v8_linux_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_macosx_x86_64:4.6.0
guru.nidi.com.eclipsesource.j2v8:j2v8_win32_x86:4.6.0
@@ -185,20 +190,21 @@ io.confluent:kafka-schema-registry-client:5.3.2
io.dropwizard.metrics:metrics-core:3.1.2
io.github.classgraph:classgraph:4.8.104
io.github.java-diff-utils:java-diff-utils:4.9
io.grpc:grpc-alts:1.45.1
io.grpc:grpc-api:1.45.1
io.grpc:grpc-auth:1.45.1
io.grpc:grpc-context:1.45.1
io.grpc:grpc-core:1.45.1
io.grpc:grpc-googleapis:1.45.1
io.grpc:grpc-grpclb:1.45.1
io.grpc:grpc-netty-shaded:1.45.1
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
io.grpc:grpc-census:1.44.0
io.grpc:grpc-context:1.46.0
io.grpc:grpc-core:1.46.0
io.grpc:grpc-googleapis:1.46.0
io.grpc:grpc-grpclb:1.46.0
io.grpc:grpc-netty-shaded:1.46.0
io.grpc:grpc-netty:1.44.0
io.grpc:grpc-protobuf-lite:1.45.1
io.grpc:grpc-protobuf:1.45.1
io.grpc:grpc-services:1.45.1
io.grpc:grpc-stub:1.45.1
io.grpc:grpc-xds:1.45.1
io.grpc:grpc-protobuf-lite:1.46.0
io.grpc:grpc-protobuf:1.46.0
io.grpc:grpc-services:1.46.0
io.grpc:grpc-stub:1.46.0
io.grpc:grpc-xds:1.46.0
io.netty:netty-buffer:4.1.72.Final
io.netty:netty-codec-http2:4.1.72.Final
io.netty:netty-codec-http:4.1.72.Final
@@ -211,11 +217,18 @@ io.netty:netty-resolver:4.1.72.Final
io.netty:netty-tcnative-boringssl-static:2.0.46.Final
io.netty:netty-tcnative-classes:2.0.46.Final
io.netty:netty-transport:4.1.72.Final
io.opencensus:opencensus-api:0.31.0
io.opencensus:opencensus-api:0.31.1
io.opencensus:opencensus-contrib-exemplar-util:0.31.0
io.opencensus:opencensus-contrib-grpc-metrics:0.31.0
io.opencensus:opencensus-contrib-grpc-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.0
io.opencensus:opencensus-contrib-http-util:0.31.1
io.opencensus:opencensus-contrib-resource-util:0.31.0
io.opencensus:opencensus-exporter-metrics-util:0.31.0
io.opencensus:opencensus-exporter-stats-stackdriver:0.31.0
io.opencensus:opencensus-impl-core:0.31.0
io.opencensus:opencensus-impl:0.31.0
io.opencensus:opencensus-proto:0.2.0
io.perfmark:perfmark-api:0.23.0
io.perfmark:perfmark-api:0.25.0
it.unimi.dsi:fastutil:6.5.16
javax.activation:activation:1.1
javax.activation:javax.activation-api:1.2.0
@@ -232,29 +245,29 @@ jline:jline:1.0
joda-time:joda-time:2.10.10
junit:junit:4.13.2
net.arnx:nashorn-promise:0.1.1
net.bytebuddy:byte-buddy-agent:1.12.9
net.bytebuddy:byte-buddy:1.12.9
net.bytebuddy:byte-buddy-agent:1.12.10
net.bytebuddy:byte-buddy:1.12.10
net.java.dev.jna:jna:5.8.0
org.apache.arrow:arrow-format:5.0.0
org.apache.arrow:arrow-memory-core:5.0.0
org.apache.arrow:arrow-vector:5.0.0
org.apache.avro:avro:1.8.2
org.apache.beam:beam-model-fn-execution:2.38.0
org.apache.beam:beam-model-job-management:2.38.0
org.apache.beam:beam-model-pipeline:2.38.0
org.apache.beam:beam-runners-core-construction-java:2.38.0
org.apache.beam:beam-runners-core-java:2.38.0
org.apache.beam:beam-runners-direct-java:2.38.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.38.0
org.apache.beam:beam-runners-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-core:2.38.0
org.apache.beam:beam-sdks-java-expansion-service:2.38.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.38.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.38.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.38.0
org.apache.beam:beam-sdks-java-fn-execution:2.38.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.38.0
org.apache.beam:beam-sdks-java-io-kafka:2.38.0
org.apache.beam:beam-model-fn-execution:2.39.0
org.apache.beam:beam-model-job-management:2.39.0
org.apache.beam:beam-model-pipeline:2.39.0
org.apache.beam:beam-runners-core-construction-java:2.39.0
org.apache.beam:beam-runners-core-java:2.39.0
org.apache.beam:beam-runners-direct-java:2.39.0
org.apache.beam:beam-runners-google-cloud-dataflow-java:2.39.0
org.apache.beam:beam-runners-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-core:2.39.0
org.apache.beam:beam-sdks-java-expansion-service:2.39.0
org.apache.beam:beam-sdks-java-extensions-arrow:2.39.0
org.apache.beam:beam-sdks-java-extensions-google-cloud-platform-core:2.39.0
org.apache.beam:beam-sdks-java-extensions-protobuf:2.39.0
org.apache.beam:beam-sdks-java-fn-execution:2.39.0
org.apache.beam:beam-sdks-java-io-google-cloud-platform:2.39.0
org.apache.beam:beam-sdks-java-io-kafka:2.39.0
org.apache.beam:beam-vendor-bytebuddy-1_11_0:0.1
org.apache.beam:beam-vendor-grpc-1_43_2:0.1
org.apache.beam:beam-vendor-guava-26_0-jre:0.1
@@ -270,58 +283,58 @@ org.apache.mina:mina-core:2.1.6
org.apache.sshd:sshd-core:2.0.0
org.apache.sshd:sshd-scp:2.0.0
org.apache.sshd:sshd-sftp:2.0.0
org.apache.tomcat:tomcat-annotations-api:10.1.0-M14
org.apache.tomcat:tomcat-annotations-api:10.1.0-M15
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
org.checkerframework:checker-compat-qual:2.5.5
org.checkerframework:checker-qual:3.21.4
org.checkerframework:checker-qual:3.22.0
org.codehaus.jackson:jackson-core-asl:1.9.13
org.codehaus.jackson:jackson-mapper-asl:1.9.13
org.codehaus.mojo:animal-sniffer-annotations:1.21
org.conscrypt:conscrypt-openjdk-uber:2.5.1
org.easymock:easymock:3.0
org.flywaydb:flyway-core:8.5.10
org.flywaydb:flyway-core:8.5.12
org.glassfish.jaxb:jaxb-runtime:2.3.1
org.glassfish.jaxb:txw2:2.3.1
org.hamcrest:hamcrest-core:2.2
org.hamcrest:hamcrest-library:2.2
org.hamcrest:hamcrest:2.2
org.hibernate.common:hibernate-commons-annotations:5.1.2.Final
org.hibernate:hibernate-core:5.6.8.Final
org.hibernate:hibernate-hikaricp:5.6.8.Final
org.hibernate:hibernate-core:5.6.9.Final
org.hibernate:hibernate-hikaricp:5.6.9.Final
org.jboss.logging:jboss-logging:3.4.3.Final
org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec:1.1.1.Final
org.jboss:jandex:2.4.2.Final
org.jetbrains:annotations:17.0.0
org.joda:joda-money:1.0.1
org.json:json:20200518
org.jsoup:jsoup:1.14.3
org.junit-pioneer:junit-pioneer:1.7.0
org.junit.jupiter:junit-jupiter-api:5.8.2
org.junit.jupiter:junit-jupiter-engine:5.8.2
org.junit.jupiter:junit-jupiter-migrationsupport:5.8.2
org.junit.jupiter:junit-jupiter-params:5.8.2
org.junit.platform:junit-platform-commons:1.8.2
org.junit.platform:junit-platform-engine:1.8.2
org.junit.platform:junit-platform-launcher:1.8.2
org.junit.platform:junit-platform-runner:1.8.2
org.junit.platform:junit-platform-suite-api:1.8.2
org.junit.platform:junit-platform-suite-commons:1.8.2
org.junit:junit-bom:5.8.2
org.jsoup:jsoup:1.15.1
org.junit-pioneer:junit-pioneer:1.7.1
org.junit.jupiter:junit-jupiter-api:5.9.0-M1
org.junit.jupiter:junit-jupiter-engine:5.9.0-M1
org.junit.jupiter:junit-jupiter-migrationsupport:5.9.0-M1
org.junit.jupiter:junit-jupiter-params:5.9.0-M1
org.junit.platform:junit-platform-commons:1.9.0-M1
org.junit.platform:junit-platform-engine:1.9.0-M1
org.junit.platform:junit-platform-launcher:1.9.0-M1
org.junit.platform:junit-platform-runner:1.9.0-M1
org.junit.platform:junit-platform-suite-api:1.9.0-M1
org.junit.platform:junit-platform-suite-commons:1.9.0-M1
org.junit:junit-bom:5.9.0-M1
org.jvnet.staxex:stax-ex:1.8
org.mockito:mockito-core:4.5.1
org.mockito:mockito-junit-jupiter:4.5.1
org.mockito:mockito-core:4.6.1
org.mockito:mockito-junit-jupiter:4.6.1
org.mortbay.jetty:jetty-util:6.1.26
org.mortbay.jetty:jetty:6.1.26
org.objenesis:objenesis:3.2
org.opentest4j:opentest4j:1.2.0
org.ow2.asm:asm-analysis:9.2
org.ow2.asm:asm-analysis:9.3
org.ow2.asm:asm-commons:9.2
org.ow2.asm:asm-tree:9.2
org.ow2.asm:asm-util:9.2
org.ow2.asm:asm:9.2
org.postgresql:postgresql:42.3.4
org.ow2.asm:asm-tree:9.3
org.ow2.asm:asm-util:9.3
org.ow2.asm:asm:9.3
org.postgresql:postgresql:42.3.6
org.rnorth.duct-tape:duct-tape:1.0.8
org.seleniumhq.selenium:selenium-api:3.141.59
org.seleniumhq.selenium:selenium-chrome-driver:3.141.59
@@ -337,14 +350,15 @@ org.slf4j:jcl-over-slf4j:1.7.30
org.slf4j:jul-to-slf4j:1.7.30
org.slf4j:slf4j-api:2.0.0-alpha7
org.slf4j:slf4j-jdk14:2.0.0-alpha7
org.springframework:spring-core:4.3.18.RELEASE
org.springframework:spring-expression:4.3.18.RELEASE
org.testcontainers:database-commons:1.17.1
org.testcontainers:jdbc:1.17.1
org.testcontainers:junit-jupiter:1.17.1
org.testcontainers:postgresql:1.17.1
org.testcontainers:selenium:1.17.1
org.testcontainers:testcontainers:1.17.1
org.springframework:spring-core:5.3.18
org.springframework:spring-expression:5.3.18
org.springframework:spring-jcl:5.3.18
org.testcontainers:database-commons:1.17.2
org.testcontainers:jdbc:1.17.2
org.testcontainers:junit-jupiter:1.17.2
org.testcontainers:postgresql:1.17.2
org.testcontainers:selenium:1.17.2
org.testcontainers:testcontainers:1.17.2
org.threeten:threetenbp:1.6.0
org.tukaani:xz:1.5
org.w3c.css:sac:1.3
@@ -21,7 +21,6 @@ import static google.registry.backup.ExportCommitLogDiffAction.UPPER_CHECKPOINT_
import static google.registry.backup.RestoreCommitLogsAction.BUCKET_OVERRIDE_PARAM;
import static google.registry.backup.RestoreCommitLogsAction.FROM_TIME_PARAM;
import static google.registry.backup.RestoreCommitLogsAction.TO_TIME_PARAM;
import static google.registry.backup.SyncDatastoreToSqlSnapshotAction.SQL_SNAPSHOT_ID_PARAM;
import static google.registry.request.RequestParameters.extractOptionalParameter;
import static google.registry.request.RequestParameters.extractRequiredDatetimeParameter;
import static google.registry.request.RequestParameters.extractRequiredParameter;
@@ -99,12 +98,6 @@ public final class BackupModule {
return extractRequiredDatetimeParameter(req, TO_TIME_PARAM);
}
@Provides
@Parameter(SQL_SNAPSHOT_ID_PARAM)
static String provideSqlSnapshotId(HttpServletRequest req) {
return extractRequiredParameter(req, SQL_SNAPSHOT_ID_PARAM);
}
@Provides
@Backups
static ListeningExecutorService provideListeningExecutorService() {
@@ -21,7 +21,6 @@ import com.google.storage.onestore.v3.OnestoreEntity.Path;
import com.google.storage.onestore.v3.OnestoreEntity.Property.Meaning;
import com.google.storage.onestore.v3.OnestoreEntity.PropertyValue.ReferenceValue;
import google.registry.model.annotations.DeleteAfterMigration;
import java.nio.charset.StandardCharsets;
import java.util.Objects;
/** Utilities for handling imported Datastore entities. */
@@ -68,9 +67,7 @@ public class EntityImports {
if (path.elementSize() == 0) {
return false;
}
return Objects.equals(
path.getElement(path.elementSize() - 1).getType(StandardCharsets.UTF_8),
"CommitLogMutation");
return Objects.equals(path.getElement(path.elementSize() - 1).getType(), "CommitLogMutation");
}
private static void fixMutationEntityProtoBytes(EntityProto entityProto, String appId) {
@@ -1,321 +0,0 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.backup;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static google.registry.backup.ExportCommitLogDiffAction.DIFF_FILE_PREFIX;
import static google.registry.backup.RestoreCommitLogsAction.DRY_RUN_PARAM;
import static google.registry.model.ofy.EntityWritePriorities.getEntityPriority;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.util.DateTimeUtils.isAtOrAfter;
import static google.registry.util.DateTimeUtils.isBeforeOrAt;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static org.joda.time.Duration.standardHours;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.cloud.storage.BlobInfo;
import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger;
import google.registry.config.RegistryConfig.Config;
import google.registry.gcs.GcsUtils;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.DatastoreOnlyEntity;
import google.registry.model.replay.NonReplicatedEntity;
import google.registry.model.replay.ReplaySpecializer;
import google.registry.model.replay.SqlReplayCheckpoint;
import google.registry.model.server.Lock;
import google.registry.model.translators.VKeyTranslatorFactory;
import google.registry.persistence.VKey;
import google.registry.request.Action;
import google.registry.request.Action.Method;
import google.registry.request.Parameter;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.RequestStatusChecker;
import java.io.IOException;
import java.io.InputStream;
import java.util.Optional;
import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.Seconds;
/** Action that replays commit logs to Cloud SQL to keep it up to date. */
@Action(
service = Action.Service.BACKEND,
path = ReplayCommitLogsToSqlAction.PATH,
method = Method.POST,
automaticallyPrintOk = true,
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
@DeleteAfterMigration
public class ReplayCommitLogsToSqlAction implements Runnable {
static final String PATH = "/_dr/task/replayCommitLogsToSql";
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
public static final String REPLAY_TO_SQL_LOCK_NAME =
ReplayCommitLogsToSqlAction.class.getSimpleName();
public static final Duration REPLAY_TO_SQL_LOCK_LEASE_LENGTH = standardHours(1);
// Stop / pause where we are if we've been replaying for more than five minutes to avoid GAE
// request timeouts
private static final Duration REPLAY_TIMEOUT_DURATION = Duration.standardMinutes(5);
@Inject GcsUtils gcsUtils;
@Inject Response response;
@Inject RequestStatusChecker requestStatusChecker;
@Inject GcsDiffFileLister diffLister;
@Inject Clock clock;
@Inject
@Config("commitLogGcsBucket")
String gcsBucket;
/** If true, will exit after logging the commit log files that would otherwise be replayed. */
@Inject
@Parameter(DRY_RUN_PARAM)
boolean dryRun;
@Inject
ReplayCommitLogsToSqlAction() {}
@Override
public void run() {
DateTime startTime = clock.nowUtc();
MigrationState state = DatabaseMigrationStateSchedule.getValueAtTime(startTime);
if (!state.getReplayDirection().equals(ReplayDirection.DATASTORE_TO_SQL)) {
String message =
String.format(
"Skipping ReplayCommitLogsToSqlAction because we are in migration phase %s.", state);
logger.atInfo().log(message);
// App Engine will retry on any non-2xx status code, which we don't want in this case.
response.setStatus(SC_NO_CONTENT);
response.setPayload(message);
return;
}
Optional<Lock> lock =
Lock.acquireSql(
REPLAY_TO_SQL_LOCK_NAME,
null,
REPLAY_TO_SQL_LOCK_LEASE_LENGTH,
requestStatusChecker,
false);
if (!lock.isPresent()) {
String message = "Can't acquire SQL commit log replay lock, aborting.";
logger.atSevere().log(message);
// App Engine will retry on any non-2xx status code, which we don't want in this case.
// Let the next run after the next export happen naturally.
response.setStatus(SC_NO_CONTENT);
response.setPayload(message);
return;
}
try {
logger.atInfo().log("Beginning replay of commit logs.");
String resultMessage;
if (dryRun) {
resultMessage = executeDryRun();
} else {
resultMessage = replayFiles(startTime);
}
response.setStatus(SC_OK);
response.setPayload(resultMessage);
logger.atInfo().log(resultMessage);
} catch (Throwable t) {
String message = "Errored out replaying files.";
logger.atSevere().withCause(t).log(message);
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
response.setPayload(message);
} finally {
lock.ifPresent(Lock::releaseSql);
}
}
private String executeDryRun() {
// Start at the first millisecond we haven't seen yet
DateTime searchStartTime = jpaTm().transact(() -> SqlReplayCheckpoint.get().plusMillis(1));
// Search through the end of the hour
DateTime searchEndTime =
searchStartTime.withMinuteOfHour(59).withSecondOfMinute(59).withMillisOfSecond(999);
ImmutableList<String> fileBatch =
diffLister.listDiffFiles(gcsBucket, searchStartTime, searchEndTime).stream()
.map(BlobInfo::getName)
.collect(toImmutableList());
return String.format(
"Running in dry-run mode, the first set of commit log files processed would be from "
+ "searching from %s to %s and would contain %d file(s). They are (limit 10): \n%s",
searchStartTime,
searchEndTime,
fileBatch.size(),
fileBatch.stream().limit(10).collect(toImmutableList()));
}
private String replayFiles(DateTime startTime) {
DateTime replayTimeoutTime = startTime.plus(REPLAY_TIMEOUT_DURATION);
DateTime searchStartTime = jpaTm().transact(() -> SqlReplayCheckpoint.get().plusMillis(1));
int filesProcessed = 0;
int transactionsProcessed = 0;
// Starting from one millisecond after the last file we processed, search for and import files
// one hour at a time until we catch up to the current time or we hit the replay timeout (in
// which case the next run will pick up from where we leave off).
//
// We use hour-long batches because GCS supports filename prefix-based searches.
while (true) {
if (isAtOrAfter(clock.nowUtc(), replayTimeoutTime)) {
return createResponseString(
"Reached max execution time", startTime, filesProcessed, transactionsProcessed);
}
if (isBeforeOrAt(clock.nowUtc(), searchStartTime)) {
return createResponseString(
"Caught up to current time", startTime, filesProcessed, transactionsProcessed);
}
// Search through the end of the hour
DateTime searchEndTime =
searchStartTime.withMinuteOfHour(59).withSecondOfMinute(59).withMillisOfSecond(999);
ImmutableList<BlobInfo> fileBatch =
diffLister.listDiffFiles(gcsBucket, searchStartTime, searchEndTime);
if (fileBatch.isEmpty()) {
logger.atInfo().log(
"No remaining files found in hour %s, continuing search in the next hour.",
searchStartTime.toString("yyyy-MM-dd HH"));
}
for (BlobInfo file : fileBatch) {
transactionsProcessed += processFile(file);
filesProcessed++;
if (clock.nowUtc().isAfter(replayTimeoutTime)) {
return createResponseString(
"Reached max execution time", startTime, filesProcessed, transactionsProcessed);
}
}
searchStartTime = searchEndTime.plusMillis(1);
}
}
private String createResponseString(
String msg, DateTime startTime, int filesProcessed, int transactionsProcessed) {
double tps =
(double) transactionsProcessed
/ (double) Seconds.secondsBetween(startTime, clock.nowUtc()).getSeconds();
return String.format(
"%s after replaying %d file(s) containing %d total transaction(s) (%.2f tx/s).",
msg, filesProcessed, transactionsProcessed, tps);
}
/**
* Replays the commit logs in the given commit log file and returns the number of transactions
* committed.
*/
private int processFile(BlobInfo metadata) {
try (InputStream input = gcsUtils.openInputStream(metadata.getBlobId())) {
// Load and process the Datastore transactions one at a time
ImmutableList<ImmutableList<VersionedEntity>> allTransactions =
CommitLogImports.loadEntitiesByTransaction(input);
try (UpdateAutoTimestamp.DisableAutoUpdateResource disabler =
UpdateAutoTimestamp.disableAutoUpdate()) {
allTransactions.forEach(
transaction -> jpaTm().transact(() -> replayTransaction(transaction)));
}
// if we succeeded, set the last-seen time
DateTime checkpoint = DateTime.parse(metadata.getName().substring(DIFF_FILE_PREFIX.length()));
jpaTm().transact(() -> SqlReplayCheckpoint.set(checkpoint));
logger.atInfo().log(
"Replayed %d transactions from commit log file %s with size %d B.",
allTransactions.size(), metadata.getName(), metadata.getSize());
return allTransactions.size();
} catch (IOException e) {
throw new RuntimeException(
"Errored out while replaying commit log file " + metadata.getName(), e);
}
}
private void replayTransaction(ImmutableList<VersionedEntity> transaction) {
transaction.stream()
.sorted(ReplayCommitLogsToSqlAction::compareByWeight)
.forEach(
versionedEntity -> {
if (versionedEntity.getEntity().isPresent()) {
handleEntityPut(versionedEntity.getEntity().get());
} else {
handleEntityDelete(versionedEntity);
}
});
}
private void handleEntityPut(Entity entity) {
Object ofyPojo = auditedOfy().toPojo(entity);
try {
if (ofyPojo instanceof DatastoreEntity) {
DatastoreEntity datastoreEntity = (DatastoreEntity) ofyPojo;
datastoreEntity
.toSqlEntity()
.ifPresent(
sqlEntity -> {
sqlEntity.beforeSqlSaveOnReplay();
jpaTm().putIgnoringReadOnlyWithoutBackup(sqlEntity);
});
} else {
// this should never happen, but we shouldn't fail on it
logger.atSevere().log(
"%s does not implement DatastoreEntity, which is necessary for SQL replay.",
ofyPojo.getClass());
}
} catch (Throwable t) {
logger.atSevere().log("Error when replaying object %s.", ofyPojo);
throw t;
}
}
private void handleEntityDelete(VersionedEntity entityToDelete) {
Key key = entityToDelete.key();
VKey<?> entityVKey;
try {
entityVKey = VKeyTranslatorFactory.createVKey(key);
} catch (RuntimeException e) {
// This means that the key wasn't convertible to VKey through the standard methods or via
// a createVKey method. This means that the object isn't persisted in SQL so we ignore it.
logger.atInfo().log(
"Skipping SQL delete for kind %s since it is not convertible.", key.getKind());
return;
}
try {
Class<?> entityClass = entityVKey.getKind();
// Delete the key iff the class represents a JPA entity that is replicated
if (!NonReplicatedEntity.class.isAssignableFrom(entityClass)
&& !DatastoreOnlyEntity.class.isAssignableFrom(entityClass)
&& entityClass.getAnnotation(javax.persistence.Entity.class) != null) {
ReplaySpecializer.beforeSqlDelete(entityVKey);
jpaTm().deleteIgnoringReadOnlyWithoutBackup(entityVKey);
}
} catch (Throwable t) {
logger.atSevere().log("Error when deleting key %s.", entityVKey);
throw t;
}
}
private static int compareByWeight(VersionedEntity a, VersionedEntity b) {
return getEntityPriority(a.key().getKind(), !a.getEntity().isPresent())
- getEntityPriority(b.key().getKind(), !b.getEntity().isPresent());
}
}
@@ -1,187 +0,0 @@
// Copyright 2022 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.backup;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import com.google.common.flogger.FluentLogger;
import google.registry.beam.comparedb.LatestDatastoreSnapshotFinder;
import google.registry.config.RegistryConfig.Config;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.ofy.CommitLogCheckpoint;
import google.registry.model.replay.ReplicateToDatastoreAction;
import google.registry.request.Action;
import google.registry.request.Action.Service;
import google.registry.request.Parameter;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
import google.registry.util.Sleeper;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import java.util.Optional;
import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/**
* Synchronizes Datastore to a given SQL snapshot when SQL is the primary database.
*
* <p>The caller takes the responsibility for:
*
* <ul>
* <li>verifying the current migration stage
* <li>acquiring the {@link ReplicateToDatastoreAction#REPLICATE_TO_DATASTORE_LOCK_NAME
* replication lock}, and
* <li>while holding the lock, creating an SQL snapshot and invoking this action with the snapshot
* id
* </ul>
*
* The caller may release the replication lock upon receiving the response from this action. Please
* refer to {@link google.registry.tools.ValidateDatastoreCommand} for more information on usage.
*
* <p>This action plays SQL transactions up to the user-specified snapshot, creates a new CommitLog
* checkpoint, and exports all CommitLogs to GCS up to this checkpoint. The timestamp of this
* checkpoint can be used to recreate a Datastore snapshot that is equivalent to the given SQL
* snapshot. If this action succeeds, the checkpoint timestamp is included in the response (the
* format of which is defined by {@link #SUCCESS_RESPONSE_TEMPLATE}).
*/
@Action(
service = Service.BACKEND,
path = SyncDatastoreToSqlSnapshotAction.PATH,
method = Action.Method.POST,
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
@DeleteAfterMigration
public class SyncDatastoreToSqlSnapshotAction implements Runnable {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
public static final String PATH = "/_dr/task/syncDatastoreToSqlSnapshot";
public static final String SUCCESS_RESPONSE_TEMPLATE =
"Datastore is up-to-date with provided SQL snapshot (%s). CommitLog timestamp is (%s).";
static final String SQL_SNAPSHOT_ID_PARAM = "sqlSnapshotId";
private static final int COMMITLOGS_PRESENCE_CHECK_ATTEMPTS = 10;
private static final Duration COMMITLOGS_PRESENCE_CHECK_DELAY = Duration.standardSeconds(6);
private final Response response;
private final Sleeper sleeper;
@Config("commitLogGcsBucket")
private final String gcsBucket;
private final GcsDiffFileLister gcsDiffFileLister;
private final LatestDatastoreSnapshotFinder datastoreSnapshotFinder;
private final CommitLogCheckpointAction commitLogCheckpointAction;
private final String sqlSnapshotId;
@Inject
SyncDatastoreToSqlSnapshotAction(
Response response,
Sleeper sleeper,
@Config("commitLogGcsBucket") String gcsBucket,
GcsDiffFileLister gcsDiffFileLister,
LatestDatastoreSnapshotFinder datastoreSnapshotFinder,
CommitLogCheckpointAction commitLogCheckpointAction,
@Parameter(SQL_SNAPSHOT_ID_PARAM) String sqlSnapshotId) {
this.response = response;
this.sleeper = sleeper;
this.gcsBucket = gcsBucket;
this.gcsDiffFileLister = gcsDiffFileLister;
this.datastoreSnapshotFinder = datastoreSnapshotFinder;
this.commitLogCheckpointAction = commitLogCheckpointAction;
this.sqlSnapshotId = sqlSnapshotId;
}
@Override
public void run() {
logger.atInfo().log("Datastore validation invoked. SqlSnapshotId is %s.", sqlSnapshotId);
try {
CommitLogCheckpoint checkpoint = ensureDatabasesComparable(sqlSnapshotId);
response.setStatus(SC_OK);
response.setPayload(
String.format(SUCCESS_RESPONSE_TEMPLATE, sqlSnapshotId, checkpoint.getCheckpointTime()));
return;
} catch (Throwable e) {
logger.atSevere().withCause(e).log("Failed to sync Datastore to SQL.");
response.setStatus(SC_INTERNAL_SERVER_ERROR);
response.setPayload(getStackTrace(e));
}
}
private static String getStackTrace(Throwable e) {
try {
ByteArrayOutputStream bis = new ByteArrayOutputStream();
PrintStream printStream = new PrintStream(bis);
e.printStackTrace(printStream);
printStream.close();
return bis.toString();
} catch (RuntimeException re) {
return re.getMessage();
}
}
private CommitLogCheckpoint ensureDatabasesComparable(String sqlSnapshotId) {
// Replicate SQL transaction to Datastore, up to when this snapshot is taken.
int playbacks = ReplicateToDatastoreAction.replayAllTransactions(Optional.of(sqlSnapshotId));
logger.atInfo().log("Played %s SQL transactions.", playbacks);
Optional<CommitLogCheckpoint> checkpoint = exportCommitLogs();
if (!checkpoint.isPresent()) {
throw new RuntimeException("Cannot create CommitLog checkpoint");
}
logger.atInfo().log(
"CommitLog checkpoint created at %s.", checkpoint.get().getCheckpointTime());
verifyCommitLogsPersisted(checkpoint.get());
return checkpoint.get();
}
private Optional<CommitLogCheckpoint> exportCommitLogs() {
// Trigger an async CommitLog export to GCS. Will check file availability later.
// Although we can add support to synchronous execution, it can disrupt the export cadence
// when the system is busy
Optional<CommitLogCheckpoint> checkpoint =
commitLogCheckpointAction.createCheckPointAndStartAsyncExport();
// Failure to create checkpoint most likely caused by race with cron-triggered checkpointing.
// Retry once.
if (!checkpoint.isPresent()) {
commitLogCheckpointAction.createCheckPointAndStartAsyncExport();
}
return checkpoint;
}
private void verifyCommitLogsPersisted(CommitLogCheckpoint checkpoint) {
DateTime exportStartTime =
datastoreSnapshotFinder
.getSnapshotInfo(checkpoint.getCheckpointTime().toInstant())
.exportInterval()
.getStart();
logger.atInfo().log("Found Datastore export at %s", exportStartTime);
for (int attempts = 0; attempts < COMMITLOGS_PRESENCE_CHECK_ATTEMPTS; attempts++) {
try {
gcsDiffFileLister.listDiffFiles(gcsBucket, exportStartTime, checkpoint.getCheckpointTime());
return;
} catch (IllegalStateException e) {
// Gap in commitlog files. Fall through to sleep and retry.
logger.atInfo().log("Commitlog files not yet found on GCS.");
}
sleeper.sleepInterruptibly(COMMITLOGS_PRESENCE_CHECK_DELAY);
}
throw new RuntimeException("Cannot find all commitlog files.");
}
}
@@ -1,621 +0,0 @@
// Copyright 2017 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.batch;
import static com.google.appengine.api.taskqueue.QueueConstants.maxLeaseCount;
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.math.IntMath.divide;
import static com.googlecode.objectify.Key.getKind;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_CLIENT_TRANSACTION_ID;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_IS_SUPERUSER;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_REQUESTED_TIME;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_REQUESTING_CLIENT_ID;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_RESOURCE_KEY;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_SERVER_TRANSACTION_ID;
import static google.registry.batch.AsyncTaskEnqueuer.QUEUE_ASYNC_DELETE;
import static google.registry.model.EppResourceUtils.isActive;
import static google.registry.model.EppResourceUtils.isDeleted;
import static google.registry.model.ResourceTransferUtils.denyPendingTransfer;
import static google.registry.model.ResourceTransferUtils.handlePendingTransferOnDelete;
import static google.registry.model.ResourceTransferUtils.updateForeignKeyIndexDeletionTime;
import static google.registry.model.eppcommon.StatusValue.PENDING_DELETE;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_DELETE;
import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_DELETE_FAILURE;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_DELETE;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_DELETE_FAILURE;
import static google.registry.model.transfer.TransferStatus.SERVER_CANCELLED;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static java.math.RoundingMode.CEILING;
import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.SECONDS;
import static java.util.logging.Level.INFO;
import static java.util.logging.Level.SEVERE;
import static org.joda.time.Duration.standardHours;
import com.google.appengine.api.taskqueue.LeaseOptions;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.TaskHandle;
import com.google.appengine.api.taskqueue.TransientFailureException;
import com.google.appengine.tools.mapreduce.Mapper;
import com.google.appengine.tools.mapreduce.Reducer;
import com.google.appengine.tools.mapreduce.ReducerInput;
import com.google.auto.value.AutoValue;
import com.google.common.collect.HashMultiset;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterators;
import com.google.common.collect.Multiset;
import com.google.common.flogger.FluentLogger;
import com.googlecode.objectify.Key;
import google.registry.batch.AsyncTaskMetrics.OperationResult;
import google.registry.batch.AsyncTaskMetrics.OperationType;
import google.registry.batch.DeleteContactsAndHostsAction.DeletionResult.Type;
import google.registry.dns.DnsQueue;
import google.registry.mapreduce.MapreduceRunner;
import google.registry.mapreduce.UnlockerOutput;
import google.registry.mapreduce.inputs.EppResourceInputs;
import google.registry.mapreduce.inputs.NullInput;
import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.ExternalMessagingName;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppcommon.Trid;
import google.registry.model.eppoutput.EppResponse.ResponseData;
import google.registry.model.host.HostResource;
import google.registry.model.poll.PendingActionNotificationResponse.ContactPendingActionNotificationResponse;
import google.registry.model.poll.PendingActionNotificationResponse.HostPendingActionNotificationResponse;
import google.registry.model.poll.PollMessage;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.server.Lock;
import google.registry.persistence.VKey;
import google.registry.request.Action;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.NonFinalForTesting;
import google.registry.util.RequestStatusChecker;
import google.registry.util.Retrier;
import google.registry.util.SystemClock;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.logging.Level;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/**
* A mapreduce that processes batch asynchronous deletions of contact and host resources by mapping
* over all domains and checking for any references to the contacts/hosts in pending deletion.
*/
@Deprecated
@Action(
service = Action.Service.BACKEND,
path = "/_dr/task/deleteContactsAndHosts",
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
@DeleteAfterMigration
public class DeleteContactsAndHostsAction implements Runnable {
static final String KIND_CONTACT = getKind(ContactResource.class);
static final String KIND_HOST = getKind(HostResource.class);
private static final Duration LEASE_LENGTH = standardHours(4);
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final int MAX_REDUCE_SHARDS = 50;
private static final int DELETES_PER_SHARD = 5;
@Inject AsyncTaskMetrics asyncTaskMetrics;
@Inject Clock clock;
@Inject MapreduceRunner mrRunner;
@Inject @Named(QUEUE_ASYNC_DELETE) Queue queue;
@Inject RequestStatusChecker requestStatusChecker;
@Inject Response response;
@Inject Retrier retrier;
@Inject DeleteContactsAndHostsAction() {}
@Override
public void run() {
// Check if the lock can be acquired, and if not, a previous run of this mapreduce is still
// executing, so return early.
Optional<Lock> lock =
Lock.acquire(
DeleteContactsAndHostsAction.class.getSimpleName(),
null,
LEASE_LENGTH,
requestStatusChecker,
false);
if (!lock.isPresent()) {
logRespondAndUnlock(INFO, "Can't acquire lock; aborting.", lock);
return;
}
// Lease the async tasks to process.
LeaseOptions options =
LeaseOptions.Builder.withCountLimit(maxLeaseCount())
.leasePeriod(LEASE_LENGTH.getStandardSeconds(), SECONDS);
List<TaskHandle> tasks = queue.leaseTasks(options);
asyncTaskMetrics.recordContactHostDeletionBatchSize(tasks.size());
// Check if there are no tasks to process, and if so, return early.
if (tasks.isEmpty()) {
logRespondAndUnlock(INFO, "No contact/host deletion tasks in pull queue; finishing.", lock);
return;
}
Multiset<String> kindCounts = HashMultiset.create(2);
ImmutableList.Builder<DeletionRequest> builder = new ImmutableList.Builder<>();
ImmutableList.Builder<Key<? extends EppResource>> resourceKeys = new ImmutableList.Builder<>();
final List<DeletionRequest> requestsToDelete = new ArrayList<>();
for (TaskHandle task : tasks) {
try {
DeletionRequest deletionRequest = DeletionRequest.createFromTask(task, clock.nowUtc());
if (deletionRequest.isDeletionAllowed()) {
builder.add(deletionRequest);
resourceKeys.add(deletionRequest.key());
kindCounts.add(deletionRequest.key().getKind());
} else {
requestsToDelete.add(deletionRequest);
}
} catch (Exception e) {
logger.atSevere().withCause(e).log(
"Could not parse async deletion request, delaying task for a day: %s", task);
// Grab the lease for a whole day, so that it won't continue throwing errors every five
// minutes.
queue.modifyTaskLease(task, 1L, DAYS);
}
}
deleteStaleTasksWithRetry(requestsToDelete);
ImmutableList<DeletionRequest> deletionRequests = builder.build();
if (deletionRequests.isEmpty()) {
logRespondAndUnlock(
INFO, "No async deletions to process because all were already handled.", lock);
} else {
logger.atInfo().log(
"Processing asynchronous deletion of %d contacts and %d hosts: %s",
kindCounts.count(KIND_CONTACT), kindCounts.count(KIND_HOST), resourceKeys.build());
runMapreduce(deletionRequests, lock);
}
}
/**
* Deletes a list of tasks associated with deletion requests from the async delete queue using a
* retrier.
*/
private void deleteStaleTasksWithRetry(final List<DeletionRequest> deletionRequests) {
if (deletionRequests.isEmpty()) {
return;
}
final List<TaskHandle> tasks =
deletionRequests.stream().map(DeletionRequest::task).collect(toImmutableList());
retrier.callWithRetry(() -> queue.deleteTask(tasks), TransientFailureException.class);
deletionRequests.forEach(
deletionRequest ->
asyncTaskMetrics.recordAsyncFlowResult(
deletionRequest.getMetricOperationType(),
OperationResult.STALE,
deletionRequest.requestedTime()));
}
private void runMapreduce(ImmutableList<DeletionRequest> deletionRequests, Optional<Lock> lock) {
try {
int numReducers =
Math.min(MAX_REDUCE_SHARDS, divide(deletionRequests.size(), DELETES_PER_SHARD, CEILING));
mrRunner
.setJobName("Check for EPP resource references and then delete")
.setModuleName("backend")
.setDefaultReduceShards(numReducers)
.runMapreduce(
new DeleteContactsAndHostsMapper(deletionRequests),
new DeleteEppResourceReducer(),
ImmutableList.of(
// Add an extra shard that maps over a null domain. See the mapper code for why.
new NullInput<>(), EppResourceInputs.createEntityInput(DomainBase.class)),
new UnlockerOutput<Void>(lock.get()))
.sendLinkToMapreduceConsole(response);
} catch (Throwable t) {
logRespondAndUnlock(SEVERE, "Error starting mapreduce to delete contacts/hosts.", lock);
}
}
private void logRespondAndUnlock(Level level, String message, Optional<Lock> lock) {
logger.at(level).log(message);
response.setPayload(message);
lock.ifPresent(Lock::release);
}
/**
* A mapper that iterates over all {@link DomainBase} entities.
*
* <p>It emits the target key and {@code true} for domains referencing the target resource. For
* the special input of {@code null} it emits the target key and {@code false}.
*/
public static class DeleteContactsAndHostsMapper
extends Mapper<DomainBase, DeletionRequest, Boolean> {
private static final long serialVersionUID = -253652818502690537L;
private final ImmutableList<DeletionRequest> deletionRequests;
DeleteContactsAndHostsMapper(ImmutableList<DeletionRequest> resourcesToDelete) {
this.deletionRequests = resourcesToDelete;
}
@Override
public void map(DomainBase domain) {
for (DeletionRequest deletionRequest : deletionRequests) {
if (domain == null) {
// The reducer only runs if at least one value is emitted. We add a null input to the
// mapreduce and emit one 'false' for each deletion request so that the reducer always
// runs for each requested deletion (so that it can finish up tasks if nothing else).
emit(deletionRequest, false);
} else if (isActive(domain, deletionRequest.lastUpdateTime())
&& isLinked(domain, deletionRequest.key())) {
emit(deletionRequest, true);
getContext()
.incrementCounter(
String.format("active Domain-%s links found", deletionRequest.key().getKind()));
}
}
if (domain != null) {
getContext().incrementCounter("domains processed");
}
}
/** Determine whether the target resource is a linked resource on the domain. */
private boolean isLinked(DomainBase domain, Key<? extends EppResource> resourceKey) {
if (resourceKey.getKind().equals(KIND_CONTACT)) {
return domain
.getReferencedContacts()
.contains(VKey.from((Key<ContactResource>) resourceKey));
} else if (resourceKey.getKind().equals(KIND_HOST)) {
return domain.getNameservers().contains(VKey.from((Key<HostResource>) resourceKey));
} else {
throw new IllegalStateException("EPP resource key of unknown type: " + resourceKey);
}
}
}
/**
* A reducer that checks if the EPP resource to be deleted is referenced anywhere, and then
* deletes it if not and unmarks it for deletion if so.
*/
public static class DeleteEppResourceReducer
extends Reducer<DeletionRequest, Boolean, Void> {
private static final long serialVersionUID = 6569363449285506326L;
private static final DnsQueue dnsQueue = DnsQueue.create();
@NonFinalForTesting
private static AsyncTaskMetrics asyncTaskMetrics = new AsyncTaskMetrics(new SystemClock());
@Override
public void reduce(final DeletionRequest deletionRequest, ReducerInput<Boolean> values) {
final boolean hasNoActiveReferences = !Iterators.contains(values, true);
logger.atInfo().log("Processing async deletion request for %s.", deletionRequest.key());
DeletionResult result =
tm()
.transactNew(
() -> {
DeletionResult deletionResult =
attemptToDeleteResource(deletionRequest, hasNoActiveReferences);
getQueue(QUEUE_ASYNC_DELETE).deleteTask(deletionRequest.task());
return deletionResult;
});
asyncTaskMetrics.recordAsyncFlowResult(
deletionRequest.getMetricOperationType(),
result.getMetricOperationResult(),
deletionRequest.requestedTime());
String resourceNamePlural = deletionRequest.key().getKind() + "s";
getContext().incrementCounter(result.type().renderCounterText(resourceNamePlural));
logger.atInfo().log(
"Result of async deletion for resource %s: %s",
deletionRequest.key(), result.pollMessageText());
}
private DeletionResult attemptToDeleteResource(
DeletionRequest deletionRequest, boolean hasNoActiveReferences) {
DateTime now = tm().getTransactionTime();
EppResource resource =
auditedOfy().load().key(deletionRequest.key()).now().cloneProjectedAtTime(now);
// Double-check transactionally that the resource is still active and in PENDING_DELETE.
if (!doesResourceStateAllowDeletion(resource, now)) {
return DeletionResult.create(Type.ERRORED, "");
}
// Contacts and external hosts have a direct client id. For subordinate hosts it needs to be
// read off of the superordinate domain.
String resourceRegistrarId = resource.getPersistedCurrentSponsorRegistrarId();
if (resource instanceof HostResource && ((HostResource) resource).isSubordinate()) {
resourceRegistrarId =
tm().loadByKey(((HostResource) resource).getSuperordinateDomain())
.cloneProjectedAtTime(now)
.getCurrentSponsorRegistrarId();
}
boolean requestedByCurrentOwner =
resourceRegistrarId.equals(deletionRequest.requestingClientId());
boolean deleteAllowed =
hasNoActiveReferences && (requestedByCurrentOwner || deletionRequest.isSuperuser());
String resourceTypeName =
resource.getClass().getAnnotation(ExternalMessagingName.class).value();
String pollMessageText =
deleteAllowed
? String.format("Deleted %s %s.", resourceTypeName, resource.getForeignKey())
: String.format(
"Can't delete %s %s because %s.",
resourceTypeName,
resource.getForeignKey(),
requestedByCurrentOwner
? "it is referenced by a domain"
: "it was transferred prior to deletion");
HistoryEntry historyEntry =
HistoryEntry.createBuilderForResource(resource)
.setRegistrarId(deletionRequest.requestingClientId())
.setModificationTime(now)
.setType(getHistoryEntryType(resource, deleteAllowed))
.build();
PollMessage.OneTime pollMessage =
new PollMessage.OneTime.Builder()
.setRegistrarId(deletionRequest.requestingClientId())
.setMsg(pollMessageText)
.setParent(historyEntry)
.setEventTime(now)
.setResponseData(
getPollMessageResponseData(deletionRequest, resource, deleteAllowed, now))
.build();
EppResource resourceToSave;
if (deleteAllowed) {
EppResource.Builder<?, ?> resourceToSaveBuilder;
if (resource instanceof ContactResource) {
ContactResource contact = (ContactResource) resource;
// Handle pending transfers on contact deletion.
if (contact.getStatusValues().contains(StatusValue.PENDING_TRANSFER)) {
contact =
denyPendingTransfer(
contact, SERVER_CANCELLED, now, deletionRequest.requestingClientId());
}
// Wipe out PII on contact deletion.
resourceToSaveBuilder = contact.asBuilder().wipeOut();
} else {
resourceToSaveBuilder = resource.asBuilder();
}
resourceToSave = resourceToSaveBuilder.setDeletionTime(now).setStatusValues(null).build();
performDeleteTasks(resource, resourceToSave, now, historyEntry);
updateForeignKeyIndexDeletionTime(resourceToSave);
} else {
resourceToSave = resource.asBuilder().removeStatusValue(PENDING_DELETE).build();
}
auditedOfy()
.save()
.<ImmutableObject>entities(resourceToSave, historyEntry.asHistoryEntry(), pollMessage);
return DeletionResult.create(
deleteAllowed ? Type.DELETED : Type.NOT_DELETED, pollMessageText);
}
private static ImmutableList<? extends ResponseData> getPollMessageResponseData(
DeletionRequest deletionRequest,
EppResource resource,
boolean deleteAllowed,
DateTime now) {
@Nullable String clientTransactionId = deletionRequest.clientTransactionId();
String serverTransactionId = deletionRequest.serverTransactionId();
Trid trid = Trid.create(clientTransactionId, serverTransactionId);
if (resource instanceof HostResource) {
return ImmutableList.of(
HostPendingActionNotificationResponse.create(
((HostResource) resource).getHostName(), deleteAllowed, trid, now));
} else if (resource instanceof ContactResource) {
return ImmutableList.of(
ContactPendingActionNotificationResponse.create(
((ContactResource) resource).getContactId(), deleteAllowed, trid, now));
} else {
throw new IllegalStateException("EPP resource of unknown type " + Key.create(resource));
}
}
/**
* Determine the proper history entry type for the delete operation, as a function of
* whether or not the delete was successful.
*/
private HistoryEntry.Type getHistoryEntryType(EppResource resource, boolean successfulDelete) {
if (resource instanceof ContactResource) {
return successfulDelete ? CONTACT_DELETE : CONTACT_DELETE_FAILURE;
} else if (resource instanceof HostResource) {
return successfulDelete ? HOST_DELETE : HOST_DELETE_FAILURE;
} else {
throw new IllegalStateException("EPP resource of unknown type: " + Key.create(resource));
}
}
/** Perform any type-specific tasks on the resource to be deleted (and/or its dependencies). */
private void performDeleteTasks(
EppResource existingResource,
EppResource deletedResource,
DateTime deletionTime,
HistoryEntry historyEntryForDelete) {
if (existingResource instanceof ContactResource) {
handlePendingTransferOnDelete(
(ContactResource) existingResource,
(ContactResource) deletedResource,
deletionTime,
historyEntryForDelete);
} else if (existingResource instanceof HostResource) {
HostResource host = (HostResource) existingResource;
if (host.isSubordinate()) {
dnsQueue.addHostRefreshTask(host.getHostName());
tm().put(
tm().loadByKey(host.getSuperordinateDomain())
.asBuilder()
.removeSubordinateHost(host.getHostName())
.build());
}
} else {
throw new IllegalStateException(
"EPP resource of unknown type: " + Key.create(existingResource));
}
}
}
/** A class that encapsulates the values of a request to delete a contact or host. */
@AutoValue
abstract static class DeletionRequest implements Serializable {
private static final long serialVersionUID = -4612618525760839240L;
abstract Key<? extends EppResource> key();
abstract DateTime lastUpdateTime();
/**
* The client id of the registrar that requested this deletion (which might NOT be the same as
* the actual current owner of the resource).
*/
abstract String requestingClientId();
/** First half of TRID for the original request, split for serializability. */
@Nullable
abstract String clientTransactionId();
/** Second half of TRID for the original request, split for serializability. */
abstract String serverTransactionId();
abstract boolean isSuperuser();
abstract DateTime requestedTime();
abstract boolean isDeletionAllowed();
abstract TaskHandle task();
@AutoValue.Builder
abstract static class Builder {
abstract Builder setKey(Key<? extends EppResource> key);
abstract Builder setLastUpdateTime(DateTime lastUpdateTime);
abstract Builder setRequestingClientId(String requestingClientId);
abstract Builder setClientTransactionId(@Nullable String clientTransactionId);
abstract Builder setServerTransactionId(String serverTransactionId);
abstract Builder setIsSuperuser(boolean isSuperuser);
abstract Builder setRequestedTime(DateTime requestedTime);
abstract Builder setIsDeletionAllowed(boolean isDeletionAllowed);
abstract Builder setTask(TaskHandle task);
abstract DeletionRequest build();
}
static DeletionRequest createFromTask(TaskHandle task, DateTime now)
throws Exception {
ImmutableMap<String, String> params = ImmutableMap.copyOf(task.extractParams());
VKey<EppResource> resourceKey =
VKey.create(
checkNotNull(params.get(PARAM_RESOURCE_KEY), "Resource to delete not specified"));
EppResource resource =
checkNotNull(
auditedOfy().load().key(resourceKey.getOfyKey()).now(),
"Resource to delete doesn't exist");
checkState(
resource instanceof ContactResource || resource instanceof HostResource,
"Cannot delete a %s via this action",
resource.getClass().getSimpleName());
return new AutoValue_DeleteContactsAndHostsAction_DeletionRequest.Builder()
.setKey(resourceKey.getOfyKey())
.setLastUpdateTime(resource.getUpdateTimestamp().getTimestamp())
.setRequestingClientId(
checkNotNull(
params.get(PARAM_REQUESTING_CLIENT_ID), "Requesting client id not specified"))
// Note that client transaction ID is optional, in which case this sets it to null.
.setClientTransactionId(params.get(PARAM_CLIENT_TRANSACTION_ID))
.setServerTransactionId(
checkNotNull(
params.get(PARAM_SERVER_TRANSACTION_ID), "Server transaction id not specified"))
.setIsSuperuser(
Boolean.parseBoolean(
checkNotNull(params.get(PARAM_IS_SUPERUSER), "Is superuser not specified")))
.setRequestedTime(
DateTime.parse(
checkNotNull(params.get(PARAM_REQUESTED_TIME), "Requested time not specified")))
.setIsDeletionAllowed(doesResourceStateAllowDeletion(resource, now))
.setTask(task)
.build();
}
OperationType getMetricOperationType() {
if (key().getKind().equals(KIND_CONTACT)) {
return OperationType.CONTACT_DELETE;
} else if (key().getKind().equals(KIND_HOST)) {
return OperationType.HOST_DELETE;
} else {
throw new IllegalStateException(
String.format(
"Cannot determine async operation type for metric for resource %s", key()));
}
}
}
/** A class that encapsulates the values resulting from attempted contact/host deletion. */
@AutoValue
abstract static class DeletionResult {
enum Type {
DELETED("%s deleted", OperationResult.SUCCESS),
NOT_DELETED("%s not deleted", OperationResult.FAILURE),
ERRORED("%s errored out during deletion", OperationResult.ERROR);
private final String counterFormat;
private final OperationResult operationResult;
Type(String counterFormat, OperationResult operationResult) {
this.counterFormat = counterFormat;
this.operationResult = operationResult;
}
String renderCounterText(String resourceName) {
return String.format(counterFormat, resourceName);
}
}
abstract Type type();
abstract String pollMessageText();
static DeletionResult create(Type type, String pollMessageText) {
return new AutoValue_DeleteContactsAndHostsAction_DeletionResult(type, pollMessageText);
}
OperationResult getMetricOperationResult() {
return type().operationResult;
}
}
static boolean doesResourceStateAllowDeletion(EppResource resource, DateTime now) {
Key<EppResource> key = Key.create(resource);
if (isDeleted(resource, now)) {
logger.atWarning().log("Cannot asynchronously delete %s because it is already deleted.", key);
return false;
}
if (!resource.getStatusValues().contains(PENDING_DELETE)) {
logger.atWarning().log(
"Cannot asynchronously delete %s because it is not in PENDING_DELETE.", key);
return false;
}
return true;
}
}
@@ -17,6 +17,7 @@ package google.registry.batch;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.collect.Sets.difference;
import static com.google.common.collect.Sets.newHashSet;
import static google.registry.mapreduce.MapreduceRunner.PARAM_DRY_RUN;
import static google.registry.mapreduce.inputs.EppResourceInputs.createChildEntityInput;
import static google.registry.model.common.Cursor.CursorType.RECURRING_BILLING;
@@ -36,11 +37,14 @@ import static google.registry.util.DomainNameUtils.getTldFromDomainName;
import com.google.appengine.tools.mapreduce.Mapper;
import com.google.appengine.tools.mapreduce.Reducer;
import com.google.appengine.tools.mapreduce.ReducerInput;
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Range;
import com.google.common.collect.Streams;
import com.google.common.flogger.FluentLogger;
import google.registry.config.RegistryConfig.Config;
import google.registry.flows.domain.DomainPricingLogic;
import google.registry.mapreduce.MapreduceRunner;
import google.registry.mapreduce.inputs.NullInput;
import google.registry.model.ImmutableObject;
@@ -61,8 +65,10 @@ import google.registry.request.Parameter;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import javax.inject.Inject;
import org.joda.money.Money;
import org.joda.time.DateTime;
@@ -86,8 +92,15 @@ public class ExpandRecurringBillingEventsAction implements Runnable {
@Inject Clock clock;
@Inject MapreduceRunner mrRunner;
@Inject
@Config("jdbcBatchSize")
int batchSize;
@Inject @Parameter(PARAM_DRY_RUN) boolean isDryRun;
@Inject @Parameter(PARAM_CURSOR_TIME) Optional<DateTime> cursorTimeParam;
@Inject DomainPricingLogic domainPricingLogic;
@Inject Response response;
@Inject ExpandRecurringBillingEventsAction() {}
@@ -120,61 +133,130 @@ public class ExpandRecurringBillingEventsAction implements Runnable {
ImmutableSet.of(DomainBase.class), ImmutableSet.of(Recurring.class))))
.sendLinkToMapreduceConsole(response);
} else {
int numBillingEventsSaved =
jpaTm()
.transact(
() ->
jpaTm()
.query(
"FROM BillingRecurrence "
+ "WHERE eventTime <= :executeTime "
+ "AND eventTime < recurrenceEndTime "
+ "ORDER BY id ASC",
Recurring.class)
.setParameter("executeTime", executeTime)
// Need to get a list from the transaction and then convert it to a stream
// for further processing. If we get a stream directly, each elements gets
// processed downstream eagerly but Hibernate returns a
// ScrollableResultsIterator that cannot be advanced outside the
// transaction, resulting in an exception.
.getResultList())
.stream()
.map(
recurring ->
jpaTm()
.transact(
() ->
expandBillingEvent(recurring, executeTime, cursorTime, isDryRun)))
.reduce(0, Integer::sum);
if (!isDryRun) {
logger.atInfo().log("Saved OneTime billing events.", numBillingEventsSaved);
} else {
logger.atInfo().log("Generated OneTime billing events (dry run).", numBillingEventsSaved);
}
logger.atInfo().log(
"Recurring event expansion %s complete for billing event range [%s, %s).",
isDryRun ? "(dry run) " : "", cursorTime, executeTime);
tm().transact(
() -> {
// Check for the unlikely scenario where the cursor has been altered during the
// expansion.
DateTime currentCursorTime =
tm().loadByKeyIfPresent(Cursor.createGlobalVKey(RECURRING_BILLING))
.orElse(Cursor.createGlobal(RECURRING_BILLING, START_OF_TIME))
.getCursorTime();
if (!currentCursorTime.equals(persistedCursorTime)) {
throw new IllegalStateException(
String.format(
"Current cursor position %s does not match persisted cursor position %s.",
currentCursorTime, persistedCursorTime));
}
if (!isDryRun) {
tm().put(Cursor.createGlobal(RECURRING_BILLING, executeTime));
}
});
expandSqlBillingEventsInBatches(executeTime, cursorTime, persistedCursorTime);
}
}
private void expandSqlBillingEventsInBatches(
DateTime executeTime, DateTime cursorTime, DateTime persistedCursorTime) {
int totalBillingEventsSaved = 0;
long maxProcessedRecurrenceId = 0;
SqlBatchResults sqlBatchResults;
do {
final long prevMaxProcessedRecurrenceId = maxProcessedRecurrenceId;
sqlBatchResults =
jpaTm()
.transact(
() -> {
Set<String> expandedDomains = newHashSet();
int batchBillingEventsSaved = 0;
long maxRecurrenceId = prevMaxProcessedRecurrenceId;
List<Recurring> recurrings =
jpaTm()
.query(
"FROM BillingRecurrence "
+ "WHERE eventTime <= :executeTime "
+ "AND eventTime < recurrenceEndTime "
+ "AND id > :maxProcessedRecurrenceId "
+ "AND recurrenceEndTime > :cursorTime "
+ "ORDER BY id ASC",
Recurring.class)
.setParameter("executeTime", executeTime)
.setParameter("maxProcessedRecurrenceId", prevMaxProcessedRecurrenceId)
.setParameter("cursorTime", cursorTime)
.setMaxResults(batchSize)
.getResultList();
for (Recurring recurring : recurrings) {
if (expandedDomains.contains(recurring.getTargetId())) {
// On the off chance this batch contains multiple recurrences for the same
// domain (which is actually possible if a given domain is quickly renewed
// multiple times in a row), then short-circuit after the first one is
// processed that involves actually expanding a billing event. This is
// necessary because otherwise we get an "Inserted/updated object reloaded"
// error from Hibernate when those billing events would be loaded
// inside a transaction where they were already written. Note, there is no
// actual further work to be done in this case anyway, not unless it has
// somehow been over a year since this action last ran successfully (and if
// that were somehow true, the remaining billing events would still be
// expanded on subsequent runs).
continue;
}
int billingEventsSaved =
expandBillingEvent(recurring, executeTime, cursorTime, isDryRun);
batchBillingEventsSaved += billingEventsSaved;
if (billingEventsSaved > 0) {
expandedDomains.add(recurring.getTargetId());
}
maxRecurrenceId = Math.max(maxRecurrenceId, recurring.getId());
}
return SqlBatchResults.create(
batchBillingEventsSaved,
maxRecurrenceId,
maxRecurrenceId > prevMaxProcessedRecurrenceId);
});
totalBillingEventsSaved += sqlBatchResults.batchBillingEventsSaved();
maxProcessedRecurrenceId = sqlBatchResults.maxProcessedRecurrenceId();
if (sqlBatchResults.batchBillingEventsSaved() > 0) {
logger.atInfo().log(
"Saved %d billing events in batch (%d total) with max recurrence id %d.",
sqlBatchResults.batchBillingEventsSaved(),
totalBillingEventsSaved,
maxProcessedRecurrenceId);
} else {
// If we're churning through a lot of no-op recurrences that don't need expanding (yet?),
// then only log one no-op every so often as a good balance between letting the user track
// that the action is still running while also not spamming the logs incessantly.
logger.atInfo().atMostEvery(3, TimeUnit.MINUTES).log(
"Processed up to max recurrence id %d (no billing events saved recently).",
maxProcessedRecurrenceId);
}
} while (sqlBatchResults.shouldContinue());
if (!isDryRun) {
logger.atInfo().log("Saved %d total OneTime billing events.", totalBillingEventsSaved);
} else {
logger.atInfo().log(
"Generated %d total OneTime billing events (dry run).", totalBillingEventsSaved);
}
logger.atInfo().log(
"Recurring event expansion %s complete for billing event range [%s, %s).",
isDryRun ? "(dry run) " : "", cursorTime, executeTime);
tm().transact(
() -> {
// Check for the unlikely scenario where the cursor has been altered during the
// expansion.
DateTime currentCursorTime =
tm().loadByKeyIfPresent(Cursor.createGlobalVKey(RECURRING_BILLING))
.orElse(Cursor.createGlobal(RECURRING_BILLING, START_OF_TIME))
.getCursorTime();
if (!currentCursorTime.equals(persistedCursorTime)) {
throw new IllegalStateException(
String.format(
"Current cursor position %s does not match persisted cursor position %s.",
currentCursorTime, persistedCursorTime));
}
if (!isDryRun) {
tm().put(Cursor.createGlobal(RECURRING_BILLING, executeTime));
}
});
}
@AutoValue
abstract static class SqlBatchResults {
abstract int batchBillingEventsSaved();
abstract long maxProcessedRecurrenceId();
abstract boolean shouldContinue();
static SqlBatchResults create(
int batchBillingEventsSaved, long maxProcessedRecurrenceId, boolean shouldContinue) {
return new AutoValue_ExpandRecurringBillingEventsAction_SqlBatchResults(
batchBillingEventsSaved, maxProcessedRecurrenceId, shouldContinue);
}
}
/** Mapper to expand {@link Recurring} billing events into synthetic {@link OneTime} events. */
public static class ExpandRecurringBillingEventsMapper
extends Mapper<Recurring, DateTime, DateTime> {
@@ -1,193 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import static google.registry.beam.comparedb.ValidateSqlUtils.createSqlEntityTupleTag;
import static google.registry.beam.initsql.Transforms.createTagForKind;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Verify;
import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key;
import google.registry.backup.VersionedEntity;
import google.registry.beam.initsql.Transforms;
import google.registry.model.EppResource;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.billing.BillingEvent;
import google.registry.model.common.Cursor;
import google.registry.model.contact.ContactHistory;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.DomainHistory;
import google.registry.model.domain.token.AllocationToken;
import google.registry.model.host.HostHistory;
import google.registry.model.host.HostResource;
import google.registry.model.poll.PollMessage;
import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarContact;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.tld.Registry;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.values.PCollection;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.apache.beam.sdk.values.TupleTag;
import org.apache.beam.sdk.values.TupleTagList;
import org.joda.time.DateTime;
/** Utilities for loading Datastore snapshots. */
@DeleteAfterMigration
public final class DatastoreSnapshots {
private DatastoreSnapshots() {}
/**
* Datastore kinds eligible for validation. This set must be consistent with {@link
* SqlSnapshots#ALL_SQL_ENTITIES}.
*/
@VisibleForTesting
static final ImmutableSet<Class<?>> ALL_DATASTORE_KINDS =
ImmutableSet.of(
Registry.class,
Cursor.class,
Registrar.class,
ContactResource.class,
RegistrarContact.class,
HostResource.class,
HistoryEntry.class,
AllocationToken.class,
BillingEvent.Recurring.class,
BillingEvent.OneTime.class,
BillingEvent.Cancellation.class,
PollMessage.class,
DomainBase.class);
/**
* Returns the Datastore snapshot right before {@code commitLogToTime} for the user specified
* {@code kinds}. The resulting snapshot has all changes that happened before {@code
* commitLogToTime}, and none at or after {@code commitLogToTime}.
*
* <p>If {@code HistoryEntry} is included in {@code kinds}, the result will contain {@code
* PCollections} for the child entities, {@code DomainHistory}, {@code ContactHistory}, and {@code
* HostHistory}.
*/
static PCollectionTuple loadDatastoreSnapshotByKind(
Pipeline pipeline,
String exportDir,
String commitLogDir,
DateTime commitLogFromTime,
DateTime commitLogToTime,
Set<Class<?>> kinds,
Optional<DateTime> compareStartTime) {
PCollectionTuple snapshot =
pipeline.apply(
"Load Datastore snapshot.",
Transforms.loadDatastoreSnapshot(
exportDir,
commitLogDir,
commitLogFromTime,
commitLogToTime,
kinds.stream().map(Key::getKind).collect(ImmutableSet.toImmutableSet())));
PCollectionTuple perTypeSnapshots = PCollectionTuple.empty(pipeline);
for (Class<?> kind : kinds) {
PCollection<VersionedEntity> perKindSnapshot =
snapshot.get(createTagForKind(Key.getKind(kind)));
if (SqlEntity.class.isAssignableFrom(kind)) {
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag((Class<? extends SqlEntity>) kind),
datastoreEntityToPojo(perKindSnapshot, kind.getSimpleName(), compareStartTime));
continue;
}
Verify.verify(kind == HistoryEntry.class, "Unexpected Non-SqlEntity class: %s", kind);
PCollectionTuple historyEntriesByType = splitHistoryEntry(perKindSnapshot, compareStartTime);
for (Map.Entry<TupleTag<?>, PCollection<?>> entry :
historyEntriesByType.getAll().entrySet()) {
perTypeSnapshots = perTypeSnapshots.and(entry.getKey().getId(), entry.getValue());
}
}
return perTypeSnapshots;
}
/**
* Splits a {@link PCollection} of {@link HistoryEntry HistoryEntries} into three collections of
* its child entities by type.
*/
static PCollectionTuple splitHistoryEntry(
PCollection<VersionedEntity> historyEntries, Optional<DateTime> compareStartTime) {
DateTime nullableStartTime = compareStartTime.orElse(null);
return historyEntries.apply(
"Split HistoryEntry by Resource Type",
ParDo.of(
new DoFn<VersionedEntity, SqlEntity>() {
@ProcessElement
public void processElement(
@Element VersionedEntity historyEntry, MultiOutputReceiver out) {
Optional.ofNullable(Transforms.convertVersionedEntityToSqlEntity(historyEntry))
.filter(e -> isEntityIncludedForComparison(e, nullableStartTime))
.ifPresent(
sqlEntity ->
out.get(createSqlEntityTupleTag(sqlEntity.getClass()))
.output(sqlEntity));
}
})
.withOutputTags(
createSqlEntityTupleTag(DomainHistory.class),
TupleTagList.of(createSqlEntityTupleTag(ContactHistory.class))
.and(createSqlEntityTupleTag(HostHistory.class))));
}
/**
* Transforms a {@link PCollection} of {@link VersionedEntity VersionedEntities} to Ofy Java
* objects.
*/
static PCollection<SqlEntity> datastoreEntityToPojo(
PCollection<VersionedEntity> entities, String desc, Optional<DateTime> compareStartTime) {
DateTime nullableStartTime = compareStartTime.orElse(null);
return entities.apply(
"Datastore Entity to Pojo " + desc,
ParDo.of(
new DoFn<VersionedEntity, SqlEntity>() {
@ProcessElement
public void processElement(
@Element VersionedEntity entity, OutputReceiver<SqlEntity> out) {
Optional.ofNullable(Transforms.convertVersionedEntityToSqlEntity(entity))
.filter(e -> isEntityIncludedForComparison(e, nullableStartTime))
.ifPresent(out::output);
}
}));
}
static boolean isEntityIncludedForComparison(
SqlEntity entity, @Nullable DateTime compareStartTime) {
if (compareStartTime == null) {
return true;
}
if (entity instanceof HistoryEntry) {
return compareStartTime.isBefore(((HistoryEntry) entity).getModificationTime());
}
if (entity instanceof EppResource) {
return compareStartTime.isBefore(((EppResource) entity).getUpdateTimestamp().getTimestamp());
}
return true;
}
}
@@ -1,154 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import com.google.auto.value.AutoValue;
import com.google.cloud.storage.BlobId;
import com.google.cloud.storage.BlobInfo;
import dagger.Component;
import google.registry.config.CloudTasksUtilsModule;
import google.registry.config.CredentialModule;
import google.registry.config.RegistryConfig;
import google.registry.config.RegistryConfig.Config;
import google.registry.config.RegistryConfig.ConfigModule;
import google.registry.gcs.GcsUtils;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.util.Clock;
import google.registry.util.UtilsModule;
import java.io.IOException;
import java.util.Comparator;
import java.util.NoSuchElementException;
import java.util.Optional;
import javax.inject.Inject;
import javax.inject.Singleton;
import org.joda.time.DateTime;
import org.joda.time.Instant;
import org.joda.time.Interval;
/** Finds the necessary information for loading the most recent Datastore snapshot. */
@DeleteAfterMigration
public class LatestDatastoreSnapshotFinder {
private final String projectId;
private final GcsUtils gcsUtils;
private final Clock clock;
@Inject
LatestDatastoreSnapshotFinder(
@Config("projectId") String projectId, GcsUtils gcsUtils, Clock clock) {
this.projectId = projectId;
this.gcsUtils = gcsUtils;
this.clock = clock;
}
/**
* Finds information of the most recent Datastore snapshot that ends strictly before {@code
* exportEndTimeUpperBound}, including the GCS folder of the exported data files and the start and
* stop times of the export. The folder of the CommitLogs is also included in the return.
*/
public DatastoreSnapshotInfo getSnapshotInfo(Instant exportEndTimeUpperBound) {
String bucketName = RegistryConfig.getDatastoreBackupsBucket().substring("gs://".length());
/**
* Find the bucket-relative path to the overall metadata file of the last Datastore export.
* Since Datastore export is saved daily, we may need to look back to yesterday. If found, the
* return value is like
* "2021-11-19T06:00:00_76493/2021-11-19T06:00:00_76493.overall_export_metadata".
*/
Optional<String> metaFilePathOptional =
findNewestExportMetadataFileBeforeTime(bucketName, exportEndTimeUpperBound, 5);
if (!metaFilePathOptional.isPresent()) {
throw new NoSuchElementException("No exports found over the past 2 days.");
}
String metaFilePath = metaFilePathOptional.get();
String metaFileFolder = metaFilePath.substring(0, metaFilePath.indexOf('/'));
Instant exportStartTime = Instant.parse(metaFileFolder.replace('_', '.') + 'Z');
BlobInfo blobInfo = gcsUtils.getBlobInfo(BlobId.of(bucketName, metaFilePath));
Instant exportEndTime = new Instant(blobInfo.getCreateTime());
return DatastoreSnapshotInfo.create(
String.format("gs://%s/%s", bucketName, metaFileFolder),
getCommitLogDir(),
new Interval(exportStartTime, exportEndTime));
}
public String getCommitLogDir() {
return "gs://" + projectId + "-commits";
}
/**
* Finds the latest Datastore export that ends strictly before {@code endTimeUpperBound} and
* returns the bucket-relative path of the overall export metadata file, in the given bucket. The
* search goes back for up to {@code lookBackDays} days in time, including today.
*
* <p>The overall export metadata file is the last file created during a Datastore export. All
* data has been exported by the creation time of this file. The name of this file, like that of
* all files in the same export, begins with the timestamp when the export starts.
*
* <p>An example return value: {@code
* 2021-11-19T06:00:00_76493/2021-11-19T06:00:00_76493.overall_export_metadata}.
*/
private Optional<String> findNewestExportMetadataFileBeforeTime(
String bucketName, Instant endTimeUpperBound, int lookBackDays) {
DateTime today = clock.nowUtc();
for (int day = 0; day < lookBackDays; day++) {
String dateString = today.minusDays(day).toString("yyyy-MM-dd");
try {
Optional<String> metaFilePath =
gcsUtils.listFolderObjects(bucketName, dateString).stream()
.filter(s -> s.endsWith("overall_export_metadata"))
.map(s -> dateString + s)
.sorted(Comparator.<String>naturalOrder().reversed())
.findFirst();
if (metaFilePath.isPresent()) {
BlobInfo blobInfo = gcsUtils.getBlobInfo(BlobId.of(bucketName, metaFilePath.get()));
Instant exportEndTime = new Instant(blobInfo.getCreateTime());
if (exportEndTime.isBefore(endTimeUpperBound)) {
return metaFilePath;
}
}
} catch (IOException ioe) {
throw new RuntimeException(ioe);
}
}
return Optional.empty();
}
/** Holds information about a Datastore snapshot. */
@AutoValue
public abstract static class DatastoreSnapshotInfo {
public abstract String exportDir();
public abstract String commitLogDir();
public abstract Interval exportInterval();
static DatastoreSnapshotInfo create(
String exportDir, String commitLogDir, Interval exportOperationInterval) {
return new AutoValue_LatestDatastoreSnapshotFinder_DatastoreSnapshotInfo(
exportDir, commitLogDir, exportOperationInterval);
}
}
@Singleton
@Component(
modules = {
CredentialModule.class,
ConfigModule.class,
CloudTasksUtilsModule.class,
UtilsModule.class
})
interface LatestDatastoreSnapshotFinderFinderComponent {
LatestDatastoreSnapshotFinder datastoreSnapshotInfoFinder();
}
}
@@ -1,539 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import static com.google.common.base.Preconditions.checkState;
import static google.registry.beam.comparedb.ValidateSqlUtils.createSqlEntityTupleTag;
import static google.registry.beam.comparedb.ValidateSqlUtils.getMedianIdForHistoryTable;
import com.google.auto.value.AutoValue;
import com.google.common.base.Strings;
import com.google.common.base.Verify;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.Streams;
import google.registry.beam.common.RegistryJpaIO;
import google.registry.beam.common.RegistryJpaIO.Read;
import google.registry.model.EppResource;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.billing.BillingEvent;
import google.registry.model.bulkquery.BulkQueryEntities;
import google.registry.model.bulkquery.DomainBaseLite;
import google.registry.model.bulkquery.DomainHistoryHost;
import google.registry.model.bulkquery.DomainHistoryLite;
import google.registry.model.bulkquery.DomainHost;
import google.registry.model.common.Cursor;
import google.registry.model.contact.ContactHistory;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.DomainHistory;
import google.registry.model.domain.DomainHistory.DomainHistoryId;
import google.registry.model.domain.GracePeriod;
import google.registry.model.domain.GracePeriod.GracePeriodHistory;
import google.registry.model.domain.secdns.DelegationSignerData;
import google.registry.model.domain.secdns.DomainDsDataHistory;
import google.registry.model.domain.token.AllocationToken;
import google.registry.model.host.HostHistory;
import google.registry.model.host.HostResource;
import google.registry.model.poll.PollMessage;
import google.registry.model.registrar.Registrar;
import google.registry.model.registrar.RegistrarContact;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.tld.Registry;
import google.registry.persistence.transaction.CriteriaQueryBuilder;
import google.registry.util.DateTimeUtils;
import java.io.Serializable;
import java.util.Optional;
import javax.persistence.Entity;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.transforms.Flatten;
import org.apache.beam.sdk.transforms.GroupByKey;
import org.apache.beam.sdk.transforms.MapElements;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.transforms.SerializableFunction;
import org.apache.beam.sdk.values.KV;
import org.apache.beam.sdk.values.PCollection;
import org.apache.beam.sdk.values.PCollectionList;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.apache.beam.sdk.values.TypeDescriptor;
import org.apache.beam.sdk.values.TypeDescriptors;
import org.joda.time.DateTime;
/**
* Utilities for loading SQL snapshots.
*
* <p>For {@link DomainBase} and {@link DomainHistory}, this class assumes the presence of the
* {@link google.registry.persistence.PersistenceModule.JpaTransactionManagerType#BULK_QUERY
* bulk-query-capable JpaTransactionManager}, and takes advantage of it for higher throughput.
*
* <p>For now this class is meant for use during the database migration period only. Therefore, it
* contains optimizations specifically for the production database at the current size, e.g.,
* parallel queries for select tables.
*/
@DeleteAfterMigration
public final class SqlSnapshots {
private SqlSnapshots() {}
/**
* SQL entity types that are eligible for validation. This set must be consistent with {@link
* DatastoreSnapshots#ALL_DATASTORE_KINDS}.
*/
static final ImmutableSet<Class<? extends SqlEntity>> ALL_SQL_ENTITIES =
ImmutableSet.of(
Registry.class,
Cursor.class,
Registrar.class,
ContactResource.class,
RegistrarContact.class,
HostResource.class,
AllocationToken.class,
BillingEvent.Recurring.class,
BillingEvent.OneTime.class,
BillingEvent.Cancellation.class,
PollMessage.class,
DomainBase.class,
ContactHistory.class,
HostHistory.class,
DomainHistory.class);
/**
* Loads a SQL snapshot for the given {@code sqlEntityTypes}.
*
* <p>If {@code snapshotId} is present, all queries use the specified database snapshot,
* guaranteeing a consistent result.
*/
public static PCollectionTuple loadCloudSqlSnapshotByType(
Pipeline pipeline,
ImmutableSet<Class<? extends SqlEntity>> sqlEntityTypes,
Optional<String> snapshotId,
Optional<DateTime> compareStartTime) {
PCollectionTuple perTypeSnapshots = PCollectionTuple.empty(pipeline);
for (Class<? extends SqlEntity> clazz : sqlEntityTypes) {
if (clazz == DomainBase.class) {
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag(DomainBase.class),
loadAndAssembleDomainBase(pipeline, snapshotId, compareStartTime));
continue;
}
if (clazz == DomainHistory.class) {
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag(DomainHistory.class),
loadAndAssembleDomainHistory(pipeline, snapshotId, compareStartTime));
continue;
}
if (clazz == ContactHistory.class) {
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag(ContactHistory.class),
loadContactHistory(pipeline, snapshotId, compareStartTime));
continue;
}
if (clazz == HostHistory.class) {
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag(HostHistory.class),
loadHostHistory(
pipeline, snapshotId, compareStartTime.orElse(DateTimeUtils.START_OF_TIME)));
continue;
}
if (EppResource.class.isAssignableFrom(clazz) && compareStartTime.isPresent()) {
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag(clazz),
pipeline.apply(
"SQL Load " + clazz.getSimpleName(),
buildEppResourceQueryWithTimeFilter(
clazz, SqlEntity.class, snapshotId, compareStartTime.get())
.withSnapshot(snapshotId.orElse(null))));
continue;
}
perTypeSnapshots =
perTypeSnapshots.and(
createSqlEntityTupleTag(clazz),
pipeline.apply(
"SQL Load " + clazz.getSimpleName(),
RegistryJpaIO.read(
() -> CriteriaQueryBuilder.create(clazz).build(), SqlEntity.class::cast)
.withSnapshot(snapshotId.orElse(null))));
}
return perTypeSnapshots;
}
/**
* Bulk-loads parts of {@link DomainBase} and assembles them in the pipeline.
*
* @see BulkQueryEntities
*/
public static PCollection<SqlEntity> loadAndAssembleDomainBase(
Pipeline pipeline, Optional<String> snapshotId, Optional<DateTime> compareStartTime) {
PCollection<KV<String, Serializable>> baseObjects =
readAllAndAssignKey(
pipeline,
DomainBaseLite.class,
DomainBaseLite::getRepoId,
snapshotId,
compareStartTime);
PCollection<KV<String, Serializable>> gracePeriods =
readAllAndAssignKey(
pipeline,
GracePeriod.class,
GracePeriod::getDomainRepoId,
snapshotId,
compareStartTime);
PCollection<KV<String, Serializable>> delegationSigners =
readAllAndAssignKey(
pipeline,
DelegationSignerData.class,
DelegationSignerData::getDomainRepoId,
snapshotId,
compareStartTime);
PCollection<KV<String, Serializable>> domainHosts =
readAllAndAssignKey(
pipeline, DomainHost.class, DomainHost::getDomainRepoId, snapshotId, compareStartTime);
DateTime nullableCompareStartTime = compareStartTime.orElse(null);
return PCollectionList.of(
ImmutableList.of(baseObjects, gracePeriods, delegationSigners, domainHosts))
.apply("SQL Merge DomainBase parts", Flatten.pCollections())
.apply("Group by Domain Parts by RepoId", GroupByKey.create())
.apply(
"Assemble DomainBase",
ParDo.of(
new DoFn<KV<String, Iterable<Serializable>>, SqlEntity>() {
@ProcessElement
public void processElement(
@Element KV<String, Iterable<Serializable>> kv,
OutputReceiver<SqlEntity> outputReceiver) {
TypedClassifier partsByType = new TypedClassifier(kv.getValue());
ImmutableSet<DomainBaseLite> baseObjects =
partsByType.getAllOf(DomainBaseLite.class);
if (nullableCompareStartTime != null) {
Verify.verify(
baseObjects.size() <= 1,
"Found duplicate DomainBaseLite object per repoId: " + kv.getKey());
if (baseObjects.isEmpty()) {
return;
}
}
Verify.verify(
baseObjects.size() == 1,
"Expecting one DomainBaseLite object per repoId: " + kv.getKey());
outputReceiver.output(
BulkQueryEntities.assembleDomainBase(
baseObjects.iterator().next(),
partsByType.getAllOf(GracePeriod.class),
partsByType.getAllOf(DelegationSignerData.class),
partsByType.getAllOf(DomainHost.class).stream()
.map(DomainHost::getHostVKey)
.collect(ImmutableSet.toImmutableSet())));
}
}));
}
/**
* Loads all {@link ContactHistory} entities from the database.
*
* <p>This method uses two queries to load data in parallel. This is a performance optimization
* specifically for the production database.
*/
static PCollection<SqlEntity> loadContactHistory(
Pipeline pipeline, Optional<String> snapshotId, Optional<DateTime> compareStartTime) {
PartitionedQuery partitionedQuery =
buildPartitonedHistoryQuery(ContactHistory.class, compareStartTime);
PCollection<SqlEntity> part1 =
pipeline.apply(
"SQL Load ContactHistory first half",
RegistryJpaIO.read(
partitionedQuery.firstHalfQuery(),
partitionedQuery.parameters(),
false,
SqlEntity.class::cast)
.withSnapshot(snapshotId.orElse(null)));
PCollection<SqlEntity> part2 =
pipeline.apply(
"SQL Load ContactHistory second half",
RegistryJpaIO.read(
partitionedQuery.secondHalfQuery(),
partitionedQuery.parameters(),
false,
SqlEntity.class::cast)
.withSnapshot(snapshotId.orElse(null)));
return PCollectionList.of(part1)
.and(part2)
.apply("Combine ContactHistory parts", Flatten.pCollections());
}
/** Loads all {@link HostHistory} entities from the database. */
static PCollection<SqlEntity> loadHostHistory(
Pipeline pipeline, Optional<String> snapshotId, DateTime compareStartTime) {
return pipeline.apply(
"SQL Load HostHistory",
RegistryJpaIO.read(
"select c from HostHistory c where :compareStartTime < modificationTime",
ImmutableMap.of("compareStartTime", compareStartTime),
false,
SqlEntity.class::cast)
.withSnapshot(snapshotId.orElse(null)));
}
/**
* Bulk-loads all parts of {@link DomainHistory} and assembles them in the pipeline.
*
* <p>This method uses two queries to load {@link DomainBaseLite} in parallel. This is a
* performance optimization specifically for the production database.
*
* @see BulkQueryEntities
*/
static PCollection<SqlEntity> loadAndAssembleDomainHistory(
Pipeline pipeline, Optional<String> snapshotId, Optional<DateTime> compareStartTime) {
PartitionedQuery partitionedQuery =
buildPartitonedHistoryQuery(DomainHistoryLite.class, compareStartTime);
PCollection<KV<String, Serializable>> baseObjectsPart1 =
queryAndAssignKey(
pipeline,
"first half",
partitionedQuery.firstHalfQuery(),
partitionedQuery.parameters(),
DomainHistoryLite.class,
compose(DomainHistoryLite::getDomainHistoryId, DomainHistoryId::toString),
snapshotId);
PCollection<KV<String, Serializable>> baseObjectsPart2 =
queryAndAssignKey(
pipeline,
"second half",
partitionedQuery.secondHalfQuery(),
partitionedQuery.parameters(),
DomainHistoryLite.class,
compose(DomainHistoryLite::getDomainHistoryId, DomainHistoryId::toString),
snapshotId);
PCollection<KV<String, Serializable>> gracePeriods =
readAllAndAssignKey(
pipeline,
GracePeriodHistory.class,
compose(GracePeriodHistory::getDomainHistoryId, DomainHistoryId::toString),
snapshotId,
compareStartTime);
PCollection<KV<String, Serializable>> delegationSigners =
readAllAndAssignKey(
pipeline,
DomainDsDataHistory.class,
compose(DomainDsDataHistory::getDomainHistoryId, DomainHistoryId::toString),
snapshotId,
compareStartTime);
PCollection<KV<String, Serializable>> domainHosts =
readAllAndAssignKey(
pipeline,
DomainHistoryHost.class,
compose(DomainHistoryHost::getDomainHistoryId, DomainHistoryId::toString),
snapshotId,
compareStartTime);
PCollection<KV<String, Serializable>> transactionRecords =
readAllAndAssignKey(
pipeline,
DomainTransactionRecord.class,
compose(DomainTransactionRecord::getDomainHistoryId, DomainHistoryId::toString),
snapshotId,
compareStartTime);
DateTime nullableCompareStartTime = compareStartTime.orElse(null);
return PCollectionList.of(
ImmutableList.of(
baseObjectsPart1,
baseObjectsPart2,
gracePeriods,
delegationSigners,
domainHosts,
transactionRecords))
.apply("Merge DomainHistory parts", Flatten.pCollections())
.apply("Group by DomainHistory Parts by DomainHistoryId string", GroupByKey.create())
.apply(
"Assemble DomainHistory",
ParDo.of(
new DoFn<KV<String, Iterable<Serializable>>, SqlEntity>() {
@ProcessElement
public void processElement(
@Element KV<String, Iterable<Serializable>> kv,
OutputReceiver<SqlEntity> outputReceiver) {
TypedClassifier partsByType = new TypedClassifier(kv.getValue());
ImmutableSet<DomainHistoryLite> baseObjects =
partsByType.getAllOf(DomainHistoryLite.class);
if (nullableCompareStartTime != null) {
Verify.verify(
baseObjects.size() <= 1,
"Found duplicate DomainHistoryLite object per domainHistoryId: "
+ kv.getKey());
if (baseObjects.isEmpty()) {
return;
}
}
Verify.verify(
baseObjects.size() == 1,
"Expecting one DomainHistoryLite object per domainHistoryId: "
+ kv.getKey());
outputReceiver.output(
BulkQueryEntities.assembleDomainHistory(
baseObjects.iterator().next(),
partsByType.getAllOf(DomainDsDataHistory.class),
partsByType.getAllOf(DomainHistoryHost.class).stream()
.map(DomainHistoryHost::getHostVKey)
.collect(ImmutableSet.toImmutableSet()),
partsByType.getAllOf(GracePeriodHistory.class),
partsByType.getAllOf(DomainTransactionRecord.class)));
}
}));
}
static <R, T> PCollection<KV<String, Serializable>> readAllAndAssignKey(
Pipeline pipeline,
Class<R> type,
SerializableFunction<R, String> keyFunction,
Optional<String> snapshotId,
Optional<DateTime> compareStartTime) {
Read<R, R> queryObject;
if (compareStartTime.isPresent() && EppResource.class.isAssignableFrom(type)) {
queryObject =
buildEppResourceQueryWithTimeFilter(type, type, snapshotId, compareStartTime.get());
} else {
queryObject =
RegistryJpaIO.read(() -> CriteriaQueryBuilder.create(type).build())
.withSnapshot(snapshotId.orElse(null));
}
return pipeline
.apply("SQL Load " + type.getSimpleName(), queryObject)
.apply(
"Assign Key to " + type.getSimpleName(),
MapElements.into(
TypeDescriptors.kvs(
TypeDescriptors.strings(), TypeDescriptor.of(Serializable.class)))
.via(obj -> KV.of(keyFunction.apply(obj), (Serializable) obj)));
}
static <R, T> PCollection<KV<String, Serializable>> queryAndAssignKey(
Pipeline pipeline,
String diffrentiator,
String jplQuery,
ImmutableMap<String, Object> queryParameters,
Class<R> type,
SerializableFunction<R, String> keyFunction,
Optional<String> snapshotId) {
return pipeline
.apply(
"SQL Load " + type.getSimpleName() + " " + diffrentiator,
RegistryJpaIO.read(jplQuery, queryParameters, false, type::cast)
.withSnapshot(snapshotId.orElse(null)))
.apply(
"Assign Key to " + type.getSimpleName() + " " + diffrentiator,
MapElements.into(
TypeDescriptors.kvs(
TypeDescriptors.strings(), TypeDescriptor.of(Serializable.class)))
.via(obj -> KV.of(keyFunction.apply(obj), (Serializable) obj)));
}
// TODO(b/205988530): don't use beam serializablefunction, make one that extends Java's Function.
private static <R, I, T> SerializableFunction<R, T> compose(
SerializableFunction<R, I> f1, SerializableFunction<I, T> f2) {
return r -> f2.apply(f1.apply(r));
}
static <R, T> Read<R, T> buildEppResourceQueryWithTimeFilter(
Class<R> entityType,
Class<T> castOutputAsType,
Optional<String> snapshotId,
DateTime compareStartTime) {
String tableName = getJpaEntityName(entityType);
String jpql =
String.format("select c from %s c where :compareStartTime < updateTimestamp", tableName);
return RegistryJpaIO.read(
jpql,
ImmutableMap.of("compareStartTime", UpdateAutoTimestamp.create(compareStartTime)),
false,
(R x) -> castOutputAsType.cast(x))
.withSnapshot(snapshotId.orElse(null));
}
static PartitionedQuery buildPartitonedHistoryQuery(
Class<?> entityType, Optional<DateTime> compareStartTime) {
String tableName = getJpaEntityName(entityType);
Verify.verify(
!Strings.isNullOrEmpty(tableName), "Invalid entity type %s", entityType.getSimpleName());
long medianId =
getMedianIdForHistoryTable(tableName)
.orElseThrow(() -> new IllegalStateException("Not a valid database: no " + tableName));
String firstHalfQuery = String.format("select c from %s c where id <= :historyId", tableName);
String secondHalfQuery = String.format("select c from %s c where id > :historyId", tableName);
if (compareStartTime.isPresent()) {
String timeFilter = " and :compareStartTime < modificationTime";
firstHalfQuery += timeFilter;
secondHalfQuery += timeFilter;
return PartitionedQuery.createPartitionedQuery(
firstHalfQuery,
secondHalfQuery,
ImmutableMap.of("historyId", medianId, "compareStartTime", compareStartTime.get()));
} else {
return PartitionedQuery.createPartitionedQuery(
firstHalfQuery, secondHalfQuery, ImmutableMap.of("historyId", medianId));
}
}
private static String getJpaEntityName(Class entityType) {
Entity entityAnnotation = (Entity) entityType.getAnnotation(Entity.class);
checkState(
entityAnnotation != null, "Unexpected non-entity type %s", entityType.getSimpleName());
return Strings.isNullOrEmpty(entityAnnotation.name())
? entityType.getSimpleName()
: entityAnnotation.name();
}
/** Contains two queries that partition the target table in two. */
@AutoValue
abstract static class PartitionedQuery {
abstract String firstHalfQuery();
abstract String secondHalfQuery();
abstract ImmutableMap<String, Object> parameters();
public static PartitionedQuery createPartitionedQuery(
String firstHalfQuery, String secondHalfQuery, ImmutableMap<String, Object> parameters) {
return new AutoValue_SqlSnapshots_PartitionedQuery(
firstHalfQuery, secondHalfQuery, parameters);
}
}
/** Container that receives mixed-typed data and groups them by {@link Class}. */
static class TypedClassifier {
private final ImmutableSetMultimap<Class<?>, Object> classifiedEntities;
TypedClassifier(Iterable<Serializable> inputs) {
this.classifiedEntities =
Streams.stream(inputs)
.collect(ImmutableSetMultimap.toImmutableSetMultimap(Object::getClass, x -> x));
}
<T> ImmutableSet<T> getAllOf(Class<T> clazz) {
return classifiedEntities.get(clazz).stream()
.map(clazz::cast)
.collect(ImmutableSet.toImmutableSet());
}
}
}
@@ -1,206 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import static com.google.common.base.Verify.verify;
import static org.apache.beam.sdk.values.TypeDescriptors.strings;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.common.flogger.FluentLogger;
import google.registry.beam.common.RegistryPipelineOptions;
import google.registry.beam.common.RegistryPipelineWorkerInitializer;
import google.registry.beam.comparedb.LatestDatastoreSnapshotFinder.DatastoreSnapshotInfo;
import google.registry.beam.comparedb.ValidateSqlUtils.CompareSqlEntity;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.DomainHistory;
import google.registry.model.replay.SqlEntity;
import google.registry.persistence.PersistenceModule.JpaTransactionManagerType;
import google.registry.persistence.PersistenceModule.TransactionIsolationLevel;
import google.registry.util.SystemClock;
import java.io.Serializable;
import java.util.Optional;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.coders.SerializableCoder;
import org.apache.beam.sdk.io.TextIO;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.Flatten;
import org.apache.beam.sdk.transforms.GroupByKey;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.transforms.WithKeys;
import org.apache.beam.sdk.values.PCollectionList;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.apache.beam.sdk.values.TupleTag;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/**
* Validates the asynchronous data replication process between Datastore and Cloud SQL.
*
* <p>This pipeline is to be launched by {@link google.registry.tools.ValidateDatastoreCommand} or
* {@link google.registry.tools.ValidateSqlCommand}.
*/
@DeleteAfterMigration
public class ValidateDatabasePipeline {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
/** Specifies the extra CommitLogs to load before the start of a Database export. */
private static final Duration COMMITLOG_START_TIME_MARGIN = Duration.standardMinutes(10);
private final ValidateDatabasePipelineOptions options;
private final LatestDatastoreSnapshotFinder datastoreSnapshotFinder;
public ValidateDatabasePipeline(
ValidateDatabasePipelineOptions options,
LatestDatastoreSnapshotFinder datastoreSnapshotFinder) {
this.options = options;
this.datastoreSnapshotFinder = datastoreSnapshotFinder;
}
@VisibleForTesting
void run(Pipeline pipeline) {
DateTime latestCommitLogTime = DateTime.parse(options.getLatestCommitLogTimestamp());
DatastoreSnapshotInfo mostRecentExport =
datastoreSnapshotFinder.getSnapshotInfo(latestCommitLogTime.toInstant());
logger.atInfo().log(
"Comparing datastore export at %s and commitlog timestamp %s.",
mostRecentExport.exportDir(), latestCommitLogTime);
Optional<String> outputPath =
Optional.ofNullable(options.getDiffOutputGcsBucket())
.map(
bucket ->
String.format(
"gs://%s/validate_database/%s/diffs.txt",
bucket, new SystemClock().nowUtc()));
outputPath.ifPresent(path -> logger.atInfo().log("Discrepancies will be logged to %s", path));
setupPipeline(
pipeline,
Optional.ofNullable(options.getSqlSnapshotId()),
mostRecentExport,
latestCommitLogTime,
Optional.ofNullable(options.getComparisonStartTimestamp()).map(DateTime::parse),
outputPath);
pipeline.run();
}
static void setupPipeline(
Pipeline pipeline,
Optional<String> sqlSnapshotId,
DatastoreSnapshotInfo mostRecentExport,
DateTime latestCommitLogTime,
Optional<DateTime> compareStartTime,
Optional<String> diffOutputPath) {
pipeline
.getCoderRegistry()
.registerCoderForClass(SqlEntity.class, SerializableCoder.of(Serializable.class));
PCollectionTuple datastoreSnapshot =
DatastoreSnapshots.loadDatastoreSnapshotByKind(
pipeline,
mostRecentExport.exportDir(),
mostRecentExport.commitLogDir(),
mostRecentExport.exportInterval().getStart().minus(COMMITLOG_START_TIME_MARGIN),
// Increase by 1ms since we want to include commitLogs latestCommitLogTime but
// this parameter is exclusive.
latestCommitLogTime.plusMillis(1),
DatastoreSnapshots.ALL_DATASTORE_KINDS,
compareStartTime);
PCollectionTuple cloudSqlSnapshot =
SqlSnapshots.loadCloudSqlSnapshotByType(
pipeline, SqlSnapshots.ALL_SQL_ENTITIES, sqlSnapshotId, compareStartTime);
verify(
datastoreSnapshot.getAll().keySet().equals(cloudSqlSnapshot.getAll().keySet()),
"Expecting the same set of types in both snapshots.");
PCollectionList<String> diffLogs = PCollectionList.empty(pipeline);
for (Class<? extends SqlEntity> clazz : SqlSnapshots.ALL_SQL_ENTITIES) {
TupleTag<SqlEntity> tag = ValidateSqlUtils.createSqlEntityTupleTag(clazz);
verify(
datastoreSnapshot.has(tag), "Missing %s in Datastore snapshot.", clazz.getSimpleName());
verify(cloudSqlSnapshot.has(tag), "Missing %s in Cloud SQL snapshot.", clazz.getSimpleName());
diffLogs =
diffLogs.and(
PCollectionList.of(datastoreSnapshot.get(tag))
.and(cloudSqlSnapshot.get(tag))
.apply(
"Combine from both snapshots: " + clazz.getSimpleName(),
Flatten.pCollections())
.apply(
"Assign primary key to merged " + clazz.getSimpleName(),
WithKeys.of(ValidateDatabasePipeline::getPrimaryKeyString)
.withKeyType(strings()))
.apply("Group by primary key " + clazz.getSimpleName(), GroupByKey.create())
.apply("Compare " + clazz.getSimpleName(), ParDo.of(new CompareSqlEntity())));
}
if (diffOutputPath.isPresent()) {
diffLogs
.apply("Gather diff logs", Flatten.pCollections())
.apply(
"Output diffs",
TextIO.write()
.to(diffOutputPath.get())
/**
* Output to a single file for ease of use since diffs should be few. If this
* assumption turns out not to be false, user should abort the pipeline and
* investigate why.
*/
.withoutSharding()
.withDelimiter((Strings.repeat("-", 80) + "\n").toCharArray()));
}
}
private static String getPrimaryKeyString(SqlEntity sqlEntity) {
// SqlEntity.getPrimaryKeyString only works with entities registered with Hibernate.
// We are using the BulkQueryJpaTransactionManager, which does not recognize DomainBase and
// DomainHistory. See BulkQueryEntities.java for more information.
if (sqlEntity instanceof DomainBase) {
return "DomainBase_" + ((DomainBase) sqlEntity).getRepoId();
}
if (sqlEntity instanceof DomainHistory) {
return "DomainHistory_" + ((DomainHistory) sqlEntity).getDomainHistoryId().toString();
}
return sqlEntity.getPrimaryKeyString();
}
public static void main(String[] args) {
ValidateDatabasePipelineOptions options =
PipelineOptionsFactory.fromArgs(args)
.withValidation()
.as(ValidateDatabasePipelineOptions.class);
RegistryPipelineOptions.validateRegistryPipelineOptions(options);
// Defensively set important options.
options.setIsolationOverride(TransactionIsolationLevel.TRANSACTION_REPEATABLE_READ);
options.setJpaTransactionManagerType(JpaTransactionManagerType.BULK_QUERY);
// Set up JPA in the pipeline harness (the locally executed part of the main() method). Reuse
// code in RegistryPipelineWorkerInitializer, which only applies to pipeline worker VMs.
new RegistryPipelineWorkerInitializer().beforeProcessing(options);
LatestDatastoreSnapshotFinder datastoreSnapshotFinder =
DaggerLatestDatastoreSnapshotFinder_LatestDatastoreSnapshotFinderFinderComponent.create()
.datastoreSnapshotInfoFinder();
new ValidateDatabasePipeline(options, datastoreSnapshotFinder).run(Pipeline.create(options));
}
}
@@ -1,55 +0,0 @@
// Copyright 2022 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import google.registry.beam.common.RegistryPipelineOptions;
import google.registry.model.annotations.DeleteAfterMigration;
import javax.annotation.Nullable;
import org.apache.beam.sdk.options.Description;
import org.apache.beam.sdk.options.Validation;
/** BEAM pipeline options for {@link ValidateDatabasePipeline}. */
@DeleteAfterMigration
public interface ValidateDatabasePipelineOptions extends RegistryPipelineOptions {
@Description(
"The id of the SQL snapshot to be compared with Datastore. "
+ "If null, the current state of the SQL database is used.")
@Nullable
String getSqlSnapshotId();
void setSqlSnapshotId(String snapshotId);
@Description("The latest CommitLogs to load, in ISO8601 format.")
@Validation.Required
String getLatestCommitLogTimestamp();
void setLatestCommitLogTimestamp(String commitLogEndTimestamp);
@Description(
"For history entries and EPP resources, only those modified strictly after this time are "
+ "included in comparison. Value is in ISO8601 format. "
+ "Other entity types are not affected.")
@Nullable
String getComparisonStartTimestamp();
void setComparisonStartTimestamp(String comparisonStartTimestamp);
@Description("The GCS bucket where discrepancies found during comparison should be logged.")
@Nullable
String getDiffOutputGcsBucket();
void setDiffOutputGcsBucket(String gcsBucket);
}
@@ -1,427 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import static com.google.common.base.Verify.verify;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps;
import com.google.common.collect.Maps.EntryTransformer;
import google.registry.beam.initsql.Transforms;
import google.registry.config.RegistryEnvironment;
import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.billing.BillingEvent;
import google.registry.model.contact.ContactBase;
import google.registry.model.contact.ContactHistory;
import google.registry.model.domain.DomainContent;
import google.registry.model.domain.DomainHistory;
import google.registry.model.eppcommon.AuthInfo;
import google.registry.model.host.HostHistory;
import google.registry.model.poll.PollMessage;
import google.registry.model.registrar.Registrar;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.util.DiffUtils;
import java.io.Serializable;
import java.lang.reflect.Field;
import java.math.BigInteger;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import org.apache.beam.sdk.metrics.Counter;
import org.apache.beam.sdk.metrics.Metrics;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.values.KV;
import org.apache.beam.sdk.values.TupleTag;
import org.checkerframework.checker.nullness.qual.Nullable;
/** Helpers for use by {@link ValidateDatabasePipeline}. */
@DeleteAfterMigration
final class ValidateSqlUtils {
private ValidateSqlUtils() {}
private static final ImmutableSet<String> PROBER_CELLS = ImmutableSet.of("IQ", "LG", "TL");
private static final ImmutableSet<String> PROBER_TYPES =
ImmutableSet.of("ANYT", "ANYTES", "CANARY");
/**
* Query template for finding the median value of the {@code history_revision_id} column in one of
* the History tables.
*
* <p>The {@link ValidateDatabasePipeline} uses this query to parallelize the query to some of the
* history tables. Although the {@code repo_id} column is the leading column in the primary keys
* of these tables, in practice and with production data, division by {@code history_revision_id}
* works slightly faster for unknown reasons.
*/
private static final String MEDIAN_ID_QUERY_TEMPLATE =
"SELECT history_revision_id FROM ( "
+ " SELECT"
+ " ROW_NUMBER() OVER (ORDER BY history_revision_id ASC) AS rownumber,"
+ " history_revision_id"
+ " FROM \"%TABLE%\""
+ ") AS foo\n"
+ "WHERE rownumber in (select count(*) / 2 + 1 from \"%TABLE%\")";
static Optional<Long> getMedianIdForHistoryTable(String tableName) {
Preconditions.checkArgument(
tableName.endsWith("History"), "Table must be one of the History tables.");
String sqlText = MEDIAN_ID_QUERY_TEMPLATE.replace("%TABLE%", tableName);
List results =
jpaTm()
.transact(() -> jpaTm().getEntityManager().createNativeQuery(sqlText).getResultList());
verify(results.size() < 2, "MidPoint query should have at most one result.");
if (results.isEmpty()) {
return Optional.empty();
}
return Optional.of(((BigInteger) results.get(0)).longValue());
}
static TupleTag<SqlEntity> createSqlEntityTupleTag(Class<? extends SqlEntity> actualType) {
return new TupleTag<SqlEntity>(actualType.getSimpleName()) {};
}
static class CompareSqlEntity extends DoFn<KV<String, Iterable<SqlEntity>>, String> {
private final HashMap<String, Counter> totalCounters = new HashMap<>();
private final HashMap<String, Counter> missingCounters = new HashMap<>();
private final HashMap<String, Counter> unequalCounters = new HashMap<>();
private final HashMap<String, Counter> badEntityCounters = new HashMap<>();
private final HashMap<String, Counter> duplicateEntityCounters = new HashMap<>();
private String getCounterKey(Class<?> clazz) {
return PollMessage.class.isAssignableFrom(clazz) ? "PollMessage" : clazz.getSimpleName();
}
private synchronized void ensureCounterExists(String counterKey) {
if (totalCounters.containsKey(counterKey)) {
return;
}
totalCounters.put(counterKey, Metrics.counter("CompareDB", "Total Compared: " + counterKey));
missingCounters.put(
counterKey, Metrics.counter("CompareDB", "Missing In One DB: " + counterKey));
unequalCounters.put(counterKey, Metrics.counter("CompareDB", "Not Equal:" + counterKey));
badEntityCounters.put(counterKey, Metrics.counter("CompareDB", "Bad Entities:" + counterKey));
duplicateEntityCounters.put(
counterKey, Metrics.counter("CompareDB", "Duplicate Entities:" + counterKey));
}
String duplicateEntityLog(String key, ImmutableList<SqlEntity> entities) {
return String.format("%s: %d entities.", key, entities.size());
}
String unmatchedEntityLog(String key, SqlEntity entry) {
// For a PollMessage only found in Datastore, key is not enough to query for it.
return String.format("Missing in one DB:\n%s", entry instanceof PollMessage ? entry : key);
}
/**
* A rudimentary debugging helper that prints the first pair of unequal entities in each worker.
* This will be removed when we start exporting such entities to GCS.
*/
String unEqualEntityLog(String key, SqlEntity entry0, SqlEntity entry1) {
Map<String, Object> fields0 = ((ImmutableObject) entry0).toDiffableFieldMap();
Map<String, Object> fields1 = ((ImmutableObject) entry1).toDiffableFieldMap();
return key + " " + DiffUtils.prettyPrintEntityDeepDiff(fields0, fields1);
}
String badEntitiesLog(String key, SqlEntity entry0, SqlEntity entry1) {
Map<String, Object> fields0 = ((ImmutableObject) entry0).toDiffableFieldMap();
Map<String, Object> fields1 = ((ImmutableObject) entry1).toDiffableFieldMap();
return String.format(
"Failed to parse one or both entities for key %s:\n%s\n",
key, DiffUtils.prettyPrintEntityDeepDiff(fields0, fields1));
}
@ProcessElement
public void processElement(
@Element KV<String, Iterable<SqlEntity>> kv, OutputReceiver<String> out) {
ImmutableList<SqlEntity> entities = ImmutableList.copyOf(kv.getValue());
verify(!entities.isEmpty(), "Can't happen: no value for key %s.", kv.getKey());
String counterKey = getCounterKey(entities.get(0).getClass());
ensureCounterExists(counterKey);
totalCounters.get(counterKey).inc();
if (entities.size() > 2) {
// Duplicates may happen with Cursors if imported across projects. Its key in Datastore, the
// id field, encodes the project name and is not fixed by the importing job.
duplicateEntityCounters.get(counterKey).inc();
out.output(duplicateEntityLog(kv.getKey(), entities) + "\n");
return;
}
if (entities.size() == 1) {
if (isSpecialCaseProberEntity(entities.get(0))) {
return;
}
missingCounters.get(counterKey).inc();
out.output(unmatchedEntityLog(kv.getKey(), entities.get(0)) + "\n");
return;
}
SqlEntity entity0 = entities.get(0);
SqlEntity entity1 = entities.get(1);
if (isSpecialCaseProberEntity(entity0) && isSpecialCaseProberEntity(entity1)) {
// Ignore prober-related data: their deletions are not propagated from Datastore to SQL.
// When code reaches here, in most cases it involves one soft deleted entity in Datastore
// and an SQL entity with its pre-deletion status.
return;
}
try {
entity0 = normalizeEntity(entity0);
entity1 = normalizeEntity(entity1);
} catch (Exception e) {
badEntityCounters.get(counterKey).inc();
out.output(badEntitiesLog(kv.getKey(), entity0, entity1));
return;
}
Map<String, Object> fields0 =
Maps.transformEntries(
((ImmutableObject) entity0).toDiffableFieldMap(), new DiffableFieldNormalizer());
Map<String, Object> fields1 =
Maps.transformEntries(
((ImmutableObject) entity1).toDiffableFieldMap(), new DiffableFieldNormalizer());
if (!Objects.equals(fields0, fields1)) {
unequalCounters.get(counterKey).inc();
out.output(kv.getKey() + " " + DiffUtils.prettyPrintEntityDeepDiff(fields0, fields1));
}
}
}
/**
* Normalizes trivial differences between objects persisted in Datastore and SQL.
*
* <p>This class works on a map generated by {@link ImmutableObject#toDiffableFieldMap}, and
* performs the following changes:
*
* <ul>
* <li>If a value is an empty {@link Collection}, it is converted to null
* <li>For each {@link google.registry.model.eppcommon.Address} object, empty strings are
* removed from its {@code string} field, which is a {@link List}.
* </ul>
*/
static class DiffableFieldNormalizer
implements EntryTransformer<String, Object, Object>, Serializable {
@Override
public Object transformEntry(String key, @Nullable Object value) {
if (value instanceof Collection && ((Collection<?>) value).isEmpty()) {
return null;
}
if (key.equals("street") && value instanceof List) {
return ((List<?>) value)
.stream().filter(v -> v != null && !Objects.equals("", v)).collect(Collectors.toList());
}
// Short-term hack: LinkedHashMap<String, ?> represents a child ImmutableObject instance.
if (value instanceof LinkedHashMap
&& ((LinkedHashMap<?, ?>) value).keySet().stream().anyMatch(e -> e instanceof String)) {
return Maps.transformEntries((Map<String, Object>) value, this);
}
return value;
}
}
static SqlEntity normalizeEntity(SqlEntity sqlEntity) {
if (sqlEntity instanceof EppResource) {
return normalizeEppResource(sqlEntity);
}
if (sqlEntity instanceof HistoryEntry) {
return (SqlEntity) normalizeHistoryEntry((HistoryEntry) sqlEntity);
}
return sqlEntity;
}
/**
* Normalizes an {@link EppResource} instance for comparison.
*
* <p>This method may modify the input object using reflection instead of making a copy with
* {@code eppResource.asBuilder().build()}, because when {@code eppResource} is a {@link
* google.registry.model.domain.DomainBase}, the {@code build} method accesses the Database, which
* we want to avoid.
*/
static SqlEntity normalizeEppResource(SqlEntity eppResource) {
try {
Field authField =
eppResource instanceof DomainContent
? DomainContent.class.getDeclaredField("authInfo")
: eppResource instanceof ContactBase
? ContactBase.class.getDeclaredField("authInfo")
: null;
if (authField != null) {
authField.setAccessible(true);
AuthInfo authInfo = (AuthInfo) authField.get(eppResource);
// When AuthInfo is missing, the authInfo field is null if the object is loaded from
// Datastore, or a PasswordAuth with null properties if loaded from SQL. In the second case
// we set the authInfo field to null.
if (authInfo != null
&& authInfo.getPw() != null
&& authInfo.getPw().getRepoId() == null
&& authInfo.getPw().getValue() == null) {
authField.set(eppResource, null);
}
}
Field field = EppResource.class.getDeclaredField("revisions");
field.setAccessible(true);
field.set(eppResource, null);
return eppResource;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Normalizes a {@link HistoryEntry} for comparison.
*
* <p>This method modifies the input using reflection because relevant builder methods performs
* unwanted checks and changes.
*/
static HistoryEntry normalizeHistoryEntry(HistoryEntry historyEntry) {
// History objects from Datastore do not have details of their EppResource objects
// (domainContent, contactBase, hostBase).
try {
if (historyEntry instanceof DomainHistory) {
Field domainContent = DomainHistory.class.getDeclaredField("domainContent");
domainContent.setAccessible(true);
domainContent.set(historyEntry, null);
// Convert empty domainTransactionRecords to null for comparison.
Field domainTransactionRecords =
HistoryEntry.class.getDeclaredField("domainTransactionRecords");
domainTransactionRecords.setAccessible(true);
Set<?> domainTransactionRecordsValue = (Set<?>) domainTransactionRecords.get(historyEntry);
if (domainTransactionRecordsValue != null && domainTransactionRecordsValue.isEmpty()) {
domainTransactionRecords.set(historyEntry, null);
}
// DomainHistory in Datastore does not have the following properties either:
Field nsHosts = DomainHistory.class.getDeclaredField("nsHosts");
nsHosts.setAccessible(true);
nsHosts.set(historyEntry, null);
Field dsDataHistories = DomainHistory.class.getDeclaredField("dsDataHistories");
dsDataHistories.setAccessible(true);
dsDataHistories.set(historyEntry, null);
Field gracePeriodHistories = DomainHistory.class.getDeclaredField("gracePeriodHistories");
gracePeriodHistories.setAccessible(true);
gracePeriodHistories.set(historyEntry, null);
} else if (historyEntry instanceof ContactHistory) {
Field contactBase = ContactHistory.class.getDeclaredField("contactBase");
contactBase.setAccessible(true);
contactBase.set(historyEntry, null);
} else if (historyEntry instanceof HostHistory) {
Field hostBase = HostHistory.class.getDeclaredField("hostBase");
hostBase.setAccessible(true);
hostBase.set(historyEntry, null);
}
return historyEntry;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* Returns {@code true} if {@code entity} is created by the prober and needs special treatment.
*
* <p>{@link EppResource} entities created by the prober are deleted by a cron job that bypasses
* the CommitLog mechanism. As a result, their deletions are not propagated to SQL, creating two
* types of mismatches: an entity exists in both databases but differs in lastUpdateTime and
* deletionTime; an entity only exists in the SQL database.
*
* <p>In production, there are few placeholder {@link Registrar registrars} that do not exist in
* Datastore. They were manually created to in SQL to solve a one-time problem (see b/187946868
* for details). They can be ignored in the database comparison.
*/
static boolean isSpecialCaseProberEntity(Object entity) {
if (entity instanceof EppResource) {
EppResource host = (EppResource) entity;
if (host.getPersistedCurrentSponsorRegistrarId().startsWith("prober-")) {
return true;
}
}
if (entity instanceof HistoryEntry) {
HistoryEntry historyEntry = (HistoryEntry) entity;
if (historyEntry.getRegistrarId().startsWith("prober-")) {
// Not all prober entities have "prober-" as registrar prefix.
return true;
}
if (Objects.equals(historyEntry.getReason(), "Deletion of prober data")) {
// Soft-delete event in Datastore that is not propagated to SQL.
return true;
}
}
if (entity instanceof DomainHistory) {
DomainHistory domainHistory = (DomainHistory) entity;
if (domainHistory.getDomainContent().isPresent()
&& domainHistory.getDomainContent().get().getDomainName().startsWith("prober-")) {
// Asynchronously replicated event in SQL.
return true;
}
if (domainHistory.getDomainRepoId() != null) {
// Some synthetic events only have domainRepoId.
String repoId = domainHistory.getDomainRepoId();
if (Transforms.IGNORED_DOMAINS.contains(repoId)) {
return true;
}
String suffix = repoId.substring(repoId.indexOf('-') + 1);
String cell = suffix.substring(0, 2);
suffix = suffix.substring(2);
if (PROBER_CELLS.contains(cell) && PROBER_TYPES.contains(suffix)) {
return true;
}
}
}
if (entity instanceof ContactHistory) {
if (Transforms.IGNORED_CONTACTS.contains(((ContactHistory) entity).getContactRepoId())) {
return true;
}
}
if (entity instanceof HostHistory) {
if (Transforms.IGNORED_HOSTS.contains(((HostHistory) entity).getHostRepoId())) {
return true;
}
}
if (entity instanceof BillingEvent) {
BillingEvent event = (BillingEvent) entity;
if (event.getRegistrarId().startsWith("prober-")) {
return true;
}
}
if (entity instanceof PollMessage) {
if (((PollMessage) entity).getRegistrarId().startsWith("prober-")) {
return true;
}
}
if (RegistryEnvironment.get().equals(RegistryEnvironment.PRODUCTION)
&& entity instanceof Registrar) {
Registrar registrar = (Registrar) entity;
if (registrar.getRegistrarId().startsWith("prober-wj-")) {
return true;
}
}
return false;
}
}
@@ -688,7 +688,7 @@ public final class RegistryConfig {
@Provides
@Config("defaultShouldPublishInvoices")
public static boolean provideDefaultShouldPublishInvoices() {
return true;
return false;
}
/**
@@ -1351,6 +1351,12 @@ public final class RegistryConfig {
public static int provideWipeOutQueryBatchSize(RegistryConfigSettings config) {
return config.contactHistory.wipeOutQueryBatchSize;
}
@Provides
@Config("jdbcBatchSize")
public static int provideHibernateJdbcBatchSize(RegistryConfigSettings config) {
return config.hibernate.jdbcBatchSize;
}
}
/** Returns the App Engine project ID, which is based off the environment name. */
@@ -1555,7 +1561,7 @@ public final class RegistryConfig {
* https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html,
* recommend between 10 and 50.
*/
public static String getHibernateJdbcBatchSize() {
public static int getHibernateJdbcBatchSize() {
return CONFIG_SETTINGS.get().hibernate.jdbcBatchSize;
}
@@ -120,7 +120,7 @@ public class RegistryConfigSettings {
public String hikariMinimumIdle;
public String hikariMaximumPoolSize;
public String hikariIdleTimeout;
public String jdbcBatchSize;
public int jdbcBatchSize;
public String jdbcFetchSize;
}
@@ -157,12 +157,6 @@
<url-pattern>/_dr/cron/readDnsQueue</url-pattern>
</servlet-mapping>
<!-- Replicates SQL transactions to Datastore during the Registry 3.0 migration. -->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
<url-pattern>/_dr/cron/replicateToDatastore</url-pattern>
</servlet-mapping>
<!-- Publishes DNS updates. -->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
@@ -243,12 +237,6 @@
<url-pattern>/_dr/task/killCommitLogs</url-pattern>
</servlet-mapping>
<!-- Replays Datastore commit logs to SQL. -->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
<url-pattern>/_dr/task/replayCommitLogsToSql</url-pattern>
</servlet-mapping>
<!-- MapReduce servlet. -->
<servlet>
<servlet-name>mapreduce</servlet-name>
@@ -334,15 +322,6 @@
<url-pattern>/_dr/task/resaveEntity</url-pattern>
</servlet-mapping>
<!--
Deletes contacts and hosts enqueued for asynchronous deletion if they are
not referenced by any domain.
-->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
<url-pattern>/_dr/task/deleteContactsAndHosts</url-pattern>
</servlet-mapping>
<!-- Enqueues DNS update tasks following a host rename. -->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
@@ -422,18 +401,6 @@ have been in the database for a certain period of time. -->
<url-pattern>/_dr/task/wipeOutDatastore</url-pattern>
</servlet-mapping>
<!-- Action to create synthetic history entries during async replication to SQL -->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
<url-pattern>/_dr/task/createSyntheticHistoryEntries</url-pattern>
</servlet-mapping>
<!-- Action to sync Datastore to a snapshot of the primary SQL database. -->
<servlet-mapping>
<servlet-name>backend-servlet</servlet-name>
<url-pattern>/_dr/task/syncDatastoreToSqlSnapshot</url-pattern>
</servlet-mapping>
<!-- Security config -->
<security-constraint>
<web-resource-collection>
@@ -255,7 +255,7 @@
</cron>
<cron>
<url><![CDATA[/_dr/cron/fanout?queue=retryable-cron-tasks&endpoint=/_dr/task/generateInvoices&runInEmpty]]></url>
<url><![CDATA[/_dr/cron/fanout?queue=retryable-cron-tasks&endpoint=/_dr/task/generateInvoices?shouldPublish=true&runInEmpty]]></url>
<description>
Starts the beam/invoicing/InvoicingPipeline Dataflow template, which creates the overall invoice and
detail report CSVs for last month, storing them in gs://[PROJECT-ID]-billing/invoices/yyyy-MM.
@@ -15,7 +15,6 @@
package google.registry.flows;
import static com.google.common.collect.Sets.intersection;
import static google.registry.model.EppResourceUtils.getLinkedDomainKeys;
import static google.registry.model.EppResourceUtils.isLinked;
import static google.registry.model.EppResourceUtils.loadByForeignKey;
import static google.registry.model.index.ForeignKeyIndex.loadAndGetKey;
@@ -54,8 +53,6 @@ import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import org.joda.time.DateTime;
/** Static utility functions for resource flows. */
@@ -63,12 +60,6 @@ public final class ResourceFlowUtils {
private ResourceFlowUtils() {}
/**
* In {@link #checkLinkedDomains(String, DateTime, Class, Function)}, check this (arbitrary)
* number of query results.
*/
private static final int FAILFAST_CHECK_COUNT = 5;
/** Check that the given registrarId corresponds to the owner of given resource. */
public static void verifyResourceOwnership(String myRegistrarId, EppResource resource)
throws EppException {
@@ -85,46 +76,18 @@ public final class ResourceFlowUtils {
* consistent, so we only check a few domains to fail fast.
*/
public static <R extends EppResource> void checkLinkedDomains(
final String targetId,
final DateTime now,
final Class<R> resourceClass,
final Function<DomainBase, ImmutableSet<?>> getPotentialReferences)
throws EppException {
final String targetId, final DateTime now, final Class<R> resourceClass) throws EppException {
EppException failfastException =
tm().isOfy()
? tm().doTransactionless(
() -> {
final ForeignKeyIndex<R> fki =
ForeignKeyIndex.load(resourceClass, targetId, now);
if (fki == null) {
return new ResourceDoesNotExistException(resourceClass, targetId);
}
// Query for the first few linked domains, and if found, actually load them.
// The query is eventually consistent and so might be very stale, but the
// direct load will not be stale, just non-transactional. If we find at least
// one actual reference then we can reliably fail. If we don't find any,
// we can't trust the query and need to do the full mapreduce.
Iterable<VKey<DomainBase>> keys =
getLinkedDomainKeys(fki.getResourceKey(), now, FAILFAST_CHECK_COUNT);
VKey<R> resourceVKey = fki.getResourceKey();
Predicate<DomainBase> predicate =
domain -> getPotentialReferences.apply(domain).contains(resourceVKey);
return tm().loadByKeys(keys).values().stream().anyMatch(predicate)
? new ResourceToDeleteIsReferencedException()
: null;
})
: tm().transact(
() -> {
final ForeignKeyIndex<R> fki =
ForeignKeyIndex.load(resourceClass, targetId, now);
if (fki == null) {
return new ResourceDoesNotExistException(resourceClass, targetId);
}
return isLinked(fki.getResourceKey(), now)
? new ResourceToDeleteIsReferencedException()
: null;
});
tm().transact(
() -> {
final ForeignKeyIndex<R> fki = ForeignKeyIndex.load(resourceClass, targetId, now);
if (fki == null) {
return new ResourceDoesNotExistException(resourceClass, targetId);
}
return isLinked(fki.getResourceKey(), now)
? new ResourceToDeleteIsReferencedException()
: null;
});
if (failfastException != null) {
throw failfastException;
}
@@ -23,7 +23,6 @@ import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
import static google.registry.model.ResourceTransferUtils.denyPendingTransfer;
import static google.registry.model.ResourceTransferUtils.handlePendingTransferOnDelete;
import static google.registry.model.eppoutput.Result.Code.SUCCESS;
import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING;
import static google.registry.model.transfer.TransferStatus.SERVER_CANCELLED;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertAsyncActionsAreAllowed;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
@@ -39,13 +38,11 @@ import google.registry.flows.TransactionalFlow;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.model.contact.ContactHistory;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.metadata.MetadataExtension;
import google.registry.model.eppcommon.AuthInfo;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppcommon.Trid;
import google.registry.model.eppoutput.EppResponse;
import google.registry.model.eppoutput.Result.Code;
import google.registry.model.reporting.HistoryEntry.Type;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import java.util.Optional;
@@ -97,41 +94,26 @@ public final class ContactDeleteFlow implements TransactionalFlow {
extensionManager.validate();
assertAsyncActionsAreAllowed();
DateTime now = tm().getTransactionTime();
checkLinkedDomains(targetId, now, ContactResource.class, DomainBase::getReferencedContacts);
checkLinkedDomains(targetId, now, ContactResource.class);
ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now);
verifyNoDisallowedStatuses(existingContact, DISALLOWED_STATUSES);
verifyOptionalAuthInfo(authInfo, existingContact);
if (!isSuperuser) {
verifyResourceOwnership(registrarId, existingContact);
}
Type historyEntryType;
Code resultCode;
ContactResource newContact;
if (tm().isOfy()) {
asyncTaskEnqueuer.enqueueAsyncDelete(
existingContact, tm().getTransactionTime(), registrarId, trid, isSuperuser);
newContact = existingContact.asBuilder().addStatusValue(StatusValue.PENDING_DELETE).build();
historyEntryType = Type.CONTACT_PENDING_DELETE;
resultCode = SUCCESS_WITH_ACTION_PENDING;
} else {
// Handle pending transfers on contact deletion.
newContact =
existingContact.getStatusValues().contains(StatusValue.PENDING_TRANSFER)
? denyPendingTransfer(existingContact, SERVER_CANCELLED, now, registrarId)
: existingContact;
// Wipe out PII on contact deletion.
newContact =
newContact.asBuilder().wipeOut().setStatusValues(null).setDeletionTime(now).build();
historyEntryType = Type.CONTACT_DELETE;
resultCode = SUCCESS;
}
// Handle pending transfers on contact deletion.
ContactResource newContact =
existingContact.getStatusValues().contains(StatusValue.PENDING_TRANSFER)
? denyPendingTransfer(existingContact, SERVER_CANCELLED, now, registrarId)
: existingContact;
// Wipe out PII on contact deletion.
newContact =
newContact.asBuilder().wipeOut().setStatusValues(null).setDeletionTime(now).build();
ContactHistory contactHistory =
historyBuilder.setType(historyEntryType).setContact(newContact).build();
if (!tm().isOfy()) {
handlePendingTransferOnDelete(existingContact, newContact, now, contactHistory);
}
historyBuilder.setType(Type.CONTACT_DELETE).setContact(newContact).build();
handlePendingTransferOnDelete(existingContact, newContact, now, contactHistory);
tm().insert(contactHistory);
tm().update(newContact);
return responseBuilder.setResultFromCode(resultCode).build();
return responseBuilder.setResultFromCode(SUCCESS).build();
}
}
@@ -17,6 +17,8 @@ package google.registry.flows.custom;
import google.registry.flows.FlowMetadata;
import google.registry.flows.SessionMetadata;
import google.registry.model.eppinput.EppInput;
import java.util.Optional;
import javax.annotation.Nullable;
/**
* An abstract base class for all flow custom logic that stores the flow's {@link EppInput} and
@@ -24,26 +26,38 @@ import google.registry.model.eppinput.EppInput;
*/
public abstract class BaseFlowCustomLogic {
private final EppInput eppInput;
private final SessionMetadata sessionMetadata;
private final FlowMetadata flowMetadata;
@Nullable private final EppInput eppInput;
@Nullable private final SessionMetadata sessionMetadata;
@Nullable private final FlowMetadata flowMetadata;
/**
* Constructs a BaseFlowCustomLogic for the specified EPP flow state.
*
* <p>Note that it is possible for the EPP flow state to be absent, which happens when the custom
* logic is running outside the context of an EPP flow (e.g. {@link DomainPricingCustomLogic} in
* backend actions).
*/
protected BaseFlowCustomLogic(
EppInput eppInput, SessionMetadata sessionMetadata, FlowMetadata flowMetadata) {
@Nullable EppInput eppInput,
@Nullable SessionMetadata sessionMetadata,
@Nullable FlowMetadata flowMetadata) {
this.eppInput = eppInput;
this.sessionMetadata = sessionMetadata;
this.flowMetadata = flowMetadata;
}
protected EppInput getEppInput() {
return eppInput;
/** Returns the {@link EppInput}, which may be empty outside a flow context. */
protected Optional<EppInput> getEppInput() {
return Optional.ofNullable(eppInput);
}
protected SessionMetadata getSessionMetadata() {
return sessionMetadata;
/** Returns the {@link SessionMetadata}, which may be empty outside a flow context. */
protected Optional<SessionMetadata> getSessionMetadata() {
return Optional.ofNullable(sessionMetadata);
}
protected FlowMetadata getFlowMetadata() {
return flowMetadata;
/** Returns the {@link FlowMetadata}, which may be empty outside a flow context. */
protected Optional<FlowMetadata> getFlowMetadata() {
return Optional.ofNullable(flowMetadata);
}
}
@@ -18,6 +18,7 @@ import google.registry.config.RegistryConfig.ConfigModule;
import google.registry.flows.FlowMetadata;
import google.registry.flows.SessionMetadata;
import google.registry.model.eppinput.EppInput;
import java.util.Optional;
/**
* A no-op base custom logic factory.
@@ -63,7 +64,10 @@ public class CustomLogicFactory {
}
public DomainPricingCustomLogic forDomainPricing(
EppInput eppInput, SessionMetadata sessionMetadata, FlowMetadata flowMetadata) {
return new DomainPricingCustomLogic(eppInput, sessionMetadata, flowMetadata);
Optional<EppInput> eppInput,
Optional<SessionMetadata> sessionMetadata,
Optional<FlowMetadata> flowMetadata) {
return new DomainPricingCustomLogic(
eppInput.orElse(null), sessionMetadata.orElse(null), flowMetadata.orElse(null));
}
}
@@ -14,15 +14,17 @@
package google.registry.flows.custom;
import dagger.BindsOptionalOf;
import dagger.Module;
import dagger.Provides;
import google.registry.flows.FlowMetadata;
import google.registry.flows.SessionMetadata;
import google.registry.model.eppinput.EppInput;
import java.util.Optional;
/** Dagger module to provide instances of custom logic classes for EPP flows. */
@Module
public class CustomLogicModule {
public abstract class CustomLogicModule {
@Provides
static DomainCreateFlowCustomLogic provideDomainCreateFlowCustomLogic(
@@ -81,9 +83,20 @@ public class CustomLogicModule {
@Provides
static DomainPricingCustomLogic provideDomainPricingCustomLogic(
CustomLogicFactory factory,
EppInput eppInput,
SessionMetadata sessionMetadata,
FlowMetadata flowMetadata) {
Optional<EppInput> eppInput,
Optional<SessionMetadata> sessionMetadata,
Optional<FlowMetadata> flowMetadata) {
// Note that, for DomainPricingCustomLogic, the EPP flow state won't be present outside the
// context of an EPP flow.
return factory.forDomainPricing(eppInput, sessionMetadata, flowMetadata);
}
@BindsOptionalOf
abstract EppInput optionalEppInput();
@BindsOptionalOf
abstract SessionMetadata optionalSessionMetadata();
@BindsOptionalOf
abstract FlowMetadata optionalFlowMetadata();
}
@@ -24,6 +24,7 @@ import google.registry.flows.domain.FeesAndCredits;
import google.registry.model.ImmutableObject;
import google.registry.model.eppinput.EppInput;
import google.registry.model.tld.Registry;
import javax.annotation.Nullable;
import org.joda.time.DateTime;
/**
@@ -33,8 +34,10 @@ import org.joda.time.DateTime;
*/
public class DomainPricingCustomLogic extends BaseFlowCustomLogic {
protected DomainPricingCustomLogic(
EppInput eppInput, SessionMetadata sessionMetadata, FlowMetadata flowMetadata) {
public DomainPricingCustomLogic(
@Nullable EppInput eppInput,
@Nullable SessionMetadata sessionMetadata,
@Nullable FlowMetadata flowMetadata) {
super(eppInput, sessionMetadata, flowMetadata);
}
@@ -26,7 +26,6 @@ import static com.google.common.collect.Sets.difference;
import static com.google.common.collect.Sets.intersection;
import static com.google.common.collect.Sets.union;
import static google.registry.model.domain.DomainBase.MAX_REGISTRATION_YEARS;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.model.tld.Registries.findTldForName;
import static google.registry.model.tld.Registries.getTlds;
import static google.registry.model.tld.Registry.TldState.GENERAL_AVAILABILITY;
@@ -680,7 +679,7 @@ public class DomainFlowUtils {
break;
case RENEW:
builder.setAvailIfSupported(true);
fees = pricingLogic.getRenewPrice(registry, domainNameString, now, years).getFees();
fees = pricingLogic.getRenewPrice(registry, domainNameString, now, years, null).getFees();
break;
case RESTORE:
// The minimum allowable period per the EPP spec is 1, so, strangely, 1 year still has to be
@@ -1159,24 +1158,14 @@ public class DomainFlowUtils {
private static List<? extends HistoryEntry> findRecentHistoryEntries(
DomainBase domainBase, DateTime now, Duration maxSearchPeriod) {
if (tm().isOfy()) {
return auditedOfy()
.load()
.type(HistoryEntry.class)
.ancestor(domainBase)
.filter("modificationTime >=", now.minus(maxSearchPeriod))
.order("modificationTime")
.list();
} else {
return jpaTm()
.query(
"FROM DomainHistory WHERE modificationTime >= :beginning AND domainRepoId = "
+ ":repoId ORDER BY modificationTime ASC",
DomainHistory.class)
.setParameter("beginning", now.minus(maxSearchPeriod))
.setParameter("repoId", domainBase.getRepoId())
.getResultList();
}
return jpaTm()
.query(
"FROM DomainHistory WHERE modificationTime >= :beginning AND domainRepoId = "
+ ":repoId ORDER BY modificationTime ASC",
DomainHistory.class)
.setParameter("beginning", now.minus(maxSearchPeriod))
.setParameter("repoId", domainBase.getRepoId())
.getResultList();
}
/** Resource linked to this domain does not exist. */
@@ -102,11 +102,6 @@ public final class DomainInfoFlow implements Flow {
verifyOptionalAuthInfo(authInfo, domain);
flowCustomLogic.afterValidation(
AfterValidationParameters.newBuilder().setDomain(domain).build());
// In ofy, refetch all referenced resources.
if (tm().isOfy()) {
tm().loadByKeys(domain.getNameservers());
tm().loadByKeys(domain.getReferencedContacts());
}
// Registrars can only see a few fields on unauthorized domains.
// This is a policy decision that is left up to us by the rfcs.
DomainInfoData.Builder infoBuilder =
@@ -14,28 +14,31 @@
package google.registry.flows.domain;
import static com.google.common.base.Preconditions.checkArgument;
import static google.registry.flows.domain.DomainFlowUtils.zeroInCurrency;
import static google.registry.pricing.PricingEngineProxy.getPricesForDomainName;
import static google.registry.util.DomainNameUtils.getTldFromDomainName;
import static google.registry.util.PreconditionsUtils.checkArgumentPresent;
import com.google.common.net.InternetDomainName;
import google.registry.flows.EppException;
import google.registry.flows.EppException.CommandUseErrorException;
import google.registry.flows.FlowScope;
import google.registry.flows.custom.DomainPricingCustomLogic;
import google.registry.flows.custom.DomainPricingCustomLogic.CreatePriceParameters;
import google.registry.flows.custom.DomainPricingCustomLogic.RenewPriceParameters;
import google.registry.flows.custom.DomainPricingCustomLogic.RestorePriceParameters;
import google.registry.flows.custom.DomainPricingCustomLogic.TransferPriceParameters;
import google.registry.flows.custom.DomainPricingCustomLogic.UpdatePriceParameters;
import google.registry.model.billing.BillingEvent.Recurring;
import google.registry.model.domain.fee.BaseFee;
import google.registry.model.domain.fee.BaseFee.FeeType;
import google.registry.model.domain.fee.Fee;
import google.registry.model.domain.token.AllocationToken;
import google.registry.model.pricing.PremiumPricingEngine.DomainPrices;
import google.registry.model.tld.Registry;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.Optional;
import javax.annotation.Nullable;
import javax.inject.Inject;
import org.joda.money.CurrencyUnit;
import org.joda.money.Money;
@@ -46,7 +49,6 @@ import org.joda.time.DateTime;
* providing a {@link DomainPricingCustomLogic} implementation that operates on cross-TLD or per-TLD
* logic.
*/
@FlowScope
public final class DomainPricingLogic {
@Inject DomainPricingCustomLogic customLogic;
@@ -102,18 +104,63 @@ public final class DomainPricingLogic {
.build());
}
/** Returns a new renew price for the pricer. */
@SuppressWarnings("unused")
FeesAndCredits getRenewPrice(Registry registry, String domainName, DateTime dateTime, int years)
/** Returns a new renewal cost for the pricer. */
FeesAndCredits getRenewPrice(
Registry registry,
String domainName,
DateTime dateTime,
int years,
@Nullable Recurring recurringBillingEvent)
throws EppException {
DomainPrices domainPrices = getPricesForDomainName(domainName, dateTime);
BigDecimal renewCost = domainPrices.getRenewCost().multipliedBy(years).getAmount();
checkArgument(years > 0, "Number of years must be positive");
Money renewCost;
boolean isRenewCostPremiumPrice;
// recurring billing event is null if the domain is still available. Billing events are created
// in the process of domain creation.
if (recurringBillingEvent == null) {
DomainPrices domainPrices = getPricesForDomainName(domainName, dateTime);
renewCost = domainPrices.getRenewCost().multipliedBy(years);
isRenewCostPremiumPrice = domainPrices.isPremium();
} else {
switch (recurringBillingEvent.getRenewalPriceBehavior()) {
case DEFAULT:
DomainPrices domainPrices = getPricesForDomainName(domainName, dateTime);
renewCost = domainPrices.getRenewCost().multipliedBy(years);
isRenewCostPremiumPrice = domainPrices.isPremium();
break;
// if the renewal price behavior is specified, then the renewal price should be the same
// as the creation price, which is stored in the billing event as the renewal price
case SPECIFIED:
checkArgumentPresent(
recurringBillingEvent.getRenewalPrice(),
"Unexpected behavior: renewal price cannot be null when renewal behavior is"
+ " SPECIFIED");
renewCost = recurringBillingEvent.getRenewalPrice().get().multipliedBy(years);
isRenewCostPremiumPrice = false;
break;
// if the renewal price behavior is nonpremium, it means that the domain should be renewed
// at standard price of domains at the time, even if the domain is premium
case NONPREMIUM:
renewCost =
Registry.get(getTldFromDomainName(domainName))
.getStandardRenewCost(dateTime)
.multipliedBy(years);
isRenewCostPremiumPrice = false;
break;
default:
throw new IllegalArgumentException(
String.format(
"Unknown RenewalPriceBehavior enum value: %s",
recurringBillingEvent.getRenewalPriceBehavior()));
}
}
return customLogic.customizeRenewPrice(
RenewPriceParameters.newBuilder()
.setFeesAndCredits(
new FeesAndCredits.Builder()
.setCurrency(registry.getCurrency())
.addFeeOrCredit(Fee.create(renewCost, FeeType.RENEW, domainPrices.isPremium()))
.setCurrency(renewCost.getCurrencyUnit())
.addFeeOrCredit(
Fee.create(renewCost.getAmount(), FeeType.RENEW, isRenewCostPremiumPrice))
.build())
.setRegistry(registry)
.setDomainName(InternetDomainName.from(domainName))
@@ -155,7 +155,8 @@ public final class DomainRenewFlow implements TransactionalFlow {
Optional<FeeRenewCommandExtension> feeRenew =
eppInput.getSingleExtension(FeeRenewCommandExtension.class);
FeesAndCredits feesAndCredits =
pricingLogic.getRenewPrice(Registry.get(existingDomain.getTld()), targetId, now, years);
pricingLogic.getRenewPrice(
Registry.get(existingDomain.getTld()), targetId, now, years, null);
validateFeeChallenge(targetId, now, feeRenew, feesAndCredits);
flowCustomLogic.afterValidation(
AfterValidationParameters.newBuilder()
@@ -48,7 +48,9 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.Ordering;
import com.google.common.collect.Sets;
import com.google.common.flogger.FluentLogger;
import com.google.common.net.InternetDomainName;
import google.registry.config.RegistryEnvironment;
import google.registry.dns.DnsQueue;
import google.registry.flows.EppException;
import google.registry.flows.ExtensionManager;
@@ -146,6 +148,9 @@ public final class DomainUpdateFlow implements TransactionalFlow {
private static final ImmutableSet<StatusValue> UPDATE_DISALLOWED_STATUSES =
ImmutableSet.of(StatusValue.PENDING_DELETE, StatusValue.SERVER_UPDATE_PROHIBITED);
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private boolean isNsDelete;
@Inject ResourceCommand resourceCommand;
@Inject ExtensionManager extensionManager;
@Inject EppInput eppInput;
@@ -200,6 +205,16 @@ public final class DomainUpdateFlow implements TransactionalFlow {
EntityChanges.newBuilder().setSaves(entitiesToSave.build()).build())
.build());
persistEntityChanges(entityChanges);
// Ideally we would like to reload the persisted entity and show what is actually persisted, but
// reloading in the current session will only give back the cached version in Hibernate. It is
// impossible to see what is actually persisted in the DB because PSQL doesn't support
// READ_UNCOMMITTED. So even if we call flush here and query with another entitymanager at
// READ_UNCOMMITTED isolation level, PSQL won't show us the new data. Therefore, we have to make
// do with trusting that the to-be-persisted entity is persisted as-is by the transaction
// manager.
if (isNsDelete) {
logger.atInfo().log("Nameservers to persist:\n%s", newDomain.getNameservers());
}
return responseBuilder.build();
}
@@ -237,6 +252,12 @@ public final class DomainUpdateFlow implements TransactionalFlow {
throws EppException {
AddRemove add = command.getInnerAdd();
AddRemove remove = command.getInnerRemove();
if (RegistryEnvironment.get() != RegistryEnvironment.PRODUCTION
&& !remove.getNameservers().isEmpty()) {
isNsDelete = true;
logger.atInfo().log("Current nameservers:\n%s", tm().loadByEntity(domain).getNsHosts());
logger.atInfo().log("Nameservers to remove:\n%s", remove.getNameservers());
}
checkSameValuesNotAddedAndRemoved(add.getNameservers(), remove.getNameservers());
checkSameValuesNotAddedAndRemoved(add.getContacts(), remove.getContacts());
checkSameValuesNotAddedAndRemoved(add.getStatusValues(), remove.getStatusValues());
@@ -21,7 +21,6 @@ import static google.registry.flows.ResourceFlowUtils.verifyNoDisallowedStatuses
import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership;
import static google.registry.flows.host.HostFlowUtils.validateHostName;
import static google.registry.model.eppoutput.Result.Code.SUCCESS;
import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertAsyncActionsAreAllowed;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
@@ -36,15 +35,12 @@ import google.registry.flows.FlowModule.TargetId;
import google.registry.flows.TransactionalFlow;
import google.registry.flows.annotations.ReportingSpec;
import google.registry.model.EppResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.metadata.MetadataExtension;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppcommon.Trid;
import google.registry.model.eppoutput.EppResponse;
import google.registry.model.eppoutput.Result;
import google.registry.model.host.HostHistory;
import google.registry.model.host.HostResource;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.reporting.HistoryEntry.Type;
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
import javax.inject.Inject;
@@ -100,7 +96,7 @@ public final class HostDeleteFlow implements TransactionalFlow {
assertAsyncActionsAreAllowed();
DateTime now = tm().getTransactionTime();
validateHostName(targetId);
checkLinkedDomains(targetId, now, HostResource.class, DomainBase::getNameservers);
checkLinkedDomains(targetId, now, HostResource.class);
HostResource existingHost = loadAndVerifyExistence(HostResource.class, targetId, now);
verifyNoDisallowedStatuses(existingHost, DISALLOWED_STATUSES);
if (!isSuperuser) {
@@ -112,31 +108,19 @@ public final class HostDeleteFlow implements TransactionalFlow {
: existingHost;
verifyResourceOwnership(registrarId, owningResource);
}
HistoryEntry.Type historyEntryType;
Result.Code resultCode;
HostResource newHost;
if (tm().isOfy()) {
asyncTaskEnqueuer.enqueueAsyncDelete(
existingHost, tm().getTransactionTime(), registrarId, trid, isSuperuser);
newHost = existingHost.asBuilder().addStatusValue(StatusValue.PENDING_DELETE).build();
historyEntryType = Type.HOST_PENDING_DELETE;
resultCode = SUCCESS_WITH_ACTION_PENDING;
} else {
newHost = existingHost.asBuilder().setStatusValues(null).setDeletionTime(now).build();
if (existingHost.isSubordinate()) {
dnsQueue.addHostRefreshTask(existingHost.getHostName());
tm().update(
tm().loadByKey(existingHost.getSuperordinateDomain())
.asBuilder()
.removeSubordinateHost(existingHost.getHostName())
.build());
}
historyEntryType = Type.HOST_DELETE;
resultCode = SUCCESS;
HostResource newHost =
existingHost.asBuilder().setStatusValues(null).setDeletionTime(now).build();
if (existingHost.isSubordinate()) {
dnsQueue.addHostRefreshTask(existingHost.getHostName());
tm().update(
tm().loadByKey(existingHost.getSuperordinateDomain())
.asBuilder()
.removeSubordinateHost(existingHost.getHostName())
.build());
}
historyBuilder.setType(historyEntryType).setHost(newHost);
historyBuilder.setType(Type.HOST_DELETE).setHost(newHost);
tm().insert(historyBuilder.build());
tm().update(newHost);
return responseBuilder.setResultFromCode(resultCode).build();
return responseBuilder.setResultFromCode(SUCCESS).build();
}
}
@@ -102,19 +102,13 @@ public final class PollAckFlow implements TransactionalFlow {
// This keeps track of whether we should include the current acked message in the updated
// message count that's returned to the user. The only case where we do so is if an autorenew
// poll message is acked, but its next event is already ready to be delivered.
boolean includeAckedMessageInCount = ackPollMessage(pollMessage);
ackPollMessage(pollMessage);
// We need to return the new queue length. If this was the last message in the queue being
// acked, then we return a special status code indicating that. Note that the query will
// include the message being acked.
int messageCount = tm().doTransactionless(() -> getPollMessageCount(registrarId, now));
// Within the same transaction, Datastore will not reflect the updated count (potentially
// reduced by one thanks to the acked poll message). SQL will, however, so we shouldn't reduce
// the count in the SQL case.
if (!includeAckedMessageInCount && tm().isOfy()) {
messageCount--;
}
if (messageCount <= 0) {
return responseBuilder.setResultFromCode(SUCCESS_WITH_NO_MESSAGES).build();
}
@@ -47,13 +47,12 @@ public final class PollFlowUtils {
* <p>The only case where we do so is if an autorenew poll message is acked, but its next event is
* already ready to be delivered.
*/
public static boolean ackPollMessage(PollMessage pollMessage) {
public static void ackPollMessage(PollMessage pollMessage) {
checkArgument(
isBeforeOrAt(pollMessage.getEventTime(), tm().getTransactionTime()),
"Cannot ACK poll message with ID %s because its event time is in the future: %s",
pollMessage.getId(),
pollMessage.getEventTime());
boolean includeAckedMessageInCount = false;
if (pollMessage instanceof PollMessage.OneTime) {
// One-time poll messages are deleted once acked.
tm().delete(pollMessage.createVKey());
@@ -68,14 +67,12 @@ public final class PollFlowUtils {
// autorenew poll message has no more events to deliver and should be deleted.
if (nextEventTime.isBefore(autorenewPollMessage.getAutorenewEndTime())) {
tm().put(autorenewPollMessage.asBuilder().setEventTime(nextEventTime).build());
includeAckedMessageInCount = isBeforeOrAt(nextEventTime, tm().getTransactionTime());
} else {
tm().delete(autorenewPollMessage.createVKey());
}
} else {
throw new IllegalArgumentException("Unknown poll message type: " + pollMessage.getClass());
}
return includeAckedMessageInCount;
}
/**
@@ -20,7 +20,6 @@ import static com.google.common.collect.Sets.difference;
import static com.google.common.collect.Sets.union;
import static google.registry.config.RegistryConfig.getEppResourceCachingDuration;
import static google.registry.config.RegistryConfig.getEppResourceMaxCachedEntries;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.replicaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.util.CollectionUtils.nullToEmpty;
@@ -39,8 +38,6 @@ import com.googlecode.objectify.annotation.Index;
import google.registry.config.RegistryConfig;
import google.registry.model.CacheUtils.AppEngineEnvironmentCacheLoader;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.index.EppResourceIndex;
import google.registry.model.index.ForeignKeyIndex;
import google.registry.model.ofy.CommitLogManifest;
import google.registry.model.transfer.TransferData;
import google.registry.persistence.VKey;
@@ -226,12 +223,6 @@ public abstract class EppResource extends BackupGroupRoot implements Buildable {
@Override
public abstract Builder<?, ?> asBuilder();
/** Used when replaying from SQL to DS to populate the Datastore indexes. */
protected void saveIndexesToDatastore() {
ofyTm().putIgnoringReadOnlyWithBackup(ForeignKeyIndex.create(this, getDeletionTime()));
ofyTm().putIgnoringReadOnlyWithBackup(EppResourceIndex.create(Key.create(this)));
}
/** EppResources that are loaded via foreign keys should implement this marker interface. */
public interface ForeignKeyedEppResource {}
@@ -14,8 +14,6 @@
package google.registry.model.contact;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.EntitySubclass;
import google.registry.model.EppResource;
@@ -136,14 +134,6 @@ public class ContactHistory extends HistoryEntry implements SqlEntity, UnsafeSer
return Optional.of(asHistoryEntry());
}
// Used to fill out the contactBase field during asynchronous replay
@Override
public void beforeSqlSaveOnReplay() {
if (contactBase == null) {
contactBase = jpaTm().getEntityManager().find(ContactResource.class, getContactRepoId());
}
}
/** Class to represent the composite primary key of {@link ContactHistory} entity. */
public static class ContactHistoryId extends ImmutableObject implements Serializable {
@@ -66,11 +66,6 @@ public class ContactResource extends ContactBase
return ContactBase.cloneContactProjectedAtTime(this, now);
}
@Override
public void beforeDatastoreSaveOnReplay() {
saveIndexesToDatastore();
}
@Override
public Builder asBuilder() {
return new Builder(clone(this));
@@ -14,8 +14,6 @@
package google.registry.model.domain;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import com.googlecode.objectify.Key;
import google.registry.model.EppResource;
import google.registry.model.EppResource.ForeignKeyedEppResource;
@@ -26,7 +24,6 @@ import google.registry.model.host.HostResource;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.WithStringVKey;
import google.registry.util.DomainNameUtils;
import java.util.Set;
import javax.persistence.Access;
import javax.persistence.AccessType;
@@ -173,20 +170,6 @@ public class DomainBase extends DomainContent
return cloneDomainProjectedAtTime(this, now);
}
@Override
public void beforeSqlSaveOnReplay() {
fullyQualifiedDomainName = DomainNameUtils.canonicalizeHostname(fullyQualifiedDomainName);
dsData =
dsData.stream()
.filter(datum -> datum.getDigest() != null && datum.getDigest().length > 0)
.collect(toImmutableSet());
}
@Override
public void beforeDatastoreSaveOnReplay() {
saveIndexesToDatastore();
}
public static VKey<DomainBase> createVKey(Key<DomainBase> key) {
return VKey.create(DomainBase.class, key.getName(), key);
}
@@ -23,7 +23,6 @@ import static com.google.common.collect.Sets.difference;
import static com.google.common.collect.Sets.intersection;
import static google.registry.model.EppResourceUtils.projectResourceOntoBuilderAtTime;
import static google.registry.model.EppResourceUtils.setAutomaticTransferSuccessProperties;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.persistence.transaction.TransactionManagerUtil.transactIfJpaTm;
import static google.registry.util.CollectionUtils.forceEmptyToNull;
@@ -63,7 +62,6 @@ import google.registry.model.domain.secdns.DelegationSignerData;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.host.HostResource;
import google.registry.model.poll.PollMessage;
import google.registry.model.replay.ReplaySpecializer;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.tld.Registry;
import google.registry.model.transfer.DomainTransferData;
@@ -403,23 +401,6 @@ public class DomainContent extends EppResource
}
}
/**
* Callback to delete grace periods and DelegationSignerData records prior to domain delete.
*
* <p>See {@link ReplaySpecializer}.
*/
public static void beforeSqlDelete(VKey<DomainBase> key) {
// Delete all grace periods associated with the domain.
jpaTm()
.query("DELETE FROM GracePeriod WHERE domain_repo_id = :repo_id")
.setParameter("repo_id", key.getSqlKey())
.executeUpdate();
jpaTm()
.query("DELETE FROM DelegationSignerData WHERE domain_repo_id = :repo_id")
.setParameter("repo_id", key.getSqlKey())
.executeUpdate();
}
public static <T> VKey<T> restoreOfyFrom(Key<DomainBase> domainKey, VKey<T> key, Long historyId) {
if (historyId == null) {
// This is a legacy key (or a null key, in which case this works too)
@@ -15,7 +15,6 @@
package google.registry.model.domain;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.util.CollectionUtils.nullToEmptyImmutableCopy;
import com.google.common.collect.ImmutableSet;
@@ -33,7 +32,6 @@ import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.VKey;
import google.registry.util.DomainNameUtils;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Optional;
@@ -303,17 +301,6 @@ public class DomainHistory extends HistoryEntry implements SqlEntity {
return Optional.of(asHistoryEntry());
}
// Used to fill out the domainContent field during asynchronous replay
@Override
public void beforeSqlSaveOnReplay() {
if (domainContent == null) {
domainContent = jpaTm().getEntityManager().find(DomainBase.class, getDomainRepoId());
domainContent.fullyQualifiedDomainName =
DomainNameUtils.canonicalizeHostname(domainContent.fullyQualifiedDomainName);
fillAuxiliaryFieldsFromDomain(this);
}
}
private static void fillAuxiliaryFieldsFromDomain(DomainHistory domainHistory) {
if (domainHistory.domainContent != null) {
domainHistory.nsHosts = nullToEmptyImmutableCopy(domainHistory.domainContent.nsHosts);
@@ -24,6 +24,7 @@ import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.eppcommon.AuthInfo;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppinput.ResourceCommand.ResourceUpdate.AddRemove;
import google.registry.util.TypeUtils.TypeInstantiator;
import java.util.List;
import java.util.Set;
@@ -91,10 +92,11 @@ public interface ResourceCommand {
* @param <C> the change type
*/
@XmlTransient
abstract class ResourceUpdate
<A extends ResourceUpdate.AddRemove,
B extends EppResource.Builder<?, ?>,
C extends ResourceCreateOrChange<B>> extends AbstractSingleResourceCommand {
abstract class ResourceUpdate<
A extends AddRemove,
B extends EppResource.Builder<?, ?>,
C extends ResourceCreateOrChange<B>>
extends AbstractSingleResourceCommand {
/** Part of an update command that specifies set values to add or remove. */
@XmlTransient
@@ -113,7 +115,7 @@ public interface ResourceCommand {
protected abstract A getNullableInnerRemove();
// Don't use MoreObjects.firstNonNull in these method because it will result in an unneeded
// Don't use MoreObjects.firstNonNull in these methods because it will result in an unneeded
// reflective instantiation when the object isn't null.
public C getInnerChange() {
@@ -14,8 +14,6 @@
package google.registry.model.host;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.EntitySubclass;
import google.registry.model.EppResource;
@@ -26,7 +24,6 @@ import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.VKey;
import google.registry.util.DomainNameUtils;
import java.io.Serializable;
import java.util.Optional;
import javax.annotation.Nullable;
@@ -137,16 +134,6 @@ public class HostHistory extends HistoryEntry implements SqlEntity, UnsafeSerial
return Optional.of(asHistoryEntry());
}
// Used to fill out the hostBase field during asynchronous replay
@Override
public void beforeSqlSaveOnReplay() {
if (hostBase == null) {
hostBase = jpaTm().getEntityManager().find(HostResource.class, getHostRepoId());
hostBase.fullyQualifiedHostName =
DomainNameUtils.canonicalizeHostname(hostBase.fullyQualifiedHostName);
}
}
/** Class to represent the composite primary key of {@link HostHistory} entity. */
public static class HostHistoryId extends ImmutableObject implements Serializable {
@@ -22,7 +22,6 @@ import google.registry.model.annotations.ReportedOn;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.WithStringVKey;
import google.registry.util.DomainNameUtils;
import javax.persistence.Access;
import javax.persistence.AccessType;
@@ -71,16 +70,6 @@ public class HostResource extends HostBase
return VKey.create(HostResource.class, getRepoId(), Key.create(this));
}
@Override
public void beforeSqlSaveOnReplay() {
fullyQualifiedHostName = DomainNameUtils.canonicalizeHostname(fullyQualifiedHostName);
}
@Override
public void beforeDatastoreSaveOnReplay() {
saveIndexesToDatastore();
}
@Override
public Builder asBuilder() {
return new Builder(clone(this));
@@ -165,7 +165,6 @@ public class CommitLoggedWork<R> implements Runnable {
.addAll(untouchedRootsWithTouchedChildren)
.build())
.now();
ReplayQueue.addInTests(info);
}
/** Check that the timestamp of each BackupGroupRoot is in the past. */
@@ -1,117 +0,0 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.ofy;
import static google.registry.model.ofy.EntityWritePriorities.getEntityPriority;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.google.common.collect.ImmutableMap;
import com.googlecode.objectify.Key;
import google.registry.config.RegistryEnvironment;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.ReplaySpecializer;
import google.registry.persistence.VKey;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentLinkedQueue;
/**
* Implements simplified datastore to SQL transaction replay.
*
* <p>This code is to be removed when the actual replay cron job is implemented.
*/
@DeleteAfterMigration
public class ReplayQueue {
static ConcurrentLinkedQueue<ImmutableMap<Key<?>, Object>> queue =
new ConcurrentLinkedQueue<ImmutableMap<Key<?>, Object>>();
static void addInTests(TransactionInfo info) {
if (RegistryEnvironment.get() == RegistryEnvironment.UNITTEST) {
// Transform the entities to be persisted to the set of values as they were actually
// persisted.
ImmutableMap.Builder<Key<?>, Object> builder = new ImmutableMap.Builder<Key<?>, Object>();
for (ImmutableMap.Entry<Key<?>, Object> entry : info.getChanges().entrySet()) {
if (entry.getValue().equals(TransactionInfo.Delete.SENTINEL)) {
builder.put(entry.getKey(), entry.getValue());
} else {
// The value is an entity object that has not yet been persisted, and thus some of the
// special transformations that we do (notably the auto-timestamp transformations) have
// not been applied. Converting the object to an entity and then back again performs
// those transformations so that we persist the same values to SQL that we have in
// Datastore.
builder.put(entry.getKey(), auditedOfy().toPojo(auditedOfy().toEntity(entry.getValue())));
}
}
queue.add(builder.build());
}
}
/** Replay all transactions, return the set of keys that were replayed. */
public static ImmutableMap<Key<?>, Object> replay() {
// We can't use an ImmutableMap.Builder here, we need to be able to overwrite existing values
// and the builder doesn't support that.
Map<Key<?>, Object> result = new HashMap<Key<?>, Object>();
ImmutableMap<Key<?>, Object> changes;
while ((changes = queue.poll()) != null) {
saveToJpa(changes);
result.putAll(changes);
}
return ImmutableMap.copyOf(result);
}
public static void clear() {
queue.clear();
}
/** Returns the priority of the entity type in the map entry. */
private static int getPriority(ImmutableMap.Entry<Key<?>, Object> entry) {
return getEntityPriority(
entry.getKey().getKind(), entry.getValue().equals(TransactionInfo.Delete.SENTINEL));
}
private static int compareByPriority(
ImmutableMap.Entry<Key<?>, Object> a, ImmutableMap.Entry<Key<?>, Object> b) {
return getPriority(a) - getPriority(b);
}
private static void saveToJpa(ImmutableMap<Key<?>, Object> changes) {
try (UpdateAutoTimestamp.DisableAutoUpdateResource disabler =
UpdateAutoTimestamp.disableAutoUpdate()) {
// Sort the changes into an order that will work for insertion into the database.
jpaTm()
.transact(
() ->
changes.entrySet().stream()
.sorted(ReplayQueue::compareByPriority)
.forEach(
entry -> {
if (entry.getValue().equals(TransactionInfo.Delete.SENTINEL)) {
VKey<?> vkey = VKey.from(entry.getKey());
ReplaySpecializer.beforeSqlDelete(vkey);
jpaTm().delete(vkey);
} else {
((DatastoreEntity) entry.getValue())
.toSqlEntity()
.ifPresent(jpaTm()::put);
}
}));
}
}
}
@@ -62,7 +62,6 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Embed;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Ignore;
import com.googlecode.objectify.annotation.IgnoreSave;
import com.googlecode.objectify.annotation.Index;
import com.googlecode.objectify.annotation.Mapify;
@@ -76,7 +75,6 @@ import google.registry.model.JsonMapBuilder;
import google.registry.model.Jsonifiable;
import google.registry.model.UnsafeSerializable;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.InCrossTld;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.common.EntityGroupRoot;
@@ -389,10 +387,6 @@ public class Registrar extends ImmutableObject
*/
@Index @Nullable Long ianaIdentifier;
/** Identifier of registrar used in external billing system (e.g. Oracle). */
// TODO(sarahbot@): Drop this column from the table in a flyway script in a follow up PR.
@DeleteAfterMigration @Nullable @Deprecated @Ignore Long billingIdentifier;
/** Purchase Order number used for invoices in external billing system, if applicable. */
@Nullable String poNumber;
@@ -29,7 +29,4 @@ import java.util.Optional;
public interface DatastoreEntity {
Optional<SqlEntity> toSqlEntity();
/** A method called before the object is saved to Datastore in asynchronous replay. */
default void beforeDatastoreSaveOnReplay() {}
}
@@ -1,52 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.replay;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.persistence.VKey;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Applies class-specific functions for model objects during transaction replays.
*
* <p>There are certain cases where changes to an entity require changes to other entities that are
* not directly present in the other database. This class allows us to do that by using reflection
* to invoke special class methods if they are present.
*/
@DeleteAfterMigration
public class ReplaySpecializer {
public static void beforeSqlDelete(VKey<?> key) {
String methodName = "beforeSqlDelete";
Class<?> clazz = key.getKind();
try {
Method method = clazz.getMethod(methodName, VKey.class);
method.invoke(null, key);
} catch (NoSuchMethodException e) {
// Ignore, this just means that the class doesn't need this hook.
} catch (IllegalAccessException e) {
throw new RuntimeException(
String.format(
"%s() method is defined for class %s but is not public.",
methodName, clazz.getName()),
e);
} catch (InvocationTargetException e) {
throw new RuntimeException(
String.format("%s() method for class %s threw an exception", methodName, clazz.getName()),
e);
}
}
}
@@ -1,377 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.model.replay;
import static com.google.common.base.Preconditions.checkState;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.request.Action.Method.GET;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static org.joda.time.Duration.standardHours;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection;
import google.registry.model.server.Lock;
import google.registry.persistence.transaction.Transaction;
import google.registry.persistence.transaction.TransactionEntity;
import google.registry.request.Action;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.RequestStatusChecker;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.inject.Inject;
import javax.persistence.NoResultException;
import org.joda.time.Duration;
/** Cron task to replicate from Cloud SQL to datastore. */
@Action(
service = Action.Service.BACKEND,
path = ReplicateToDatastoreAction.PATH,
method = GET,
automaticallyPrintOk = true,
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
@VisibleForTesting
@DeleteAfterMigration
public class ReplicateToDatastoreAction implements Runnable {
public static final String PATH = "/_dr/cron/replicateToDatastore";
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
/** Name of the lock that ensures sequential execution of replays. */
public static final String REPLICATE_TO_DATASTORE_LOCK_NAME =
ReplicateToDatastoreAction.class.getSimpleName();
/**
* Number of transactions to fetch from SQL. The rationale for 200 is that we're processing these
* every minute and our production instance currently does about 2 mutations per second, so this
* should generally be enough to scoop up all of the transactions for the past minute.
*/
public static final int BATCH_SIZE = 200;
/**
* The longest time that we'll keep trying to resolve a gap in the Transaction table in
* milliseconds, after which, the gap record will be deleted.
*/
public static final long MAX_GAP_RETENTION_MILLIS = 300000;
/**
* The maximum number of entitities to be mutated per transaction. For our purposes, the entities
* that we're keeping track of are each in their own entity group. Per datastore documentation, we
* should be allowed to update up to 25 of them. In practice, we get an error if we go beyond 24
* (possibly due to something in our own infrastructure).
*/
private static final int MAX_ENTITIES_PER_TXN = 24;
public static final Duration REPLICATE_TO_DATASTORE_LOCK_LEASE_LENGTH = standardHours(1);
private final Clock clock;
private final RequestStatusChecker requestStatusChecker;
private final Response response;
@Inject
public ReplicateToDatastoreAction(
Clock clock, RequestStatusChecker requestStatusChecker, Response response) {
this.clock = clock;
this.requestStatusChecker = requestStatusChecker;
this.response = response;
}
@VisibleForTesting
public List<TransactionEntity> getTransactionBatchAtSnapshot() {
return getTransactionBatchAtSnapshot(Optional.empty());
}
/**
* Get the next batch of transactions, optionally from a specific SQL database snapshot.
*
* <p>Note that this method may also apply transactions from previous batches that had not yet
* been committed at the time the previous batch was retrieved.
*/
static List<TransactionEntity> getTransactionBatchAtSnapshot(Optional<String> snapshotId) {
// Get the next batch of transactions that we haven't replicated.
LastSqlTransaction lastSqlTxnBeforeBatch = ofyTm().transact(LastSqlTransaction::load);
try {
return jpaTm()
.transactWithoutBackup(
() -> {
snapshotId.ifPresent(jpaTm()::setDatabaseSnapshot);
// Fill in any gaps in the transaction log that have since become available before
// processing the next batch.
applyMissingTransactions();
return jpaTm()
.query(
"SELECT txn FROM TransactionEntity txn WHERE id >" + " :lastId ORDER BY id",
TransactionEntity.class)
.setParameter("lastId", lastSqlTxnBeforeBatch.getTransactionId())
.setMaxResults(BATCH_SIZE)
.getResultList();
});
} catch (NoResultException e) {
return ImmutableList.of();
}
}
/**
* Iterate over the recent gaps in the Transaction table and apply any that have been filled in.
*
* <p>Must be called from within a JPA transaction.
*
* <p>Gap rewriting is a complicated matter, and the algorithm is the product of some very deep
* consideration by mmuller and weiminyu. Basically, the constraints are:
*
* <ol>
* <li>Replay has to work against a database snapshot (gap replay would break this, so we don't
* call this method when replaying against a snapshot)
* </ol>
*/
private static void applyMissingTransactions() {
long now = jpaTm().getTransactionTime().getMillis();
ImmutableList<ReplayGap> gaps = ofyTm().loadAllOf(ReplayGap.class);
jpaTm()
.query("SELECT txn from TransactionEntity txn WHERE id IN :gapIds", TransactionEntity.class)
.setParameter(
"gapIds", gaps.stream().map(gap -> gap.getTransactionId()).collect(toImmutableList()))
.getResultStream()
.forEach(
txn -> {
// Transcribe the transaction and delete the gap record in the same ofy transaction.
ofyTm()
.transact(
() -> {
// Write the transaction to datastore.
try {
Transaction.deserialize(txn.getContents()).writeToDatastore();
} catch (IOException e) {
throw new RuntimeException("Error during transaction deserialization", e);
}
// Find and delete the gap record.
ImmutableList<ReplayGap> filledGaps =
gaps.stream()
.filter(gap -> gap.getTransactionId() == txn.getId())
.collect(toImmutableList());
checkState(
filledGaps.size() == 1,
"Bad list of gaps for discovered id: %s",
filledGaps);
auditedOfy().deleteIgnoringReadOnlyWithoutBackup().entity(gaps.get(0));
});
logger.atInfo().log("Applied missing transaction %s", txn.getId());
});
// Clean up any gaps that have expired (in batches because they're each in their own entity
// group).
ArrayList<ReplayGap> gapBatch = new ArrayList<>();
gaps.stream()
.forEach(
gap -> {
if (now - gap.getTimestamp().getMillis() > MAX_GAP_RETENTION_MILLIS) {
gapBatch.add(gap);
}
if (gapBatch.size() == MAX_ENTITIES_PER_TXN) {
deleteReplayGaps(gapBatch);
gapBatch.clear();
}
});
if (!gapBatch.isEmpty()) {
deleteReplayGaps(gapBatch);
}
}
private static void deleteReplayGaps(ArrayList<ReplayGap> gapsToDelete) {
logger.atInfo().log(
"deleting gap records for %s",
gapsToDelete.stream().map(g -> g.getTransactionId()).collect(toImmutableList()));
ofyTm()
.transact(() -> auditedOfy().deleteIgnoringReadOnlyWithoutBackup().entities(gapsToDelete));
}
/**
* Apply a transaction to Datastore.
*
* <p>Throws an exception if a fatal error occurred and the batch should be aborted.
*/
@VisibleForTesting
public static void applyTransaction(TransactionEntity txnEntity) {
logger.atInfo().log("Applying a single transaction Cloud SQL -> Cloud Datastore.");
boolean done = false;
try (UpdateAutoTimestamp.DisableAutoUpdateResource disabler =
UpdateAutoTimestamp.disableAutoUpdate()) {
// We put this in a do/while loop because we can potentially clean out some range of gaps
// first and we want to do those in their own transaction so as not to run up the entity group
// count. (This is a highly pathological case: consecutive gaps are rare, but the fact that
// they can occur potentially increases the entity group count to beyond what we can
// accommodate in a single transaction.)
do {
done =
ofyTm()
.transact(
() -> {
// Reload the last transaction id, which could possibly have changed.
LastSqlTransaction lastSqlTxn = LastSqlTransaction.load();
long nextTxnId = lastSqlTxn.getTransactionId() + 1;
// Skip missing transactions. Missed transactions can happen normally. If a
// transaction gets rolled back, the sequence counter doesn't.
int gapCount = 0;
while (nextTxnId < txnEntity.getId()) {
logger.atWarning().log(
"Ignoring transaction %s, which does not exist.", nextTxnId);
auditedOfy()
.saveIgnoringReadOnlyWithoutBackup()
.entity(new ReplayGap(ofyTm().getTransactionTime(), nextTxnId));
++nextTxnId;
// Don't exceed the entity group count trying to clean these up (we stop at
// max
// - 1 because we also want to save the lastSqlTransaction).
if (++gapCount == MAX_ENTITIES_PER_TXN - 1) {
break;
}
}
// Don't write gap records in the same transaction as the SQL transaction that
// we're replaying. Return false to force us to go through and repeat in a
// new
// transaction.
if (gapCount > 0) {
// We haven't replayed the transaction, but we've determined that we can
// ignore everything before it so update lastSqlTransaction accordingly.
auditedOfy()
.saveIgnoringReadOnlyWithoutBackup()
.entity(lastSqlTxn.cloneWithNewTransactionId(nextTxnId - 1));
return false;
}
if (nextTxnId > txnEntity.getId()) {
// We've already replayed this transaction. This shouldn't happen, as GAE
// cron
// is supposed to avoid overruns and this action shouldn't be executed from
// any
// other context, but it's not harmful as we can just ignore the
// transaction.
// Log it so that we know about it and move on.
logger.atWarning().log(
"Ignoring transaction %s, which appears to have already been applied.",
txnEntity.getId());
return true;
}
logger.atInfo().log(
"Applying transaction %s to Cloud Datastore.", txnEntity.getId());
// At this point, we know txnEntity is the correct next transaction, so write
// it
// to Datastore.
try {
Transaction.deserialize(txnEntity.getContents()).writeToDatastore();
} catch (IOException e) {
throw new RuntimeException("Error during transaction deserialization", e);
}
// Write the updated last transaction id to Datastore as part of this
// Datastore
// transaction.
auditedOfy()
.saveIgnoringReadOnlyWithoutBackup()
.entity(lastSqlTxn.cloneWithNewTransactionId(nextTxnId));
logger.atInfo().log(
"Finished applying single transaction Cloud SQL -> Cloud Datastore.");
return true;
});
} while (!done);
}
}
@Override
public void run() {
MigrationState state = DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc());
if (!state.getReplayDirection().equals(ReplayDirection.SQL_TO_DATASTORE)) {
String message =
String.format(
"Skipping ReplicateToDatastoreAction because we are in migration phase %s.", state);
logger.atInfo().log(message);
// App Engine will retry on any non-2xx status code, which we don't want in this case.
response.setStatus(SC_NO_CONTENT);
response.setPayload(message);
return;
}
Optional<Lock> lock =
Lock.acquireSql(
REPLICATE_TO_DATASTORE_LOCK_NAME,
null,
REPLICATE_TO_DATASTORE_LOCK_LEASE_LENGTH,
requestStatusChecker,
false);
if (!lock.isPresent()) {
String message = "Can't acquire ReplicateToDatastoreAction lock, aborting.";
logger.atSevere().log(message);
// App Engine will retry on any non-2xx status code, which we don't want in this case.
response.setStatus(SC_NO_CONTENT);
response.setPayload(message);
return;
}
try {
logger.atInfo().log("Processing transaction replay batch Cloud SQL -> Cloud Datastore.");
int numTransactionsReplayed = replayAllTransactions();
String resultMessage =
String.format(
"Replayed %d transaction(s) from Cloud SQL -> Datastore.", numTransactionsReplayed);
logger.atInfo().log(resultMessage);
response.setPayload(resultMessage);
response.setStatus(SC_OK);
} catch (Throwable t) {
String message = "Errored out replaying files.";
logger.atSevere().withCause(t).log(message);
response.setStatus(SC_INTERNAL_SERVER_ERROR);
response.setPayload(message);
} finally {
lock.ifPresent(Lock::releaseSql);
}
}
private int replayAllTransactions() {
return replayAllTransactions(Optional.empty());
}
public static int replayAllTransactions(Optional<String> snapshotId) {
int numTransactionsReplayed = 0;
List<TransactionEntity> transactionBatch;
do {
transactionBatch = getTransactionBatchAtSnapshot(snapshotId);
for (TransactionEntity transaction : transactionBatch) {
applyTransaction(transaction);
numTransactionsReplayed++;
}
} while (!transactionBatch.isEmpty());
return numTransactionsReplayed;
}
}
@@ -31,9 +31,6 @@ public interface SqlEntity {
Optional<DatastoreEntity> toDatastoreEntity();
/** A method that will be called before the object is saved to SQL in asynchronous replay. */
default void beforeSqlSaveOnReplay() {}
/** Returns this entity's primary key field(s) in a string. */
default String getPrimaryKeyString() {
return jpaTm()
@@ -16,9 +16,7 @@ package google.registry.model.reporting;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.util.DateTimeUtils.END_OF_TIME;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
@@ -72,29 +70,16 @@ public class HistoryEntryDao {
/** Loads all history objects in the times specified, including all types. */
public static ImmutableList<HistoryEntry> loadAllHistoryObjects(
DateTime afterTime, DateTime beforeTime) {
if (tm().isOfy()) {
return Streams.stream(
auditedOfy()
.load()
.type(HistoryEntry.class)
.order("modificationTime")
.filter("modificationTime >=", afterTime)
.filter("modificationTime <=", beforeTime))
.map(HistoryEntry::toChildHistoryEntity)
.collect(toImmutableList());
} else {
return jpaTm()
.transact(
() ->
new ImmutableList.Builder<HistoryEntry>()
.addAll(
loadAllHistoryObjectsFromSql(ContactHistory.class, afterTime, beforeTime))
.addAll(
loadAllHistoryObjectsFromSql(DomainHistory.class, afterTime, beforeTime))
.addAll(
loadAllHistoryObjectsFromSql(HostHistory.class, afterTime, beforeTime))
.build());
}
return jpaTm()
.transact(
() ->
new ImmutableList.Builder<HistoryEntry>()
.addAll(
loadAllHistoryObjectsFromSql(ContactHistory.class, afterTime, beforeTime))
.addAll(
loadAllHistoryObjectsFromSql(DomainHistory.class, afterTime, beforeTime))
.addAll(loadAllHistoryObjectsFromSql(HostHistory.class, afterTime, beforeTime))
.build());
}
/** Loads all history objects corresponding to the given {@link EppResource}. */
@@ -115,21 +100,8 @@ public class HistoryEntryDao {
/** Loads all history objects in the time period specified for the given {@link EppResource}. */
public static ImmutableList<HistoryEntry> loadHistoryObjectsForResource(
VKey<? extends EppResource> parentKey, DateTime afterTime, DateTime beforeTime) {
if (tm().isOfy()) {
return Streams.stream(
auditedOfy()
.load()
.type(HistoryEntry.class)
.ancestor(parentKey.getOfyKey())
.order("modificationTime")
.filter("modificationTime >=", afterTime)
.filter("modificationTime <=", beforeTime))
.map(HistoryEntry::toChildHistoryEntity)
.collect(toImmutableList());
} else {
return jpaTm()
.transact(() -> loadHistoryObjectsForResourceFromSql(parentKey, afterTime, beforeTime));
}
return jpaTm()
.transact(() -> loadHistoryObjectsForResourceFromSql(parentKey, afterTime, beforeTime));
}
/**
@@ -162,23 +134,15 @@ public class HistoryEntryDao {
/** Loads all history objects from all time from the given registrars. */
public static Iterable<HistoryEntry> loadHistoryObjectsByRegistrars(
ImmutableCollection<String> registrarIds) {
if (tm().isOfy()) {
return auditedOfy()
.load()
.type(HistoryEntry.class)
.filter("clientId in", registrarIds)
.order("modificationTime");
} else {
return jpaTm()
.transact(
() ->
Streams.concat(
loadHistoryObjectFromSqlByRegistrars(ContactHistory.class, registrarIds),
loadHistoryObjectFromSqlByRegistrars(DomainHistory.class, registrarIds),
loadHistoryObjectFromSqlByRegistrars(HostHistory.class, registrarIds))
.sorted(Comparator.comparing(HistoryEntry::getModificationTime))
.collect(toImmutableList()));
}
return jpaTm()
.transact(
() ->
Streams.concat(
loadHistoryObjectFromSqlByRegistrars(ContactHistory.class, registrarIds),
loadHistoryObjectFromSqlByRegistrars(DomainHistory.class, registrarIds),
loadHistoryObjectFromSqlByRegistrars(HostHistory.class, registrarIds))
.sorted(Comparator.comparing(HistoryEntry::getModificationTime))
.collect(toImmutableList()));
}
private static <T extends HistoryEntry> Stream<T> loadHistoryObjectFromSqlByRegistrars(
@@ -211,7 +175,7 @@ public class HistoryEntryDao {
jpaTm().criteriaQuery(criteriaQuery).getResultList());
}
private static Class<? extends HistoryEntry> getHistoryClassFromParent(
public static Class<? extends HistoryEntry> getHistoryClassFromParent(
Class<? extends EppResource> parent) {
if (!RESOURCE_TYPES_TO_HISTORY_TYPES.containsKey(parent)) {
throw new IllegalArgumentException(
@@ -220,7 +184,7 @@ public class HistoryEntryDao {
return RESOURCE_TYPES_TO_HISTORY_TYPES.get(parent);
}
private static String getRepoIdFieldNameFromHistoryClass(
public static String getRepoIdFieldNameFromHistoryClass(
Class<? extends HistoryEntry> historyClass) {
if (!REPO_ID_FIELD_NAMES.containsKey(historyClass)) {
throw new IllegalArgumentException(
@@ -20,10 +20,7 @@ import google.registry.backup.BackupModule;
import google.registry.backup.CommitLogCheckpointAction;
import google.registry.backup.DeleteOldCommitLogsAction;
import google.registry.backup.ExportCommitLogDiffAction;
import google.registry.backup.ReplayCommitLogsToSqlAction;
import google.registry.backup.SyncDatastoreToSqlSnapshotAction;
import google.registry.batch.BatchModule;
import google.registry.batch.DeleteContactsAndHostsAction;
import google.registry.batch.DeleteExpiredDomainsAction;
import google.registry.batch.DeleteLoadTestDataAction;
import google.registry.batch.DeleteProberDataAction;
@@ -61,8 +58,8 @@ import google.registry.export.UploadDatastoreBackupAction;
import google.registry.export.sheet.SheetModule;
import google.registry.export.sheet.SyncRegistrarsSheetAction;
import google.registry.flows.FlowComponent;
import google.registry.flows.custom.CustomLogicModule;
import google.registry.mapreduce.MapreduceModule;
import google.registry.model.replay.ReplicateToDatastoreAction;
import google.registry.monitoring.whitebox.WhiteboxModule;
import google.registry.rdap.UpdateRegistrarRdapBaseUrlsAction;
import google.registry.rde.BrdaCopyAction;
@@ -92,7 +89,6 @@ import google.registry.tmch.TmchCrlAction;
import google.registry.tmch.TmchDnlAction;
import google.registry.tmch.TmchModule;
import google.registry.tmch.TmchSmdrlAction;
import google.registry.tools.javascrap.CreateSyntheticHistoryEntriesAction;
/** Dagger component with per-request lifetime for "backend" App Engine module. */
@RequestScope
@@ -103,6 +99,7 @@ import google.registry.tools.javascrap.CreateSyntheticHistoryEntriesAction;
BillingModule.class,
CloudDnsWriterModule.class,
CronModule.class,
CustomLogicModule.class,
DnsCountQueryCoordinatorModule.class,
DnsModule.class,
DnsUpdateConfigModule.class,
@@ -135,10 +132,6 @@ interface BackendRequestComponent {
CopyDetailReportsAction copyDetailReportAction();
CreateSyntheticHistoryEntriesAction createSyntheticHistoryEntriesAction();
DeleteContactsAndHostsAction deleteContactsAndHostsAction();
DeleteExpiredDomainsAction deleteExpiredDomainsAction();
DeleteLoadTestDataAction deleteLoadTestDataAction();
@@ -191,10 +184,6 @@ interface BackendRequestComponent {
RelockDomainAction relockDomainAction();
ReplayCommitLogsToSqlAction replayCommitLogsToSqlAction();
ReplicateToDatastoreAction replicateToDatastoreAction();
ResaveAllEppResourcesAction resaveAllEppResourcesAction();
ResaveAllEppResourcesPipelineAction resaveAllEppResourcesPipelineAction();
@@ -203,8 +192,6 @@ interface BackendRequestComponent {
SendExpiringCertificateNotificationEmailAction sendExpiringCertificateNotificationEmailAction();
SyncDatastoreToSqlSnapshotAction syncDatastoreToSqlSnapshotAction();
SyncGroupMembersAction syncGroupMembersAction();
SyncRegistrarsSheetAction syncRegistrarsSheetAction();
@@ -48,14 +48,14 @@ import google.registry.tools.server.VerifyOteAction;
@RequestScope
@Subcomponent(
modules = {
BackupModule.class,
DnsModule.class,
EppToolModule.class,
LoadTestModule.class,
MapreduceModule.class,
RequestModule.class,
ToolsServerModule.class,
WhiteboxModule.class,
BackupModule.class,
DnsModule.class,
EppToolModule.class,
LoadTestModule.class,
MapreduceModule.class,
RequestModule.class,
ToolsServerModule.class,
WhiteboxModule.class,
})
interface ToolsRequestComponent {
CreateGroupsAction createGroupsAction();
@@ -107,7 +107,7 @@ public abstract class PersistenceModule {
properties.put(HIKARI_MAXIMUM_POOL_SIZE, getHibernateHikariMaximumPoolSize());
properties.put(HIKARI_IDLE_TIMEOUT, getHibernateHikariIdleTimeout());
properties.put(Environment.DIALECT, NomulusPostgreSQLDialect.class.getName());
properties.put(JDBC_BATCH_SIZE, getHibernateJdbcBatchSize());
properties.put(JDBC_BATCH_SIZE, Integer.toString(getHibernateJdbcBatchSize()));
properties.put(JDBC_FETCH_SIZE, getHibernateJdbcFetchSize());
return properties.build();
}
@@ -106,11 +106,6 @@ public class JpaTransactionManagerImpl implements JpaTransactionManager {
private static final ThreadLocal<TransactionInfo> transactionInfo =
ThreadLocal.withInitial(TransactionInfo::new);
// If this value is present, use it to determine whether or not to replay SQL transactions to
// Datastore, rather than using the schedule stored in Datastore.
private static final ThreadLocal<Optional<Boolean>> replaySqlToDatastoreOverrideForTest =
ThreadLocal.withInitial(Optional::empty);
public JpaTransactionManagerImpl(EntityManagerFactory emf, Clock clock) {
this.emf = emf;
this.clock = clock;
@@ -825,16 +820,6 @@ public class JpaTransactionManagerImpl implements JpaTransactionManager {
return entity;
}
/** Sets the override to always/never replay SQL transactions to Datastore. */
public static void setReplaySqlToDatastoreOverrideForTest(boolean replaySqlToDs) {
replaySqlToDatastoreOverrideForTest.set(Optional.of(replaySqlToDs));
}
/** Removes the replay-SQL-to-Datastore override; the migration schedule will then be used. */
public static void removeReplaySqlToDsOverrideForTest() {
replaySqlToDatastoreOverrideForTest.set(Optional.empty());
}
/** Returns true if the entity class should be replicated from SQL to datastore. */
private static boolean shouldReplicate(Class<?> entityClass) {
return !NonReplicatedEntity.class.isAssignableFrom(entityClass)
@@ -860,14 +845,12 @@ public class JpaTransactionManagerImpl implements JpaTransactionManager {
checkArgumentNotNull(clock);
inTransaction = true;
transactionTime = clock.nowUtc();
if (withBackup
&& replaySqlToDatastoreOverrideForTest
.get()
.orElseGet(
() ->
DatabaseMigrationStateSchedule.getValueAtTime(transactionTime)
.getReplayDirection()
.equals(ReplayDirection.SQL_TO_DATASTORE))) {
Supplier<Boolean> sqlToDsReplaySupplier =
() ->
DatabaseMigrationStateSchedule.getValueAtTime(transactionTime)
.getReplayDirection()
.equals(ReplayDirection.SQL_TO_DATASTORE);
if (withBackup && sqlToDsReplaySupplier.get()) {
contentsBuilder = new Transaction.Builder();
}
}
@@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableList;
import com.google.storage.onestore.v3.OnestoreEntity.EntityProto;
import google.registry.model.Buildable;
import google.registry.model.ImmutableObject;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.SqlEntity;
import google.registry.persistence.VKey;
import java.io.ByteArrayInputStream;
@@ -241,10 +240,6 @@ public class Transaction extends ImmutableObject implements Buildable {
@Override
public void writeToDatastore() {
// this should always be the case, but check just in case
if (entity instanceof DatastoreEntity) {
((DatastoreEntity) entity).beforeDatastoreSaveOnReplay();
}
ofyTm().putIgnoringReadOnlyWithBackup(entity);
}
@@ -20,11 +20,14 @@ import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
import static com.google.common.collect.ImmutableSetMultimap.toImmutableSetMultimap;
import static google.registry.model.EppResourceUtils.isLinked;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.persistence.transaction.TransactionManagerUtil.transactIfJpaTm;
import static google.registry.rdap.RdapIcannStandardInformation.CONTACT_REDACTED_VALUE;
import static google.registry.util.CollectionUtils.union;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -81,6 +84,7 @@ import java.util.Set;
import java.util.stream.Stream;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.persistence.Entity;
import org.joda.time.DateTime;
/**
@@ -150,6 +154,19 @@ public class RdapJsonFormatter {
INTERNAL
}
/**
* JPQL query template for finding the latest history entry per event type for an EPP entity.
*
* <p>User should replace '%entityName%', '%repoIdField%', and '%repoIdValue%' with valid values.
* A DomainHistory query may look like below: {@code select e from DomainHistory e where
* domainRepoId = '17-Q9JYB4C' and modificationTime in (select max(modificationTime) from
* DomainHistory where domainRepoId = '17-Q9JYB4C' and type is not null group by type)}
*/
private static final String GET_LAST_HISTORY_BY_TYPE_JPQL_TEMPLATE =
"select e from %entityName% e where %repoIdField% = '%repoIdValue%' and modificationTime in "
+ " (select max(modificationTime) from %entityName% where "
+ " %repoIdField% = '%repoIdValue%' and type is not null group by type)";
/** Map of EPP status values to the RDAP equivalents. */
private static final ImmutableMap<StatusValue, RdapStatus> STATUS_TO_RDAP_STATUS_MAP =
new ImmutableMap.Builder<StatusValue, RdapStatus>()
@@ -855,17 +872,8 @@ public class RdapJsonFormatter {
return rolesBuilder.build();
}
/**
* Creates the list of optional events to list in domain, nameserver, or contact replies.
*
* <p>Only has entries for optional events that won't be shown in "SUMMARY" versions of these
* objects. These are either stated as optional in the RDAP Response Profile 15feb19, or not
* mentioned at all but thought to be useful anyway.
*
* <p>Any required event should be added elsewhere, preferably without using HistoryEntries (so
* that we don't need to load HistoryEntries for "summary" responses).
*/
private ImmutableList<Event> makeOptionalEvents(EppResource resource) {
@VisibleForTesting
ImmutableMap<EventAction, HistoryEntry> getLastHistoryEntryByType(EppResource resource) {
HashMap<EventAction, HistoryEntry> lastEntryOfType = Maps.newHashMap();
// Events (such as transfer, but also create) can appear multiple times. We only want the last
// time they appeared.
@@ -878,8 +886,26 @@ public class RdapJsonFormatter {
// 2.3.2.3 An event of *eventAction* type *transfer*, with the last date and time that the
// domain was transferred. The event of *eventAction* type *transfer* MUST be omitted if the
// domain name has not been transferred since it was created.
Iterable<? extends HistoryEntry> historyEntries =
HistoryEntryDao.loadHistoryObjectsForResource(resource.createVKey());
Iterable<? extends HistoryEntry> historyEntries;
if (tm().isOfy()) {
historyEntries = HistoryEntryDao.loadHistoryObjectsForResource(resource.createVKey());
} else {
VKey<? extends EppResource> resourceVkey = resource.createVKey();
Class<? extends HistoryEntry> historyClass =
HistoryEntryDao.getHistoryClassFromParent(resourceVkey.getKind());
String entityName = historyClass.getAnnotation(Entity.class).name();
if (Strings.isNullOrEmpty(entityName)) {
entityName = historyClass.getSimpleName();
}
String repoIdFieldName = HistoryEntryDao.getRepoIdFieldNameFromHistoryClass(historyClass);
String jpql =
GET_LAST_HISTORY_BY_TYPE_JPQL_TEMPLATE
.replace("%entityName%", entityName)
.replace("%repoIdField%", repoIdFieldName)
.replace("%repoIdValue%", resourceVkey.getSqlKey().toString());
historyEntries =
jpaTm().transact(() -> jpaTm().getEntityManager().createQuery(jpql).getResultList());
}
for (HistoryEntry historyEntry : historyEntries) {
EventAction rdapEventAction =
HISTORY_ENTRY_TYPE_TO_RDAP_EVENT_ACTION_MAP.get(historyEntry.getType());
@@ -889,6 +915,21 @@ public class RdapJsonFormatter {
}
lastEntryOfType.put(rdapEventAction, historyEntry);
}
return ImmutableMap.copyOf(lastEntryOfType);
}
/**
* Creates the list of optional events to list in domain, nameserver, or contact replies.
*
* <p>Only has entries for optional events that won't be shown in "SUMMARY" versions of these
* objects. These are either stated as optional in the RDAP Response Profile 15feb19, or not
* mentioned at all but thought to be useful anyway.
*
* <p>Any required event should be added elsewhere, preferably without using HistoryEntries (so
* that we don't need to load HistoryEntries for "summary" responses).
*/
private ImmutableList<Event> makeOptionalEvents(EppResource resource) {
ImmutableMap<EventAction, HistoryEntry> lastEntryOfType = getLastHistoryEntryByType(resource);
ImmutableList.Builder<Event> eventsBuilder = new ImmutableList.Builder<>();
DateTime creationTime = resource.getCreationTime();
DateTime lastChangeTime =
@@ -49,11 +49,14 @@ final class GetAllocationTokenCommand implements CommandWithRemoteApi {
tokens.stream()
.map(t -> VKey.create(AllocationToken.class, t))
.collect(toImmutableList());
tm().loadByKeysIfPresent(tokenKeys)
.forEach((k, v) -> builder.put(k.getSqlKey().toString(), v));
tm().transact(
() ->
tm().loadByKeysIfPresent(tokenKeys)
.forEach((k, v) -> builder.put(k.getSqlKey().toString(), v)));
}
ImmutableMap<String, AllocationToken> loadedTokens = builder.build();
ImmutableMap<VKey<DomainBase>, DomainBase> domains = loadRedeemedDomains(loadedTokens.values());
ImmutableMap<VKey<DomainBase>, DomainBase> domains =
tm().transact(() -> loadRedeemedDomains(loadedTokens.values()));
for (String token : mainParameters) {
if (loadedTokens.containsKey(token)) {
@@ -127,10 +127,8 @@ public final class RegistryTool {
.put("update_server_locks", UpdateServerLocksCommand.class)
.put("update_tld", UpdateTldCommand.class)
.put("upload_claims_list", UploadClaimsListCommand.class)
.put("validate_datastore", ValidateDatastoreCommand.class)
.put("validate_escrow_deposit", ValidateEscrowDepositCommand.class)
.put("validate_login_credentials", ValidateLoginCredentialsCommand.class)
.put("validate_sql", ValidateSqlCommand.class)
.put("verify_ote", VerifyOteCommand.class)
.put("whois_query", WhoisQueryCommand.class)
.build();
@@ -175,14 +175,10 @@ interface RegistryToolComponent {
void inject(UpdateTldCommand command);
void inject(ValidateDatastoreCommand command);
void inject(ValidateEscrowDepositCommand command);
void inject(ValidateLoginCredentialsCommand command);
void inject(ValidateSqlCommand command);
void inject(WhoisQueryCommand command);
AppEngineConnection appEngineConnection();
@@ -204,7 +204,8 @@ final class UniformRapidSuspensionCommand extends MutatingEppToolCommand {
private ImmutableSortedSet<String> getExistingNameservers(DomainBase domain) {
ImmutableSortedSet.Builder<String> nameservers = ImmutableSortedSet.naturalOrder();
for (HostResource host : tm().loadByKeys(domain.getNameservers()).values()) {
for (HostResource host :
tm().transact(() -> tm().loadByKeys(domain.getNameservers()).values())) {
nameservers.add(host.getForeignKey());
}
return nameservers.build();
@@ -1,232 +0,0 @@
// Copyright 2022 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools;
import static google.registry.beam.BeamUtils.createJobName;
import com.beust.jcommander.Parameter;
import com.google.api.services.dataflow.Dataflow;
import com.google.api.services.dataflow.model.Job;
import com.google.api.services.dataflow.model.LaunchFlexTemplateParameter;
import com.google.api.services.dataflow.model.LaunchFlexTemplateRequest;
import com.google.api.services.dataflow.model.LaunchFlexTemplateResponse;
import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import google.registry.beam.common.DatabaseSnapshot;
import google.registry.config.RegistryConfig.Config;
import google.registry.tools.params.DateTimeParameter;
import google.registry.util.Clock;
import google.registry.util.RequestStatusChecker;
import google.registry.util.Sleeper;
import java.io.IOException;
import java.util.Optional;
import java.util.UUID;
import javax.inject.Inject;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/** Shared setup for commands that validate the data replication between Datastore and Cloud SQL. */
abstract class ValidateDatabaseMigrationCommand
implements CommandWithConnection, CommandWithRemoteApi {
private static final String PIPELINE_NAME = "validate_database_pipeline";
private static final String MANUAL_PIPELINE_LAUNCH_COMMAND_TEMPLATE =
"gcloud dataflow flex-template run "
+ "\"%s-${USER}-$(date +%%Y%%m%%dt%%H%%M%%S)\" "
+ "--template-file-gcs-location %s "
+ "--project %s "
+ "--region=%s "
+ "--worker-machine-type=n2-standard-8 --num-workers=8 "
+ "--parameters registryEnvironment=%s "
+ "--parameters sqlSnapshotId=%s "
+ "--parameters latestCommitLogTimestamp=%s "
+ "--parameters diffOutputGcsBucket=%s ";
// States indicating a job is not finished yet.
static final ImmutableSet<String> DATAFLOW_JOB_RUNNING_STATES =
ImmutableSet.of(
"JOB_STATE_UNKNOWN",
"JOB_STATE_RUNNING",
"JOB_STATE_STOPPED",
"JOB_STATE_PENDING",
"JOB_STATE_QUEUED");
static final Duration JOB_POLLING_INTERVAL = Duration.standardSeconds(60);
@Parameter(
names = {"-m", "--manual"},
description =
"If true, let user launch the comparison pipeline manually out of band. "
+ "Command will wait for user key-press to exit after syncing Datastore.")
boolean manualLaunchPipeline;
@Parameter(
names = {"-r", "--release"},
description = "The release tag of the BEAM pipeline to run. It defaults to 'live'.")
String release = "live";
@Parameter(
names = {"-c", "--comparisonStartTimestamp"},
description =
"When comparing History and Epp Resource entities, ignore those that have not"
+ " changed since this time.",
converter = DateTimeParameter.class)
DateTime comparisonStartTimestamp;
@Parameter(
names = {"-o", "--outputBucket"},
description =
"The GCS bucket where data discrepancies are logged. "
+ "It defaults to ${projectId}-beam")
String outputBucket;
@Inject Clock clock;
@Inject Dataflow dataflow;
@Inject
@Config("defaultJobRegion")
String jobRegion;
@Inject
@Config("beamStagingBucketUrl")
String stagingBucketUrl;
@Inject
@Config("projectId")
String projectId;
@Inject Sleeper sleeper;
AppEngineConnection connection;
@Override
public void setConnection(AppEngineConnection connection) {
this.connection = connection;
}
String getDataflowJobStatus(String jobId) {
try {
return dataflow
.projects()
.locations()
.jobs()
.get(projectId, jobRegion, jobId)
.execute()
.getCurrentState();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
void launchPipelineAndWaitUntilFinish(
String pipelineName, DatabaseSnapshot snapshot, String latestCommitTimestamp) {
Job pipelineJob =
launchComparisonPipeline(pipelineName, snapshot.getSnapshotId(), latestCommitTimestamp)
.getJob();
String jobId = pipelineJob.getId();
System.out.printf("Launched comparison pipeline %s (%s).\n", pipelineJob.getName(), jobId);
while (DATAFLOW_JOB_RUNNING_STATES.contains(getDataflowJobStatus(jobId))) {
sleeper.sleepInterruptibly(JOB_POLLING_INTERVAL);
}
System.out.printf(
"Pipeline ended with %s state. Please check counters for results.\n",
getDataflowJobStatus(jobId));
}
String getOutputBucket() {
return Optional.ofNullable(outputBucket).orElse(projectId + "-beam");
}
String getContainerSpecGcsPath() {
return String.format(
"%s/%s_metadata.json", stagingBucketUrl.replace("live", release), PIPELINE_NAME);
}
String getManualLaunchCommand(
String jobName, String snapshotId, String latestCommitLogTimestamp) {
String baseCommand =
String.format(
MANUAL_PIPELINE_LAUNCH_COMMAND_TEMPLATE,
jobName,
getContainerSpecGcsPath(),
projectId,
jobRegion,
RegistryToolEnvironment.get().name(),
snapshotId,
latestCommitLogTimestamp,
getOutputBucket());
if (comparisonStartTimestamp == null) {
return baseCommand;
}
return baseCommand + "--parameters comparisonStartTimestamp=" + comparisonStartTimestamp;
}
LaunchFlexTemplateResponse launchComparisonPipeline(
String jobName, String sqlSnapshotId, String latestCommitLogTimestamp) {
try {
// Hardcode machine type and initial workers to force a quick start.
ImmutableMap.Builder<String, String> paramsBuilder =
new ImmutableMap.Builder()
.put("workerMachineType", "n2-standard-8")
.put("numWorkers", "8")
.put("sqlSnapshotId", sqlSnapshotId)
.put("latestCommitLogTimestamp", latestCommitLogTimestamp)
.put("registryEnvironment", RegistryToolEnvironment.get().name())
.put("diffOutputGcsBucket", getOutputBucket());
if (comparisonStartTimestamp != null) {
paramsBuilder.put("comparisonStartTimestamp", comparisonStartTimestamp.toString());
}
LaunchFlexTemplateParameter parameter =
new LaunchFlexTemplateParameter()
.setJobName(createJobName(Ascii.toLowerCase(jobName).replace('_', '-'), clock))
.setContainerSpecGcsPath(getContainerSpecGcsPath())
.setParameters(paramsBuilder.build());
return dataflow
.projects()
.locations()
.flexTemplates()
.launch(
projectId, jobRegion, new LaunchFlexTemplateRequest().setLaunchParameter(parameter))
.execute();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* A fake implementation of {@link RequestStatusChecker} for managing SQL-backed locks from
* non-AppEngine platforms. This is only required until the Nomulus server is migrated off
* AppEngine.
*/
static class FakeRequestStatusChecker implements RequestStatusChecker {
private final String logId =
ValidateDatastoreCommand.class.getSimpleName() + "-" + UUID.randomUUID();
@Override
public String getLogId() {
return logId;
}
@Override
public boolean isRunning(String requestLogId) {
return false;
}
}
}
@@ -1,105 +0,0 @@
// Copyright 2022 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools;
import static google.registry.model.replay.ReplicateToDatastoreAction.REPLICATE_TO_DATASTORE_LOCK_LEASE_LENGTH;
import static google.registry.model.replay.ReplicateToDatastoreAction.REPLICATE_TO_DATASTORE_LOCK_NAME;
import static java.nio.charset.StandardCharsets.UTF_8;
import com.beust.jcommander.Parameters;
import com.google.common.collect.ImmutableMap;
import com.google.common.net.MediaType;
import google.registry.backup.SyncDatastoreToSqlSnapshotAction;
import google.registry.beam.common.DatabaseSnapshot;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection;
import google.registry.model.server.Lock;
import google.registry.request.Action.Service;
import java.util.Optional;
/**
* Validates asynchronously replicated data from the primary Cloud SQL database to Datastore.
*
* <p>This command suspends the replication process (by acquiring the replication lock), take a
* snapshot of the Cloud SQL database, invokes a Nomulus server action to sync Datastore to this
* snapshot (See {@link SyncDatastoreToSqlSnapshotAction} for details), and finally launches a BEAM
* pipeline to compare Datastore with the given SQL snapshot.
*
* <p>This command does not lock up the SQL database. Normal processing can proceed.
*/
@Parameters(commandDescription = "Validates Datastore with the primary Cloud SQL database.")
public class ValidateDatastoreCommand extends ValidateDatabaseMigrationCommand {
private static final Service NOMULUS_SERVICE = Service.BACKEND;
@Override
public void run() throws Exception {
MigrationState state = DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc());
if (!state.getReplayDirection().equals(ReplayDirection.SQL_TO_DATASTORE)) {
throw new IllegalStateException("Cannot validate Datastore in migration step " + state);
}
Optional<Lock> lock =
Lock.acquireSql(
REPLICATE_TO_DATASTORE_LOCK_NAME,
null,
REPLICATE_TO_DATASTORE_LOCK_LEASE_LENGTH,
new FakeRequestStatusChecker(),
false);
if (!lock.isPresent()) {
throw new IllegalStateException("Cannot acquire the async propagation lock.");
}
try {
try (DatabaseSnapshot snapshot = DatabaseSnapshot.createSnapshot()) {
System.out.printf("Obtained snapshot %s\n", snapshot.getSnapshotId());
AppEngineConnection connectionToService = connection.withService(NOMULUS_SERVICE);
String response =
connectionToService.sendPostRequest(
getNomulusEndpoint(snapshot.getSnapshotId()),
ImmutableMap.<String, String>of(),
MediaType.PLAIN_TEXT_UTF_8,
"".getBytes(UTF_8));
System.out.println(response);
lock.ifPresent(Lock::releaseSql);
lock = Optional.empty();
// See SyncDatastoreToSqlSnapshotAction for response format.
String latestCommitTimestamp =
response.substring(response.lastIndexOf('(') + 1, response.lastIndexOf(')'));
if (manualLaunchPipeline) {
System.out.printf(
"To launch the pipeline manually, use the following command:\n%s\n",
getManualLaunchCommand(
"validate-datastore", snapshot.getSnapshotId(), latestCommitTimestamp));
System.out.print("\nEnter any key to continue when the pipeline ends:");
System.in.read();
} else {
launchPipelineAndWaitUntilFinish("validate-datastore", snapshot, latestCommitTimestamp);
}
}
} finally {
lock.ifPresent(Lock::releaseSql);
}
}
private static String getNomulusEndpoint(String sqlSnapshotId) {
return String.format(
"%s?sqlSnapshotId=%s", SyncDatastoreToSqlSnapshotAction.PATH, sqlSnapshotId);
}
}
@@ -1,91 +0,0 @@
// Copyright 2022 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools;
import static google.registry.backup.ReplayCommitLogsToSqlAction.REPLAY_TO_SQL_LOCK_LEASE_LENGTH;
import static google.registry.backup.ReplayCommitLogsToSqlAction.REPLAY_TO_SQL_LOCK_NAME;
import com.beust.jcommander.Parameters;
import google.registry.beam.common.DatabaseSnapshot;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection;
import google.registry.model.replay.SqlReplayCheckpoint;
import google.registry.model.server.Lock;
import google.registry.persistence.transaction.TransactionManagerFactory;
import java.util.Optional;
import org.joda.time.DateTime;
/**
* Validates asynchronously replicated data from the primary Datastore to Cloud SQL.
*
* <p>This command suspends the replication process (by acquiring the replication lock), take a
* snapshot of the Cloud SQL database, finds the corresponding Datastore snapshot, and finally
* launches a BEAM pipeline to compare the two snapshots.
*
* <p>This command does not lock up either database. Normal processing can proceed.
*/
@Parameters(commandDescription = "Validates Cloud SQL with the primary Datastore.")
public class ValidateSqlCommand extends ValidateDatabaseMigrationCommand {
@Override
public void run() throws Exception {
MigrationState state = DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc());
if (!state.getReplayDirection().equals(ReplayDirection.DATASTORE_TO_SQL)) {
throw new IllegalStateException("Cannot validate SQL in migration step " + state);
}
Optional<Lock> lock =
Lock.acquireSql(
REPLAY_TO_SQL_LOCK_NAME,
null,
REPLAY_TO_SQL_LOCK_LEASE_LENGTH,
new FakeRequestStatusChecker(),
false);
if (!lock.isPresent()) {
throw new IllegalStateException("Cannot acquire the async propagation lock.");
}
try {
DateTime latestCommitLogTime =
TransactionManagerFactory.jpaTm().transact(() -> SqlReplayCheckpoint.get());
try (DatabaseSnapshot databaseSnapshot = DatabaseSnapshot.createSnapshot()) {
// Eagerly release the commitlog replay lock so that replay can resume.
lock.ifPresent(Lock::releaseSql);
lock = Optional.empty();
System.out.printf(
"Start comparison with SQL snapshot (%s) and CommitLog timestamp (%s).\n",
databaseSnapshot.getSnapshotId(), latestCommitLogTime);
if (manualLaunchPipeline) {
System.out.printf(
"To launch the pipeline manually, use the following command:\n%s\n",
getManualLaunchCommand(
"validate-sql",
databaseSnapshot.getSnapshotId(),
latestCommitLogTime.toString()));
System.out.print("\nEnter any key to continue when the pipeline ends:");
System.in.read();
} else {
launchPipelineAndWaitUntilFinish(
"validate-sql", databaseSnapshot, latestCommitLogTime.toString());
}
}
} finally {
lock.ifPresent(Lock::releaseSql);
}
}
}
@@ -1,198 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools.javascrap;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.model.reporting.HistoryEntryDao.REPO_ID_FIELD_NAMES;
import static google.registry.model.reporting.HistoryEntryDao.RESOURCE_TYPES_TO_HISTORY_TYPES;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import com.google.appengine.tools.mapreduce.Mapper;
import com.google.common.base.CaseFormat;
import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key;
import google.registry.config.RegistryConfig.Config;
import google.registry.mapreduce.MapreduceRunner;
import google.registry.mapreduce.inputs.EppResourceInputs;
import google.registry.model.EppResource;
import google.registry.model.domain.DomainHistory;
import google.registry.model.reporting.HistoryEntry;
import google.registry.rde.RdeStagingAction;
import google.registry.request.Action;
import google.registry.request.Response;
import google.registry.request.auth.Auth;
import google.registry.tools.server.GenerateZoneFilesAction;
import javax.inject.Inject;
/**
* A mapreduce that creates synthetic history objects in SQL for all {@link EppResource} objects.
*
* <p>Certain operations, e.g. {@link RdeStagingAction} or {@link GenerateZoneFilesAction}, require
* that we are able to answer the question of "What did this EPP resource look like at a point in
* time?" In the Datastore world, we are able to answer this question using the commit logs, however
* this is no longer possible in the SQL world. Instead, we will use the history objects, e.g.
* {@link DomainHistory} to see what a particular resource looked like at that point in time, since
* history objects store a snapshot of that resource.
*
* <p>This command creates a synthetic history object at the current point in time for every single
* EPP resource to guarantee that later on, when examining in-the-past resources, we have some
* history object for which the EppResource field is filled. This synthetic history object contains
* basically nothing and its only purpose is to create a populated history object in SQL through
* asynchronous replication.
*
* <p>NB: This class operates entirely in Datastore, which may be counterintuitive at first glance.
* However, since this is meant to be run during the Datastore-primary, SQL-secondary stage of the
* migration, we want to make sure that we are using the most up-to-date version of the data. The
* resource field of the history objects will be populated during asynchronous migration, e.g. in
* {@link DomainHistory#beforeSqlSaveOnReplay}.
*/
@Action(
service = Action.Service.BACKEND,
path = "/_dr/task/createSyntheticHistoryEntries",
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
public class CreateSyntheticHistoryEntriesAction implements Runnable {
private static final String HISTORY_REASON =
"Backfill EppResource history objects during Cloud SQL migration";
private final MapreduceRunner mrRunner;
private final Response response;
private final String registryAdminRegistrarId;
@Inject
CreateSyntheticHistoryEntriesAction(
MapreduceRunner mrRunner,
Response response,
@Config("registryAdminClientId") String registryAdminRegistrarId) {
this.mrRunner = mrRunner;
this.response = response;
this.registryAdminRegistrarId = registryAdminRegistrarId;
}
/**
* The default number of shards to run the map-only mapreduce on.
*
* <p>This is much lower than the default of 100 because we can afford it being slow and we want
* to avoid overloading SQL.
*/
private static final int NUM_SHARDS = 10;
@Override
public void run() {
mrRunner
.setJobName("Create a synthetic HistoryEntry for each EPP resource")
.setModuleName("backend")
.setDefaultMapShards(NUM_SHARDS)
.runMapOnly(
new CreateSyntheticHistoryEntriesMapper(registryAdminRegistrarId),
ImmutableList.of(EppResourceInputs.createKeyInput(EppResource.class)))
.sendLinkToMapreduceConsole(response);
}
// Returns true iff any of the *History objects in SQL contain a representation of this resource
// at the point in time that the *History object was created.
private static boolean hasHistoryContainingResource(EppResource resource) {
return jpaTm()
.transact(
() -> {
// Use READ COMMITTED isolation level so that any long-living queries don't cause
// collection of predicate locks to spiral out of control (as would happen with a
// SERIALIZABLE isolation level)
//
// NB: setting the isolation level inside the transaction only works for Postgres and
// will be reverted to the default once the transaction is committed.
jpaTm()
.getEntityManager()
.createNativeQuery("SET TRANSACTION ISOLATION LEVEL READ COMMITTED")
.executeUpdate();
// The class we're searching from is based on which parent type (e.g. Domain) we have
Class<? extends HistoryEntry> historyClass =
getHistoryClassFromParent(resource.getClass());
// The field representing repo ID unfortunately varies by history class
String repoIdFieldName =
CaseFormat.LOWER_CAMEL.to(
CaseFormat.LOWER_UNDERSCORE,
getRepoIdFieldNameFromHistoryClass(historyClass));
// The "history" fields in the *History objects are all prefixed with "history_". If
// any of the non-"history_" fields are non-null, that means that that row contains
// a representation of that EppResource at that point in time. We use creation_time as
// a marker since it's the simplest field and all EppResources will have it.
return (boolean)
jpaTm()
.getEntityManager()
.createNativeQuery(
String.format(
"SELECT EXISTS (SELECT 1 FROM \"%s\" WHERE %s = :repoId AND"
+ " creation_time IS NOT NULL)",
historyClass.getSimpleName(), repoIdFieldName))
.setParameter("repoId", resource.getRepoId())
.getSingleResult();
});
}
// Lifted from HistoryEntryDao
private static Class<? extends HistoryEntry> getHistoryClassFromParent(
Class<? extends EppResource> parent) {
if (!RESOURCE_TYPES_TO_HISTORY_TYPES.containsKey(parent)) {
throw new IllegalArgumentException(
String.format("Unknown history type for parent %s", parent.getName()));
}
return RESOURCE_TYPES_TO_HISTORY_TYPES.get(parent);
}
// Lifted from HistoryEntryDao
private static String getRepoIdFieldNameFromHistoryClass(
Class<? extends HistoryEntry> historyClass) {
if (!REPO_ID_FIELD_NAMES.containsKey(historyClass)) {
throw new IllegalArgumentException(
String.format("Unknown history type %s", historyClass.getName()));
}
return REPO_ID_FIELD_NAMES.get(historyClass);
}
/** Mapper to re-save all EPP resources. */
public static class CreateSyntheticHistoryEntriesMapper
extends Mapper<Key<EppResource>, Void, Void> {
private final String registryAdminRegistrarId;
public CreateSyntheticHistoryEntriesMapper(String registryAdminRegistrarId) {
this.registryAdminRegistrarId = registryAdminRegistrarId;
}
@Override
public final void map(final Key<EppResource> resourceKey) {
EppResource eppResource = auditedOfy().load().key(resourceKey).now();
// Only save new history entries if the most recent history for this object in SQL does not
// have the resource at that point in time already
if (!hasHistoryContainingResource(eppResource)) {
ofyTm()
.transact(
() ->
ofyTm()
.put(
HistoryEntry.createBuilderForResource(eppResource)
.setRegistrarId(registryAdminRegistrarId)
.setBySuperuser(true)
.setRequestedByRegistrar(false)
.setModificationTime(ofyTm().getTransactionTime())
.setReason(HISTORY_REASON)
.setType(HistoryEntry.Type.SYNTHETIC)
.build()));
}
}
}
}
@@ -1,135 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.tools.javascrap;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.google.common.collect.ImmutableList;
import dagger.Component;
import google.registry.beam.common.RegistryJpaIO;
import google.registry.beam.common.RegistryPipelineOptions;
import google.registry.config.RegistryConfig.Config;
import google.registry.config.RegistryConfig.ConfigModule;
import google.registry.model.EppResource;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.UpdateAutoTimestamp.DisableAutoUpdateResource;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.host.HostResource;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.PersistenceModule.TransactionIsolationLevel;
import google.registry.persistence.VKey;
import java.io.Serializable;
import javax.inject.Singleton;
import javax.persistence.Entity;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.MapElements;
import org.apache.beam.sdk.values.TypeDescriptor;
/**
* Pipeline that creates a synthetic history entry for every {@link EppResource} in SQL at the
* current time.
*
* <p>The history entries in Datastore does not have the EPP resource embedded in them. Therefore
* after {@link google.registry.beam.initsql.InitSqlPipeline} runs, these fields will all be empty.
* This pipeline loads all EPP resources and for each of them creates a synthetic history entry that
* contains the resource and saves them back to SQL, so that they can be used in the RDE pipeline.
*
* <p>Note that this pipeline should only be run in a test environment right after the init SQL
* pipeline finishes, and no EPP update is being made to the system, otherwise there is no garuantee
* that the latest history entry for a given EPP resource does not already have the resource
* embedded within it.
*
* <p>To run the pipeline:
*
* <p><code>
* $ ./nom_build :core:cSHE --args="--region=us-central1
* --runner=DataflowRunner
* --registryEnvironment=CRASH
* --project={project-id}
* --workerMachineType=n2-standard-4"
* </code>
*
* @see google.registry.tools.javascrap.CreateSyntheticHistoryEntriesAction
*/
public class CreateSyntheticHistoryEntriesPipeline implements Serializable {
private static final ImmutableList<Class<? extends EppResource>> EPP_RESOURCE_CLASSES =
ImmutableList.of(DomainBase.class, ContactResource.class, HostResource.class);
private static final String HISTORY_REASON =
"Backfill EppResource history objects after initial backup to SQL";
static void setup(Pipeline pipeline, String registryAdminRegistrarId) {
for (Class<? extends EppResource> clazz : EPP_RESOURCE_CLASSES) {
pipeline
.apply(
String.format("Read all %s", clazz.getSimpleName()),
RegistryJpaIO.read(
"SELECT id FROM %entity%"
.replace("%entity%", clazz.getAnnotation(Entity.class).name()),
String.class,
repoId -> VKey.createSql(clazz, repoId)))
.apply(
String.format("Save a synthetic HistoryEntry for each %s", clazz),
MapElements.into(TypeDescriptor.of(Void.class))
.via(
(VKey<? extends EppResource> key) -> {
jpaTm()
.transact(
() -> {
EppResource eppResource = jpaTm().loadByKey(key);
try (DisableAutoUpdateResource disable =
UpdateAutoTimestamp.disableAutoUpdate()) {
jpaTm()
.put(
HistoryEntry.createBuilderForResource(eppResource)
.setRegistrarId(registryAdminRegistrarId)
.setBySuperuser(true)
.setRequestedByRegistrar(false)
.setModificationTime(jpaTm().getTransactionTime())
.setReason(HISTORY_REASON)
.setType(HistoryEntry.Type.SYNTHETIC)
.build());
}
});
return null;
}));
}
}
public static void main(String[] args) {
RegistryPipelineOptions options =
PipelineOptionsFactory.fromArgs(args).withValidation().as(RegistryPipelineOptions.class);
RegistryPipelineOptions.validateRegistryPipelineOptions(options);
options.setIsolationOverride(TransactionIsolationLevel.TRANSACTION_READ_COMMITTED);
String registryAdminRegistrarId =
DaggerCreateSyntheticHistoryEntriesPipeline_ConfigComponent.create()
.getRegistryAdminRegistrarId();
Pipeline pipeline = Pipeline.create(options);
setup(pipeline, registryAdminRegistrarId);
pipeline.run();
}
@Singleton
@Component(modules = ConfigModule.class)
interface ConfigComponent {
@Config("registryAdminClientId")
String getRegistryAdminRegistrarId();
}
}
@@ -1,677 +0,0 @@
// Copyright 2020 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.backup;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.backup.RestoreCommitLogsActionTest.createCheckpoint;
import static google.registry.backup.RestoreCommitLogsActionTest.saveDiffFile;
import static google.registry.backup.RestoreCommitLogsActionTest.saveDiffFileNotToRestore;
import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects;
import static google.registry.model.common.DatabaseMigrationStateSchedule.DEFAULT_TRANSITION_MAP;
import static google.registry.model.common.EntityGroupRoot.getCrossTldKey;
import static google.registry.model.ofy.CommitLogBucket.getBucketKey;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.testing.DatabaseHelper.createTld;
import static google.registry.testing.DatabaseHelper.insertInDb;
import static google.registry.testing.DatabaseHelper.newDomainBase;
import static google.registry.testing.DatabaseHelper.persistActiveContact;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
import static javax.servlet.http.HttpServletResponse.SC_OK;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import com.google.cloud.storage.contrib.nio.testing.LocalStorageHelper;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.Iterables;
import com.google.common.truth.Truth8;
import com.google.common.util.concurrent.MoreExecutors;
import com.googlecode.objectify.Key;
import google.registry.gcs.GcsUtils;
import google.registry.model.common.ClassPathManager;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.GracePeriod;
import google.registry.model.domain.secdns.DelegationSignerData;
import google.registry.model.index.ForeignKeyIndex;
import google.registry.model.ofy.CommitLogBucket;
import google.registry.model.ofy.CommitLogManifest;
import google.registry.model.ofy.CommitLogMutation;
import google.registry.model.ofy.Ofy;
import google.registry.model.rde.RdeMode;
import google.registry.model.rde.RdeNamingUtils;
import google.registry.model.rde.RdeRevision;
import google.registry.model.registrar.RegistrarContact;
import google.registry.model.replay.SqlReplayCheckpoint;
import google.registry.model.server.Lock;
import google.registry.model.tld.label.PremiumList;
import google.registry.model.tld.label.PremiumList.PremiumEntry;
import google.registry.persistence.VKey;
import google.registry.persistence.transaction.JpaTransactionManager;
import google.registry.persistence.transaction.TransactionManagerFactory;
import google.registry.testing.AppEngineExtension;
import google.registry.testing.DatabaseHelper;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.InjectExtension;
import google.registry.testing.TestObject;
import google.registry.util.RequestStatusChecker;
import java.io.IOException;
import java.util.concurrent.Executors;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.mockito.ArgumentCaptor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.junit.jupiter.MockitoExtension;
/** Tests for {@link ReplayCommitLogsToSqlAction}. */
@ExtendWith(MockitoExtension.class)
public class ReplayCommitLogsToSqlActionTest {
private final FakeClock fakeClock = new FakeClock(DateTime.parse("2000-01-01TZ"));
@RegisterExtension
public final AppEngineExtension appEngine =
AppEngineExtension.builder()
.withDatastoreAndCloudSql()
.withClock(fakeClock)
.withOfyTestEntities(TestObject.class)
.withJpaUnitTestEntities(
ContactResource.class,
DelegationSignerData.class,
DomainBase.class,
GracePeriod.class,
Lock.class,
PremiumList.class,
PremiumEntry.class,
RegistrarContact.class,
SqlReplayCheckpoint.class,
TestObject.class)
.build();
@RegisterExtension public final InjectExtension inject = new InjectExtension();
/** Local GCS service. */
private final GcsUtils gcsUtils = new GcsUtils(LocalStorageHelper.getOptions());
private final ReplayCommitLogsToSqlAction action = new ReplayCommitLogsToSqlAction();
private final FakeResponse response = new FakeResponse();
@Mock private RequestStatusChecker requestStatusChecker;
@BeforeAll
static void beforeAll() {
ClassPathManager.addTestEntityClass(TestObject.class);
}
@BeforeEach
void beforeEach() {
inject.setStaticField(Ofy.class, "clock", fakeClock);
lenient().when(requestStatusChecker.getLogId()).thenReturn("requestLogId");
action.gcsUtils = gcsUtils;
action.response = response;
action.requestStatusChecker = requestStatusChecker;
action.clock = fakeClock;
action.gcsBucket = "gcs bucket";
action.diffLister = new GcsDiffFileLister();
action.diffLister.gcsUtils = gcsUtils;
action.diffLister.executorProvider = MoreExecutors::newDirectExecutorService;
action.diffLister.scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
jpaTm()
.transact(
() ->
DatabaseMigrationStateSchedule.set(
ImmutableSortedMap.of(
START_OF_TIME,
MigrationState.DATASTORE_ONLY,
START_OF_TIME.plusMinutes(1),
MigrationState.DATASTORE_PRIMARY)));
TestObject.beforeSqlSaveCallCount = 0;
TestObject.beforeSqlDeleteCallCount = 0;
}
@AfterEach
void afterEach() {
DatabaseHelper.removeDatabaseMigrationSchedule();
}
@Test
void testReplay_multipleDiffFiles() throws Exception {
insertInDb(TestObject.create("previous to keep"), TestObject.create("previous to delete"));
DateTime now = fakeClock.nowUtc();
// Create 3 transactions, across two diff files.
// Before: {"previous to keep", "previous to delete"}
// 1a: Add {"a", "b"}, Delete {"previous to delete"}
// 1b: Add {"c", "d"}, Delete {"a"}
// 2: Add {"e", "f"}, Delete {"c"}
// After: {"previous to keep", "b", "d", "e", "f"}
Key<CommitLogManifest> manifest1aKey =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(3));
Key<CommitLogManifest> manifest1bKey =
CommitLogManifest.createKey(getBucketKey(2), now.minusMinutes(2));
Key<CommitLogManifest> manifest2Key =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(1));
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(2));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1),
now.minusMinutes(3),
ImmutableSet.of(Key.create(TestObject.create("previous to delete")))),
CommitLogMutation.create(manifest1aKey, TestObject.create("a")),
CommitLogMutation.create(manifest1aKey, TestObject.create("b")),
CommitLogManifest.create(
getBucketKey(2),
now.minusMinutes(2),
ImmutableSet.of(Key.create(TestObject.create("a")))),
CommitLogMutation.create(manifest1bKey, TestObject.create("c")),
CommitLogMutation.create(manifest1bKey, TestObject.create("d")));
saveDiffFile(
gcsUtils,
createCheckpoint(now),
CommitLogManifest.create(
getBucketKey(1),
now.minusMinutes(1),
ImmutableSet.of(Key.create(TestObject.create("c")))),
CommitLogMutation.create(manifest2Key, TestObject.create("e")),
CommitLogMutation.create(manifest2Key, TestObject.create("f")));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
fakeClock.advanceOneMilli();
runAndAssertSuccess(now, 2, 3);
assertExpectedIds("previous to keep", "b", "d", "e", "f");
}
@Test
void testReplay_noManifests() throws Exception {
DateTime now = fakeClock.nowUtc();
insertInDb(TestObject.create("previous to keep"));
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(1));
saveDiffFile(gcsUtils, createCheckpoint(now.minusMillis(2)));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMillis(1)));
runAndAssertSuccess(now.minusMillis(1), 0, 0);
assertExpectedIds("previous to keep");
}
@Test
void testReplay_dryRun() throws Exception {
action.dryRun = true;
DateTime now = fakeClock.nowUtc();
insertInDb(TestObject.create("previous to keep"));
Key<CommitLogBucket> bucketKey = getBucketKey(1);
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(bucketKey, now);
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(2));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(bucketKey, now, null),
CommitLogMutation.create(manifestKey, TestObject.create("a")),
CommitLogMutation.create(manifestKey, TestObject.create("b")));
action.run();
assertThat(response.getStatus()).isEqualTo(SC_OK);
assertThat(response.getPayload())
.isEqualTo(
"Running in dry-run mode, the first set of commit log files processed would be from "
+ "searching from 1999-12-31T23:59:00.000Z to 1999-12-31T23:59:59.999Z and would "
+ "contain 1 file(s). They are (limit 10): \n"
+ "[commit_diff_until_1999-12-31T23:59:00.000Z]");
}
@Test
void testReplay_manifestWithNoDeletions() throws Exception {
DateTime now = fakeClock.nowUtc();
insertInDb(TestObject.create("previous to keep"));
Key<CommitLogBucket> bucketKey = getBucketKey(1);
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(bucketKey, now);
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(2));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(bucketKey, now, null),
CommitLogMutation.create(manifestKey, TestObject.create("a")),
CommitLogMutation.create(manifestKey, TestObject.create("b")));
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
assertExpectedIds("previous to keep", "a", "b");
}
@Test
void testReplay_manifestWithNoMutations() throws Exception {
DateTime now = fakeClock.nowUtc();
insertInDb(TestObject.create("previous to keep"), TestObject.create("previous to delete"));
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(2));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1),
now,
ImmutableSet.of(Key.create(TestObject.create("previous to delete")))));
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
assertExpectedIds("previous to keep");
}
@Test
void testReplay_mutateExistingEntity() throws Exception {
DateTime now = fakeClock.nowUtc();
insertInDb(TestObject.create("existing", "a"));
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(getBucketKey(1), now);
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(1).minusMillis(1));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMillis(1)),
CommitLogManifest.create(getBucketKey(1), now, null),
CommitLogMutation.create(manifestKey, TestObject.create("existing", "b")));
action.run();
TestObject fromDatabase =
jpaTm().transact(() -> jpaTm().loadByKey(VKey.createSql(TestObject.class, "existing")));
assertThat(fromDatabase.getField()).isEqualTo("b");
}
// This should be harmless
@Test
void testReplay_deleteMissingEntity() throws Exception {
DateTime now = fakeClock.nowUtc();
insertInDb(TestObject.create("previous to keep", "a"));
saveDiffFileNotToRestore(gcsUtils, now.minusMinutes(1).minusMillis(1));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMillis(1)),
CommitLogManifest.create(
getBucketKey(1),
now,
ImmutableSet.of(Key.create(TestObject.create("previous to delete")))));
action.run();
assertExpectedIds("previous to keep");
}
@Test
void testReplay_doesNotChangeUpdateTime() throws Exception {
// Save the contact with an earlier updateTimestamp
ContactResource contactResource = persistActiveContact("contactfoobar");
DateTime persistenceTime = fakeClock.nowUtc();
Key<CommitLogBucket> bucketKey = getBucketKey(1);
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(bucketKey, persistenceTime);
CommitLogMutation mutation =
tm().transact(() -> CommitLogMutation.create(manifestKey, contactResource));
jpaTm().transact(() -> SqlReplayCheckpoint.set(persistenceTime.minusMinutes(1).minusMillis(1)));
// Replay the contact-save an hour later; the updateTimestamp should be unchanged
fakeClock.advanceBy(Duration.standardHours(1));
saveDiffFile(
gcsUtils,
createCheckpoint(persistenceTime.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1), persistenceTime.minusMinutes(1), ImmutableSet.of()),
mutation);
runAndAssertSuccess(persistenceTime.minusMinutes(1), 1, 1);
assertAboutImmutableObjects()
.that(jpaTm().transact(() -> jpaTm().loadByEntity(contactResource)))
.isEqualExceptFields(contactResource, "revisions");
}
@Test
@SuppressWarnings({"unchecked", "rawtypes"})
void testReplay_properlyWeighted() throws Exception {
DateTime now = fakeClock.nowUtc();
Key<CommitLogManifest> manifestKey =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(1));
// Create (but don't save to SQL) a domain + contact
createTld("tld");
DomainBase domain = newDomainBase("example.tld");
CommitLogMutation domainMutation =
tm().transact(() -> CommitLogMutation.create(manifestKey, domain));
ContactResource contact = tm().transact(() -> tm().loadByKey(domain.getRegistrant()));
CommitLogMutation contactMutation =
tm().transact(() -> CommitLogMutation.create(manifestKey, contact));
// Create and save to SQL a registrar contact that we will delete
RegistrarContact toDelete = AppEngineExtension.makeRegistrarContact1();
insertInDb(toDelete);
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
// spy the txn manager so we can see what order things were inserted/removed
JpaTransactionManager spy = spy(jpaTm());
TransactionManagerFactory.setJpaTm(() -> spy);
// Save in the commit logs the domain and contact (in that order) and the token deletion
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1), now.minusMinutes(1), ImmutableSet.of(Key.create(toDelete))),
domainMutation,
contactMutation);
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
// Verify two things:
// 1. that the contact insert occurred before the domain insert (necessary for FK ordering)
// even though the domain came first in the file
// 2. that the allocation token delete occurred after the insertions
InOrder inOrder = Mockito.inOrder(spy);
inOrder.verify(spy).putIgnoringReadOnlyWithoutBackup(any(ContactResource.class));
inOrder.verify(spy).putIgnoringReadOnlyWithoutBackup(any(DomainBase.class));
inOrder.verify(spy).deleteIgnoringReadOnlyWithoutBackup(toDelete.createVKey());
inOrder.verify(spy).putIgnoringReadOnlyWithoutBackup(any(SqlReplayCheckpoint.class));
}
@Test
@SuppressWarnings({"unchecked", "rawtypes"})
void testReplay_properlyWeighted_doesNotApplyCrossTransactions() throws Exception {
DateTime now = fakeClock.nowUtc();
Key<CommitLogManifest> manifestKey =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(1));
// Create and save the standard contact
ContactResource contact = persistActiveContact("contact1234");
jpaTm().transact(() -> jpaTm().put(contact));
// Simulate a Datastore transaction with a new version of the contact
ContactResource contactWithEdit =
contact.asBuilder().setEmailAddress("replay@example.tld").build();
CommitLogMutation contactMutation =
ofyTm().transact(() -> CommitLogMutation.create(manifestKey, contactWithEdit));
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
// spy the txn manager so we can see what order things were inserted
JpaTransactionManager spy = spy(jpaTm());
TransactionManagerFactory.setJpaTm(() -> spy);
// Save two commits -- the deletion, then the new version of the contact
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1).plusMillis(1)),
CommitLogManifest.create(
getBucketKey(1), now.minusMinutes(1), ImmutableSet.of(Key.create(contact))),
CommitLogManifest.create(
getBucketKey(1), now.minusMinutes(1).plusMillis(1), ImmutableSet.of()),
contactMutation);
runAndAssertSuccess(now.minusMinutes(1).plusMillis(1), 1, 2);
// Verify that the delete occurred first (because it was in the first transaction) even though
// deletes have higher weight
ArgumentCaptor<Object> putCaptor = ArgumentCaptor.forClass(Object.class);
InOrder inOrder = Mockito.inOrder(spy);
inOrder.verify(spy).deleteIgnoringReadOnlyWithoutBackup(contact.createVKey());
inOrder.verify(spy).putIgnoringReadOnlyWithoutBackup(putCaptor.capture());
assertThat(putCaptor.getValue().getClass()).isEqualTo(ContactResource.class);
assertThat(jpaTm().transact(() -> jpaTm().loadByKey(contact.createVKey()).getEmailAddress()))
.isEqualTo("replay@example.tld");
}
@Test
void testSuccess_nonReplicatedEntity_isNotReplayed() {
DateTime now = fakeClock.nowUtc();
// spy the txn manager so we can verify it's never called
JpaTransactionManager spy = spy(jpaTm());
TransactionManagerFactory.setJpaTm(() -> spy);
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
Key<CommitLogManifest> manifestKey =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(1));
createTld("tld");
// Have a commit log with a couple objects that shouldn't be replayed
String triplet = RdeNamingUtils.makePartialName("tld", fakeClock.nowUtc(), RdeMode.FULL);
RdeRevision rdeRevision =
RdeRevision.create(triplet, "tld", fakeClock.nowUtc().toLocalDate(), RdeMode.FULL, 1);
ForeignKeyIndex<DomainBase> fki = ForeignKeyIndex.create(newDomainBase("foo.tld"), now);
tm().transact(
() -> {
try {
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1), now.minusMinutes(1), ImmutableSet.of()),
// RDE Revisions are not replicated
CommitLogMutation.create(manifestKey, rdeRevision),
// FKIs aren't replayed to SQL at all
CommitLogMutation.create(manifestKey, fki));
} catch (IOException e) {
throw new RuntimeException(e);
}
});
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
// jpaTm()::putIgnoringReadOnly should only have been called with the checkpoint and the lock
verify(spy, times(2)).putIgnoringReadOnlyWithoutBackup(any(SqlReplayCheckpoint.class));
verify(spy).putIgnoringReadOnlyWithoutBackup(any(Lock.class));
verify(spy, times(3)).putIgnoringReadOnlyWithoutBackup(any());
}
@Test
void testSuccess_nonReplicatedEntity_isNotDeleted() throws Exception {
DateTime now = fakeClock.nowUtc();
// spy the txn manager so we can verify it's never called
JpaTransactionManager spy = spy(jpaTm());
TransactionManagerFactory.setJpaTm(() -> spy);
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
// Save a couple deletes that aren't propagated to SQL (the objects deleted are irrelevant)
Key<CommitLogManifest> manifestKey =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(1));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1),
now.minusMinutes(1),
// one object only exists in Datastore, one is dually-written (so isn't replicated)
ImmutableSet.of(getCrossTldKey(), manifestKey)));
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
verify(spy, times(0)).delete(any(VKey.class));
}
@Test
void testFailure_notEnabled() {
jpaTm().transact(() -> DatabaseMigrationStateSchedule.set(DEFAULT_TRANSITION_MAP.toValueMap()));
action.run();
assertThat(response.getStatus()).isEqualTo(SC_NO_CONTENT);
assertThat(response.getPayload())
.isEqualTo(
"Skipping ReplayCommitLogsToSqlAction because we are in migration phase"
+ " DATASTORE_ONLY.");
}
@Test
void testFailure_cannotAcquireLock() {
Truth8.assertThat(
Lock.acquireSql(
ReplayCommitLogsToSqlAction.class.getSimpleName(),
null,
Duration.standardHours(1),
requestStatusChecker,
false))
.isPresent();
fakeClock.advanceOneMilli();
action.run();
assertThat(response.getStatus()).isEqualTo(SC_NO_CONTENT);
assertThat(response.getPayload())
.isEqualTo("Can't acquire SQL commit log replay lock, aborting.");
}
@Test
void testSuccess_beforeSqlSaveCallback() throws Exception {
DateTime now = fakeClock.nowUtc();
Key<CommitLogBucket> bucketKey = getBucketKey(1);
Key<CommitLogManifest> manifestKey = CommitLogManifest.createKey(bucketKey, now);
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(bucketKey, now, null),
CommitLogMutation.create(manifestKey, TestObject.create("a")));
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
assertThat(TestObject.beforeSqlSaveCallCount).isEqualTo(1);
}
@Test
void testSuccess_deleteSqlCallback() throws Exception {
DateTime now = fakeClock.nowUtc();
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1),
now.minusMinutes(1),
ImmutableSet.of(Key.create(TestObject.create("to delete")))));
action.run();
assertThat(TestObject.beforeSqlDeleteCallCount).isEqualTo(1);
}
@Test
void testSuccess_cascadingDelete() throws Exception {
DateTime now = fakeClock.nowUtc();
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
createTld("tld");
DomainBase domain =
newDomainBase("example.tld")
.asBuilder()
.setDsData(ImmutableSet.of(DelegationSignerData.create(1, 2, 3, new byte[] {0, 1, 2})))
.build();
insertInDb(domain);
assertThat(jpaTm().transact(() -> jpaTm().loadAllOf(DelegationSignerData.class))).isNotEmpty();
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1), now.minusMinutes(3), ImmutableSet.of(Key.create(domain))));
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
assertThat(jpaTm().transact(() -> jpaTm().loadAllOf(DomainBase.class))).isEmpty();
assertThat(jpaTm().transact(() -> jpaTm().loadAllOf(DelegationSignerData.class))).isEmpty();
}
@Test
void testReplay_duringReadOnly() throws Exception {
DateTime now = fakeClock.nowUtc();
jpaTm()
.transact(
() -> {
jpaTm().insertWithoutBackup(TestObject.create("previous to delete"));
SqlReplayCheckpoint.set(now.minusMinutes(2));
});
Key<CommitLogManifest> manifestKey =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(1));
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1),
now.minusMinutes(1),
ImmutableSet.of(Key.create(TestObject.create("previous to delete")))),
CommitLogMutation.create(manifestKey, TestObject.create("a")));
DatabaseHelper.setMigrationScheduleToDatastorePrimaryReadOnly(fakeClock);
runAndAssertSuccess(now.minusMinutes(1), 1, 1);
jpaTm()
.transact(
() ->
assertThat(Iterables.getOnlyElement(jpaTm().loadAllOf(TestObject.class)).getId())
.isEqualTo("a"));
}
@Test
void testReplay_deleteAndResaveCascade_withOtherDeletion_noErrors() throws Exception {
createTld("tld");
DateTime now = fakeClock.nowUtc();
jpaTm().transact(() -> SqlReplayCheckpoint.set(now.minusMinutes(1).minusMillis(1)));
// Save a domain with a particular dsData in SQL as the base
ImmutableSet<DelegationSignerData> dsData =
ImmutableSet.of(DelegationSignerData.create(1, 2, 3, new byte[] {4, 5, 6}));
DomainBase domainWithDsData =
newDomainBase("example.tld").asBuilder().setDsData(dsData).build();
insertInDb(domainWithDsData);
// Replay a version of that domain without the dsData
Key<CommitLogManifest> manifestKeyOne =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(3));
DomainBase domainWithoutDsData =
domainWithDsData.asBuilder().setDsData(ImmutableSet.of()).build();
CommitLogMutation domainWithoutDsDataMutation =
ofyTm().transact(() -> CommitLogMutation.create(manifestKeyOne, domainWithoutDsData));
// Create an object (any object) to delete via replay to trigger Hibernate flush events
TestObject testObject = TestObject.create("foo", "bar");
insertInDb(testObject);
// Replay the original domain, with the original dsData
Key<CommitLogManifest> manifestKeyTwo =
CommitLogManifest.createKey(getBucketKey(1), now.minusMinutes(2));
CommitLogMutation domainWithOriginalDsDataMutation =
ofyTm().transact(() -> CommitLogMutation.create(manifestKeyTwo, domainWithDsData));
// If we try to perform all the events in one transaction (cascade-removal of the dsData,
// cascade-adding the dsData back in, and deleting any other random object), Hibernate will
// throw an exception
saveDiffFile(
gcsUtils,
createCheckpoint(now.minusMinutes(1)),
CommitLogManifest.create(
getBucketKey(1), now.minusMinutes(3), ImmutableSet.of(Key.create(testObject))),
domainWithoutDsDataMutation,
CommitLogManifest.create(getBucketKey(1), now.minusMinutes(2), ImmutableSet.of()),
domainWithOriginalDsDataMutation);
runAndAssertSuccess(now.minusMinutes(1), 1, 2);
}
private void runAndAssertSuccess(
DateTime expectedCheckpointTime, int numFiles, int numTransactions) {
action.run();
assertThat(response.getStatus()).isEqualTo(SC_OK);
assertThat(response.getPayload())
.startsWith(
String.format(
"Caught up to current time after replaying %d file(s) containing %d total"
+ " transaction(s)",
numFiles, numTransactions));
assertThat(jpaTm().transact(SqlReplayCheckpoint::get)).isEqualTo(expectedCheckpointTime);
}
private void assertExpectedIds(String... expectedIds) {
ImmutableList<String> actualIds =
jpaTm()
.transact(
() ->
jpaTm().loadAllOf(TestObject.class).stream()
.map(TestObject::getId)
.collect(toImmutableList()));
assertThat(actualIds).containsExactlyElementsIn(expectedIds);
}
}
@@ -1,950 +0,0 @@
// Copyright 2017 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.batch;
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
import static com.google.common.collect.MoreCollectors.onlyElement;
import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth8.assertThat;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_RESOURCE_KEY;
import static google.registry.batch.AsyncTaskEnqueuer.QUEUE_ASYNC_DELETE;
import static google.registry.batch.AsyncTaskMetrics.OperationResult.STALE;
import static google.registry.model.EppResourceUtils.loadByForeignKey;
import static google.registry.model.eppcommon.StatusValue.PENDING_DELETE;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_DELETE;
import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_DELETE_FAILURE;
import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_TRANSFER_REQUEST;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_DELETE;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_DELETE_FAILURE;
import static google.registry.testing.ContactResourceSubject.assertAboutContacts;
import static google.registry.testing.DatabaseHelper.assertNoBillingEvents;
import static google.registry.testing.DatabaseHelper.createTld;
import static google.registry.testing.DatabaseHelper.getOnlyHistoryEntryOfType;
import static google.registry.testing.DatabaseHelper.getOnlyPollMessageForHistoryEntry;
import static google.registry.testing.DatabaseHelper.getPollMessages;
import static google.registry.testing.DatabaseHelper.newContactResource;
import static google.registry.testing.DatabaseHelper.newDomainBase;
import static google.registry.testing.DatabaseHelper.newHostResource;
import static google.registry.testing.DatabaseHelper.persistActiveContact;
import static google.registry.testing.DatabaseHelper.persistActiveHost;
import static google.registry.testing.DatabaseHelper.persistContactWithPendingTransfer;
import static google.registry.testing.DatabaseHelper.persistDeletedContact;
import static google.registry.testing.DatabaseHelper.persistDeletedHost;
import static google.registry.testing.DatabaseHelper.persistResource;
import static google.registry.testing.HostResourceSubject.assertAboutHosts;
import static google.registry.testing.TaskQueueHelper.assertDnsTasksEnqueued;
import static google.registry.testing.TaskQueueHelper.assertNoTasksEnqueued;
import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued;
import static google.registry.util.DateTimeUtils.END_OF_TIME;
import static org.joda.time.DateTimeZone.UTC;
import static org.joda.time.Duration.millis;
import static org.joda.time.Duration.standardDays;
import static org.joda.time.Duration.standardHours;
import static org.joda.time.Duration.standardSeconds;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.taskqueue.TaskOptions.Method;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import google.registry.batch.AsyncTaskMetrics.OperationResult;
import google.registry.batch.AsyncTaskMetrics.OperationType;
import google.registry.batch.DeleteContactsAndHostsAction.DeleteEppResourceReducer;
import google.registry.model.EppResource;
import google.registry.model.contact.ContactAddress;
import google.registry.model.contact.ContactPhoneNumber;
import google.registry.model.contact.ContactResource;
import google.registry.model.contact.PostalInfo;
import google.registry.model.domain.DomainBase;
import google.registry.model.eppcommon.StatusValue;
import google.registry.model.eppcommon.Trid;
import google.registry.model.eppoutput.EppResponse.ResponseData;
import google.registry.model.host.HostResource;
import google.registry.model.ofy.Ofy;
import google.registry.model.poll.PendingActionNotificationResponse;
import google.registry.model.poll.PendingActionNotificationResponse.ContactPendingActionNotificationResponse;
import google.registry.model.poll.PendingActionNotificationResponse.HostPendingActionNotificationResponse;
import google.registry.model.poll.PollMessage;
import google.registry.model.poll.PollMessage.OneTime;
import google.registry.model.reporting.HistoryEntry;
import google.registry.model.server.Lock;
import google.registry.model.tld.Registry;
import google.registry.model.transfer.ContactTransferData;
import google.registry.model.transfer.TransferData;
import google.registry.model.transfer.TransferResponse;
import google.registry.model.transfer.TransferStatus;
import google.registry.testing.CloudTasksHelper;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.FakeSleeper;
import google.registry.testing.InjectExtension;
import google.registry.testing.TaskQueueHelper.TaskMatcher;
import google.registry.testing.mapreduce.MapreduceTestCase;
import google.registry.util.RequestStatusChecker;
import google.registry.util.Retrier;
import google.registry.util.Sleeper;
import google.registry.util.SystemSleeper;
import java.util.Optional;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.mockito.Mock;
/** Unit tests for {@link DeleteContactsAndHostsAction}. */
public class DeleteContactsAndHostsActionTest
extends MapreduceTestCase<DeleteContactsAndHostsAction> {
@RegisterExtension public final InjectExtension inject = new InjectExtension();
private AsyncTaskEnqueuer enqueuer;
private final FakeClock clock = new FakeClock(DateTime.parse("2015-01-15T11:22:33Z"));
private final FakeResponse fakeResponse = new FakeResponse();
@Mock private RequestStatusChecker requestStatusChecker;
private void runMapreduce() throws Exception {
clock.advanceBy(standardSeconds(5));
// Apologies for the hard sleeps. Without them, the tests can be flaky because the tasks aren't
// quite fully enqueued by the time the tests attempt to lease from the queue.
Sleeper sleeper = new SystemSleeper();
sleeper.sleep(millis(50));
action.run();
sleeper.sleep(millis(50));
executeTasksUntilEmpty("mapreduce", clock);
sleeper.sleep(millis(50));
clock.advanceBy(standardSeconds(5));
auditedOfy().clearSessionCache();
}
/** Kicks off, but does not run, the mapreduce tasks. Useful for testing validation/setup. */
private void enqueueMapreduceOnly() {
clock.advanceBy(standardSeconds(5));
action.run();
clock.advanceBy(standardSeconds(5));
auditedOfy().clearSessionCache();
}
@BeforeEach
void beforeEach() {
inject.setStaticField(Ofy.class, "clock", clock);
enqueuer =
AsyncTaskEnqueuerTest.createForTesting(
new CloudTasksHelper(clock).getTestCloudTasksUtils(), clock, Duration.ZERO);
AsyncTaskMetrics asyncTaskMetricsMock = mock(AsyncTaskMetrics.class);
action = new DeleteContactsAndHostsAction();
action.asyncTaskMetrics = asyncTaskMetricsMock;
inject.setStaticField(DeleteEppResourceReducer.class, "asyncTaskMetrics", asyncTaskMetricsMock);
action.clock = clock;
action.mrRunner = makeDefaultRunner();
action.requestStatusChecker = requestStatusChecker;
action.response = fakeResponse;
action.retrier = new Retrier(new FakeSleeper(clock), 1);
action.queue = getQueue(QUEUE_ASYNC_DELETE);
when(requestStatusChecker.getLogId()).thenReturn("requestId");
when(requestStatusChecker.isRunning(anyString()))
.thenThrow(new AssertionError("Should not be called"));
createTld("tld");
clock.advanceOneMilli();
}
@Test
void testSuccess_contact_referencedByActiveDomain_doesNotGetDeleted() throws Exception {
ContactResource contact = persistContactPendingDelete("blah8221");
persistResource(newDomainBase("example.tld", contact));
DateTime timeEnqueued = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
contact,
timeEnqueued,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
ContactResource contactUpdated =
loadByForeignKey(ContactResource.class, "blah8221", clock.nowUtc()).get();
assertAboutContacts()
.that(contactUpdated)
.doesNotHaveStatusValue(PENDING_DELETE)
.and()
.hasDeletionTime(END_OF_TIME);
DomainBase domainReloaded =
loadByForeignKey(DomainBase.class, "example.tld", clock.nowUtc()).get();
// We have to check for the objectify key here, specifically, as the SQL side of the key does
// not get persisted.
assertThat(domainReloaded.getReferencedContacts()).contains(contactUpdated.createVKey());
HistoryEntry historyEntry =
getOnlyHistoryEntryOfType(contactUpdated, HistoryEntry.Type.CONTACT_DELETE_FAILURE);
assertPollMessageFor(
historyEntry,
"TheRegistrar",
"Can't delete contact blah8221 because it is referenced by a domain.",
false,
contact,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
verify(action.asyncTaskMetrics).recordContactHostDeletionBatchSize(1L);
verify(action.asyncTaskMetrics)
.recordAsyncFlowResult(OperationType.CONTACT_DELETE, OperationResult.FAILURE, timeEnqueued);
verifyNoMoreInteractions(action.asyncTaskMetrics);
}
@Test
void testSuccess_contact_notReferenced_getsDeleted_andPiiWipedOut() throws Exception {
runSuccessfulContactDeletionTest(Optional.of("fakeClientTrid"));
}
@Test
void testSuccess_contact_andNoClientTrid_deletesSuccessfully() throws Exception {
runSuccessfulContactDeletionTest(Optional.empty());
}
@Test
void test_cannotAcquireLock() {
// Make lock acquisition fail.
acquireLock();
enqueueMapreduceOnly();
assertThat(fakeResponse.getPayload()).isEqualTo("Can't acquire lock; aborting.");
}
@Test
void test_mapreduceHasWorkToDo_lockIsAcquired() {
ContactResource contact = persistContactPendingDelete("blah8221");
persistResource(newDomainBase("example.tld", contact));
DateTime timeEnqueued = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
contact,
timeEnqueued,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueueMapreduceOnly();
assertThat(acquireLock()).isEmpty();
}
@Test
void test_noTasksToLease_releasesLockImmediately() {
enqueueMapreduceOnly();
// If the Lock was correctly released, then we can acquire it now.
assertThat(acquireLock()).isPresent();
}
private void runSuccessfulContactDeletionTest(Optional<String> clientTrid) throws Exception {
ContactResource contact = persistContactWithPii("jim919");
DateTime timeEnqueued = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
contact,
timeEnqueued,
"TheRegistrar",
Trid.create(clientTrid.orElse(null), "fakeServerTrid"),
false);
runMapreduce();
assertThat(loadByForeignKey(ContactResource.class, "jim919", clock.nowUtc())).isEmpty();
ContactResource contactAfterDeletion = auditedOfy().load().entity(contact).now();
assertAboutContacts()
.that(contactAfterDeletion)
.isNotActiveAt(clock.nowUtc())
// Note that there will be another history entry of CONTACT_PENDING_DELETE, but this is
// added by the flow and not the mapreduce itself.
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(CONTACT_DELETE);
assertAboutContacts()
.that(contactAfterDeletion)
.hasNullLocalizedPostalInfo()
.and()
.hasNullInternationalizedPostalInfo()
.and()
.hasNullEmailAddress()
.and()
.hasNullVoiceNumber()
.and()
.hasNullFaxNumber();
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(contactAfterDeletion, CONTACT_DELETE);
assertPollMessageFor(
historyEntry, "TheRegistrar", "Deleted contact jim919.", true, contact, clientTrid);
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
verify(action.asyncTaskMetrics).recordContactHostDeletionBatchSize(1L);
verify(action.asyncTaskMetrics)
.recordAsyncFlowResult(OperationType.CONTACT_DELETE, OperationResult.SUCCESS, timeEnqueued);
verifyNoMoreInteractions(action.asyncTaskMetrics);
}
@Test
void testSuccess_contactWithoutPendingTransfer_isDeletedAndHasNoTransferData() throws Exception {
ContactResource contact = persistContactPendingDelete("blah8221");
enqueuer.enqueueAsyncDelete(
contact,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
ContactResource contactAfterDeletion = auditedOfy().load().entity(contact).now();
assertThat(contactAfterDeletion.getTransferData()).isEqualTo(ContactTransferData.EMPTY);
}
@Test
void testSuccess_contactWithPendingTransfer_getsDeleted() throws Exception {
DateTime transferRequestTime = clock.nowUtc().minusDays(3);
ContactResource contact =
persistContactWithPendingTransfer(
newContactResource("sh8013").asBuilder().addStatusValue(PENDING_DELETE).build(),
transferRequestTime,
transferRequestTime.plus(Registry.DEFAULT_TRANSFER_GRACE_PERIOD),
clock.nowUtc());
enqueuer.enqueueAsyncDelete(
contact,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
// Check that the contact is deleted as of now.
assertThat(loadByForeignKey(ContactResource.class, "sh8013", clock.nowUtc())).isEmpty();
// Check that it's still there (it wasn't deleted yesterday) and that it has history.
ContactResource softDeletedContact =
loadByForeignKey(ContactResource.class, "sh8013", clock.nowUtc().minusDays(1)).get();
assertAboutContacts()
.that(softDeletedContact)
.hasOneHistoryEntryEachOfTypes(CONTACT_TRANSFER_REQUEST, CONTACT_DELETE);
// Check that the transfer data reflects the cancelled transfer as we expect.
TransferData oldTransferData = contact.getTransferData();
assertThat(softDeletedContact.getTransferData())
.isEqualTo(
oldTransferData.copyConstantFieldsToBuilder()
.setTransferStatus(TransferStatus.SERVER_CANCELLED)
.setPendingTransferExpirationTime(softDeletedContact.getDeletionTime())
.build());
assertNoBillingEvents();
PollMessage deletePollMessage =
Iterables.getOnlyElement(getPollMessages("TheRegistrar", clock.nowUtc().plusMonths(1)));
assertThat(deletePollMessage.getMsg()).isEqualTo("Deleted contact sh8013.");
// The poll message in the future to the gaining registrar should be gone too, but there
// should be one at the current time to the gaining registrar.
PollMessage gainingPollMessage =
Iterables.getOnlyElement(getPollMessages("NewRegistrar", clock.nowUtc()));
assertThat(gainingPollMessage.getEventTime()).isLessThan(clock.nowUtc());
assertThat(
gainingPollMessage
.getResponseData()
.stream()
.filter(TransferResponse.class::isInstance)
.map(TransferResponse.class::cast)
.collect(onlyElement())
.getTransferStatus())
.isEqualTo(TransferStatus.SERVER_CANCELLED);
PendingActionNotificationResponse panData =
gainingPollMessage
.getResponseData()
.stream()
.filter(PendingActionNotificationResponse.class::isInstance)
.map(PendingActionNotificationResponse.class::cast)
.collect(onlyElement());
assertThat(panData.getTrid())
.isEqualTo(Trid.create("transferClient-trid", "transferServer-trid"));
assertThat(panData.getActionResult()).isFalse();
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_contact_referencedByDeletedDomain_getsDeleted() throws Exception {
ContactResource contactUsed = persistContactPendingDelete("blah1234");
persistResource(
newDomainBase("example.tld", contactUsed)
.asBuilder()
.setDeletionTime(clock.nowUtc().minusDays(3))
.build());
enqueuer.enqueueAsyncDelete(
contactUsed,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
assertThat(loadByForeignKey(ContactResource.class, "blah1234", clock.nowUtc())).isEmpty();
ContactResource contactBeforeDeletion =
loadByForeignKey(ContactResource.class, "blah1234", clock.nowUtc().minusDays(1)).get();
assertAboutContacts()
.that(contactBeforeDeletion)
.isNotActiveAt(clock.nowUtc())
.and()
.hasExactlyStatusValues(StatusValue.OK)
// Note that there will be another history entry of CONTACT_PENDING_DELETE, but this is
// added by the flow and not the mapreduce itself.
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(CONTACT_DELETE);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(contactBeforeDeletion, CONTACT_DELETE);
assertPollMessageFor(
historyEntry,
"TheRegistrar",
"Deleted contact blah1234.",
true,
contactUsed,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_contact_notRequestedByOwner_doesNotGetDeleted() throws Exception {
ContactResource contact = persistContactPendingDelete("jane0991");
enqueuer.enqueueAsyncDelete(
contact,
clock.nowUtc(),
"OtherRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
ContactResource contactAfter =
loadByForeignKey(ContactResource.class, "jane0991", clock.nowUtc()).get();
assertAboutContacts()
.that(contactAfter)
.doesNotHaveStatusValue(PENDING_DELETE)
.and()
.hasDeletionTime(END_OF_TIME);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(contactAfter, CONTACT_DELETE_FAILURE);
assertPollMessageFor(
historyEntry,
"OtherRegistrar",
"Can't delete contact jane0991 because it was transferred prior to deletion.",
false,
contact,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_contact_notRequestedByOwner_isSuperuser_getsDeleted() throws Exception {
ContactResource contact = persistContactWithPii("nate007");
enqueuer.enqueueAsyncDelete(
contact,
clock.nowUtc(),
"OtherRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
true);
runMapreduce();
assertThat(loadByForeignKey(ContactResource.class, "nate007", clock.nowUtc())).isEmpty();
ContactResource contactAfterDeletion = auditedOfy().load().entity(contact).now();
assertAboutContacts()
.that(contactAfterDeletion)
.isNotActiveAt(clock.nowUtc())
// Note that there will be another history entry of CONTACT_PENDING_DELETE, but this is
// added by the flow and not the mapreduce itself.
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(CONTACT_DELETE);
assertAboutContacts()
.that(contactAfterDeletion)
.hasNullLocalizedPostalInfo()
.and()
.hasNullInternationalizedPostalInfo()
.and()
.hasNullEmailAddress()
.and()
.hasNullVoiceNumber()
.and()
.hasNullFaxNumber();
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(contactAfterDeletion, CONTACT_DELETE);
assertPollMessageFor(
historyEntry,
"OtherRegistrar",
"Deleted contact nate007.",
true,
contact,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_targetResourcesDontExist_areDelayedForADay() {
ContactResource contactNotSaved = newContactResource("somecontact");
HostResource hostNotSaved = newHostResource("a11.blah.foo");
DateTime timeBeforeRun = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
contactNotSaved,
timeBeforeRun,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueuer.enqueueAsyncDelete(
hostNotSaved,
timeBeforeRun,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueueMapreduceOnly();
assertTasksEnqueued(
QUEUE_ASYNC_DELETE,
new TaskMatcher()
.etaDelta(standardHours(23), standardHours(25))
.param(PARAM_RESOURCE_KEY, contactNotSaved.createVKey().stringify())
.param("requestingClientId", "TheRegistrar")
.param("clientTransactionId", "fakeClientTrid")
.param("serverTransactionId", "fakeServerTrid")
.param("isSuperuser", "false")
.param("requestedTime", timeBeforeRun.toString()),
new TaskMatcher()
.etaDelta(standardHours(23), standardHours(25))
.param(PARAM_RESOURCE_KEY, hostNotSaved.createVKey().stringify())
.param("requestingClientId", "TheRegistrar")
.param("clientTransactionId", "fakeClientTrid")
.param("serverTransactionId", "fakeServerTrid")
.param("isSuperuser", "false")
.param("requestedTime", timeBeforeRun.toString()));
assertThat(acquireLock()).isPresent();
}
@Test
void testSuccess_unparseableTasks_areDelayedForADay() {
TaskOptions task =
TaskOptions.Builder.withMethod(Method.PULL).param("gobbledygook", "kljhadfgsd9f7gsdfh");
getQueue(QUEUE_ASYNC_DELETE).add(task);
enqueueMapreduceOnly();
assertTasksEnqueued(
QUEUE_ASYNC_DELETE,
new TaskMatcher()
.payload("gobbledygook=kljhadfgsd9f7gsdfh")
.etaDelta(standardHours(23), standardHours(25)));
verify(action.asyncTaskMetrics).recordContactHostDeletionBatchSize(1L);
verifyNoMoreInteractions(action.asyncTaskMetrics);
assertThat(acquireLock()).isPresent();
}
@Test
void testSuccess_resourcesNotInPendingDelete_areSkipped() {
ContactResource contact = persistActiveContact("blah2222");
HostResource host = persistActiveHost("rustles.your.jimmies");
DateTime timeEnqueued = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
contact,
timeEnqueued,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueuer.enqueueAsyncDelete(
host,
timeEnqueued,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueueMapreduceOnly();
assertThat(loadByForeignKey(ContactResource.class, "blah2222", clock.nowUtc()))
.hasValue(contact);
assertThat(loadByForeignKey(HostResource.class, "rustles.your.jimmies", clock.nowUtc()))
.hasValue(host);
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
verify(action.asyncTaskMetrics).recordContactHostDeletionBatchSize(2L);
verify(action.asyncTaskMetrics)
.recordAsyncFlowResult(OperationType.CONTACT_DELETE, STALE, timeEnqueued);
verify(action.asyncTaskMetrics)
.recordAsyncFlowResult(OperationType.HOST_DELETE, STALE, timeEnqueued);
verifyNoMoreInteractions(action.asyncTaskMetrics);
assertThat(acquireLock()).isPresent();
}
@Test
void testSuccess_alreadyDeletedResources_areSkipped() {
ContactResource contactDeleted = persistDeletedContact("blah1236", clock.nowUtc().minusDays(2));
HostResource hostDeleted = persistDeletedHost("a.lim.lop", clock.nowUtc().minusDays(3));
enqueuer.enqueueAsyncDelete(
contactDeleted,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueuer.enqueueAsyncDelete(
hostDeleted,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
enqueueMapreduceOnly();
assertThat(auditedOfy().load().entity(contactDeleted).now()).isEqualTo(contactDeleted);
assertThat(auditedOfy().load().entity(hostDeleted).now()).isEqualTo(hostDeleted);
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
assertThat(acquireLock()).isPresent();
}
@Test
void testSuccess_host_referencedByActiveDomain_doesNotGetDeleted() throws Exception {
HostResource host = persistHostPendingDelete("ns1.example.tld");
persistUsedDomain("example.tld", persistActiveContact("abc456"), host);
DateTime timeEnqueued = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
host,
timeEnqueued,
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
HostResource hostAfter =
loadByForeignKey(HostResource.class, "ns1.example.tld", clock.nowUtc()).get();
assertAboutHosts()
.that(hostAfter)
.doesNotHaveStatusValue(PENDING_DELETE)
.and()
.hasDeletionTime(END_OF_TIME);
DomainBase domain =
loadByForeignKey(DomainBase.class, "example.tld", clock.nowUtc()).get();
assertThat(domain.getNameservers()).contains(hostAfter.createVKey());
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(hostAfter, HOST_DELETE_FAILURE);
assertPollMessageFor(
historyEntry,
"TheRegistrar",
"Can't delete host ns1.example.tld because it is referenced by a domain.",
false,
host,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
verify(action.asyncTaskMetrics).recordContactHostDeletionBatchSize(1L);
verify(action.asyncTaskMetrics)
.recordAsyncFlowResult(OperationType.HOST_DELETE, OperationResult.FAILURE, timeEnqueued);
verifyNoMoreInteractions(action.asyncTaskMetrics);
}
@Test
void testSuccess_host_notReferenced_getsDeleted() throws Exception {
runSuccessfulHostDeletionTest(Optional.of("fakeClientTrid"));
}
@Test
void testSuccess_host_andNoClientTrid_deletesSuccessfully() throws Exception {
runSuccessfulHostDeletionTest(Optional.empty());
}
private void runSuccessfulHostDeletionTest(Optional<String> clientTrid) throws Exception {
HostResource host = persistHostPendingDelete("ns2.example.tld");
DateTime timeEnqueued = clock.nowUtc();
enqueuer.enqueueAsyncDelete(
host,
timeEnqueued,
"TheRegistrar",
Trid.create(clientTrid.orElse(null), "fakeServerTrid"),
false);
runMapreduce();
assertThat(loadByForeignKey(HostResource.class, "ns2.example.tld", clock.nowUtc())).isEmpty();
HostResource hostBeforeDeletion =
loadByForeignKey(HostResource.class, "ns2.example.tld", clock.nowUtc().minusDays(1)).get();
assertAboutHosts()
.that(hostBeforeDeletion)
.isNotActiveAt(clock.nowUtc())
.and()
.hasExactlyStatusValues(StatusValue.OK)
// Note that there will be another history entry of HOST_PENDING_DELETE, but this is
// added by the flow and not the mapreduce itself.
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(HOST_DELETE);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(hostBeforeDeletion, HOST_DELETE);
assertPollMessageFor(
historyEntry,
"TheRegistrar",
"Deleted host ns2.example.tld.",
true,
host,
clientTrid);
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
verify(action.asyncTaskMetrics).recordContactHostDeletionBatchSize(1L);
verify(action.asyncTaskMetrics)
.recordAsyncFlowResult(OperationType.HOST_DELETE, OperationResult.SUCCESS, timeEnqueued);
verifyNoMoreInteractions(action.asyncTaskMetrics);
}
@Test
void testSuccess_host_referencedByDeletedDomain_getsDeleted() throws Exception {
HostResource host = persistHostPendingDelete("ns1.example.tld");
persistResource(
newDomainBase("example.tld")
.asBuilder()
.setNameservers(ImmutableSet.of(host.createVKey()))
.setDeletionTime(clock.nowUtc().minusDays(5))
.build());
enqueuer.enqueueAsyncDelete(
host,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
assertThat(loadByForeignKey(HostResource.class, "ns1.example.tld", clock.nowUtc())).isEmpty();
HostResource hostBeforeDeletion =
loadByForeignKey(HostResource.class, "ns1.example.tld", clock.nowUtc().minusDays(1)).get();
assertAboutHosts()
.that(hostBeforeDeletion)
.isNotActiveAt(clock.nowUtc())
.and()
.hasExactlyStatusValues(StatusValue.OK)
// Note that there will be another history entry of HOST_PENDING_DELETE, but this is
// added by the flow and not the mapreduce itself.
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(HOST_DELETE);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(hostBeforeDeletion, HOST_DELETE);
assertPollMessageFor(
historyEntry,
"TheRegistrar",
"Deleted host ns1.example.tld.",
true,
host,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_subordinateHost_getsDeleted() throws Exception {
DomainBase domain =
persistResource(
newDomainBase("example.tld")
.asBuilder()
.setSubordinateHosts(ImmutableSet.of("ns2.example.tld"))
.build());
HostResource host =
persistResource(
persistHostPendingDelete("ns2.example.tld")
.asBuilder()
.setSuperordinateDomain(domain.createVKey())
.build());
enqueuer.enqueueAsyncDelete(
host,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
// Check that the host is deleted as of now.
assertThat(loadByForeignKey(HostResource.class, "ns2.example.tld", clock.nowUtc())).isEmpty();
assertNoBillingEvents();
assertThat(
loadByForeignKey(DomainBase.class, "example.tld", clock.nowUtc())
.get()
.getSubordinateHosts())
.isEmpty();
assertDnsTasksEnqueued("ns2.example.tld");
HostResource hostBeforeDeletion =
loadByForeignKey(HostResource.class, "ns2.example.tld", clock.nowUtc().minusDays(1)).get();
assertAboutHosts()
.that(hostBeforeDeletion)
.isNotActiveAt(clock.nowUtc())
.and()
.hasExactlyStatusValues(StatusValue.OK)
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(HOST_DELETE);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(hostBeforeDeletion, HOST_DELETE);
assertPollMessageFor(
historyEntry,
"TheRegistrar",
"Deleted host ns2.example.tld.",
true,
host,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_host_notRequestedByOwner_doesNotGetDeleted() throws Exception {
HostResource host = persistHostPendingDelete("ns2.example.tld");
enqueuer.enqueueAsyncDelete(
host,
clock.nowUtc(),
"OtherRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
runMapreduce();
HostResource hostAfter =
loadByForeignKey(HostResource.class, "ns2.example.tld", clock.nowUtc()).get();
assertAboutHosts()
.that(hostAfter)
.doesNotHaveStatusValue(PENDING_DELETE)
.and()
.hasDeletionTime(END_OF_TIME);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(host, HOST_DELETE_FAILURE);
assertPollMessageFor(
historyEntry,
"OtherRegistrar",
"Can't delete host ns2.example.tld because it was transferred prior to deletion.",
false,
host,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_host_notRequestedByOwner_isSuperuser_getsDeleted() throws Exception {
HostResource host = persistHostPendingDelete("ns66.example.tld");
enqueuer.enqueueAsyncDelete(
host,
clock.nowUtc(),
"OtherRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
true);
runMapreduce();
assertThat(loadByForeignKey(HostResource.class, "ns66.example.tld", clock.nowUtc())).isEmpty();
HostResource hostBeforeDeletion =
loadByForeignKey(HostResource.class, "ns66.example.tld", clock.nowUtc().minusDays(1)).get();
assertAboutHosts()
.that(hostBeforeDeletion)
.isNotActiveAt(clock.nowUtc())
.and()
.hasExactlyStatusValues(StatusValue.OK)
// Note that there will be another history entry of HOST_PENDING_DELETE, but this is
// added by the flow and not the mapreduce itself.
.and()
.hasOnlyOneHistoryEntryWhich()
.hasType(HOST_DELETE);
HistoryEntry historyEntry = getOnlyHistoryEntryOfType(hostBeforeDeletion, HOST_DELETE);
assertPollMessageFor(
historyEntry,
"OtherRegistrar",
"Deleted host ns66.example.tld.",
true,
host,
Optional.of("fakeClientTrid"));
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
@Test
void testSuccess_deleteABunchOfContactsAndHosts_butNotSome() throws Exception {
ContactResource c1 = persistContactPendingDelete("nsaid54");
ContactResource c2 = persistContactPendingDelete("nsaid55");
ContactResource c3 = persistContactPendingDelete("nsaid57");
HostResource h1 = persistHostPendingDelete("nn5.example.tld");
HostResource h2 = persistHostPendingDelete("no.foos.ball");
HostResource h3 = persistHostPendingDelete("slime.wars.fun");
ContactResource c4 = persistContactPendingDelete("iaminuse6");
HostResource h4 = persistHostPendingDelete("used.host.com");
persistUsedDomain("usescontactandhost.tld", c4, h4);
for (EppResource resource : ImmutableList.<EppResource>of(c1, c2, c3, c4, h1, h2, h3, h4)) {
enqueuer.enqueueAsyncDelete(
resource,
clock.nowUtc(),
"TheRegistrar",
Trid.create("fakeClientTrid", "fakeServerTrid"),
false);
}
runMapreduce();
for (EppResource resource : ImmutableList.<EppResource>of(c1, c2, c3, h1, h2, h3)) {
EppResource loaded = auditedOfy().load().entity(resource).now();
assertThat(loaded.getDeletionTime()).isLessThan(DateTime.now(UTC));
assertThat(loaded.getStatusValues()).doesNotContain(PENDING_DELETE);
}
for (EppResource resource : ImmutableList.<EppResource>of(c4, h4)) {
EppResource loaded = auditedOfy().load().entity(resource).now();
assertThat(loaded.getDeletionTime()).isEqualTo(END_OF_TIME);
assertThat(loaded.getStatusValues()).doesNotContain(PENDING_DELETE);
}
assertNoTasksEnqueued(QUEUE_ASYNC_DELETE);
}
private static ContactResource persistContactWithPii(String contactId) {
return persistResource(
newContactResource(contactId)
.asBuilder()
.setLocalizedPostalInfo(
new PostalInfo.Builder()
.setType(PostalInfo.Type.LOCALIZED)
.setAddress(
new ContactAddress.Builder()
.setStreet(ImmutableList.of("123 Grand Ave"))
.build())
.build())
.setInternationalizedPostalInfo(
new PostalInfo.Builder()
.setType(PostalInfo.Type.INTERNATIONALIZED)
.setAddress(
new ContactAddress.Builder()
.setStreet(ImmutableList.of("123 Avenida Grande"))
.build())
.build())
.setEmailAddress("bob@bob.com")
.setVoiceNumber(new ContactPhoneNumber.Builder().setPhoneNumber("555-1212").build())
.setFaxNumber(new ContactPhoneNumber.Builder().setPhoneNumber("555-1212").build())
.addStatusValue(PENDING_DELETE)
.build());
}
/**
* Helper method to check that one poll message exists with a given history entry, resource,
* client id, and message. Also checks that the only resulting async response matches the resource
* type, and has the appropriate actionResult, nameOrId, and Trid.
*/
private static void assertPollMessageFor(
HistoryEntry historyEntry,
String registrarId,
String msg,
boolean expectedActionResult,
EppResource resource,
Optional<String> clientTrid) {
PollMessage.OneTime pollMessage = (OneTime) getOnlyPollMessageForHistoryEntry(historyEntry);
assertThat(pollMessage.getMsg()).isEqualTo(msg);
assertThat(pollMessage.getRegistrarId()).isEqualTo(registrarId);
ImmutableList<ResponseData> pollResponses = pollMessage.getResponseData();
assertThat(pollResponses).hasSize(1);
ResponseData responseData = pollMessage.getResponseData().get(0);
String expectedResourceName;
if (resource instanceof HostResource) {
assertThat(responseData).isInstanceOf(HostPendingActionNotificationResponse.class);
expectedResourceName = ((HostResource) resource).getHostName();
} else {
assertThat(responseData).isInstanceOf(ContactPendingActionNotificationResponse.class);
expectedResourceName = ((ContactResource) resource).getContactId();
}
PendingActionNotificationResponse pendingResponse =
(PendingActionNotificationResponse) responseData;
assertThat(pendingResponse.getActionResult()).isEqualTo(expectedActionResult);
assertThat(pendingResponse.getNameAsString()).isEqualTo(expectedResourceName);
Trid trid = pendingResponse.getTrid();
assertThat(trid.getClientTransactionId()).isEqualTo(clientTrid);
assertThat(trid.getServerTransactionId()).isEqualTo("fakeServerTrid");
}
private static ContactResource persistContactPendingDelete(String contactId) {
return persistResource(
newContactResource(contactId).asBuilder().addStatusValue(PENDING_DELETE).build());
}
private static HostResource persistHostPendingDelete(String hostName) {
return persistResource(
newHostResource(hostName).asBuilder().addStatusValue(PENDING_DELETE).build());
}
private static DomainBase persistUsedDomain(
String domainName, ContactResource contact, HostResource host) {
return persistResource(
newDomainBase(domainName, contact)
.asBuilder()
.setNameservers(ImmutableSet.of(host.createVKey()))
.build());
}
private Optional<Lock> acquireLock() {
return Lock.acquire(
DeleteContactsAndHostsAction.class.getSimpleName(),
null,
standardDays(30),
requestStatusChecker,
false);
}
}
@@ -55,7 +55,6 @@ import google.registry.model.tld.Registry;
import google.registry.testing.DualDatabaseTest;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.ReplayExtension;
import google.registry.testing.TestOfyAndSql;
import google.registry.testing.TestOfyOnly;
import google.registry.testing.mapreduce.MapreduceTestCase;
@@ -65,8 +64,6 @@ import java.util.Optional;
import org.joda.money.Money;
import org.joda.time.DateTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Unit tests for {@link ExpandRecurringBillingEventsAction}. */
@DualDatabaseTest
@@ -76,10 +73,6 @@ public class ExpandRecurringBillingEventsActionTest
private DateTime currentTestTime = DateTime.parse("1999-01-05T00:00:00Z");
private final FakeClock clock = new FakeClock(currentTestTime);
@Order(Order.DEFAULT - 2)
@RegisterExtension
public final ReplayExtension replayExtension = ReplayExtension.createWithDoubleReplay(clock);
private DomainBase domain;
private DomainHistory historyEntry;
private BillingEvent.Recurring recurring;
@@ -90,6 +83,7 @@ public class ExpandRecurringBillingEventsActionTest
action.mrRunner = makeDefaultRunner();
action.clock = clock;
action.cursorTimeParam = Optional.empty();
action.batchSize = 2;
createTld("tld");
domain =
persistResource(
@@ -279,11 +273,12 @@ public class ExpandRecurringBillingEventsActionTest
assertHistoryEntryMatches(
domain, persistedEntry, "TheRegistrar", DateTime.parse("2000-02-19T00:00:00Z"), true);
BillingEvent.OneTime expected = defaultOneTimeBuilder().setParent(persistedEntry).build();
// Persist an otherwise identical billing event that differs only in billing time.
// Persist an otherwise identical billing event that differs only in billing time (and ID).
BillingEvent.OneTime persisted =
persistResource(
expected
.asBuilder()
.setId(15891L)
.setBillingTime(DateTime.parse("1999-02-19T00:00:00Z"))
.setEventTime(DateTime.parse("1999-01-05T00:00:00Z"))
.build());
@@ -639,43 +634,95 @@ public class ExpandRecurringBillingEventsActionTest
@TestOfyAndSql
void testSuccess_expandMultipleEvents() throws Exception {
persistResource(recurring);
DomainBase domain2 =
persistResource(
newDomainBase("example2.tld")
.asBuilder()
.setCreationTimeForTest(DateTime.parse("1999-04-05T00:00:00Z"))
.build());
DomainHistory historyEntry2 =
persistResource(
new DomainHistory.Builder()
.setRegistrarId(domain2.getCreationRegistrarId())
.setType(HistoryEntry.Type.DOMAIN_CREATE)
.setModificationTime(DateTime.parse("1999-04-05T00:00:00Z"))
.setDomain(domain2)
.build());
BillingEvent.Recurring recurring2 =
persistResource(
recurring
new BillingEvent.Recurring.Builder()
.setParent(historyEntry2)
.setRegistrarId(domain2.getCreationRegistrarId())
.setEventTime(DateTime.parse("2000-04-05T00:00:00Z"))
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setReason(Reason.RENEW)
.setRecurrenceEndTime(END_OF_TIME)
.setTargetId(domain2.getDomainName())
.build());
DomainBase domain3 =
persistResource(
newDomainBase("example3.tld")
.asBuilder()
.setEventTime(recurring.getEventTime().plusMonths(3))
.setId(3L)
.setCreationTimeForTest(DateTime.parse("1999-06-05T00:00:00Z"))
.build());
DomainHistory historyEntry3 =
persistResource(
new DomainHistory.Builder()
.setRegistrarId(domain3.getCreationRegistrarId())
.setType(HistoryEntry.Type.DOMAIN_CREATE)
.setModificationTime(DateTime.parse("1999-06-05T00:00:00Z"))
.setDomain(domain3)
.build());
BillingEvent.Recurring recurring3 =
persistResource(
new BillingEvent.Recurring.Builder()
.setParent(historyEntry3)
.setRegistrarId(domain3.getCreationRegistrarId())
.setEventTime(DateTime.parse("2000-06-05T00:00:00Z"))
.setFlags(ImmutableSet.of(Flag.AUTO_RENEW))
.setReason(Reason.RENEW)
.setRecurrenceEndTime(END_OF_TIME)
.setTargetId(domain3.getDomainName())
.build());
action.cursorTimeParam = Optional.of(START_OF_TIME);
runAction();
List<DomainHistory> persistedEntries =
getHistoryEntriesOfType(domain, DOMAIN_AUTORENEW, DomainHistory.class);
assertThat(persistedEntries).hasSize(2);
DomainHistory persistedHistory1 =
getOnlyHistoryEntryOfType(domain, DOMAIN_AUTORENEW, DomainHistory.class);
assertHistoryEntryMatches(
domain,
persistedEntries.get(0),
"TheRegistrar",
DateTime.parse("2000-02-19T00:00:00Z"),
true);
domain, persistedHistory1, "TheRegistrar", DateTime.parse("2000-02-19T00:00:00Z"), true);
BillingEvent.OneTime expected =
defaultOneTimeBuilder()
.setParent(persistedEntries.get(0))
.setParent(persistedHistory1)
.setCancellationMatchingBillingEvent(recurring.createVKey())
.build();
DomainHistory persistedHistory2 =
getOnlyHistoryEntryOfType(domain2, DOMAIN_AUTORENEW, DomainHistory.class);
assertHistoryEntryMatches(
domain,
persistedEntries.get(1),
"TheRegistrar",
DateTime.parse("2000-05-20T00:00:00Z"),
true);
domain2, persistedHistory2, "TheRegistrar", DateTime.parse("2000-05-20T00:00:00Z"), true);
BillingEvent.OneTime expected2 =
defaultOneTimeBuilder()
.setBillingTime(DateTime.parse("2000-05-20T00:00:00Z"))
.setEventTime(DateTime.parse("2000-04-05T00:00:00Z"))
.setParent(persistedEntries.get(1))
.setParent(persistedHistory2)
.setTargetId(domain2.getDomainName())
.setCancellationMatchingBillingEvent(recurring2.createVKey())
.build();
assertBillingEventsForResource(domain, expected, expected2, recurring, recurring2);
DomainHistory persistedHistory3 =
getOnlyHistoryEntryOfType(domain3, DOMAIN_AUTORENEW, DomainHistory.class);
assertHistoryEntryMatches(
domain3, persistedHistory3, "TheRegistrar", DateTime.parse("2000-07-20T00:00:00Z"), true);
BillingEvent.OneTime expected3 =
defaultOneTimeBuilder()
.setBillingTime(DateTime.parse("2000-07-20T00:00:00Z"))
.setEventTime(DateTime.parse("2000-06-05T00:00:00Z"))
.setTargetId(domain3.getDomainName())
.setParent(persistedHistory3)
.setCancellationMatchingBillingEvent(recurring3.createVKey())
.build();
assertBillingEventsForResource(domain, expected, recurring);
assertBillingEventsForResource(domain2, expected2, recurring2);
assertBillingEventsForResource(domain3, expected3, recurring3);
assertCursorAt(currentTestTime);
}
@@ -1,95 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import com.google.common.collect.ImmutableSet;
import google.registry.beam.TestPipelineExtension;
import google.registry.beam.initsql.DatastoreSetupHelper;
import google.registry.model.domain.DomainHistory;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar;
import google.registry.model.replay.SqlEntity;
import google.registry.persistence.transaction.JpaTestExtensions;
import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension;
import google.registry.testing.DatastoreEntityExtension;
import google.registry.testing.FakeClock;
import google.registry.testing.InjectExtension;
import java.io.Serializable;
import java.nio.file.Path;
import java.util.Optional;
import org.apache.beam.sdk.coders.SerializableCoder;
import org.apache.beam.sdk.testing.PAssert;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.joda.time.DateTime;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.api.io.TempDir;
/** Unit tests for {@link DatastoreSnapshots}. */
class DatastoreSnapshotsTest {
static final DateTime START_TIME = DateTime.parse("2000-01-01T00:00:00.0Z");
private FakeClock fakeClock = new FakeClock(START_TIME);
@RegisterExtension
@Order(Order.DEFAULT - 1)
final transient DatastoreEntityExtension datastore =
new DatastoreEntityExtension().allThreads(true);
@RegisterExtension final transient InjectExtension injectExtension = new InjectExtension();
@SuppressWarnings("WeakerAccess")
@TempDir
transient Path tmpDir;
@RegisterExtension
final transient TestPipelineExtension testPipeline =
TestPipelineExtension.create().enableAbandonedNodeEnforcement(true);
@RegisterExtension
final transient JpaIntegrationTestExtension database =
new JpaTestExtensions.Builder().withClock(fakeClock).buildIntegrationTestExtension();
DatastoreSetupHelper setupHelper;
@BeforeEach
void beforeEach() throws Exception {
injectExtension.setStaticField(Ofy.class, "clock", fakeClock);
setupHelper = new DatastoreSetupHelper(tmpDir, fakeClock).initializeData();
testPipeline
.getCoderRegistry()
.registerCoderForClass(SqlEntity.class, SerializableCoder.of(Serializable.class));
}
@Test
void loadDatastoreSnapshotByKind() {
PCollectionTuple tuple =
DatastoreSnapshots.loadDatastoreSnapshotByKind(
testPipeline,
setupHelper.exportDir.getAbsolutePath(),
setupHelper.commitLogDir.getAbsolutePath(),
START_TIME,
fakeClock.nowUtc().plusMillis(1),
ImmutableSet.copyOf(DatastoreSetupHelper.ALL_KINDS),
Optional.empty());
PAssert.that(tuple.get(ValidateSqlUtils.createSqlEntityTupleTag(Registrar.class)))
.containsInAnyOrder(setupHelper.registrar1, setupHelper.registrar2);
PAssert.that(tuple.get(ValidateSqlUtils.createSqlEntityTupleTag(DomainHistory.class)))
.containsInAnyOrder(setupHelper.historyEntry);
testPipeline.run();
}
}
@@ -1,101 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import static google.registry.beam.comparedb.ValidateSqlUtils.createSqlEntityTupleTag;
import static org.joda.time.DateTimeZone.UTC;
import com.google.common.collect.ImmutableSet;
import google.registry.beam.TestPipelineExtension;
import google.registry.model.bulkquery.TestSetupHelper;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.DomainHistory;
import google.registry.model.host.HostResource;
import google.registry.model.registrar.Registrar;
import google.registry.model.replay.SqlEntity;
import google.registry.model.tld.Registry;
import google.registry.testing.AppEngineExtension;
import google.registry.testing.DatastoreEntityExtension;
import google.registry.testing.FakeClock;
import java.io.Serializable;
import java.util.Optional;
import org.apache.beam.sdk.coders.SerializableCoder;
import org.apache.beam.sdk.testing.PAssert;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.joda.time.DateTime;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Unit tests for {@link SqlSnapshots}. */
class SqlSnapshotsTest {
protected FakeClock fakeClock = new FakeClock(DateTime.now(UTC));
@RegisterExtension
@Order(Order.DEFAULT - 1)
final transient DatastoreEntityExtension datastore =
new DatastoreEntityExtension().allThreads(true);
@RegisterExtension
public final AppEngineExtension appEngine =
AppEngineExtension.builder().withDatastoreAndCloudSql().withClock(fakeClock).build();
@RegisterExtension
final transient TestPipelineExtension testPipeline =
TestPipelineExtension.create().enableAbandonedNodeEnforcement(true);
private final TestSetupHelper setupHelper = new TestSetupHelper(fakeClock);
@BeforeEach
void setUp() {
testPipeline
.getCoderRegistry()
.registerCoderForClass(SqlEntity.class, SerializableCoder.of(Serializable.class));
setupHelper.initializeAllEntities();
setupHelper.setupBulkQueryJpaTm(appEngine);
}
@AfterEach
void afterEach() {
setupHelper.tearDownBulkQueryJpaTm();
}
@Test
void loadCloudSqlSnapshotByType() {
PCollectionTuple sqlSnapshot =
SqlSnapshots.loadCloudSqlSnapshotByType(
testPipeline,
ImmutableSet.of(
Registry.class,
Registrar.class,
DomainBase.class,
DomainHistory.class,
ContactResource.class,
HostResource.class),
Optional.empty(),
Optional.empty());
PAssert.that(sqlSnapshot.get(createSqlEntityTupleTag(Registry.class)))
.containsInAnyOrder(setupHelper.registry);
PAssert.that(sqlSnapshot.get(createSqlEntityTupleTag(DomainBase.class)))
.containsInAnyOrder(setupHelper.domain);
PAssert.that(sqlSnapshot.get(createSqlEntityTupleTag(DomainHistory.class)))
.containsInAnyOrder(setupHelper.domainHistory);
testPipeline.run();
}
}
@@ -1,96 +0,0 @@
// Copyright 2021 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.beam.comparedb;
import static com.google.common.truth.Truth8.assertThat;
import static google.registry.beam.comparedb.ValidateSqlUtils.getMedianIdForHistoryTable;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static org.joda.time.DateTimeZone.UTC;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Maps;
import com.google.common.truth.Truth;
import google.registry.beam.comparedb.ValidateSqlUtils.DiffableFieldNormalizer;
import google.registry.model.bulkquery.TestSetupHelper;
import google.registry.model.contact.ContactAddress;
import google.registry.model.contact.ContactResource;
import google.registry.model.contact.PostalInfo;
import google.registry.model.domain.DomainHistory;
import google.registry.testing.AppEngineExtension;
import google.registry.testing.FakeClock;
import google.registry.util.DiffUtils;
import java.util.Map;
import org.joda.time.DateTime;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
/** Unit tests for {@link ValidateSqlUtils}. */
class ValidateSqlUtilsTest {
private final FakeClock fakeClock = new FakeClock(DateTime.now(UTC));
private final TestSetupHelper setupHelper = new TestSetupHelper(fakeClock);
@RegisterExtension
public final AppEngineExtension appEngine =
AppEngineExtension.builder().withDatastoreAndCloudSql().withClock(fakeClock).build();
@Test
void getMedianIdForHistoryTable_emptyTable() {
assertThat(getMedianIdForHistoryTable("DomainHistory")).isEmpty();
}
@Test
void getMedianIdForHistoryTable_oneRow() {
setupHelper.initializeAllEntities();
Truth.assertThat(jpaTm().transact(() -> jpaTm().loadAllOf(DomainHistory.class))).hasSize(1);
assertThat(getMedianIdForHistoryTable("DomainHistory"))
.hasValue(setupHelper.domainHistory.getId());
}
@Test
void getMedianIdForHistoryTable_twoRows() {
setupHelper.initializeAllEntities();
setupHelper.applyChangeToDomainAndHistory();
Truth.assertThat(jpaTm().transact(() -> jpaTm().loadAllOf(DomainHistory.class))).hasSize(2);
assertThat(getMedianIdForHistoryTable("DomainHistory"))
.hasValue(setupHelper.domainHistory.getId());
}
@Test
void diffableFieldNormalizer() {
ContactResource contactResource =
new ContactResource.Builder()
.setLocalizedPostalInfo(
new PostalInfo.Builder()
.setType(PostalInfo.Type.LOCALIZED)
.setAddress(
new ContactAddress.Builder()
.setStreet(ImmutableList.of("111 8th Ave", ""))
.setCity("New York")
.setState("NY")
.setZip("10011")
.setCountryCode("US")
.build())
.build())
.build();
Map<String, Object> origMap = contactResource.toDiffableFieldMap();
Map<String, Object> trimmedMap = Maps.transformEntries(origMap, new DiffableFieldNormalizer());
// In the trimmed map, localizedPostalInfo.address.street only has one element in the list,
// thus the output: 'null -> '
Truth.assertThat(DiffUtils.prettyPrintEntityDeepDiff(trimmedMap, origMap))
.isEqualTo("localizedPostalInfo.address.street.1: null -> \n");
}
}
@@ -16,13 +16,10 @@ package google.registry.flows;
import static google.registry.model.eppoutput.Result.Code.SUCCESS;
import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACK_MESSAGE;
import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING;
import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_NO_MESSAGES;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.testing.EppMetricSubject.assertThat;
import com.google.common.collect.ImmutableMap;
import google.registry.model.eppoutput.Result;
import google.registry.testing.AppEngineExtension;
import google.registry.testing.DualDatabaseTest;
import google.registry.testing.TestOfyAndSql;
@@ -65,22 +62,14 @@ class EppLifecycleContactTest extends EppTestCase {
.hasCommandName("ContactInfo")
.and()
.hasStatus(SUCCESS);
Result.Code deleteResultCode;
if (tm().isOfy()) {
assertThatCommand("contact_delete_sh8013.xml")
.hasResponse("contact_delete_response_sh8013_pending.xml");
deleteResultCode = SUCCESS_WITH_ACTION_PENDING;
} else {
assertThatCommand("contact_delete_sh8013.xml")
.hasResponse("contact_delete_response_sh8013.xml");
deleteResultCode = SUCCESS;
}
assertThatCommand("contact_delete_sh8013.xml")
.hasResponse("contact_delete_response_sh8013.xml");
assertThat(getRecordedEppMetric())
.hasClientId("NewRegistrar")
.and()
.hasCommandName("ContactDelete")
.and()
.hasStatus(deleteResultCode);
.hasStatus(SUCCESS);
assertThatLogoutSucceeds();
}
@@ -17,8 +17,6 @@ package google.registry.flows;
import static com.google.common.truth.Truth.assertThat;
import static google.registry.model.EppResourceUtils.loadByForeignKey;
import static google.registry.model.eppoutput.Result.Code.SUCCESS;
import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.testing.DatabaseHelper.createTld;
import static google.registry.testing.DatabaseHelper.createTlds;
import static google.registry.testing.EppMetricSubject.assertThat;
@@ -26,7 +24,6 @@ import static google.registry.testing.HostResourceSubject.assertAboutHosts;
import com.google.common.collect.ImmutableMap;
import google.registry.model.domain.DomainBase;
import google.registry.model.eppoutput.Result;
import google.registry.model.host.HostResource;
import google.registry.testing.AppEngineExtension;
import google.registry.testing.DualDatabaseTest;
@@ -82,24 +79,15 @@ class EppLifecycleHostTest extends EppTestCase {
.hasCommandName("HostInfo")
.and()
.hasStatus(SUCCESS);
Result.Code deleteResultCode;
if (tm().isOfy()) {
assertThatCommand("host_delete.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld"))
.atTime("2000-06-02T00:03:00Z")
.hasResponse("generic_success_action_pending_response.xml");
deleteResultCode = SUCCESS_WITH_ACTION_PENDING;
} else {
assertThatCommand("host_delete.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld"))
.atTime("2000-06-02T00:03:00Z")
.hasResponse("generic_success_response.xml");
deleteResultCode = SUCCESS;
}
assertThatCommand("host_delete.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld"))
.atTime("2000-06-02T00:03:00Z")
.hasResponse("generic_success_response.xml");
assertThat(getRecordedEppMetric())
.hasClientId("NewRegistrar")
.and()
.hasCommandName("HostDelete")
.and()
.hasStatus(deleteResultCode);
.hasStatus(SUCCESS);
assertThatLogoutSucceeds();
}

Some files were not shown because too many files have changed in this diff Show More