diff --git a/core/src/main/java/google/registry/rde/RdeModule.java b/core/src/main/java/google/registry/rde/RdeModule.java index 685868952..b459cf153 100644 --- a/core/src/main/java/google/registry/rde/RdeModule.java +++ b/core/src/main/java/google/registry/rde/RdeModule.java @@ -14,7 +14,6 @@ package google.registry.rde; -import static com.google.appengine.api.taskqueue.QueueFactory.getQueue; import static google.registry.request.RequestParameters.extractBooleanParameter; import static google.registry.request.RequestParameters.extractOptionalIntParameter; import static google.registry.request.RequestParameters.extractOptionalParameter; @@ -22,7 +21,6 @@ import static google.registry.request.RequestParameters.extractRequiredDatetimeP import static google.registry.request.RequestParameters.extractSetOfDatetimeParameters; import static google.registry.request.RequestParameters.extractSetOfParameters; -import com.google.appengine.api.taskqueue.Queue; import com.google.common.collect.ImmutableSet; import com.jcraft.jsch.SftpProgressMonitor; import dagger.Binds; @@ -30,7 +28,6 @@ import dagger.Module; import dagger.Provides; import google.registry.request.Parameter; import java.util.Optional; -import javax.inject.Named; import javax.servlet.http.HttpServletRequest; import org.joda.time.DateTime; @@ -110,12 +107,6 @@ public abstract class RdeModule { return extractOptionalParameter(req, PARAM_PREFIX); } - @Provides - @Named("rde-report") - static Queue provideQueueRdeReport() { - return getQueue("rde-report"); - } - @Binds abstract SftpProgressMonitor provideSftpProgressMonitor( LoggingSftpProgressMonitor loggingSftpProgressMonitor); diff --git a/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java b/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java index c5a37fb3e..af7760218 100644 --- a/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java +++ b/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java @@ -14,7 +14,6 @@ package google.registry.tools; -import static com.google.appengine.api.taskqueue.TaskOptions.Builder.withUrl; import static google.registry.model.tld.Registries.assertTldsExist; import static google.registry.rde.RdeModule.PARAM_BEAM; import static google.registry.rde.RdeModule.PARAM_DIRECTORY; @@ -23,23 +22,22 @@ import static google.registry.rde.RdeModule.PARAM_MANUAL; import static google.registry.rde.RdeModule.PARAM_MODE; import static google.registry.rde.RdeModule.PARAM_REVISION; import static google.registry.rde.RdeModule.PARAM_WATERMARKS; +import static google.registry.rde.RdeModule.RDE_REPORT_QUEUE; import static google.registry.request.RequestParameters.PARAM_TLDS; import com.beust.jcommander.Parameter; import com.beust.jcommander.ParameterException; import com.beust.jcommander.Parameters; -import com.google.appengine.api.taskqueue.Queue; -import com.google.appengine.api.taskqueue.TaskOptions; -import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMultimap; import google.registry.model.rde.RdeMode; import google.registry.rde.RdeStagingAction; +import google.registry.request.Action.Service; import google.registry.tools.params.DateTimeParameter; import google.registry.util.AppEngineServiceUtils; +import google.registry.util.CloudTasksUtils; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; import javax.inject.Inject; -import javax.inject.Named; import org.joda.time.DateTime; /** @@ -94,15 +92,7 @@ final class GenerateEscrowDepositCommand implements CommandWithRemoteApi { @Inject AppEngineServiceUtils appEngineServiceUtils; - @Inject - @Named("rde-report") - Queue queue; - - // ETA is a required property for TaskOptions but we let the service to set it when submitting the - // task to the task queue. However, the local test service doesn't do that for us during the unit - // test, so we add this field here to let the unit test be able to inject the ETA to pass the - // test. - @VisibleForTesting Optional maybeEtaMillis = Optional.empty(); + @Inject CloudTasksUtils cloudTasksUtils; @Override public void run() { @@ -126,27 +116,25 @@ final class GenerateEscrowDepositCommand implements CommandWithRemoteApi { throw new ParameterException("Output subdirectory must not be empty"); } - // Unlike many tool commands, this command is actually invoking an action on the backend module - // (because it's a mapreduce). So we invoke it in a different way. - String hostname = appEngineServiceUtils.getCurrentVersionHostname("backend"); - TaskOptions opts = - withUrl(RdeStagingAction.PATH) - .header("Host", hostname) - .param(PARAM_MANUAL, String.valueOf(true)) - .param(PARAM_MODE, mode.toString()) - .param(PARAM_DIRECTORY, outdir) - .param(PARAM_LENIENT, Boolean.toString(lenient)) - .param(PARAM_BEAM, Boolean.toString(beam)) - .param(PARAM_TLDS, tlds.stream().collect(Collectors.joining(","))) - .param( + ImmutableMultimap.Builder paramsBuilder = + new ImmutableMultimap.Builder() + .put(PARAM_MANUAL, String.valueOf(true)) + .put(PARAM_MODE, mode.toString()) + .put(PARAM_DIRECTORY, outdir) + .put(PARAM_LENIENT, Boolean.toString(lenient)) + .put(PARAM_BEAM, Boolean.toString(beam)) + .put(PARAM_TLDS, tlds.stream().collect(Collectors.joining(","))) + .put( PARAM_WATERMARKS, watermarks.stream().map(DateTime::toString).collect(Collectors.joining(","))); + if (revision != null) { - opts = opts.param(PARAM_REVISION, String.valueOf(revision)); + paramsBuilder.put(PARAM_REVISION, String.valueOf(revision)); } - if (maybeEtaMillis.isPresent()) { - opts = opts.etaMillis(maybeEtaMillis.get()); - } - queue.add(opts); + cloudTasksUtils.enqueue( + RDE_REPORT_QUEUE, + CloudTasksUtils.createPostTask( + RdeStagingAction.PATH, Service.BACKEND.toString(), paramsBuilder.build())); } + } diff --git a/core/src/main/java/google/registry/tools/RegistryToolComponent.java b/core/src/main/java/google/registry/tools/RegistryToolComponent.java index ebb02a72b..4c8463f3a 100644 --- a/core/src/main/java/google/registry/tools/RegistryToolComponent.java +++ b/core/src/main/java/google/registry/tools/RegistryToolComponent.java @@ -19,6 +19,7 @@ import dagger.Component; import dagger.Lazy; import google.registry.batch.BatchModule; import google.registry.bigquery.BigqueryModule; +import google.registry.config.CloudTasksUtilsModule; import google.registry.config.CredentialModule.LocalCredentialJson; import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.ConfigModule; @@ -64,6 +65,7 @@ import javax.inject.Singleton; BigqueryModule.class, ConfigModule.class, CloudDnsWriterModule.class, + CloudTasksUtilsModule.class, DatastoreAdminModule.class, DatastoreServiceModule.class, DummyKeyringModule.class, diff --git a/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java b/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java index e027538d1..382a7d37d 100644 --- a/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java +++ b/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java @@ -14,18 +14,16 @@ package google.registry.tools; -import static com.google.appengine.api.taskqueue.QueueFactory.getQueue; import static com.google.common.truth.Truth.assertThat; import static google.registry.testing.DatabaseHelper.createTld; -import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; import com.beust.jcommander.ParameterException; +import google.registry.testing.CloudTasksHelper; +import google.registry.testing.CloudTasksHelper.TaskMatcher; import google.registry.testing.InjectExtension; -import google.registry.testing.TaskQueueHelper.TaskMatcher; import google.registry.util.AppEngineServiceUtils; -import java.util.Optional; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -42,14 +40,15 @@ public class GenerateEscrowDepositCommandTest @Mock AppEngineServiceUtils appEngineServiceUtils; + CloudTasksHelper cloudTasksHelper = new CloudTasksHelper(); + @BeforeEach void beforeEach() { createTld("tld"); createTld("anothertld"); command = new GenerateEscrowDepositCommand(); command.appEngineServiceUtils = appEngineServiceUtils; - command.queue = getQueue("rde-report"); - command.maybeEtaMillis = Optional.of(fakeClock.nowUtc().getMillis()); + command.cloudTasksUtils = cloudTasksHelper.getTestCloudTasksUtils(); when(appEngineServiceUtils.getCurrentVersionHostname("backend")) .thenReturn("backend.test.localhost"); } @@ -197,11 +196,10 @@ public class GenerateEscrowDepositCommandTest "-r 42", "-o test"); - assertTasksEnqueued( + cloudTasksHelper.assertTasksEnqueued( "rde-report", new TaskMatcher() .url("/_dr/task/rdeStaging") - .header("Host", "backend.test.localhost") .param("mode", "THIN") .param("lenient", "true") .param("watermarks", "2017-01-01T00:00:00.000Z") @@ -221,11 +219,10 @@ public class GenerateEscrowDepositCommandTest "-r 42", "-o test"); - assertTasksEnqueued( + cloudTasksHelper.assertTasksEnqueued( "rde-report", new TaskMatcher() .url("/_dr/task/rdeStaging") - .header("Host", "backend.test.localhost") .param("mode", "THIN") .param("beam", "true") .param("watermarks", "2017-01-01T00:00:00.000Z") @@ -239,11 +236,10 @@ public class GenerateEscrowDepositCommandTest void testCommand_successWithDefaultValidationMode() throws Exception { runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-r 42", "-o test"); - assertTasksEnqueued( + cloudTasksHelper.assertTasksEnqueued( "rde-report", new TaskMatcher() .url("/_dr/task/rdeStaging") - .header("Host", "backend.test.localhost") .param("mode", "THIN") .param("lenient", "false") .param("watermarks", "2017-01-01T00:00:00.000Z") @@ -257,11 +253,10 @@ public class GenerateEscrowDepositCommandTest void testCommand_successWithDefaultRevision() throws Exception { runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-o test"); - assertTasksEnqueued( + cloudTasksHelper.assertTasksEnqueued( "rde-report", new TaskMatcher() .url("/_dr/task/rdeStaging") - .header("Host", "backend.test.localhost") .param("lenient", "false") .param("beam", "false") .param("mode", "THIN") @@ -275,11 +270,10 @@ public class GenerateEscrowDepositCommandTest void testCommand_successWithDefaultMode() throws Exception { runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "-r=42", "-o test"); - assertTasksEnqueued( + cloudTasksHelper.assertTasksEnqueued( "rde-report", new TaskMatcher() .url("/_dr/task/rdeStaging") - .header("Host", "backend.test.localhost") .param("mode", "FULL") .param("lenient", "false") .param("beam", "false") @@ -299,11 +293,10 @@ public class GenerateEscrowDepositCommandTest "-r 42", "-o test"); - assertTasksEnqueued( + cloudTasksHelper.assertTasksEnqueued( "rde-report", new TaskMatcher() .url("/_dr/task/rdeStaging") - .header("Host", "backend.test.localhost") .param("mode", "THIN") .param("lenient", "false") .param("beam", "false")