mirror of
https://github.com/google/nomulus
synced 2026-05-18 22:01:47 +00:00
Compare commits
5 Commits
nomulus-20
...
nomulus-20
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c878679770 | ||
|
|
2f8be045c7 | ||
|
|
dcc11379c8 | ||
|
|
6ff4aaeb1c | ||
|
|
199d02a4cc |
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.|
|
||||
@@ -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.
|
||||
@@ -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',
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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.
|
||||
@@ -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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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 =
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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]);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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() {}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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() {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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. */
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 =
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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<?>>>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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.
|
||||
|
||||
|
||||
@@ -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
Reference in New Issue
Block a user