diff --git a/java/google/registry/batch/BUILD b/java/google/registry/batch/BUILD index fa41b9019..7351acccc 100644 --- a/java/google/registry/batch/BUILD +++ b/java/google/registry/batch/BUILD @@ -13,8 +13,10 @@ java_library( "//java/com/google/common/collect", "//java/com/google/common/html", "//java/com/google/common/io", + "//java/com/google/common/math", "//java/com/google/common/net", - "//java/google/registry/config", + "//java/google/registry/dns", + "//java/google/registry/flows", "//java/google/registry/mapreduce", "//java/google/registry/mapreduce/inputs", "//java/google/registry/model", @@ -24,6 +26,7 @@ java_library( "//third_party/java/appengine:appengine-api", "//third_party/java/appengine_gcs_client", "//third_party/java/appengine_mapreduce2:appengine_mapreduce", + "//third_party/java/auto:auto_value", "//third_party/java/dagger", "//third_party/java/joda_money", "//third_party/java/joda_time", diff --git a/java/google/registry/flows/async/DeleteContactsAndHostsAction.java b/java/google/registry/batch/DeleteContactsAndHostsAction.java similarity index 97% rename from java/google/registry/flows/async/DeleteContactsAndHostsAction.java rename to java/google/registry/batch/DeleteContactsAndHostsAction.java index 8b934f348..d1c0b7492 100644 --- a/java/google/registry/flows/async/DeleteContactsAndHostsAction.java +++ b/java/google/registry/batch/DeleteContactsAndHostsAction.java @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -package google.registry.flows.async; +package google.registry.batch; import static com.google.appengine.api.taskqueue.QueueConstants.maxLeaseCount; import static com.google.appengine.api.taskqueue.QueueFactory.getQueue; @@ -23,6 +23,10 @@ import static com.googlecode.objectify.Key.getKind; import static google.registry.flows.ResourceFlowUtils.createResolvedTransferData; import static google.registry.flows.ResourceFlowUtils.handlePendingTransferOnDelete; import static google.registry.flows.ResourceFlowUtils.updateForeignKeyIndexDeletionTime; +import static google.registry.flows.async.AsyncFlowEnqueuer.PARAM_IS_SUPERUSER; +import static google.registry.flows.async.AsyncFlowEnqueuer.PARAM_REQUESTING_CLIENT_ID; +import static google.registry.flows.async.AsyncFlowEnqueuer.PARAM_RESOURCE_KEY; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_DELETE; import static google.registry.model.EppResourceUtils.isActive; import static google.registry.model.EppResourceUtils.isDeleted; import static google.registry.model.eppcommon.StatusValue.PENDING_DELETE; @@ -53,8 +57,8 @@ import com.google.common.collect.Iterators; import com.google.common.collect.Multiset; import com.googlecode.objectify.Key; import com.googlecode.objectify.Work; +import google.registry.batch.DeleteContactsAndHostsAction.DeletionResult.Type; import google.registry.dns.DnsQueue; -import google.registry.flows.async.DeleteContactsAndHostsAction.DeletionResult.Type; import google.registry.mapreduce.MapreduceRunner; import google.registry.mapreduce.inputs.EppResourceInputs; import google.registry.mapreduce.inputs.NullInput; @@ -89,12 +93,6 @@ import org.joda.time.DateTime; @Action(path = "/_dr/task/deleteContactsAndHosts") public class DeleteContactsAndHostsAction implements Runnable { - /** The HTTP parameter name used to specify the websafe key of the resource to delete. */ - public static final String PARAM_RESOURCE_KEY = "resourceKey"; - public static final String PARAM_REQUESTING_CLIENT_ID = "requestingClientId"; - public static final String PARAM_IS_SUPERUSER = "isSuperuser"; - public static final String QUEUE_ASYNC_DELETE = "async-delete-pull"; - static final String KIND_CONTACT = getKind(ContactResource.class); static final String KIND_HOST = getKind(HostResource.class); diff --git a/java/google/registry/flows/async/RefreshDnsOnHostRenameAction.java b/java/google/registry/batch/RefreshDnsOnHostRenameAction.java similarity index 97% rename from java/google/registry/flows/async/RefreshDnsOnHostRenameAction.java rename to java/google/registry/batch/RefreshDnsOnHostRenameAction.java index f06e0db76..4ba73d7e1 100644 --- a/java/google/registry/flows/async/RefreshDnsOnHostRenameAction.java +++ b/java/google/registry/batch/RefreshDnsOnHostRenameAction.java @@ -12,11 +12,13 @@ // See the License for the specific language governing permissions and // limitations under the License. -package google.registry.flows.async; +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 google.registry.flows.async.AsyncFlowEnqueuer.PARAM_HOST_KEY; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_HOST_RENAME; import static google.registry.mapreduce.inputs.EppResourceInputs.createEntityInput; import static google.registry.model.EppResourceUtils.isActive; import static google.registry.model.EppResourceUtils.isDeleted; @@ -61,10 +63,6 @@ import org.joda.time.DateTime; @Action(path = "/_dr/task/refreshDnsOnHostRename") public class RefreshDnsOnHostRenameAction implements Runnable { - /** The HTTP parameter name used to specify the websafe key of the host to rename. */ - public static final String PARAM_HOST_KEY = "hostKey"; - public static final String QUEUE_ASYNC_HOST_RENAME = "async-host-rename-pull"; - private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); private static final long LEASE_MINUTES = 20; diff --git a/java/google/registry/flows/async/AsyncFlowEnqueuer.java b/java/google/registry/flows/async/AsyncFlowEnqueuer.java index 5071f7555..9cfa8c7ae 100644 --- a/java/google/registry/flows/async/AsyncFlowEnqueuer.java +++ b/java/google/registry/flows/async/AsyncFlowEnqueuer.java @@ -14,16 +14,11 @@ package google.registry.flows.async; -import static google.registry.flows.async.DeleteContactsAndHostsAction.PARAM_IS_SUPERUSER; -import static google.registry.flows.async.DeleteContactsAndHostsAction.PARAM_REQUESTING_CLIENT_ID; -import static google.registry.flows.async.DeleteContactsAndHostsAction.PARAM_RESOURCE_KEY; -import static google.registry.flows.async.RefreshDnsOnHostRenameAction.PARAM_HOST_KEY; -import static google.registry.flows.async.RefreshDnsOnHostRenameAction.QUEUE_ASYNC_HOST_RENAME; - import com.google.appengine.api.taskqueue.Queue; import com.google.appengine.api.taskqueue.TaskOptions; import com.google.appengine.api.taskqueue.TaskOptions.Method; import com.google.appengine.api.taskqueue.TransientFailureException; +import com.google.common.annotations.VisibleForTesting; import com.googlecode.objectify.Key; import google.registry.config.ConfigModule.Config; import google.registry.model.EppResource; @@ -38,13 +33,40 @@ import org.joda.time.Duration; /** Helper class to enqueue tasks for handling asynchronous operations in flows. */ public final class AsyncFlowEnqueuer { + /** The HTTP parameter names used by async flows. */ + public static final String PARAM_RESOURCE_KEY = "resourceKey"; + public static final String PARAM_REQUESTING_CLIENT_ID = "requestingClientId"; + public static final String PARAM_IS_SUPERUSER = "isSuperuser"; + public static final String PARAM_HOST_KEY = "hostKey"; + + /** The task queue names used by async flows. */ + public static final String QUEUE_ASYNC_DELETE = "async-delete-pull"; + public static final String QUEUE_ASYNC_HOST_RENAME = "async-host-rename-pull"; + private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); - @Inject @Config("asyncDeleteFlowMapreduceDelay") Duration asyncDeleteDelay; - @Inject @Named("async-delete-pull") Queue asyncDeletePullQueue; - @Inject @Named(QUEUE_ASYNC_HOST_RENAME) Queue asyncDnsRefreshPullQueue; - @Inject Retrier retrier; - @Inject AsyncFlowEnqueuer() {} + @VisibleForTesting + @Inject + @Config("asyncDeleteFlowMapreduceDelay") + public Duration asyncDeleteDelay; + + @VisibleForTesting + @Inject + @Named("async-delete-pull") + public Queue asyncDeletePullQueue; + + @VisibleForTesting + @Inject + @Named(QUEUE_ASYNC_HOST_RENAME) + public Queue asyncDnsRefreshPullQueue; + + @VisibleForTesting + @Inject + public Retrier retrier; + + @VisibleForTesting + @Inject + public AsyncFlowEnqueuer() {} /** Enqueues a task to asynchronously delete a contact or host, by key. */ public void enqueueAsyncDelete( diff --git a/java/google/registry/flows/async/AsyncFlowsModule.java b/java/google/registry/flows/async/AsyncFlowsModule.java index cb9bf3bb9..d044b77b8 100644 --- a/java/google/registry/flows/async/AsyncFlowsModule.java +++ b/java/google/registry/flows/async/AsyncFlowsModule.java @@ -14,8 +14,8 @@ package google.registry.flows.async; -import static google.registry.flows.async.DeleteContactsAndHostsAction.QUEUE_ASYNC_DELETE; -import static google.registry.flows.async.RefreshDnsOnHostRenameAction.QUEUE_ASYNC_HOST_RENAME; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_DELETE; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_HOST_RENAME; import com.google.appengine.api.taskqueue.Queue; import com.google.appengine.api.taskqueue.QueueFactory; diff --git a/java/google/registry/module/backend/BackendRequestComponent.java b/java/google/registry/module/backend/BackendRequestComponent.java index 42aa1cef1..9bab1e074 100644 --- a/java/google/registry/module/backend/BackendRequestComponent.java +++ b/java/google/registry/module/backend/BackendRequestComponent.java @@ -21,8 +21,10 @@ import google.registry.backup.CommitLogCheckpointAction; import google.registry.backup.DeleteOldCommitLogsAction; import google.registry.backup.ExportCommitLogDiffAction; import google.registry.backup.RestoreCommitLogsAction; +import google.registry.batch.DeleteContactsAndHostsAction; import google.registry.batch.DeleteProberDataAction; import google.registry.batch.ExpandRecurringBillingEventsAction; +import google.registry.batch.RefreshDnsOnHostRenameAction; import google.registry.cron.CommitLogFanoutAction; import google.registry.cron.CronModule; import google.registry.cron.TldFanoutAction; @@ -43,8 +45,6 @@ import google.registry.export.UpdateSnapshotViewAction; import google.registry.export.sheet.SheetModule; import google.registry.export.sheet.SyncRegistrarsSheetAction; import google.registry.flows.async.AsyncFlowsModule; -import google.registry.flows.async.DeleteContactsAndHostsAction; -import google.registry.flows.async.RefreshDnsOnHostRenameAction; import google.registry.mapreduce.MapreduceModule; import google.registry.monitoring.whitebox.MetricsExportAction; import google.registry.monitoring.whitebox.VerifyEntityIntegrityAction; diff --git a/javatests/google/registry/batch/BUILD b/javatests/google/registry/batch/BUILD index 68e9aa962..25a2a5a59 100644 --- a/javatests/google/registry/batch/BUILD +++ b/javatests/google/registry/batch/BUILD @@ -17,6 +17,7 @@ java_library( "//java/com/google/common/io", "//java/com/google/common/net", "//java/google/registry/batch", + "//java/google/registry/flows", "//java/google/registry/model", "//java/google/registry/util", "//javatests/google/registry/testing", diff --git a/javatests/google/registry/flows/async/DeleteContactsAndHostsActionTest.java b/javatests/google/registry/batch/DeleteContactsAndHostsActionTest.java similarity index 99% rename from javatests/google/registry/flows/async/DeleteContactsAndHostsActionTest.java rename to javatests/google/registry/batch/DeleteContactsAndHostsActionTest.java index 557550bfd..61c985530 100644 --- a/javatests/google/registry/flows/async/DeleteContactsAndHostsActionTest.java +++ b/javatests/google/registry/batch/DeleteContactsAndHostsActionTest.java @@ -12,12 +12,12 @@ // See the License for the specific language governing permissions and // limitations under the License. -package google.registry.flows.async; +package google.registry.batch; import static com.google.appengine.api.taskqueue.QueueFactory.getQueue; import static com.google.common.collect.Iterables.getOnlyElement; import static com.google.common.truth.Truth.assertThat; -import static google.registry.flows.async.DeleteContactsAndHostsAction.QUEUE_ASYNC_DELETE; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_DELETE; import static google.registry.model.EppResourceUtils.loadByForeignKey; import static google.registry.model.eppcommon.StatusValue.PENDING_DELETE; import static google.registry.model.ofy.ObjectifyService.ofy; @@ -60,6 +60,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.googlecode.objectify.Key; +import google.registry.flows.async.AsyncFlowEnqueuer; import google.registry.model.EppResource; import google.registry.model.contact.ContactAddress; import google.registry.model.contact.ContactPhoneNumber; diff --git a/javatests/google/registry/flows/async/RefreshDnsOnHostRenameActionTest.java b/javatests/google/registry/batch/RefreshDnsOnHostRenameActionTest.java similarity index 97% rename from javatests/google/registry/flows/async/RefreshDnsOnHostRenameActionTest.java rename to javatests/google/registry/batch/RefreshDnsOnHostRenameActionTest.java index 7388437a5..fe348351e 100644 --- a/javatests/google/registry/flows/async/RefreshDnsOnHostRenameActionTest.java +++ b/javatests/google/registry/batch/RefreshDnsOnHostRenameActionTest.java @@ -12,10 +12,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package google.registry.flows.async; +package google.registry.batch; import static com.google.appengine.api.taskqueue.QueueFactory.getQueue; -import static google.registry.flows.async.RefreshDnsOnHostRenameAction.QUEUE_ASYNC_HOST_RENAME; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_HOST_RENAME; import static google.registry.model.ofy.ObjectifyService.ofy; import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.newDomainApplication; @@ -35,6 +35,7 @@ import static org.joda.time.Duration.standardSeconds; import com.google.common.collect.ImmutableSet; import com.googlecode.objectify.Key; +import google.registry.flows.async.AsyncFlowEnqueuer; import google.registry.model.host.HostResource; import google.registry.testing.ExceptionRule; import google.registry.testing.FakeClock; diff --git a/javatests/google/registry/flows/host/HostUpdateFlowTest.java b/javatests/google/registry/flows/host/HostUpdateFlowTest.java index 1d033a781..03e150796 100644 --- a/javatests/google/registry/flows/host/HostUpdateFlowTest.java +++ b/javatests/google/registry/flows/host/HostUpdateFlowTest.java @@ -16,7 +16,7 @@ package google.registry.flows.host; import static com.google.common.base.Strings.nullToEmpty; import static com.google.common.truth.Truth.assertThat; -import static google.registry.flows.async.RefreshDnsOnHostRenameAction.QUEUE_ASYNC_HOST_RENAME; +import static google.registry.flows.async.AsyncFlowEnqueuer.QUEUE_ASYNC_HOST_RENAME; import static google.registry.model.EppResourceUtils.loadByForeignKey; import static google.registry.testing.DatastoreHelper.assertNoBillingEvents; import static google.registry.testing.DatastoreHelper.createTld;