1
0
mirror of https://github.com/google/nomulus synced 2026-05-18 22:01:47 +00:00

Compare commits

...

5 Commits

Author SHA1 Message Date
Lai Jiang
c878679770 Migrate ReadDnsQueueAction to use CloudTasksUtils (#1669)
* Migrate ReadDnsQueueAction to use CloudTasksUtils

Also marked TaskQueueUtils as deprecated and fixed a few linter errors.

Note that DNS pull queue still requires the use of the GAE Task Queue API.

* Fix a test failure

* Remove TaskQueueUtils from VKeyTest

* Remove the @error exception that was inadvertently pulled in
2022-06-15 13:48:28 -04:00
gbrodman
2f8be045c7 Delete code relating to SQL init and scheduling (#1661)
One of the more significant changes introduced in this PR is that we use
SQL as the backing database in all tests unless otherwise specified,
e.g. by using the TmOverrideExtension. We change various ofy-related
tests to use this.

This includes various changes:
- Deletion of SqlEntity/DatastoreEntity and related classes. Includes
  any necessary changes because of that (e.g. getting a nice SQL key on
  error in RegistryJpaIO).
- Deletion of classes that used libraries from the init-sql code
  (RefreshDnsOnHostRenameAction)
- Removal of the JpaTransactionManager's backup implementation
- Modification of RegistryJpaWriteTest to not use init-sql code
- Removal of the Transaction class and related classes, however it does
  not remove the TransactionEntity class as that would require DB
  changes
- Removal of anything related to the actual usage of the database
  migration schedule or read-only phases
- Various test changes and fixes to account for the differences in SQL
  (like how foreign keys need to exist)

This deliberately doesn't do anything to alter the objects actually
stored in the DB yet, just how we use them
2022-06-13 15:10:35 -04:00
gbrodman
dcc11379c8 Remove TM references from GaeUserIdConverter (#1666)
This is the only user of the ofy code that will stick around at least
until we move to the new registrar console. By removing references to
the transaction manager, we will be able to delete all the tm code
without interfering with this.
2022-06-13 11:47:39 -04:00
Weimin Yu
6ff4aaeb1c Remove version pin for java-diff-utils dependency (#1667)
* Remove version pin for java-diff-utils dependency

Latest version of the lib introduces a small behavior change/bug fix.
It no longer ignores empty lines. This actually makes sense.

Update the test data to reflect this change.
2022-06-13 10:35:51 -04:00
Lai Jiang
199d02a4cc Fix EPP update NS delete bug (#1665) 2022-06-10 12:42:31 -04:00
371 changed files with 2174 additions and 10050 deletions

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,13 +11,13 @@ 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.apis:google-api-services-storage:v1-rev20220604-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.7.1
com.google.cloud:google-cloud-core:2.7.1
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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

View File

@@ -11,7 +11,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -11,7 +11,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -12,7 +12,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -12,7 +12,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -11,7 +11,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -11,7 +11,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -12,7 +12,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -12,7 +12,7 @@ com.google.guava:guava:31.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.3
com.google.truth:truth:1.1.3
io.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
javax.inject:javax.inject:1
joda-time:joda-time:2.10.14
junit:junit:4.13.2

View File

@@ -1,3 +1,2 @@
This is a random file,
with three lines and terminates without a newline.
with three lines and terminates without a newline.

View File

@@ -1,5 +1,4 @@
|Expected |Actual |
|------------------------------------------------------|-----------------------------------------------------|
|This is a random file, |This is a random file, |
| |with **two** lines and terminates **with** a newline.|
|with ~three~ lines and terminates ~without~ a newline.| |
|with ~three~ lines and terminates ~without~ a newline.|with **two** lines and terminates **with** a newline.|

View File

@@ -1,6 +1,5 @@
--- expected
+++ actual
@@ -2,2 +2,1 @@
-
@@ -2,1 +2,1 @@
-with three lines and terminates without a newline.
+with two lines and terminates with a newline.

View File

@@ -765,11 +765,6 @@ createUberJar(
// User should install gcloud and login to GCP before invoking this tasks.
if (environment == 'alpha') {
def pipelines = [
initSql :
[
mainClass: 'google.registry.beam.initsql.InitSqlPipeline',
metaData : 'google/registry/beam/init_sql_pipeline_metadata.json'
],
bulkDeleteDatastore:
[
mainClass: 'google.registry.beam.datastore.BulkDeleteDatastorePipeline',
@@ -888,48 +883,6 @@ task buildToolImage(dependsOn: nomulus, type: Exec) {
commandLine 'docker', 'build', '-t', 'nomulus-tool', '.'
}
task generateInitSqlPipelineGraph(type: FilteringTest) {
tests = ['InitSqlPipelineGraphTest.createPipeline_compareGraph']
ignoreFailures = true
}
task updateInitSqlPipelineGraph(type: Copy) {
def graphRelativePath = 'google/registry/beam/initsql/'
from ("${projectDir}/build/resources/test/${graphRelativePath}") {
include 'pipeline_curr.dot'
rename 'curr', 'golden'
}
into "src/test/resources/${graphRelativePath}"
dependsOn generateInitSqlPipelineGraph
doLast {
if (com.google.common.base.Strings.isNullOrEmpty(project.dot_path)) {
getLogger().info('Property dot_path is null. Not creating image for pipeline graph.')
}
def dotPath = project.dot_path
if (!new File(dotPath).exists()) {
throw new RuntimeException(
"""\
${dotPath} not found. Make sure graphviz is installed
and the dot_path property is set correctly."""
.stripIndent())
}
def goldenGraph = "src/test/resources/${graphRelativePath}/pipeline_golden.dot"
def goldenImage = "src/test/resources/${graphRelativePath}/pipeline_golden.png"
def cmd = "${dotPath} -Tpng -o \"${goldenImage}\" \"${goldenGraph}\""
try {
rootProject.ext.execInBash(cmd, projectDir)
} catch (Throwable throwable) {
throw new RuntimeException(
"""\
Failed to generate golden image with command ${cmd}
Error: ${throwable.getMessage()}
""")
}
}
}
// Build the devtool jar.
createUberJar(
'devtool',

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,7 +103,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -115,7 +115,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -123,7 +123,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +133,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -286,7 +286,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18

View File

@@ -27,11 +27,11 @@ 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.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -84,8 +84,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -102,7 +102,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -114,7 +114,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -122,7 +122,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +132,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -278,7 +278,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,8 +103,8 @@ 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.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud.sql:postgres-socket-factory:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -116,7 +116,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -124,7 +124,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -134,23 +134,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -296,7 +296,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,8 +103,8 @@ 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.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud.sql:postgres-socket-factory:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -116,7 +116,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -124,7 +124,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -134,23 +134,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -294,7 +294,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -4,7 +4,7 @@
com.sun.activation:jakarta.activation:1.2.2
com.sun.activation:javax.activation:1.2.0
com.sun.xml.bind:jaxb-impl:2.3.3
com.sun.xml.bind:jaxb-osgi:4.0.0-M4
com.sun.xml.bind:jaxb-osgi:4.0.0
com.sun.xml.bind:jaxb-xjc:2.3.3
jakarta.activation:jakarta.activation-api:2.1.0
jakarta.xml.bind:jakarta.xml.bind-api:4.0.0

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,7 +103,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -115,7 +115,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -123,7 +123,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +133,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -286,7 +286,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18

View File

@@ -27,11 +27,11 @@ 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.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -84,8 +84,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -102,7 +102,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -114,7 +114,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -122,7 +122,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +132,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -280,7 +280,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
org.rnorth.duct-tape:duct-tape:1.0.8
org.slf4j:slf4j-api:1.7.36
org.springframework:spring-core:5.3.18

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,7 +103,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -115,7 +115,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -123,7 +123,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +133,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -295,7 +295,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,7 +103,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -115,7 +115,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -123,7 +123,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +133,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -295,7 +295,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,7 +103,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -115,7 +115,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -123,7 +123,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
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,23 +133,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -295,7 +295,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,8 +103,8 @@ 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.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud.sql:postgres-socket-factory:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -116,7 +116,7 @@ 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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -124,7 +124,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -134,23 +134,23 @@ 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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -294,7 +294,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -104,7 +104,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -112,12 +112,12 @@ 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-nio:0.124.2
com.google.cloud:google-cloud-nio:0.124.4
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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -125,7 +125,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -136,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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -149,11 +149,11 @@ 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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -273,7 +273,7 @@ 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-M15
org.apache.tomcat:tomcat-annotations-api:10.1.0-M16
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
@@ -324,7 +324,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -27,11 +27,11 @@ 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.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -84,8 +84,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -103,7 +103,7 @@ 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.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -111,12 +111,12 @@ 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-nio:0.124.2
com.google.cloud:google-cloud-nio:0.124.4
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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -124,7 +124,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -135,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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -148,11 +148,11 @@ 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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -268,7 +268,7 @@ 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-M15
org.apache.tomcat:tomcat-annotations-api:10.1.0-M16
org.apiguardian:apiguardian-api:1.1.2
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
@@ -318,7 +318,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -104,8 +104,8 @@ 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.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud.sql:postgres-socket-factory:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -113,12 +113,12 @@ 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-nio:0.124.2
com.google.cloud:google-cloud-nio:0.124.4
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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -126,7 +126,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -137,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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -150,11 +150,11 @@ 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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -189,7 +189,7 @@ 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.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
@@ -283,7 +283,7 @@ 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-M15
org.apache.tomcat:tomcat-annotations-api:10.1.0-M16
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
@@ -334,7 +334,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -28,11 +28,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.android:annotations:4.1.1.4
com.google.api-client:google-api-client-appengine:1.35.0
com.google.api-client:google-api-client-appengine:1.35.1
com.google.api-client:google-api-client-jackson2:1.32.2
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-client:google-api-client-java6:1.35.1
com.google.api-client:google-api-client-servlet:1.35.1
com.google.api-client:google-api-client:1.35.1
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
@@ -85,8 +85,8 @@ com.google.apis:google-api-services-iamcredentials:v1-rev20210326-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-rev20220323-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220509-1.32.1
com.google.apis:google-api-services-sqladmin:v1beta4-rev20220513-1.32.1
com.google.apis:google-api-services-storage:v1-rev20220604-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
@@ -104,8 +104,8 @@ 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.6.0
com.google.cloud.sql:postgres-socket-factory:1.6.0
com.google.cloud.sql:jdbc-socket-factory-core:1.6.1
com.google.cloud.sql:postgres-socket-factory:1.6.1
com.google.cloud:google-cloud-bigquerystorage:2.10.0
com.google.cloud:google-cloud-bigtable:2.5.3
com.google.cloud:google-cloud-core-grpc:2.4.0
@@ -113,12 +113,12 @@ 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-nio:0.124.2
com.google.cloud:google-cloud-nio:0.124.4
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.2.0
com.google.cloud:google-cloud-spanner:6.20.0
com.google.cloud:google-cloud-storage:2.7.2
com.google.cloud:google-cloud-storage:2.8.0
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
@@ -126,7 +126,7 @@ 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.42
com.google.errorprone:error_prone_annotations:2.13.1
com.google.errorprone:error_prone_annotations:2.14.0
com.google.escapevelocity:escapevelocity:0.9.1
com.google.flatbuffers:flatbuffers-java:1.12.0
com.google.flogger:flogger-system-backend:0.7.4
@@ -137,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.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-apache-v2:1.42.0
com.google.http-client:google-http-client-appengine:1.42.0
com.google.http-client:google-http-client-gson:1.42.0
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.8
com.google.http-client:google-http-client:1.42.0
com.google.inject.extensions:guice-multibindings:4.1.0
com.google.inject:guice:4.1.0
com.google.j2objc:j2objc-annotations:1.3
@@ -150,11 +150,11 @@ 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.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.oauth-client:google-oauth-client-appengine:1.34.1
com.google.oauth-client:google-oauth-client-java6:1.34.1
com.google.oauth-client:google-oauth-client-jetty:1.34.1
com.google.oauth-client:google-oauth-client-servlet:1.34.1
com.google.oauth-client:google-oauth-client:1.34.1
com.google.protobuf:protobuf-java-util:3.20.1
com.google.protobuf:protobuf-java:3.20.1
com.google.re2j:re2j:1.6
@@ -189,7 +189,7 @@ 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.github.java-diff-utils:java-diff-utils:4.9
io.github.java-diff-utils:java-diff-utils:4.11
io.grpc:grpc-alts:1.46.0
io.grpc:grpc-api:1.46.0
io.grpc:grpc-auth:1.46.0
@@ -283,7 +283,7 @@ 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-M15
org.apache.tomcat:tomcat-annotations-api:10.1.0-M16
org.bouncycastle:bcpg-jdk15on:1.67
org.bouncycastle:bcpkix-jdk15on:1.67
org.bouncycastle:bcprov-jdk15on:1.67
@@ -334,7 +334,7 @@ org.ow2.asm:asm-commons:9.2
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.postgresql:postgresql:42.4.0
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

View File

@@ -1,140 +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.base.Preconditions.checkState;
import static com.google.common.collect.ImmutableList.toImmutableList;
import static google.registry.backup.BackupUtils.createDeserializingIterator;
import com.google.common.collect.ImmutableList;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.ofy.CommitLogCheckpoint;
import google.registry.model.ofy.CommitLogManifest;
import google.registry.model.ofy.CommitLogMutation;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.util.Iterator;
/**
* Helpers for reading CommitLog records from a file.
*
* <p>This class is adapted from {@link RestoreCommitLogsAction}, and will be used in the initial
* population of the Cloud SQL database.
*/
@DeleteAfterMigration
public final class CommitLogImports {
private CommitLogImports() {}
/**
* Returns entities in an {@code inputStream} (from a single CommitLog file) as an {@link
* ImmutableList} of {@link ImmutableList}s of {@link VersionedEntity} records where the inner
* lists each consist of one transaction. Upon completion the {@code inputStream} is closed.
*
* <p>The returned list may be empty, since CommitLogs are written at fixed intervals regardless
* if actual changes exist. Each sublist, however, will not be empty.
*
* <p>A CommitLog file starts with a {@link CommitLogCheckpoint}, followed by (repeated)
* subsequences of [{@link CommitLogManifest}, [{@link CommitLogMutation}] ...]. Each subsequence
* represents the changes in one transaction. The {@code CommitLogManifest} contains deleted
* entity keys, whereas each {@code CommitLogMutation} contains one whole entity.
*/
static ImmutableList<ImmutableList<VersionedEntity>> loadEntitiesByTransaction(
InputStream inputStream) {
try (InputStream input = new BufferedInputStream(inputStream)) {
Iterator<ImmutableObject> commitLogs = createDeserializingIterator(input, false);
checkState(commitLogs.hasNext());
checkState(commitLogs.next() instanceof CommitLogCheckpoint);
ImmutableList.Builder<ImmutableList<VersionedEntity>> resultBuilder =
new ImmutableList.Builder<>();
ImmutableList.Builder<VersionedEntity> currentTransactionBuilder =
new ImmutableList.Builder<>();
while (commitLogs.hasNext()) {
ImmutableObject currentObject = commitLogs.next();
if (currentObject instanceof CommitLogManifest) {
// CommitLogManifest means we are starting a new transaction
addIfNonempty(resultBuilder, currentTransactionBuilder);
currentTransactionBuilder = new ImmutableList.Builder<>();
VersionedEntity.fromManifest((CommitLogManifest) currentObject)
.forEach(currentTransactionBuilder::add);
} else if (currentObject instanceof CommitLogMutation) {
currentTransactionBuilder.add(
VersionedEntity.fromMutation((CommitLogMutation) currentObject));
} else {
throw new IllegalStateException(
String.format("Unknown entity type %s in commit logs", currentObject.getClass()));
}
}
// Add the last transaction in (if it's not empty)
addIfNonempty(resultBuilder, currentTransactionBuilder);
return resultBuilder.build();
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Returns entities in an {@code inputStream} (from a single CommitLog file) as an {@link
* ImmutableList} of {@link VersionedEntity} records. Upon completion the {@code inputStream} is
* closed.
*
* <p>The returned list may be empty, since CommitLogs are written at fixed intervals regardless
* if actual changes exist.
*
* <p>A CommitLog file starts with a {@link CommitLogCheckpoint}, followed by (repeated)
* subsequences of [{@link CommitLogManifest}, [{@link CommitLogMutation}] ...]. Each subsequence
* represents the changes in one transaction. The {@code CommitLogManifest} contains deleted
* entity keys, whereas each {@code CommitLogMutation} contains one whole entity.
*/
static ImmutableList<VersionedEntity> loadEntities(InputStream inputStream) {
return loadEntitiesByTransaction(inputStream).stream()
.flatMap(ImmutableList::stream)
.collect(toImmutableList());
}
/** Covenience method that adapts {@link #loadEntities(InputStream)} to a {@link File}. */
public static ImmutableList<VersionedEntity> loadEntities(File commitLogFile) {
try {
return loadEntities(new FileInputStream(commitLogFile));
} catch (IOException e) {
throw new RuntimeException(e);
}
}
/**
* Covenience method that adapts {@link #loadEntities(InputStream)} to a {@link
* ReadableByteChannel}.
*/
public static ImmutableList<VersionedEntity> loadEntities(ReadableByteChannel channel) {
return loadEntities(Channels.newInputStream(channel));
}
private static void addIfNonempty(
ImmutableList.Builder<ImmutableList<VersionedEntity>> resultBuilder,
ImmutableList.Builder<VersionedEntity> currentTransactionBuilder) {
ImmutableList<VersionedEntity> currentTransaction = currentTransactionBuilder.build();
if (!currentTransaction.isEmpty()) {
resultBuilder.add(currentTransaction);
}
}
}

View File

@@ -1,379 +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.collect.ImmutableList.toImmutableList;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_HOST_KEY;
import static google.registry.batch.AsyncTaskEnqueuer.PARAM_REQUESTED_TIME;
import static google.registry.batch.AsyncTaskEnqueuer.QUEUE_ASYNC_HOST_RENAME;
import static google.registry.batch.AsyncTaskMetrics.OperationType.DNS_REFRESH;
import static google.registry.mapreduce.inputs.EppResourceInputs.createEntityInput;
import static google.registry.model.EppResourceUtils.getLinkedDomainKeys;
import static google.registry.model.EppResourceUtils.isActive;
import static google.registry.model.EppResourceUtils.isDeleted;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.util.DateTimeUtils.latestOf;
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.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.flogger.FluentLogger;
import google.registry.batch.AsyncTaskMetrics.OperationResult;
import google.registry.dns.DnsQueue;
import google.registry.mapreduce.MapreduceRunner;
import google.registry.mapreduce.inputs.NullInput;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.domain.DomainBase;
import google.registry.model.host.HostResource;
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.NoSuchElementException;
import java.util.Optional;
import java.util.logging.Level;
import javax.annotation.Nullable;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.http.HttpStatus;
import org.joda.time.DateTime;
import org.joda.time.Duration;
/** Performs batched DNS refreshes for applicable domains following a host rename. */
@Action(
service = Action.Service.BACKEND,
path = "/_dr/task/refreshDnsOnHostRename",
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
@DeleteAfterMigration
@Deprecated
public class RefreshDnsOnHostRenameAction implements Runnable {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
private static final Duration LEASE_LENGTH = standardHours(4);
@Inject AsyncTaskMetrics asyncTaskMetrics;
@Inject Clock clock;
@Inject MapreduceRunner mrRunner;
@Inject @Named(QUEUE_ASYNC_HOST_RENAME) Queue pullQueue;
@Inject DnsQueue dnsQueue;
@Inject RequestStatusChecker requestStatusChecker;
@Inject Response response;
@Inject Retrier retrier;
@Inject RefreshDnsOnHostRenameAction() {}
@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(
RefreshDnsOnHostRenameAction.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 = pullQueue.leaseTasks(options);
asyncTaskMetrics.recordDnsRefreshBatchSize(tasks.size());
// Check if there are no tasks to process, and if so, return early.
if (tasks.isEmpty()) {
logRespondAndUnlock(
INFO, "No DNS refresh on host rename tasks to process in pull queue; finishing.", lock);
return;
}
ImmutableList.Builder<DnsRefreshRequest> requestsBuilder = new ImmutableList.Builder<>();
ImmutableList.Builder<VKey<HostResource>> hostKeys = new ImmutableList.Builder<>();
final List<DnsRefreshRequest> requestsToDelete = new ArrayList<>();
for (TaskHandle task : tasks) {
try {
DnsRefreshRequest request = DnsRefreshRequest.createFromTask(task, clock.nowUtc());
if (request.isRefreshNeeded()) {
requestsBuilder.add(request);
hostKeys.add(request.hostKey());
} else {
// Skip hosts that are deleted.
requestsToDelete.add(request);
}
} catch (Exception e) {
logger.atSevere().withCause(e).log(
"Could not parse DNS refresh for host request, delaying task for a day: %s", task);
// Grab the lease for a whole day, so it won't continue throwing errors every five minutes.
pullQueue.modifyTaskLease(task, 1L, DAYS);
}
}
deleteTasksWithRetry(
requestsToDelete, pullQueue, asyncTaskMetrics, retrier, OperationResult.STALE);
ImmutableList<DnsRefreshRequest> refreshRequests = requestsBuilder.build();
if (refreshRequests.isEmpty()) {
logRespondAndUnlock(
INFO, "No async DNS refreshes to process because all renamed hosts are deleted.", lock);
} else {
logger.atInfo().log(
"Processing asynchronous DNS refresh for renamed hosts: %s", hostKeys.build());
if (tm().isOfy()) {
runMapreduce(refreshRequests, lock);
} else {
try {
refreshRequests.stream()
.flatMap(
request ->
getLinkedDomainKeys(request.hostKey(), request.lastUpdateTime(), null)
.stream())
.distinct()
.map(domainKey -> tm().transact(() -> tm().loadByKey(domainKey).getDomainName()))
.forEach(
domainName -> {
retrier.callWithRetry(
() -> dnsQueue.addDomainRefreshTask(domainName),
TransientFailureException.class);
logger.atInfo().log("Enqueued DNS refresh for domain '%s'.", domainName);
});
deleteTasksWithRetry(
refreshRequests,
getQueue(QUEUE_ASYNC_HOST_RENAME),
asyncTaskMetrics,
retrier,
OperationResult.SUCCESS);
} catch (Throwable t) {
String message = "Error refreshing DNS on host rename.";
logger.atSevere().withCause(t).log(message);
response.setPayload(message);
response.setStatus(HttpStatus.SC_INTERNAL_SERVER_ERROR);
} finally {
lock.get().release();
}
}
}
}
private void runMapreduce(ImmutableList<DnsRefreshRequest> refreshRequests, Optional<Lock> lock) {
try {
mrRunner
.setJobName("Enqueue DNS refreshes for domains referencing renamed hosts")
.setModuleName("backend")
.setDefaultReduceShards(1)
.runMapreduce(
new RefreshDnsOnHostRenameMapper(refreshRequests, retrier),
new RefreshDnsOnHostRenameReducer(refreshRequests, lock.get(), retrier),
// Add an extra NullInput so that the reducer always fires exactly once.
ImmutableList.of(new NullInput<>(), createEntityInput(DomainBase.class)))
.sendLinkToMapreduceConsole(response);
} catch (Throwable t) {
logRespondAndUnlock(
SEVERE, "Error starting mapreduce to refresh DNS for renamed hosts.", lock);
}
}
private void logRespondAndUnlock(Level level, String message, Optional<Lock> lock) {
logger.at(level).log(message);
response.setPayload(message);
lock.ifPresent(Lock::release);
}
/** Map over domains and refresh the DNS of those that reference the renamed hosts. */
public static class RefreshDnsOnHostRenameMapper
extends Mapper<DomainBase, Boolean, Boolean> {
private static final long serialVersionUID = -5261698524424335531L;
private static final DnsQueue dnsQueue = DnsQueue.create();
private final ImmutableList<DnsRefreshRequest> refreshRequests;
private final Retrier retrier;
RefreshDnsOnHostRenameMapper(
ImmutableList<DnsRefreshRequest> refreshRequests, Retrier retrier) {
this.refreshRequests = refreshRequests;
this.retrier = retrier;
}
@Override
public final void map(@Nullable final DomainBase domain) {
if (domain == null) {
// Emit a single value so that the reducer always runs. The key and value don't matter.
emit(true, true);
return;
}
VKey<HostResource> referencingHostKey = null;
for (DnsRefreshRequest request : refreshRequests) {
if (isActive(domain, request.lastUpdateTime())
&& domain.getNameservers().contains(request.hostKey())) {
referencingHostKey = request.hostKey();
break;
}
}
if (referencingHostKey != null) {
retrier.callWithRetry(
() -> dnsQueue.addDomainRefreshTask(domain.getDomainName()),
TransientFailureException.class);
logger.atInfo().log(
"Enqueued DNS refresh for domain %s referenced by host %s.",
domain.getDomainName(), referencingHostKey);
getContext().incrementCounter("domains refreshed");
} else {
getContext().incrementCounter("domains not refreshed");
}
// Don't catch errors -- we allow the mapreduce to terminate on any errors that can't be
// resolved by retrying the transaction. The reducer only fires if the mapper completes
// without errors, meaning that it is acceptable to delete all tasks.
}
}
/**
* A reducer that always fires exactly once.
*
* <p>This is really a reducer in name only; what it's really doing is waiting for all of the
* mapper tasks to finish, and then delete the pull queue tasks. Note that this only happens if
* the mapper completes execution without errors.
*/
public static class RefreshDnsOnHostRenameReducer extends Reducer<Boolean, Boolean, Void> {
private static final long serialVersionUID = 9077366205249562118L;
@NonFinalForTesting
private static AsyncTaskMetrics asyncTaskMetrics = new AsyncTaskMetrics(new SystemClock());
private final Lock lock;
private final Retrier retrier;
private final List<DnsRefreshRequest> refreshRequests;
RefreshDnsOnHostRenameReducer(
List<DnsRefreshRequest> refreshRequests, Lock lock, Retrier retrier) {
this.refreshRequests = refreshRequests;
this.lock = lock;
this.retrier = retrier;
}
@Override
public void reduce(Boolean key, ReducerInput<Boolean> values) {
// The reduce() method is run precisely once, because the NullInput caused the mapper to emit
// a dummy value once.
deleteTasksWithRetry(
refreshRequests,
getQueue(QUEUE_ASYNC_HOST_RENAME),
asyncTaskMetrics,
retrier,
OperationResult.SUCCESS);
lock.release();
}
}
/** Deletes a list of tasks from the given queue using a retrier. */
private static void deleteTasksWithRetry(
final List<DnsRefreshRequest> refreshRequests,
final Queue queue,
AsyncTaskMetrics asyncTaskMetrics,
Retrier retrier,
OperationResult result) {
if (refreshRequests.isEmpty()) {
return;
}
final List<TaskHandle> tasks =
refreshRequests.stream().map(DnsRefreshRequest::task).collect(toImmutableList());
retrier.callWithRetry(() -> queue.deleteTask(tasks), TransientFailureException.class);
refreshRequests.forEach(
r -> asyncTaskMetrics.recordAsyncFlowResult(DNS_REFRESH, result, r.requestedTime()));
}
/** A class that encapsulates the values of a request to refresh DNS for a renamed host. */
@AutoValue
abstract static class DnsRefreshRequest implements Serializable {
private static final long serialVersionUID = 1772812852271288622L;
abstract VKey<HostResource> hostKey();
abstract DateTime lastUpdateTime();
abstract DateTime requestedTime();
abstract boolean isRefreshNeeded();
abstract TaskHandle task();
@AutoValue.Builder
abstract static class Builder {
abstract Builder setHostKey(VKey<HostResource> hostKey);
abstract Builder setLastUpdateTime(DateTime lastUpdateTime);
abstract Builder setRequestedTime(DateTime requestedTime);
abstract Builder setIsRefreshNeeded(boolean isRefreshNeeded);
abstract Builder setTask(TaskHandle task);
abstract DnsRefreshRequest build();
}
/**
* Returns a packaged-up {@link DnsRefreshRequest} parsed from a task queue task.
*/
static DnsRefreshRequest createFromTask(TaskHandle task, DateTime now) throws Exception {
ImmutableMap<String, String> params = ImmutableMap.copyOf(task.extractParams());
VKey<HostResource> hostKey =
VKey.create(checkNotNull(params.get(PARAM_HOST_KEY), "Host to refresh not specified"));
HostResource host =
tm().transact(() -> tm().loadByKeyIfPresent(hostKey))
.orElseThrow(() -> new NoSuchElementException("Host to refresh doesn't exist"));
boolean isHostDeleted =
isDeleted(host, latestOf(now, host.getUpdateTimestamp().getTimestamp()));
if (isHostDeleted) {
logger.atInfo().log("Host %s is already deleted, not refreshing DNS.", hostKey);
}
return new AutoValue_RefreshDnsOnHostRenameAction_DnsRefreshRequest.Builder()
.setHostKey(hostKey)
.setLastUpdateTime(host.getUpdateTimestamp().getTimestamp())
.setRequestedTime(
DateTime.parse(
checkNotNull(params.get(PARAM_REQUESTED_TIME), "Requested time not specified")))
.setIsRefreshNeeded(!isHostDeleted)
.setTask(task)
.build();
}
}
}

View File

@@ -23,8 +23,6 @@ import com.google.common.collect.Streams;
import google.registry.beam.common.RegistryQuery.CriteriaQuerySupplier;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.UpdateAutoTimestamp.DisableAutoUpdateResource;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.replay.SqlEntity;
import google.registry.persistence.transaction.JpaTransactionManager;
import google.registry.persistence.transaction.TransactionManagerFactory;
import java.io.Serializable;
@@ -235,10 +233,6 @@ public final class RegistryJpaIO {
@ProcessElement
public void processElement(OutputReceiver<T> outputReceiver) {
// Preload the migration schedule into cache, otherwise the cache loading query may happen
// before the setDatabaseSnapshot call in the transaction below, causing it to fail.
DatabaseMigrationStateSchedule.get();
jpaTm()
.transactNoRetry(
() -> {
@@ -433,11 +427,23 @@ public final class RegistryJpaIO {
}
}
/** Returns this entity's primary key field(s) in a string. */
private String toEntityKeyString(Object entity) {
if (entity instanceof SqlEntity) {
return ((SqlEntity) entity).getPrimaryKeyString();
try {
return jpaTm()
.transact(
() ->
String.format(
"%s_%s",
entity.getClass().getSimpleName(),
jpaTm()
.getEntityManager()
.getEntityManagerFactory()
.getPersistenceUnitUtil()
.getIdentifier(entity)));
} catch (IllegalArgumentException e) {
return "Non-SqlEntity: " + entity;
}
return "Non-SqlEntity: " + String.valueOf(entity);
}
}
}

View File

@@ -1,119 +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.beam.initsql;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Strings.isNullOrEmpty;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Streams;
import google.registry.model.annotations.DeleteAfterMigration;
import org.joda.time.DateTime;
/**
* Helpers for determining the fully qualified paths to Nomulus backup files. A backup consists of a
* Datastore export and Nomulus CommitLogs that overlap with the export.
*/
@DeleteAfterMigration
public final class BackupPaths {
private BackupPaths() {}
private static final String WILDCARD_CHAR = "*";
private static final String EXPORT_PATTERN_TEMPLATE = "%s/all_namespaces/kind_%s/output-%s";
public static final String COMMIT_LOG_NAME_PREFIX = "commit_diff_until_";
private static final String COMMIT_LOG_PATTERN_TEMPLATE = "%s/" + COMMIT_LOG_NAME_PREFIX + "*";
/**
* Pattern of the per-project file with Cloud SQL connection information. To get a concrete path,
* user needs to provide the name of the environment, alpha, crash, sandbox, or production. This
* file is meant for applications without access to secrets stored in Datastore.
*
* <p>In production, this is an base-64 encoded encrypted file with one line, which contains
* space-separated values of Cloud SQL instance name, login, and password.
*
* <p>A plain text may be used for tests to a local database. Replace Cloud SQL instance name with
* JDBC URL.
*/
private static final String SQL_CONN_INFO_FILE_PATTERN =
"gs://domain-registry-dev-deploy/cloudsql-credentials/%s/admin_credential.enc";
private static final ImmutableSet<String> ALLOWED_ENV =
ImmutableSet.of("alpha", "crash", "sandbox", "production");
/**
* Returns a regex pattern that matches all Datastore export files of a given {@code kind}.
*
* @param exportDir path to the top directory of a Datastore export
* @param kind the 'kind' of the Datastore entity
*/
public static String getExportFileNamePattern(String exportDir, String kind) {
checkArgument(!isNullOrEmpty(exportDir), "Null or empty exportDir.");
checkArgument(!isNullOrEmpty(kind), "Null or empty kind.");
return String.format(EXPORT_PATTERN_TEMPLATE, exportDir, kind, WILDCARD_CHAR);
}
/**
* Returns an {@link ImmutableList} of regex patterns that match all Datastore export files of the
* given {@code kinds}.
*
* @param exportDir path to the top directory of a Datastore export
* @param kinds all entity 'kinds' to be matched
*/
public static ImmutableList<String> getExportFilePatterns(
String exportDir, Iterable<String> kinds) {
checkNotNull(kinds, "kinds");
return Streams.stream(kinds)
.map(kind -> getExportFileNamePattern(exportDir, kind))
.collect(ImmutableList.toImmutableList());
}
/**
* Returns the fully qualified path of a Datastore export file with the given {@code kind} and
* {@code shard}.
*
* @param exportDir path to the top directory of a Datastore export
* @param kind the 'kind' of the Datastore entity
* @param shard an integer suffix of the file name
*/
public static String getExportFileNameByShard(String exportDir, String kind, int shard) {
checkArgument(!isNullOrEmpty(exportDir), "Null or empty exportDir.");
checkArgument(!isNullOrEmpty(kind), "Null or empty kind.");
checkArgument(shard >= 0, "Negative shard %s not allowed.", shard);
return String.format(EXPORT_PATTERN_TEMPLATE, exportDir, kind, shard);
}
/** Returns an {@link ImmutableList} of regex patterns that match all CommitLog files. */
public static ImmutableList<String> getCommitLogFilePatterns(String commitLogDir) {
return ImmutableList.of(String.format(COMMIT_LOG_PATTERN_TEMPLATE, commitLogDir));
}
/** Gets the Commit timestamp from a CommitLog file name. */
public static DateTime getCommitLogTimestamp(String fileName) {
checkArgument(!isNullOrEmpty(fileName), "Null or empty fileName.");
int start = fileName.lastIndexOf(COMMIT_LOG_NAME_PREFIX);
checkArgument(start >= 0, "Illegal file name %s.", fileName);
return DateTime.parse(fileName.substring(start + COMMIT_LOG_NAME_PREFIX.length()));
}
public static ImmutableList<String> getCloudSQLCredentialFilePatterns(String environmentName) {
checkArgument(
ALLOWED_ENV.contains(environmentName), "Invalid environment name %s", environmentName);
return ImmutableList.of(String.format(SQL_CONN_INFO_FILE_PATTERN, environmentName));
}
}

View File

@@ -1,78 +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.beam.initsql;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.appengine.api.datastore.Entity;
import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Objects;
/** Helper for manipulating {@code DomainBase} when migrating from Datastore to SQL database */
@DeleteAfterMigration
final class DomainBaseUtil {
private DomainBaseUtil() {}
/**
* Removes properties that contain foreign keys from a Datastore {@link Entity} that represents an
* Ofy {@link google.registry.model.domain.DomainBase}. This breaks the cycle of foreign key
* constraints between entity kinds, allowing {@code DomainBases} to be inserted into the SQL
* database. See {@link InitSqlPipeline} for a use case, where the full {@code DomainBases} are
* written again during the last stage of the pipeline.
*
* <p>The returned object may be in bad state. Specifically, {@link
* google.registry.model.eppcommon.StatusValue#INACTIVE} is not added after name servers are
* removed. This only impacts tests that manipulate Datastore entities directly.
*
* <p>This operation is performed on an Datastore {@link Entity} instead of Ofy Java object
* because Objectify requires access to a Datastore service when converting an Ofy object to a
* Datastore {@code Entity}. If we insist on working with Objectify objects, we face a few
* unsatisfactory options:
*
* <ul>
* <li>Connect to our production Datastore, which incurs unnecessary security and code health
* risk.
* <li>Connect to a separate real Datastore instance, which is a waster and overkill.
* <li>Use an in-memory test Datastore, which is a project health risk in that the test
* Datastore would be added to Nomulus' production binary unless we create a separate
* project for this pipeline.
* </ul>
*
* <p>Given our use case, operating on Datastore entities is the best option.
*
* @throws IllegalArgumentException if input does not represent a DomainBase
*/
static Entity removeBillingAndPollAndHosts(Entity domainBase) {
checkNotNull(domainBase, "domainBase");
checkArgument(
Objects.equals(domainBase.getKind(), "DomainBase"),
"Expecting DomainBase, got %s",
domainBase.getKind());
Entity clone = domainBase.clone();
clone.removeProperty("autorenewBillingEvent");
clone.removeProperty("autorenewPollMessage");
clone.removeProperty("deletePollMessage");
clone.removeProperty("nsHosts");
domainBase.getProperties().keySet().stream()
.filter(s -> s.startsWith("transferData."))
.forEach(s -> clone.removeProperty(s));
domainBase.getProperties().keySet().stream()
.filter(s -> s.startsWith("gracePeriods."))
.forEach(s -> clone.removeProperty(s));
return clone;
}
}

View File

@@ -1,242 +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.beam.initsql;
import static com.google.common.base.Preconditions.checkArgument;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key;
import google.registry.backup.VersionedEntity;
import google.registry.beam.common.RegistryJpaIO;
import google.registry.beam.initsql.Transforms.RemoveDomainBaseForeignKeys;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.billing.BillingEvent;
import google.registry.model.common.Cursor;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.token.AllocationToken;
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.reporting.HistoryEntry;
import google.registry.model.tld.Registry;
import google.registry.persistence.PersistenceModule.TransactionIsolationLevel;
import java.io.Serializable;
import java.util.Collection;
import java.util.Optional;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.transforms.Wait;
import org.apache.beam.sdk.values.PCollection;
import org.apache.beam.sdk.values.PCollectionTuple;
import org.apache.beam.sdk.values.TupleTag;
import org.joda.time.DateTime;
/**
* A BEAM pipeline that populates a SQL database with data from a Datastore backup.
*
* <p>This pipeline migrates EPP resources and related entities that cross-reference each other. To
* avoid violating foreign key constraints, writes to SQL are ordered by entity kinds. In addition,
* the {@link DomainBase} kind is written twice (see details below). The write order is presented
* below. Although some kinds can be written concurrently, e.g. {@code ContactResource} and {@code
* RegistrarContact}, we do not expect any performance benefit since the limiting resource is the
* number of JDBC connections. Google internal users may refer to <a
* href="http://go/registry-r3-init-sql">the design doc</a> for more information.
*
* <ol>
* <li>{@link Registry}: Assumes that {@code PremiumList} and {@code ReservedList} have been set
* up in the SQL database.
* <li>{@link Cursor}: Logically can depend on {@code Registry}, but without foreign key.
* <li>{@link Registrar}: Logically depends on {@code Registry}, Foreign key not modeled yet.
* <li>{@link ContactResource}: references {@code Registrar}
* <li>{@link RegistrarContact}: references {@code Registrar}.
* <li>Cleansed {@link DomainBase}: with references to {@code BillingEvent}, {@code Recurring},
* {@code Cancellation} and {@code HostResource} removed, still references {@code Registrar}
* and {@code ContactResource}. The removal breaks circular Foreign Key references.
* <li>{@link HostResource}: references {@code DomainBase}.
* <li>{@link HistoryEntry}: maps to one of three SQL entity types and may reference {@code
* Registrar}, {@code ContactResource}, {@code HostResource}, and {@code DomainBase}.
* <li>{@link AllocationToken}: references {@code HistoryEntry}.
* <li>{@link BillingEvent.Recurring}: references {@code Registrar}, {@code DomainBase} and {@code
* HistoryEntry}.
* <li>{@link BillingEvent.OneTime}: references {@code Registrar}, {@code DomainBase}, {@code
* BillingEvent.Recurring}, {@code HistoryEntry} and {@code AllocationToken}.
* <li>{@link BillingEvent.Cancellation}: references {@code Registrar}, {@code DomainBase}, {@code
* BillingEvent.Recurring}, {@code BillingEvent.OneTime}, and {@code HistoryEntry}.
* <li>{@link PollMessage}: references {@code Registrar}, {@code DomainBase}, {@code
* ContactResource}, {@code HostResource}, and {@code HistoryEntry}.
* <li>{@link DomainBase}, original copy from Datastore.
* </ol>
*
* <p>This pipeline expects that the source Datastore has at least one entity in each of the types
* above. This assumption allows us to construct a simpler pipeline graph that can be visually
* examined, and is true in all intended use cases. However, tests must not violate this assumption
* when setting up data, otherwise they may run into foreign key constraint violations. The reason
* is that this pipeline uses the {@link Wait} transform to order the persistence by entity type.
* However, the wait is skipped if the target type has no data, resulting in subsequent entity types
* starting prematurely. E.g., if a Datastore has no {@code RegistrarContact} entities, the pipeline
* may start writing {@code DomainBase} entities before all {@code Registry}, {@code Registrar} and
* {@code ContactResource} entities have been persisted.
*/
@DeleteAfterMigration
public class InitSqlPipeline implements Serializable {
/**
* Datastore kinds to be written to the SQL database before the cleansed version of {@link
* DomainBase}.
*/
private static final ImmutableList<Class<?>> PHASE_ONE_ORDERED =
ImmutableList.of(
Registry.class,
Cursor.class,
Registrar.class,
ContactResource.class,
RegistrarContact.class);
/**
* Datastore kinds to be written to the SQL database after the cleansed version of {@link
* DomainBase}.
*/
private static final ImmutableList<Class<?>> PHASE_TWO_ORDERED =
ImmutableList.of(
HostResource.class,
HistoryEntry.class,
AllocationToken.class,
BillingEvent.Recurring.class,
BillingEvent.OneTime.class,
BillingEvent.Cancellation.class,
PollMessage.class,
DomainBase.class);
private final InitSqlPipelineOptions options;
InitSqlPipeline(InitSqlPipelineOptions options) {
this.options = options;
}
PipelineResult run() {
return run(Pipeline.create(options));
}
@VisibleForTesting
PipelineResult run(Pipeline pipeline) {
setupPipeline(pipeline);
return pipeline.run();
}
@VisibleForTesting
void setupPipeline(Pipeline pipeline) {
options.setIsolationOverride(TransactionIsolationLevel.TRANSACTION_READ_UNCOMMITTED);
PCollectionTuple datastoreSnapshot =
pipeline.apply(
"Load Datastore snapshot",
Transforms.loadDatastoreSnapshot(
options.getDatastoreExportDir(),
options.getCommitLogDir(),
DateTime.parse(options.getCommitLogStartTimestamp()),
DateTime.parse(options.getCommitLogEndTimestamp()),
ImmutableSet.<String>builder()
.add("DomainBase")
.addAll(toKindStrings(PHASE_ONE_ORDERED))
.addAll(toKindStrings(PHASE_TWO_ORDERED))
.build()));
// Set up the pipeline to write entity kinds from PHASE_ONE_ORDERED to SQL. Return an object
// that signals the completion of the phase.
PCollection<Void> blocker =
scheduleOnePhaseWrites(datastoreSnapshot, PHASE_ONE_ORDERED, Optional.empty(), null);
blocker =
writeToSql(
"DomainBase without circular foreign keys",
removeDomainBaseForeignKeys(datastoreSnapshot)
.apply("Wait on phase one", Wait.on(blocker)));
// Set up the pipeline to write entity kinds from PHASE_TWO_ORDERED to SQL. This phase won't
// start until all cleansed DomainBases have been written (started by line above).
scheduleOnePhaseWrites(
datastoreSnapshot, PHASE_TWO_ORDERED, Optional.of(blocker), "DomainBaseNoFkeys");
}
private PCollection<VersionedEntity> removeDomainBaseForeignKeys(
PCollectionTuple datastoreSnapshot) {
PCollection<VersionedEntity> domainBases =
datastoreSnapshot.get(Transforms.createTagForKind("DomainBase"));
return domainBases.apply(
"Remove circular foreign keys from DomainBase",
ParDo.of(new RemoveDomainBaseForeignKeys()));
}
/**
* Sets up the pipeline to write entities in {@code entityClasses} to SQL. Entities are written
* one kind at a time based on each kind's position in {@code entityClasses}. Concurrency exists
* within each kind.
*
* @param datastoreSnapshot the Datastore snapshot of all data to be migrated to SQL
* @param entityClasses the entity types in write order
* @param blockingPCollection the pipeline stage that blocks this phase
* @param blockingTag description of the stage (if exists) that blocks this phase. Needed for
* generating unique transform ids
* @return the output {@code PCollection} from the writing of the last entity kind. Other parts of
* the pipeline can {@link Wait} on this object
*/
private PCollection<Void> scheduleOnePhaseWrites(
PCollectionTuple datastoreSnapshot,
Collection<Class<?>> entityClasses,
Optional<PCollection<Void>> blockingPCollection,
String blockingTag) {
checkArgument(!entityClasses.isEmpty(), "Each phase must have at least one kind.");
ImmutableList<TupleTag<VersionedEntity>> tags =
toKindStrings(entityClasses).stream()
.map(Transforms::createTagForKind)
.collect(ImmutableList.toImmutableList());
PCollection<Void> prev = blockingPCollection.orElse(null);
String prevTag = blockingTag;
for (TupleTag<VersionedEntity> tag : tags) {
PCollection<VersionedEntity> curr = datastoreSnapshot.get(tag);
if (prev != null) {
curr = curr.apply("Wait on " + prevTag, Wait.on(prev));
}
prev = writeToSql(tag.getId(), curr);
prevTag = tag.getId();
}
return prev;
}
private PCollection<Void> writeToSql(String transformId, PCollection<VersionedEntity> data) {
return data.apply(
"Write to Sql: " + transformId,
RegistryJpaIO.<VersionedEntity>write()
.withName(transformId)
.withBatchSize(options.getSqlWriteBatchSize())
.withShards(options.getSqlWriteShards())
.withJpaConverter(Transforms::convertVersionedEntityToSqlEntity)
.disableUpdateAutoTimestamp());
}
private static ImmutableList<String> toKindStrings(Collection<Class<?>> entityClasses) {
return entityClasses.stream().map(Key::getKind).collect(ImmutableList.toImmutableList());
}
public static void main(String[] args) {
InitSqlPipelineOptions options =
PipelineOptionsFactory.fromArgs(args).withValidation().as(InitSqlPipelineOptions.class);
new InitSqlPipeline(options).run();
}
}

View File

@@ -1,47 +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.beam.initsql;
import google.registry.beam.common.RegistryPipelineOptions;
import google.registry.model.annotations.DeleteAfterMigration;
import org.apache.beam.sdk.options.Description;
import org.apache.beam.sdk.options.Validation;
/** Pipeline options for {@link InitSqlPipeline} */
@DeleteAfterMigration
public interface InitSqlPipelineOptions extends RegistryPipelineOptions {
@Description("The root directory of the export to load.")
String getDatastoreExportDir();
void setDatastoreExportDir(String datastoreExportDir);
@Description("The directory that contains all CommitLog files.")
String getCommitLogDir();
void setCommitLogDir(String commitLogDir);
@Description("The earliest CommitLogs to load, in ISO8601 format.")
@Validation.Required
String getCommitLogStartTimestamp();
void setCommitLogStartTimestamp(String commitLogStartTimestamp);
@Description("The latest CommitLogs to load, in ISO8601 format.")
@Validation.Required
String getCommitLogEndTimestamp();
void setCommitLogEndTimestamp(String commitLogEndTimestamp);
}

View File

@@ -1,17 +0,0 @@
## Summary
This package contains a BEAM pipeline that populates a Cloud SQL database from a
Datastore backup. The pipeline uses an unsynchronized Datastore export and
overlapping CommitLogs generated by the Nomulus server to recreate a consistent
Datastore snapshot, and writes the data to a Cloud SQL instance.
## Pipeline Visualization
The golden flow graph of the InitSqlPipeline is saved both as a text-base
[DOT file](../../../../../../test/resources/google/registry/beam/initsql/pipeline_golden.dot)
and a
[.png file](../../../../../../test/resources/google/registry/beam/initsql/pipeline_golden.png).
A test compares the flow graph of the current pipeline with the golden graph,
and will fail if changes are detected. When this happens, run the Gradle task
':core:updateInitSqlPipelineGraph' to update the golden files and review the
changes.

View File

@@ -1,485 +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.beam.initsql;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
import static google.registry.beam.initsql.BackupPaths.getCommitLogTimestamp;
import static google.registry.beam.initsql.BackupPaths.getExportFilePatterns;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
import static google.registry.util.DateTimeUtils.isBeforeOrAt;
import static google.registry.util.DomainNameUtils.canonicalizeHostname;
import static java.util.Comparator.comparing;
import static org.apache.beam.sdk.values.TypeDescriptors.kvs;
import static org.apache.beam.sdk.values.TypeDescriptors.strings;
import avro.shaded.com.google.common.collect.Iterators;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.EntityTranslator;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Streams;
import google.registry.backup.CommitLogImports;
import google.registry.backup.VersionedEntity;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.billing.BillingEvent.Flag;
import google.registry.model.billing.BillingEvent.Reason;
import google.registry.model.domain.DomainBase;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.tools.LevelDbLogReader;
import java.io.Serializable;
import java.util.Collection;
import java.util.Iterator;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import javax.annotation.Nullable;
import org.apache.beam.sdk.coders.StringUtf8Coder;
import org.apache.beam.sdk.io.Compression;
import org.apache.beam.sdk.io.FileIO;
import org.apache.beam.sdk.io.FileIO.ReadableFile;
import org.apache.beam.sdk.io.fs.EmptyMatchTreatment;
import org.apache.beam.sdk.io.fs.MatchResult.Metadata;
import org.apache.beam.sdk.transforms.Create;
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.PTransform;
import org.apache.beam.sdk.transforms.ParDo;
import org.apache.beam.sdk.transforms.ProcessFunction;
import org.apache.beam.sdk.values.KV;
import org.apache.beam.sdk.values.PBegin;
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.TupleTag;
import org.apache.beam.sdk.values.TupleTagList;
import org.apache.beam.sdk.values.TypeDescriptor;
import org.joda.time.DateTime;
/**
* {@link PTransform Pipeline transforms} used in pipelines that load from both Datastore export
* files and Nomulus CommitLog files.
*/
@DeleteAfterMigration
public final class Transforms {
private Transforms() {}
/**
* The commitTimestamp assigned to all entities loaded from a Datastore export file. The exact
* value does not matter, but it must be lower than the timestamps of real CommitLog records.
*/
@VisibleForTesting static final long EXPORT_ENTITY_TIME_STAMP = START_OF_TIME.getMillis();
/**
* Returns a {@link TupleTag} that can be used to retrieve entities of the given {@code kind} from
* the Datastore snapshot returned by {@link #loadDatastoreSnapshot}.
*/
public static TupleTag<VersionedEntity> createTagForKind(String kind) {
// When used with PCollectionTuple the result must retain generic type information.
// Both the Generic param and the empty bracket below are important.
return new TupleTag<VersionedEntity>(Transforms.class.getSimpleName() + ":" + kind) {};
}
/**
* Composite {@link PTransform transform} that loads the Datastore snapshot right before {@code
* commitLogToTime} for caller specified {@code kinds}. The resulting snapshot has all changes
* that happened before {@code commitLogToTime}, and none at or after {@code commitLogToTime}.
*
* <p>Caller must provide the location of a Datastore export that started AFTER {@code
* commitLogFromTime} and completed BEFORE {@code commitLogToTime}, as well as the root directory
* of all CommitLog files.
*
* <p>Selection of {@code commitLogFromTime} and {@code commitLogToTime} should follow the
* guidelines below to ensure that all incremental changes concurrent with the export are covered:
*
* <ul>
* <li>Two or more CommitLogs should exist between {@code commitLogFromTime} and the starting
* time of the Datastore export. This ensures that the earlier CommitLog file was complete
* before the export started.
* <li>Two or more CommitLogs should exit between the export completion time and {@code
* commitLogToTime}.
* </ul>
*
* <p>The output from the returned transform is a {@link PCollectionTuple} consisting of {@link
* VersionedEntity VersionedEntities} grouped into {@link PCollection PCollections} by {@code
* kind}.
*/
public static PTransform<PBegin, PCollectionTuple> loadDatastoreSnapshot(
String exportDir,
String commitLogDir,
DateTime commitLogFromTime,
DateTime commitLogToTime,
Set<String> kinds) {
checkArgument(kinds != null && !kinds.isEmpty(), "At least one kind is expected.");
// Create tags to collect entities by kind in final step.
final ImmutableMap<String, TupleTag<VersionedEntity>> outputTags =
kinds.stream()
.collect(ImmutableMap.toImmutableMap(kind -> kind, Transforms::createTagForKind));
// Arbitrarily select one tag as mainOutTag and put the remaining ones in a TupleTagList.
// This separation is required by ParDo's config API.
Iterator<TupleTag<VersionedEntity>> tagsIt = outputTags.values().iterator();
final TupleTag<VersionedEntity> mainOutputTag = tagsIt.next();
final TupleTagList additionalTags = TupleTagList.of(ImmutableList.copyOf(tagsIt));
return new PTransform<PBegin, PCollectionTuple>() {
@Override
public PCollectionTuple expand(PBegin input) {
PCollection<VersionedEntity> exportedEntities =
input
.apply("Get export file patterns", getDatastoreExportFilePatterns(exportDir, kinds))
.apply("Find export files", getFilesByPatterns())
.apply("Load export data", loadExportDataFromFiles());
PCollection<VersionedEntity> commitLogEntities =
input
.apply("Get commitlog file patterns", getCommitLogFilePatterns(commitLogDir))
.apply("Find commitlog files", getFilesByPatterns())
.apply(
"Filter commitLog by time",
filterCommitLogsByTime(commitLogFromTime, commitLogToTime))
.apply("Load commitlog data", loadCommitLogsFromFiles(kinds));
return PCollectionList.of(exportedEntities)
.and(commitLogEntities)
.apply("Merge exports and CommitLogs", Flatten.pCollections())
.apply(
"Key entities by Datastore Keys",
// Converting to KV<String, VE> instead of KV<Key, VE> b/c default coder for Key
// (SerializableCoder) is not deterministic and cannot be used with GroupBy.
MapElements.into(kvs(strings(), TypeDescriptor.of(VersionedEntity.class)))
.via((VersionedEntity e) -> KV.of(e.key().toString(), e)))
.apply("Gather entities by key", GroupByKey.create())
.apply(
"Output latest version per entity",
ParDo.of(
new DoFn<KV<String, Iterable<VersionedEntity>>, VersionedEntity>() {
@ProcessElement
public void processElement(
@Element KV<String, Iterable<VersionedEntity>> kv,
MultiOutputReceiver out) {
Optional<VersionedEntity> latest =
Streams.stream(kv.getValue())
.sorted(comparing(VersionedEntity::commitTimeMills).reversed())
.findFirst();
// Throw to abort (after default retries). Investigate, fix, and rerun.
checkState(
latest.isPresent(), "Unexpected key with no data", kv.getKey());
if (latest.get().isDelete()) {
return;
}
String kind = latest.get().getEntity().get().getKind();
out.get(outputTags.get(kind)).output(latest.get());
}
})
.withOutputTags(mainOutputTag, additionalTags));
}
};
}
/**
* Returns a {@link PTransform transform} that can generate a collection of patterns that match
* all Datastore CommitLog files.
*/
public static PTransform<PBegin, PCollection<String>> getCommitLogFilePatterns(
String commitLogDir) {
return toStringPCollection(BackupPaths.getCommitLogFilePatterns(commitLogDir));
}
/**
* Returns a {@link PTransform transform} that can generate a collection of patterns that match
* all Datastore export files of the given {@code kinds}.
*/
public static PTransform<PBegin, PCollection<String>> getDatastoreExportFilePatterns(
String exportDir, Collection<String> kinds) {
return toStringPCollection(getExportFilePatterns(exportDir, kinds));
}
public static PTransform<PBegin, PCollection<String>> getCloudSqlConnectionInfoFilePatterns(
String gcpProjectName) {
return toStringPCollection(BackupPaths.getCloudSQLCredentialFilePatterns(gcpProjectName));
}
/**
* Returns a {@link PTransform} from file name patterns to file {@link Metadata Metadata records}.
*/
public static PTransform<PCollection<String>, PCollection<Metadata>> getFilesByPatterns() {
return new PTransform<PCollection<String>, PCollection<Metadata>>() {
@Override
public PCollection<Metadata> expand(PCollection<String> input) {
return input.apply(FileIO.matchAll().withEmptyMatchTreatment(EmptyMatchTreatment.ALLOW));
}
};
}
/**
* Returns CommitLog files with timestamps between {@code fromTime} (inclusive) and {@code
* endTime} (exclusive).
*/
public static PTransform<PCollection<? extends Metadata>, PCollection<Metadata>>
filterCommitLogsByTime(DateTime fromTime, DateTime toTime) {
return ParDo.of(new FilterCommitLogFileByTime(fromTime, toTime));
}
/** Returns a {@link PTransform} from file {@link Metadata} to {@link VersionedEntity}. */
public static PTransform<PCollection<Metadata>, PCollection<VersionedEntity>>
loadExportDataFromFiles() {
return processFiles(
new BackupFileReader(
file ->
Iterators.transform(
LevelDbLogReader.from(file.open()),
(byte[] bytes) -> VersionedEntity.from(EXPORT_ENTITY_TIME_STAMP, bytes))));
}
/** Returns a {@link PTransform} from file {@link Metadata} to {@link VersionedEntity}. */
public static PTransform<PCollection<Metadata>, PCollection<VersionedEntity>>
loadCommitLogsFromFiles(Set<String> kinds) {
return processFiles(
new BackupFileReader(
file ->
CommitLogImports.loadEntities(file.open()).stream()
.filter(e -> kinds.contains(e.key().getKind()))
.iterator()));
}
// Production data repair configs go below. See b/185954992. Note that the CommitLog replay
// process does not filter out the ignored entities listed below, a mistake that we do not fix
// for operational convenience. Instead, the Database comparison tool will filter them out. See
// ValidateSqlUtils.java for more information.
// Prober domains in bad state, without associated contacts, hosts, billings, and non-synthesized
// history. They can be safely ignored.
public static final ImmutableSet<String> IGNORED_DOMAINS =
ImmutableSet.of("6AF6D2-IQCANT", "2-IQANYT");
// Prober hosts referencing phantom registrars. They and their associated history entries can be
// safely ignored.
public static final ImmutableSet<String> IGNORED_HOSTS =
ImmutableSet.of(
"4E21_WJ0TEST-GOOGLE",
"4E21_WJ1TEST-GOOGLE",
"4E21_WJ2TEST-GOOGLE",
"4E21_WJ3TEST-GOOGLE");
// Prober contacts referencing phantom registrars. They and their associated history entries can
// be safely ignored.
public static final ImmutableSet<String> IGNORED_CONTACTS =
ImmutableSet.of(
"1_WJ0TEST-GOOGLE", "1_WJ1TEST-GOOGLE", "1_WJ2TEST-GOOGLE", "1_WJ3TEST-GOOGLE");
private static boolean isMigratable(Entity entity) {
// Checks specific to production data. See b/185954992 for details.
// The names of these bad entities in production do not conflict with other environments. For
// simplicities sake we apply them regardless of the source of the data.
if (entity.getKind().equals("DomainBase")
&& IGNORED_DOMAINS.contains(entity.getKey().getName())) {
return false;
}
if (entity.getKind().equals("ContactResource")) {
String roid = entity.getKey().getName();
return !IGNORED_CONTACTS.contains(roid);
}
if (entity.getKind().equals("HostResource")) {
String roid = entity.getKey().getName();
return !IGNORED_HOSTS.contains(roid);
}
if (entity.getKind().equals("HistoryEntry")) {
// DOMAIN_APPLICATION_CREATE is deprecated type and should not be migrated.
// The Enum name DOMAIN_APPLICATION_CREATE no longer exists in Java and cannot
// be deserialized.
if (Objects.equals(entity.getProperty("type"), "DOMAIN_APPLICATION_CREATE")) {
return false;
}
// Remove production bad data: Histories of ignored EPP resources:
com.google.appengine.api.datastore.Key parentKey = entity.getKey().getParent();
if (parentKey.getKind().equals("ContactResource")) {
String contactRoid = parentKey.getName();
return !IGNORED_CONTACTS.contains(contactRoid);
}
if (parentKey.getKind().equals("HostResource")) {
String hostRoid = parentKey.getName();
return !IGNORED_HOSTS.contains(hostRoid);
}
if (parentKey.getKind().equals("DomainBase")) {
String domainRoid = parentKey.getName();
return !IGNORED_DOMAINS.contains(domainRoid);
}
}
return true;
}
@VisibleForTesting
static Entity repairBadData(Entity entity) {
if (entity.getKind().equals("Cancellation")
&& Objects.equals(entity.getProperty("reason"), "AUTO_RENEW")) {
// AUTO_RENEW has been moved from 'reason' to flags. Change reason to RENEW and add the
// AUTO_RENEW flag. Note: all affected entities have empty flags so we can simply assign
// instead of append. See b/185954992.
entity.setUnindexedProperty("reason", Reason.RENEW.name());
entity.setUnindexedProperty("flags", ImmutableList.of(Flag.AUTO_RENEW.name()));
} else if (entity.getKind().equals("DomainBase")) {
// Canonicalize old domain/host names from 2016 and earlier before we were enforcing this.
entity.setIndexedProperty(
"fullyQualifiedDomainName",
canonicalizeHostname((String) entity.getProperty("fullyQualifiedDomainName")));
} else if (entity.getKind().equals("HostResource")) {
entity.setIndexedProperty(
"fullyQualifiedHostName",
canonicalizeHostname((String) entity.getProperty("fullyQualifiedHostName")));
}
return entity;
}
private static SqlEntity toSqlEntity(Object ofyEntity) {
if (ofyEntity instanceof HistoryEntry) {
HistoryEntry ofyHistory = (HistoryEntry) ofyEntity;
return (SqlEntity) ofyHistory.toChildHistoryEntity();
}
return ((DatastoreAndSqlEntity) ofyEntity).toSqlEntity().get();
}
/**
* Converts a {@link VersionedEntity} to an JPA entity for persistence.
*
* @return An object to be persisted to SQL, or null if the input is not to be migrated. (Not
* using Optional in return because as a one-use method, we do not want to invest the effort
* to make Optional work with BEAM)
*/
@Nullable
public static SqlEntity convertVersionedEntityToSqlEntity(VersionedEntity dsEntity) {
return dsEntity
.getEntity()
.filter(Transforms::isMigratable)
.map(Transforms::repairBadData)
.map(e -> auditedOfy().toPojo(e))
.map(Transforms::toSqlEntity)
.orElse(null);
}
/** Interface for serializable {@link Supplier suppliers}. */
public interface SerializableSupplier<T> extends Supplier<T>, Serializable {}
/**
* Returns a {@link PTransform} that produces a {@link PCollection} containing all elements in the
* given {@link Iterable}.
*/
private static PTransform<PBegin, PCollection<String>> toStringPCollection(
Iterable<String> strings) {
return Create.of(strings).withCoder(StringUtf8Coder.of());
}
/**
* Returns a {@link PTransform} from file {@link Metadata} to {@link VersionedEntity} using
* caller-provided {@code transformer}.
*/
private static PTransform<PCollection<Metadata>, PCollection<VersionedEntity>> processFiles(
DoFn<ReadableFile, VersionedEntity> transformer) {
return new PTransform<PCollection<Metadata>, PCollection<VersionedEntity>>() {
@Override
public PCollection<VersionedEntity> expand(PCollection<Metadata> input) {
return input
.apply(FileIO.readMatches().withCompression(Compression.UNCOMPRESSED))
.apply(transformer.getClass().getSimpleName(), ParDo.of(transformer));
}
};
}
private static class FilterCommitLogFileByTime extends DoFn<Metadata, Metadata> {
private final DateTime fromTime;
private final DateTime toTime;
FilterCommitLogFileByTime(DateTime fromTime, DateTime toTime) {
checkNotNull(fromTime, "fromTime");
checkNotNull(toTime, "toTime");
checkArgument(
fromTime.isBefore(toTime),
"Invalid time range: fromTime (%s) is before endTime (%s)",
fromTime,
toTime);
this.fromTime = fromTime;
this.toTime = toTime;
}
@ProcessElement
public void processElement(@Element Metadata fileMeta, OutputReceiver<Metadata> out) {
DateTime timestamp = getCommitLogTimestamp(fileMeta.resourceId().toString());
if (isBeforeOrAt(fromTime, timestamp) && timestamp.isBefore(toTime)) {
out.output(fileMeta);
}
}
}
/**
* Reads from a Datastore backup file and converts its content into {@link VersionedEntity
* VersionedEntities}.
*
* <p>The input file may be either a LevelDb file from a Datastore export or a CommitLog file
* generated by the Nomulus server. In either case, the file contains variable-length records and
* must be read sequentially from the beginning. If the read fails, the file needs to be retried
* from the beginning.
*/
private static class BackupFileReader extends DoFn<ReadableFile, VersionedEntity> {
private final ProcessFunction<ReadableFile, Iterator<VersionedEntity>> reader;
private BackupFileReader(ProcessFunction<ReadableFile, Iterator<VersionedEntity>> reader) {
this.reader = reader;
}
@ProcessElement
public void processElement(@Element ReadableFile file, OutputReceiver<VersionedEntity> out) {
try {
reader.apply(file).forEachRemaining(out::output);
} catch (Exception e) {
// Let the pipeline use default retry strategy on the whole file. For GCP Dataflow this
// means retrying up to 4 times (may include other files grouped with this one), and failing
// the pipeline if no success.
throw new RuntimeException(e);
}
}
}
/**
* Removes BillingEvents, {@link google.registry.model.poll.PollMessage PollMessages} and {@link
* google.registry.model.host.HostResource} from a {@link DomainBase}. These are circular foreign
* key constraints that prevent migration of {@code DomainBase} to SQL databases.
*
* <p>See {@link InitSqlPipeline} for more information.
*/
static class RemoveDomainBaseForeignKeys extends DoFn<VersionedEntity, VersionedEntity> {
@ProcessElement
public void processElement(
@Element VersionedEntity domainBase, OutputReceiver<VersionedEntity> out) {
checkArgument(
domainBase.getEntity().isPresent(), "Unexpected delete entity %s", domainBase.key());
Entity outputEntity =
DomainBaseUtil.removeBillingAndPollAndHosts(domainBase.getEntity().get());
out.output(
VersionedEntity.from(
domainBase.commitTimeMills(),
EntityTranslator.convertToPb(outputEntity).toByteArray()));
}
}
}

View File

@@ -41,11 +41,9 @@ import java.util.Optional;
import java.util.regex.Pattern;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.coders.SerializableCoder;
import org.apache.beam.sdk.coders.StringUtf8Coder;
import org.apache.beam.sdk.io.FileIO;
import org.apache.beam.sdk.io.TextIO;
import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.Contextful;
import org.apache.beam.sdk.transforms.Count;
@@ -92,28 +90,11 @@ public class InvoicingPipeline implements Serializable {
void setupPipeline(Pipeline pipeline) {
options.setIsolationOverride(TransactionIsolationLevel.TRANSACTION_READ_COMMITTED);
PCollection<BillingEvent> billingEvents =
options.getDatabase().equals("DATASTORE")
? readFromBigQuery(options, pipeline)
: readFromCloudSql(options, pipeline);
PCollection<BillingEvent> billingEvents = readFromCloudSql(options, pipeline);
saveInvoiceCsv(billingEvents, options);
saveDetailedCsv(billingEvents, options);
}
static PCollection<BillingEvent> readFromBigQuery(
InvoicingPipelineOptions options, Pipeline pipeline) {
return pipeline.apply(
"Read BillingEvents from Bigquery",
BigQueryIO.read(BillingEvent::parseFromRecord)
.fromQuery(makeQuery(options.getYearMonth(), options.getProject()))
.withCoder(SerializableCoder.of(BillingEvent.class))
.usingStandardSql()
.withoutValidation()
.withTemplateCompatibility());
}
static PCollection<BillingEvent> readFromCloudSql(
InvoicingPipelineOptions options, Pipeline pipeline) {
Read<Object[], BillingEvent> read =

View File

@@ -30,11 +30,6 @@ public interface InvoicingPipelineOptions extends RegistryPipelineOptions {
void setInvoiceFilePrefix(String value);
@Description("The database to read data from.")
String getDatabase();
void setDatabase(String value);
@Description("The GCS bucket URL for invoices and detailed reports to be uploaded.")
String getBillingBucketUrl();

View File

@@ -14,30 +14,19 @@
package google.registry.beam.spec11;
import static google.registry.beam.BeamUtils.checkFieldsNotNull;
import static google.registry.beam.BeamUtils.extractField;
import com.google.auto.value.AutoValue;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import java.io.Serializable;
import org.apache.avro.generic.GenericRecord;
import org.apache.beam.sdk.io.gcp.bigquery.SchemaAndRecord;
/**
* A POJO representing a domain name and associated info, parsed from a {@code SchemaAndRecord}.
*
* <p>This is a trivially serializable class that allows Beam to transform the results of a Bigquery
* query into a standard Java representation, giving us the type guarantees and ease of manipulation
* Bigquery lacks, while localizing any Bigquery-side failures to the {@link #parseFromRecord}
* function.
* <p>This is a trivially serializable class that allows Beam to transform the results of a SQL
* query into a standard Java representation.
*/
@AutoValue
public abstract class DomainNameInfo implements Serializable {
private static final ImmutableList<String> FIELD_NAMES =
ImmutableList.of("domainName", "domainRepoId", "registrarId", "registrarEmailAddress");
/** Returns the fully qualified domain name. */
abstract String domainName();
@@ -50,28 +39,8 @@ public abstract class DomainNameInfo implements Serializable {
/** Returns the email address of the registrar associated with this domain. */
abstract String registrarEmailAddress();
/**
* Constructs a {@link DomainNameInfo} from an Apache Avro {@code SchemaAndRecord}.
*
* @see <a
* href=http://avro.apache.org/docs/1.7.7/api/java/org/apache/avro/generic/GenericData.Record.html>
* Apache AVRO GenericRecord</a>
*/
static DomainNameInfo parseFromRecord(SchemaAndRecord schemaAndRecord) {
checkFieldsNotNull(FIELD_NAMES, schemaAndRecord);
GenericRecord record = schemaAndRecord.getRecord();
return create(
extractField(record, "domainName"),
extractField(record, "domainRepoId"),
extractField(record, "registrarId"),
extractField(record, "registrarEmailAddress"));
}
/**
* Creates a concrete {@link DomainNameInfo}.
*
* <p>This should only be used outside this class for testing- instances of {@link DomainNameInfo}
* should otherwise come from {@link #parseFromRecord}.
*/
@VisibleForTesting
static DomainNameInfo create(

View File

@@ -15,7 +15,6 @@
package google.registry.beam.spec11;
import static com.google.common.base.Preconditions.checkArgument;
import static google.registry.beam.BeamUtils.getQueryFromFile;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import com.google.auto.value.AutoValue;
@@ -33,15 +32,12 @@ import google.registry.model.reporting.Spec11ThreatMatch.ThreatType;
import google.registry.persistence.PersistenceModule.TransactionIsolationLevel;
import google.registry.persistence.VKey;
import google.registry.util.Retrier;
import google.registry.util.SqlTemplate;
import google.registry.util.UtilsModule;
import java.io.Serializable;
import javax.inject.Singleton;
import org.apache.beam.sdk.Pipeline;
import org.apache.beam.sdk.PipelineResult;
import org.apache.beam.sdk.coders.SerializableCoder;
import org.apache.beam.sdk.io.TextIO;
import org.apache.beam.sdk.io.gcp.bigquery.BigQueryIO;
import org.apache.beam.sdk.options.PipelineOptionsFactory;
import org.apache.beam.sdk.transforms.DoFn;
import org.apache.beam.sdk.transforms.GroupByKey;
@@ -104,10 +100,7 @@ public class Spec11Pipeline implements Serializable {
void setupPipeline(Pipeline pipeline) {
options.setIsolationOverride(TransactionIsolationLevel.TRANSACTION_READ_COMMITTED);
PCollection<DomainNameInfo> domains =
options.getDatabase().equals("DATASTORE")
? readFromBigQuery(options, pipeline)
: readFromCloudSql(pipeline);
PCollection<DomainNameInfo> domains = readFromCloudSql(pipeline);
PCollection<KV<DomainNameInfo, ThreatMatch>> threatMatches =
domains.apply("Run through SafeBrowsing API", ParDo.of(safeBrowsingFn));
@@ -156,24 +149,6 @@ public class Spec11Pipeline implements Serializable {
}));
}
static PCollection<DomainNameInfo> readFromBigQuery(
Spec11PipelineOptions options, Pipeline pipeline) {
return pipeline.apply(
"Read active domains from BigQuery",
BigQueryIO.read(DomainNameInfo::parseFromRecord)
.fromQuery(
SqlTemplate.create(getQueryFromFile(Spec11Pipeline.class, "domain_name_infos.sql"))
.put("PROJECT_ID", options.getProject())
.put("DATASTORE_EXPORT_DATASET", "latest_datastore_export")
.put("REGISTRAR_TABLE", "Registrar")
.put("DOMAIN_BASE_TABLE", "DomainBase")
.build())
.withCoder(SerializableCoder.of(DomainNameInfo.class))
.usingStandardSql()
.withoutValidation()
.withTemplateCompatibility());
}
private static KV<String, String> parseRow(Object[] row) {
return KV.of((String) row[0], (String) row[1]);
}

View File

@@ -34,9 +34,4 @@ public interface Spec11PipelineOptions extends RegistryPipelineOptions {
String getReportingBucketUrl();
void setReportingBucketUrl(String value);
@Description("The database to read data from.")
String getDatabase();
void setDatabase(String value);
}

View File

@@ -34,7 +34,6 @@ import com.google.common.collect.ImmutableSortedMap;
import dagger.Module;
import dagger.Provides;
import google.registry.persistence.transaction.JpaTransactionManager;
import google.registry.util.TaskQueueUtils;
import google.registry.util.YamlUtils;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
@@ -952,7 +951,7 @@ public final class RegistryConfig {
* <p>Note that this uses {@code @Named} instead of {@code @Config} so that it can be used from
* the low-level util package, which cannot have a dependency on the config package.
*
* @see TaskQueueUtils
* @see google.registry.util.CloudTasksUtils
*/
@Provides
@Named("transientFailureRetries")

View File

@@ -30,14 +30,13 @@ import static google.registry.dns.DnsModule.PARAM_REFRESH_REQUEST_CREATED;
import static google.registry.request.RequestParameters.PARAM_TLD;
import static google.registry.util.DomainNameUtils.getSecondLevelDomain;
import static java.nio.charset.StandardCharsets.UTF_8;
import static java.util.concurrent.TimeUnit.SECONDS;
import com.google.appengine.api.taskqueue.Queue;
import com.google.appengine.api.taskqueue.TaskHandle;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.auto.value.AutoValue;
import com.google.cloud.tasks.v2.Task;
import com.google.common.collect.ComparisonChain;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSetMultimap;
import com.google.common.collect.Iterables;
@@ -50,20 +49,19 @@ import google.registry.dns.DnsConstants.TargetType;
import google.registry.model.tld.Registries;
import google.registry.model.tld.Registry;
import google.registry.request.Action;
import google.registry.request.Action.Service;
import google.registry.request.Parameter;
import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.TaskQueueUtils;
import google.registry.util.CloudTasksUtils;
import java.io.UnsupportedEncodingException;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Random;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.inject.Named;
import org.joda.time.DateTime;
import org.joda.time.Duration;
@@ -84,7 +82,6 @@ import org.joda.time.Duration;
public final class ReadDnsQueueAction implements Runnable {
private static final String PARAM_JITTER_SECONDS = "jitterSeconds";
private static final Random random = new Random();
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
/**
@@ -101,15 +98,31 @@ public final class ReadDnsQueueAction implements Runnable {
*/
private static final Duration LEASE_PADDING = Duration.standardMinutes(1);
@Inject @Config("dnsTldUpdateBatchSize") int tldUpdateBatchSize;
@Inject @Config("readDnsQueueActionRuntime") Duration requestedMaximumDuration;
@Inject @Named(DNS_PUBLISH_PUSH_QUEUE_NAME) Queue dnsPublishPushQueue;
@Inject @Parameter(PARAM_JITTER_SECONDS) Optional<Integer> jitterSeconds;
@Inject Clock clock;
@Inject DnsQueue dnsQueue;
@Inject HashFunction hashFunction;
@Inject TaskQueueUtils taskQueueUtils;
@Inject ReadDnsQueueAction() {}
private final int tldUpdateBatchSize;
private final Duration requestedMaximumDuration;
private final Optional<Integer> jitterSeconds;
private final Clock clock;
private final DnsQueue dnsQueue;
private final HashFunction hashFunction;
private final CloudTasksUtils cloudTasksUtils;
@Inject
ReadDnsQueueAction(
@Config("dnsTldUpdateBatchSize") int tldUpdateBatchSize,
@Config("readDnsQueueActionRuntime") Duration requestedMaximumDuration,
@Parameter(PARAM_JITTER_SECONDS) Optional<Integer> jitterSeconds,
Clock clock,
DnsQueue dnsQueue,
HashFunction hashFunction,
CloudTasksUtils cloudTasksUtils) {
this.tldUpdateBatchSize = tldUpdateBatchSize;
this.requestedMaximumDuration = requestedMaximumDuration;
this.jitterSeconds = jitterSeconds;
this.clock = clock;
this.dnsQueue = dnsQueue;
this.hashFunction = hashFunction;
this.cloudTasksUtils = cloudTasksUtils;
}
/** Container for items we pull out of the DNS pull queue and process for fanout. */
@AutoValue
@@ -322,17 +335,13 @@ public final class ReadDnsQueueAction implements Runnable {
if (numPublishLocks <= 1) {
enqueueUpdates(tld, 1, 1, tldRefreshItemsEntry.getValue());
} else {
tldRefreshItemsEntry
.getValue()
.stream()
tldRefreshItemsEntry.getValue().stream()
.collect(
toImmutableSetMultimap(
refreshItem -> getLockIndex(tld, numPublishLocks, refreshItem),
refreshItem -> refreshItem))
.asMap()
.entrySet()
.forEach(
entry -> enqueueUpdates(tld, entry.getKey(), numPublishLocks, entry.getValue()));
.forEach((key, value) -> enqueueUpdates(tld, key, numPublishLocks, value));
}
}
}
@@ -340,10 +349,10 @@ public final class ReadDnsQueueAction implements Runnable {
/**
* Returns the lock index for a given refreshItem.
*
* <p>We hash the second level domain domain for all records, to group in-balliwick hosts (the
* only ones we refresh DNS for) with their superordinate domains. We use consistent hashing to
* determine the lock index because it gives us [0,N) bucketing properties out of the box, then
* add 1 to make indexes within [1,N].
* <p>We hash the second level domain for all records, to group in-bailiwick hosts (the only ones
* we refresh DNS for) with their superordinate domains. We use consistent hashing to determine
* the lock index because it gives us [0,N) bucketing properties out of the box, then add 1 to
* make indexes within [1,N].
*/
private int getLockIndex(String tld, int numPublishLocks, RefreshItem refreshItem) {
String domain = getSecondLevelDomain(refreshItem.name(), tld);
@@ -360,33 +369,32 @@ public final class ReadDnsQueueAction implements Runnable {
DateTime earliestCreateTime =
chunk.stream().map(RefreshItem::creationTime).min(Comparator.naturalOrder()).get();
for (String dnsWriter : Registry.get(tld).getDnsWriters()) {
taskQueueUtils.enqueue(
dnsPublishPushQueue,
TaskOptions.Builder.withUrl(PublishDnsUpdatesAction.PATH)
.countdownMillis(
jitterSeconds
.map(seconds -> random.nextInt((int) SECONDS.toMillis(seconds)))
.orElse(0))
.param(PARAM_TLD, tld)
.param(PARAM_DNS_WRITER, dnsWriter)
.param(PARAM_LOCK_INDEX, Integer.toString(lockIndex))
.param(PARAM_NUM_PUBLISH_LOCKS, Integer.toString(numPublishLocks))
.param(PARAM_PUBLISH_TASK_ENQUEUED, clock.nowUtc().toString())
.param(PARAM_REFRESH_REQUEST_CREATED, earliestCreateTime.toString())
.param(
PARAM_DOMAINS,
chunk
.stream()
.filter(item -> item.type() == TargetType.DOMAIN)
.map(RefreshItem::name)
.collect(Collectors.joining(",")))
.param(
PARAM_HOSTS,
chunk
.stream()
.filter(item -> item.type() == TargetType.HOST)
.map(RefreshItem::name)
.collect(Collectors.joining(","))));
Task task =
cloudTasksUtils.createPostTaskWithJitter(
PublishDnsUpdatesAction.PATH,
Service.BACKEND.toString(),
ImmutableMultimap.<String, String>builder()
.put(PARAM_TLD, tld)
.put(PARAM_DNS_WRITER, dnsWriter)
.put(PARAM_LOCK_INDEX, Integer.toString(lockIndex))
.put(PARAM_NUM_PUBLISH_LOCKS, Integer.toString(numPublishLocks))
.put(PARAM_PUBLISH_TASK_ENQUEUED, clock.nowUtc().toString())
.put(PARAM_REFRESH_REQUEST_CREATED, earliestCreateTime.toString())
.put(
PARAM_DOMAINS,
chunk.stream()
.filter(item -> item.type() == TargetType.DOMAIN)
.map(RefreshItem::name)
.collect(Collectors.joining(",")))
.put(
PARAM_HOSTS,
chunk.stream()
.filter(item -> item.type() == TargetType.HOST)
.map(RefreshItem::name)
.collect(Collectors.joining(",")))
.build(),
jitterSeconds);
cloudTasksUtils.enqueue(DNS_PUBLISH_PUSH_QUEUE_NAME, task);
}
}
}

View File

@@ -25,7 +25,6 @@ import google.registry.model.eppinput.EppInput.InnerCommand;
import google.registry.model.eppinput.EppInput.ResourceCommandWrapper;
import google.registry.model.eppoutput.Result;
import google.registry.model.eppoutput.Result.Code;
import google.registry.persistence.transaction.TransactionManagerFactory.ReadOnlyModeException;
import java.lang.annotation.Documented;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
@@ -262,12 +261,4 @@ public abstract class EppException extends Exception {
super("Specified protocol version is not implemented");
}
}
/** Registry is currently undergoing maintenance and is in read-only mode. */
@EppResultCode(Code.COMMAND_FAILED)
public static class ReadOnlyModeEppException extends EppException {
ReadOnlyModeEppException(ReadOnlyModeException cause) {
super("Registry is currently undergoing maintenance and is in read-only mode", cause);
}
}
}

View File

@@ -19,7 +19,6 @@ import static google.registry.xml.XmlTransformer.prettyPrint;
import com.google.common.base.Strings;
import com.google.common.flogger.FluentLogger;
import google.registry.flows.EppException.ReadOnlyModeEppException;
import google.registry.flows.FlowModule.DryRun;
import google.registry.flows.FlowModule.InputXml;
import google.registry.flows.FlowModule.RegistrarId;
@@ -29,7 +28,6 @@ import google.registry.flows.session.LoginFlow;
import google.registry.model.eppcommon.Trid;
import google.registry.model.eppoutput.EppOutput;
import google.registry.monitoring.whitebox.EppMetric;
import google.registry.persistence.transaction.TransactionManagerFactory.ReadOnlyModeException;
import javax.inject.Inject;
import javax.inject.Provider;
@@ -99,8 +97,6 @@ public class FlowRunner {
return e.output;
} catch (EppRuntimeException e) {
throw e.getCause();
} catch (ReadOnlyModeException e) {
throw new ReadOnlyModeEppException(e);
}
}

View File

@@ -50,7 +50,6 @@ import org.joda.time.DateTime;
/**
* An EPP flow that creates a new contact.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link ResourceAlreadyExistsForThisClientException}
* @error {@link ResourceCreateContentionException}

View File

@@ -24,7 +24,6 @@ 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.transfer.TransferStatus.SERVER_CANCELLED;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertAsyncActionsAreAllowed;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import com.google.common.collect.ImmutableSet;
@@ -58,7 +57,6 @@ import org.joda.time.DateTime;
* references to the host before the deletion is allowed to proceed. A poll message will be written
* with the success or failure message when the process is complete.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
@@ -92,7 +90,6 @@ public final class ContactDeleteFlow implements TransactionalFlow {
extensionManager.register(MetadataExtension.class);
validateRegistrarIsLoggedIn(registrarId);
extensionManager.validate();
assertAsyncActionsAreAllowed();
DateTime now = tm().getTransactionTime();
checkLinkedDomains(targetId, now, ContactResource.class);
ContactResource existingContact = loadAndVerifyExistence(ContactResource.class, targetId, now);

View File

@@ -54,7 +54,6 @@ import org.joda.time.DateTime;
* transfer is automatically approved. Within that window, this flow allows the losing client to
* explicitly approve the transfer request, which then becomes effective immediately.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}

View File

@@ -54,7 +54,6 @@ import org.joda.time.DateTime;
* transfer is automatically approved. Within that window, this flow allows the gaining client to
* withdraw the transfer request.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -53,7 +53,6 @@ import org.joda.time.DateTime;
* transfer is automatically approved. Within that window, this flow allows the losing client to
* reject the transfer request.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -63,7 +63,6 @@ import org.joda.time.Duration;
* by the losing registrar or rejected, and the gaining registrar can also cancel the transfer
* request.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -55,7 +55,6 @@ import org.joda.time.DateTime;
/**
* An EPP flow that updates a contact.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.AddRemoveSameValueException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -139,7 +139,6 @@ import org.joda.time.Duration;
* google.registry.flows.domain.token.AllocationTokenFlowUtils.AlreadyRedeemedAllocationTokenException}
* @error {@link
* google.registry.flows.domain.token.AllocationTokenFlowUtils.InvalidAllocationTokenException}
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.exceptions.OnlyToolCanPassMetadataException}
* @error {@link ResourceAlreadyExistsForThisClientException}
* @error {@link ResourceCreateContentionException}

View File

@@ -103,7 +103,6 @@ import org.joda.time.Duration;
/**
* An EPP flow that deletes a domain.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.EppException.UnimplementedExtensionException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -95,7 +95,6 @@ import org.joda.time.Duration;
* longer than 10 years unless it comes in at the exact millisecond that the domain would have
* expired.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -94,7 +94,6 @@ import org.joda.time.DateTime;
* restored to a single year expiration starting at the restore time, regardless of what the
* original expiration time was.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.EppException.UnimplementedExtensionException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException}

View File

@@ -78,7 +78,6 @@ import org.joda.time.DateTime;
* timestamps such that they only would become active when the transfer period passed. In this flow,
* those speculative objects are deleted and replaced with new ones with the correct approval time.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -65,7 +65,6 @@ import org.joda.time.DateTime;
* timestamps such that they only would become active when the transfer period passed. In this flow,
* those speculative objects are deleted.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -67,7 +67,6 @@ import org.joda.time.DateTime;
* timestamps such that they only would become active when the transfer period passed. In this flow,
* those speculative objects are deleted.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}

View File

@@ -94,7 +94,6 @@ import org.joda.time.DateTime;
* rejection or cancellation of the request, they will be deleted (and in the approval case,
* replaced with new ones with the correct approval time).
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.FlowUtils.UnknownCurrencyEppException}
* @error {@link google.registry.flows.ResourceFlowUtils.BadAuthInfoForResourceException}

View File

@@ -48,9 +48,7 @@ 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;
@@ -102,7 +100,6 @@ import org.joda.time.DateTime;
* superuser. As such, adding or removing these statuses incurs a billing event. There will be only
* one charge per update, even if several such statuses are updated at once.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.EppException.UnimplementedExtensionException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.AddRemoveSameValueException}
@@ -148,9 +145,6 @@ 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;
@@ -205,16 +199,6 @@ 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();
}
@@ -252,12 +236,6 @@ 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());

View File

@@ -65,7 +65,6 @@ import org.joda.time.DateTime;
* hosts cannot have any. This flow allows creating a host name, and if necessary enqueues tasks to
* update DNS.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.IpAddressVersionMismatchException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link ResourceAlreadyExistsForThisClientException}

View File

@@ -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.persistence.transaction.TransactionManagerFactory.assertAsyncActionsAreAllowed;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import com.google.common.collect.ImmutableSet;
@@ -55,7 +54,6 @@ import org.joda.time.DateTime;
* references to the host before the deletion is allowed to proceed. A poll message will be written
* with the success or failure message when the process is complete.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceNotOwnedException}
@@ -93,7 +91,6 @@ public final class HostDeleteFlow implements TransactionalFlow {
extensionManager.register(MetadataExtension.class);
validateRegistrarIsLoggedIn(registrarId);
extensionManager.validate();
assertAsyncActionsAreAllowed();
DateTime now = tm().getTransactionTime();
validateHostName(targetId);
checkLinkedDomains(targetId, now, HostResource.class);

View File

@@ -28,7 +28,6 @@ import static google.registry.flows.host.HostFlowUtils.verifySuperordinateDomain
import static google.registry.flows.host.HostFlowUtils.verifySuperordinateDomainOwnership;
import static google.registry.model.index.ForeignKeyIndex.loadAndGetKey;
import static google.registry.model.reporting.HistoryEntry.Type.HOST_UPDATE;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertAsyncActionsAreAllowed;
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
import static google.registry.util.CollectionUtils.isNullOrEmpty;
@@ -79,7 +78,6 @@ import org.joda.time.DateTime;
* when it is renamed from external to internal at least one must be added. If the host is renamed
* or IP addresses are added, tasks are enqueued to update DNS accordingly.
*
* @error {@link google.registry.flows.EppException.ReadOnlyModeEppException}
* @error {@link google.registry.flows.FlowUtils.NotLoggedInException}
* @error {@link google.registry.flows.ResourceFlowUtils.AddRemoveSameValueException}
* @error {@link google.registry.flows.ResourceFlowUtils.ResourceDoesNotExistException}
@@ -137,9 +135,6 @@ public final class HostUpdateFlow implements TransactionalFlow {
validateHostName(targetId);
HostResource existingHost = loadAndVerifyExistence(HostResource.class, targetId, now);
boolean isHostRename = suppliedNewHostName != null;
if (isHostRename) {
assertAsyncActionsAreAllowed();
}
String oldHostName = targetId;
String newHostName = firstNonNull(suppliedNewHostName, oldHostName);
DomainBase oldSuperordinateDomain =

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key;
import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.index.EppResourceIndex;
/**
@@ -30,6 +31,7 @@ import google.registry.model.index.EppResourceIndex;
* <p>The inputs provided by this class are not deletion-aware and do not project the resources
* forward in time. That is the responsibility of mappers that use these inputs.
*/
@DeleteAfterMigration
public final class EppResourceInputs {
private EppResourceInputs() {}

View File

@@ -46,8 +46,6 @@ import google.registry.model.domain.DomainHistory;
import google.registry.model.domain.GracePeriod;
import google.registry.model.domain.rgp.GracePeriodStatus;
import google.registry.model.domain.token.AllocationToken;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.model.replay.DatastoreOnlyEntity;
import google.registry.model.transfer.TransferData.TransferServerApproveEntity;
import google.registry.persistence.BillingVKey.BillingEventVKey;
import google.registry.persistence.BillingVKey.BillingRecurrenceVKey;
@@ -347,7 +345,7 @@ public abstract class BillingEvent extends ImmutableObject
})
@AttributeOverride(name = "id", column = @Column(name = "billing_event_id"))
@WithLongVKey(compositeKey = true)
public static class OneTime extends BillingEvent implements DatastoreAndSqlEntity {
public static class OneTime extends BillingEvent {
/** The billable value. */
@Type(type = JodaMoneyType.TYPE_NAME)
@@ -559,7 +557,7 @@ public abstract class BillingEvent extends ImmutableObject
})
@AttributeOverride(name = "id", column = @Column(name = "billing_recurrence_id"))
@WithLongVKey(compositeKey = true)
public static class Recurring extends BillingEvent implements DatastoreAndSqlEntity {
public static class Recurring extends BillingEvent {
/**
* The billing event recurs every year between {@link #eventTime} and this time on the
@@ -696,7 +694,7 @@ public abstract class BillingEvent extends ImmutableObject
})
@AttributeOverride(name = "id", column = @Column(name = "billing_cancellation_id"))
@WithLongVKey(compositeKey = true)
public static class Cancellation extends BillingEvent implements DatastoreAndSqlEntity {
public static class Cancellation extends BillingEvent {
/** The billing time of the charge that is being cancelled. */
@Index
@@ -819,7 +817,7 @@ public abstract class BillingEvent extends ImmutableObject
@ReportedOn
@Entity
@WithLongVKey(compositeKey = true)
public static class Modification extends BillingEvent implements DatastoreOnlyEntity {
public static class Modification extends BillingEvent {
/** The change in cost that should be applied to the original billing event. */
Money cost;

View File

@@ -16,7 +16,6 @@ package google.registry.model.bulkquery;
import google.registry.model.domain.DomainBase;
import google.registry.model.domain.DomainContent;
import google.registry.model.replay.SqlOnlyEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.WithStringVKey;
import javax.persistence.Access;
@@ -34,7 +33,7 @@ import javax.persistence.Entity;
@Entity(name = "Domain")
@WithStringVKey
@Access(AccessType.FIELD)
public class DomainBaseLite extends DomainContent implements SqlOnlyEntity {
public class DomainBaseLite extends DomainContent {
@Override
@javax.persistence.Id

View File

@@ -17,7 +17,6 @@ package google.registry.model.bulkquery;
import com.google.common.base.Objects;
import google.registry.model.domain.DomainHistory.DomainHistoryId;
import google.registry.model.host.HostResource;
import google.registry.model.replay.SqlOnlyEntity;
import google.registry.persistence.VKey;
import java.io.Serializable;
import javax.persistence.Access;
@@ -33,7 +32,7 @@ import javax.persistence.IdClass;
@Entity
@Access(AccessType.FIELD)
@IdClass(DomainHistoryHost.class)
public class DomainHistoryHost implements Serializable, SqlOnlyEntity {
public class DomainHistoryHost implements Serializable {
@Id private Long domainHistoryHistoryRevisionId;
@Id private String domainHistoryDomainRepoId;

View File

@@ -20,7 +20,6 @@ import google.registry.model.domain.DomainContent;
import google.registry.model.domain.DomainHistory;
import google.registry.model.domain.DomainHistory.DomainHistoryId;
import google.registry.model.domain.Period;
import google.registry.model.replay.SqlOnlyEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.VKey;
import javax.annotation.Nullable;
@@ -48,7 +47,7 @@ import javax.persistence.PostLoad;
@Entity(name = "DomainHistory")
@Access(AccessType.FIELD)
@IdClass(DomainHistoryId.class)
public class DomainHistoryLite extends HistoryEntry implements SqlOnlyEntity {
public class DomainHistoryLite extends HistoryEntry {
// Store DomainContent instead of DomainBase so we don't pick up its @Id
// Nullable for the sake of pre-Registry-3.0 history objects

View File

@@ -16,7 +16,6 @@ package google.registry.model.bulkquery;
import com.google.common.base.Objects;
import google.registry.model.host.HostResource;
import google.registry.model.replay.SqlOnlyEntity;
import google.registry.persistence.VKey;
import java.io.Serializable;
import javax.persistence.Access;
@@ -29,7 +28,7 @@ import javax.persistence.IdClass;
@Entity
@Access(AccessType.FIELD)
@IdClass(DomainHost.class)
public class DomainHost implements Serializable, SqlOnlyEntity {
public class DomainHost implements Serializable {
@Id private String domainRepoId;

View File

@@ -31,7 +31,6 @@ import google.registry.model.UnsafeSerializable;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.annotations.InCrossTld;
import google.registry.model.common.Cursor.CursorId;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.model.tld.Registry;
import google.registry.persistence.VKey;
import java.util.List;
@@ -53,7 +52,7 @@ import org.joda.time.DateTime;
@javax.persistence.Entity
@IdClass(CursorId.class)
@InCrossTld
public class Cursor extends ImmutableObject implements DatastoreAndSqlEntity, UnsafeSerializable {
public class Cursor extends ImmutableObject implements UnsafeSerializable {
/** The scope of a global cursor. A global cursor is a cursor that is not specific to one tld. */
public static final String GLOBAL = "GLOBAL";

View File

@@ -27,7 +27,6 @@ import google.registry.config.RegistryEnvironment;
import google.registry.model.CacheUtils;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.TimedTransitionProperty.TimedTransition;
import google.registry.model.replay.SqlOnlyEntity;
import java.time.Duration;
import java.util.Arrays;
import javax.persistence.Entity;
@@ -42,7 +41,7 @@ import org.joda.time.DateTime;
*/
@DeleteAfterMigration
@Entity
public class DatabaseMigrationStateSchedule extends CrossTldSingleton implements SqlOnlyEntity {
public class DatabaseMigrationStateSchedule extends CrossTldSingleton {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -218,7 +217,7 @@ public class DatabaseMigrationStateSchedule extends CrossTldSingleton implements
MigrationState.DATASTORE_ONLY,
"migrationTransitionMap must start with DATASTORE_ONLY");
validateTransitionAtCurrentTime(transitions);
jpaTm().putIgnoringReadOnlyWithoutBackup(new DatabaseMigrationStateSchedule(transitions));
jpaTm().putWithoutBackup(new DatabaseMigrationStateSchedule(transitions));
CACHE.invalidateAll();
}

View File

@@ -20,7 +20,6 @@ import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import google.registry.model.BackupGroupRoot;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.replay.DatastoreOnlyEntity;
import javax.annotation.Nullable;
/**
@@ -39,7 +38,7 @@ import javax.annotation.Nullable;
*/
@Entity
@DeleteAfterMigration
public class EntityGroupRoot extends BackupGroupRoot implements DatastoreOnlyEntity {
public class EntityGroupRoot extends BackupGroupRoot {
@SuppressWarnings("unused")
@Id

View File

@@ -16,7 +16,7 @@ package google.registry.model.common;
import static com.google.common.base.Preconditions.checkState;
import static google.registry.model.IdService.allocateId;
import static google.registry.persistence.transaction.TransactionManagerFactory.ofyTm;
import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import com.google.appengine.api.users.User;
import com.google.common.base.Splitter;
@@ -55,22 +55,19 @@ public class GaeUserIdConverter extends ImmutableObject {
try {
// Perform these operations in a transactionless context to avoid enlisting in some outer
// transaction (if any).
ofyTm()
auditedOfy()
.doTransactionless(
() -> {
ofyTm().putWithoutBackup(gaeUserIdConverter);
auditedOfy().saveWithoutBackup().entity(gaeUserIdConverter).now();
return null;
});
// The read must be done in its own transaction to avoid reading from the session cache.
return ofyTm().transactNew(() -> ofyTm().loadByEntity(gaeUserIdConverter).user.getUserId());
return auditedOfy()
.transactNew(() -> auditedOfy().load().entity(gaeUserIdConverter).now().user.getUserId());
} finally {
ofyTm()
auditedOfy()
.doTransactionless(
() -> {
ofyTm().deleteWithoutBackup(gaeUserIdConverter);
return null;
});
() -> auditedOfy().deleteWithoutBackup().entity(gaeUserIdConverter).now());
}
}
}

View File

@@ -20,8 +20,6 @@ import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.UnsafeSerializable;
import google.registry.model.contact.ContactHistory.ContactHistoryId;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.VKey;
import java.io.Serializable;
@@ -58,7 +56,7 @@ import javax.persistence.PostLoad;
@EntitySubclass
@Access(AccessType.FIELD)
@IdClass(ContactHistoryId.class)
public class ContactHistory extends HistoryEntry implements SqlEntity, UnsafeSerializable {
public class ContactHistory extends HistoryEntry implements UnsafeSerializable {
// Store ContactBase instead of ContactResource so we don't pick up its @Id
// Nullable for the sake of pre-Registry-3.0 history objects
@@ -128,12 +126,6 @@ public class ContactHistory extends HistoryEntry implements SqlEntity, UnsafeSer
}
}
// In Datastore, save as a HistoryEntry object regardless of this object's type
@Override
public Optional<DatastoreEntity> toDatastoreEntity() {
return Optional.of(asHistoryEntry());
}
/** Class to represent the composite primary key of {@link ContactHistory} entity. */
public static class ContactHistoryId extends ImmutableObject implements Serializable {

View File

@@ -19,7 +19,6 @@ import com.googlecode.objectify.annotation.Entity;
import google.registry.model.EppResource.ForeignKeyedEppResource;
import google.registry.model.annotations.ExternalMessagingName;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.WithStringVKey;
import javax.persistence.Access;
@@ -46,8 +45,7 @@ import org.joda.time.DateTime;
@ExternalMessagingName("contact")
@WithStringVKey
@Access(AccessType.FIELD)
public class ContactResource extends ContactBase
implements DatastoreAndSqlEntity, ForeignKeyedEppResource {
public class ContactResource extends ContactBase implements ForeignKeyedEppResource {
@Override
public VKey<ContactResource> createVKey() {

View File

@@ -21,7 +21,6 @@ import google.registry.model.annotations.ExternalMessagingName;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.domain.secdns.DelegationSignerData;
import google.registry.model.host.HostResource;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.WithStringVKey;
import java.util.Set;
@@ -74,8 +73,7 @@ import org.joda.time.DateTime;
@WithStringVKey
@ExternalMessagingName("domain")
@Access(AccessType.FIELD)
public class DomainBase extends DomainContent
implements DatastoreAndSqlEntity, ForeignKeyedEppResource {
public class DomainBase extends DomainContent implements ForeignKeyedEppResource {
@Override
@javax.persistence.Id

View File

@@ -27,8 +27,6 @@ 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.host.HostResource;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.DomainTransactionRecord;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.VKey;
@@ -80,7 +78,7 @@ import org.hibernate.Hibernate;
@EntitySubclass
@Access(AccessType.FIELD)
@IdClass(DomainHistoryId.class)
public class DomainHistory extends HistoryEntry implements SqlEntity {
public class DomainHistory extends HistoryEntry {
// Store DomainContent instead of DomainBase so we don't pick up its @Id
// Nullable for the sake of pre-Registry-3.0 history objects
@@ -295,12 +293,6 @@ public class DomainHistory extends HistoryEntry implements SqlEntity {
}
}
// In Datastore, save as a HistoryEntry object regardless of this object's type
@Override
public Optional<DatastoreEntity> toDatastoreEntity() {
return Optional.of(asHistoryEntry());
}
private static void fillAuxiliaryFieldsFromDomain(DomainHistory domainHistory) {
if (domainHistory.domainContent != null) {
domainHistory.nsHosts = nullToEmptyImmutableCopy(domainHistory.domainContent.nsHosts);

View File

@@ -24,8 +24,6 @@ import google.registry.model.billing.BillingEvent;
import google.registry.model.billing.BillingEvent.Recurring;
import google.registry.model.domain.DomainHistory.DomainHistoryId;
import google.registry.model.domain.rgp.GracePeriodStatus;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.model.replay.SqlOnlyEntity;
import google.registry.persistence.BillingVKey.BillingEventVKey;
import google.registry.persistence.BillingVKey.BillingRecurrenceVKey;
import google.registry.persistence.VKey;
@@ -52,7 +50,7 @@ import org.joda.time.DateTime;
@Index(columnList = "billing_event_id"),
@Index(columnList = "billing_recurrence_id")
})
public class GracePeriod extends GracePeriodBase implements DatastoreAndSqlEntity {
public class GracePeriod extends GracePeriodBase {
@Id
@Access(AccessType.PROPERTY)
@@ -197,7 +195,7 @@ public class GracePeriod extends GracePeriodBase implements DatastoreAndSqlEntit
/** Entity class to represent a historic {@link GracePeriod}. */
@Entity(name = "GracePeriodHistory")
@Table(indexes = @Index(columnList = "domainRepoId"))
public static class GracePeriodHistory extends GracePeriodBase implements SqlOnlyEntity {
public static class GracePeriodHistory extends GracePeriodBase {
@Id Long gracePeriodHistoryRevisionId;
/** ID for the associated {@link DomainHistory} entity. */

View File

@@ -23,7 +23,6 @@ import google.registry.model.Buildable;
import google.registry.model.CreateAutoTimestamp;
import google.registry.model.ImmutableObject;
import google.registry.model.UpdateAutoTimestamp;
import google.registry.model.replay.SqlOnlyEntity;
import google.registry.util.DateTimeUtils;
import java.time.ZonedDateTime;
import java.util.Optional;
@@ -76,7 +75,7 @@ import org.joda.time.Duration;
@Index(name = "idx_registry_lock_verification_code", columnList = "verificationCode"),
@Index(name = "idx_registry_lock_registrar_id", columnList = "registrarId")
})
public final class RegistryLock extends ImmutableObject implements Buildable, SqlOnlyEntity {
public final class RegistryLock extends ImmutableObject implements Buildable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)

View File

@@ -19,7 +19,6 @@ import static google.registry.model.IdService.allocateId;
import google.registry.model.UnsafeSerializable;
import google.registry.model.domain.DomainHistory;
import google.registry.model.domain.DomainHistory.DomainHistoryId;
import google.registry.model.replay.SqlOnlyEntity;
import javax.persistence.Access;
import javax.persistence.AccessType;
import javax.persistence.Column;
@@ -28,8 +27,7 @@ import javax.persistence.Id;
/** Entity class to represent a historic {@link DelegationSignerData}. */
@Entity
public class DomainDsDataHistory extends DomainDsDataBase
implements SqlOnlyEntity, UnsafeSerializable {
public class DomainDsDataHistory extends DomainDsDataBase implements UnsafeSerializable {
@Id Long dsDataHistoryRevisionId;

View File

@@ -47,7 +47,6 @@ import google.registry.model.billing.BillingEvent.RenewalPriceBehavior;
import google.registry.model.common.TimedTransitionProperty;
import google.registry.model.common.TimedTransitionProperty.TimeMapper;
import google.registry.model.common.TimedTransitionProperty.TimedTransition;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.DomainHistoryVKey;
import google.registry.persistence.VKey;
@@ -80,7 +79,7 @@ import org.joda.time.DateTime;
@javax.persistence.Index(columnList = "tokenType"),
@javax.persistence.Index(columnList = "redemption_domain_repo_id")
})
public class AllocationToken extends BackupGroupRoot implements Buildable, DatastoreAndSqlEntity {
public class AllocationToken extends BackupGroupRoot implements Buildable {
// Promotions should only move forward, and ENDED / CANCELLED are terminal states.
private static final ImmutableMultimap<TokenStatus, TokenStatus> VALID_TOKEN_STATUS_TRANSITIONS =

View File

@@ -20,8 +20,6 @@ import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.UnsafeSerializable;
import google.registry.model.host.HostHistory.HostHistoryId;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.SqlEntity;
import google.registry.model.reporting.HistoryEntry;
import google.registry.persistence.VKey;
import java.io.Serializable;
@@ -59,7 +57,7 @@ import javax.persistence.PostLoad;
@EntitySubclass
@Access(AccessType.FIELD)
@IdClass(HostHistoryId.class)
public class HostHistory extends HistoryEntry implements SqlEntity, UnsafeSerializable {
public class HostHistory extends HistoryEntry implements UnsafeSerializable {
// Store HostBase instead of HostResource so we don't pick up its @Id
// Nullable for the sake of pre-Registry-3.0 history objects
@@ -128,12 +126,6 @@ public class HostHistory extends HistoryEntry implements SqlEntity, UnsafeSerial
}
}
// In Datastore, save as a HistoryEntry object regardless of this object's type
@Override
public Optional<DatastoreEntity> toDatastoreEntity() {
return Optional.of(asHistoryEntry());
}
/** Class to represent the composite primary key of {@link HostHistory} entity. */
public static class HostHistoryId extends ImmutableObject implements Serializable {

View File

@@ -19,7 +19,6 @@ import com.googlecode.objectify.annotation.Entity;
import google.registry.model.EppResource.ForeignKeyedEppResource;
import google.registry.model.annotations.ExternalMessagingName;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.replay.DatastoreAndSqlEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.WithStringVKey;
import javax.persistence.Access;
@@ -55,8 +54,7 @@ import javax.persistence.AccessType;
@ExternalMessagingName("host")
@WithStringVKey
@Access(AccessType.FIELD) // otherwise it'll use the default if the repoId (property)
public class HostResource extends HostBase
implements DatastoreAndSqlEntity, ForeignKeyedEppResource {
public class HostResource extends HostBase implements ForeignKeyedEppResource {
@Override
@javax.persistence.Id

View File

@@ -26,14 +26,13 @@ import google.registry.model.BackupGroupRoot;
import google.registry.model.EppResource;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.replay.DatastoreOnlyEntity;
import google.registry.persistence.VKey;
/** An index that allows for quick enumeration of all EppResource entities (e.g. via map reduce). */
@ReportedOn
@Entity
@DeleteAfterMigration
public class EppResourceIndex extends BackupGroupRoot implements DatastoreOnlyEntity {
public class EppResourceIndex extends BackupGroupRoot {
@Id String id;

View File

@@ -25,13 +25,12 @@ import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.VirtualEntity;
import google.registry.model.replay.DatastoreOnlyEntity;
/** A virtual entity to represent buckets to which EppResourceIndex objects are randomly added. */
@Entity
@VirtualEntity
@DeleteAfterMigration
public class EppResourceIndexBucket extends ImmutableObject implements DatastoreOnlyEntity {
public class EppResourceIndexBucket extends ImmutableObject {
@SuppressWarnings("unused")
@Id

View File

@@ -50,7 +50,6 @@ import google.registry.model.annotations.ReportedOn;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
import google.registry.model.host.HostResource;
import google.registry.model.replay.DatastoreOnlyEntity;
import google.registry.persistence.VKey;
import google.registry.persistence.transaction.CriteriaQueryBuilder;
import google.registry.persistence.transaction.JpaTransactionManager;
@@ -74,20 +73,17 @@ public abstract class ForeignKeyIndex<E extends EppResource> extends BackupGroup
/** The {@link ForeignKeyIndex} type for {@link ContactResource} entities. */
@ReportedOn
@Entity
public static class ForeignKeyContactIndex extends ForeignKeyIndex<ContactResource>
implements DatastoreOnlyEntity {}
public static class ForeignKeyContactIndex extends ForeignKeyIndex<ContactResource> {}
/** The {@link ForeignKeyIndex} type for {@link DomainBase} entities. */
@ReportedOn
@Entity
public static class ForeignKeyDomainIndex extends ForeignKeyIndex<DomainBase>
implements DatastoreOnlyEntity {}
public static class ForeignKeyDomainIndex extends ForeignKeyIndex<DomainBase> {}
/** The {@link ForeignKeyIndex} type for {@link HostResource} entities. */
@ReportedOn
@Entity
public static class ForeignKeyHostIndex extends ForeignKeyIndex<HostResource>
implements DatastoreOnlyEntity {}
public static class ForeignKeyHostIndex extends ForeignKeyIndex<HostResource> {}
private static final ImmutableBiMap<
Class<? extends EppResource>, Class<? extends ForeignKeyIndex<?>>>

View File

@@ -34,7 +34,6 @@ import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
import google.registry.util.NonFinalForTesting;
import java.util.Random;
import java.util.function.Supplier;
@@ -53,7 +52,7 @@ import org.joda.time.DateTime;
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
@DeleteAfterMigration
public class CommitLogBucket extends ImmutableObject implements Buildable, DatastoreOnlyEntity {
public class CommitLogBucket extends ImmutableObject implements Buildable {
/**
* Ranges from 1 to {@link RegistryConfig#getCommitLogBucketCount()}, inclusive; starts at 1 since

View File

@@ -28,7 +28,6 @@ import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
@@ -47,7 +46,7 @@ import org.joda.time.DateTime;
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
@DeleteAfterMigration
public class CommitLogCheckpoint extends ImmutableObject implements DatastoreOnlyEntity {
public class CommitLogCheckpoint extends ImmutableObject {
/** Shared singleton parent entity for commit log checkpoints. */
@Parent

View File

@@ -24,14 +24,13 @@ import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
import org.joda.time.DateTime;
/** Singleton parent entity for all commit log checkpoints. */
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
@DeleteAfterMigration
public class CommitLogCheckpointRoot extends ImmutableObject implements DatastoreOnlyEntity {
public class CommitLogCheckpointRoot extends ImmutableObject {
public static final long SINGLETON_ID = 1; // There is always exactly one of these.

View File

@@ -26,7 +26,6 @@ import google.registry.model.ImmutableObject;
import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
import java.util.LinkedHashSet;
import java.util.Set;
import org.joda.time.DateTime;
@@ -41,7 +40,7 @@ import org.joda.time.DateTime;
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
@DeleteAfterMigration
public class CommitLogManifest extends ImmutableObject implements DatastoreOnlyEntity {
public class CommitLogManifest extends ImmutableObject {
/** Commit log manifests are parented on a random bucket. */
@Parent

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