Use CloudTasksUtils to enqueue in GenerateEscrowDepositCommand (#1465)

* Use CloudTasksUtils to enqueue in GenerateEscrowDepositCommand

* Add CloudTasksUtil to RegistryToolComponent

* Remove header param
This commit is contained in:
Rachel Guan 2022-01-06 15:36:22 -05:00 committed by GitHub
parent b353c2ccb7
commit 6cfe4ddf4f
4 changed files with 34 additions and 60 deletions

View file

@ -14,7 +14,6 @@
package google.registry.rde; 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.extractBooleanParameter;
import static google.registry.request.RequestParameters.extractOptionalIntParameter; import static google.registry.request.RequestParameters.extractOptionalIntParameter;
import static google.registry.request.RequestParameters.extractOptionalParameter; 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.extractSetOfDatetimeParameters;
import static google.registry.request.RequestParameters.extractSetOfParameters; import static google.registry.request.RequestParameters.extractSetOfParameters;
import com.google.appengine.api.taskqueue.Queue;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.jcraft.jsch.SftpProgressMonitor; import com.jcraft.jsch.SftpProgressMonitor;
import dagger.Binds; import dagger.Binds;
@ -30,7 +28,6 @@ import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.request.Parameter; import google.registry.request.Parameter;
import java.util.Optional; import java.util.Optional;
import javax.inject.Named;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -110,12 +107,6 @@ public abstract class RdeModule {
return extractOptionalParameter(req, PARAM_PREFIX); return extractOptionalParameter(req, PARAM_PREFIX);
} }
@Provides
@Named("rde-report")
static Queue provideQueueRdeReport() {
return getQueue("rde-report");
}
@Binds @Binds
abstract SftpProgressMonitor provideSftpProgressMonitor( abstract SftpProgressMonitor provideSftpProgressMonitor(
LoggingSftpProgressMonitor loggingSftpProgressMonitor); LoggingSftpProgressMonitor loggingSftpProgressMonitor);

View file

@ -14,7 +14,6 @@
package google.registry.tools; 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.model.tld.Registries.assertTldsExist;
import static google.registry.rde.RdeModule.PARAM_BEAM; import static google.registry.rde.RdeModule.PARAM_BEAM;
import static google.registry.rde.RdeModule.PARAM_DIRECTORY; 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_MODE;
import static google.registry.rde.RdeModule.PARAM_REVISION; import static google.registry.rde.RdeModule.PARAM_REVISION;
import static google.registry.rde.RdeModule.PARAM_WATERMARKS; 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 static google.registry.request.RequestParameters.PARAM_TLDS;
import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException; import com.beust.jcommander.ParameterException;
import com.beust.jcommander.Parameters; import com.beust.jcommander.Parameters;
import com.google.appengine.api.taskqueue.Queue; import com.google.common.collect.ImmutableMultimap;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.common.annotations.VisibleForTesting;
import google.registry.model.rde.RdeMode; import google.registry.model.rde.RdeMode;
import google.registry.rde.RdeStagingAction; import google.registry.rde.RdeStagingAction;
import google.registry.request.Action.Service;
import google.registry.tools.params.DateTimeParameter; import google.registry.tools.params.DateTimeParameter;
import google.registry.util.AppEngineServiceUtils; import google.registry.util.AppEngineServiceUtils;
import google.registry.util.CloudTasksUtils;
import java.util.List; import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named;
import org.joda.time.DateTime; import org.joda.time.DateTime;
/** /**
@ -94,15 +92,7 @@ final class GenerateEscrowDepositCommand implements CommandWithRemoteApi {
@Inject AppEngineServiceUtils appEngineServiceUtils; @Inject AppEngineServiceUtils appEngineServiceUtils;
@Inject @Inject CloudTasksUtils cloudTasksUtils;
@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<Long> maybeEtaMillis = Optional.empty();
@Override @Override
public void run() { public void run() {
@ -126,27 +116,25 @@ final class GenerateEscrowDepositCommand implements CommandWithRemoteApi {
throw new ParameterException("Output subdirectory must not be empty"); throw new ParameterException("Output subdirectory must not be empty");
} }
// Unlike many tool commands, this command is actually invoking an action on the backend module ImmutableMultimap.Builder<String, String> paramsBuilder =
// (because it's a mapreduce). So we invoke it in a different way. new ImmutableMultimap.Builder<String, String>()
String hostname = appEngineServiceUtils.getCurrentVersionHostname("backend"); .put(PARAM_MANUAL, String.valueOf(true))
TaskOptions opts = .put(PARAM_MODE, mode.toString())
withUrl(RdeStagingAction.PATH) .put(PARAM_DIRECTORY, outdir)
.header("Host", hostname) .put(PARAM_LENIENT, Boolean.toString(lenient))
.param(PARAM_MANUAL, String.valueOf(true)) .put(PARAM_BEAM, Boolean.toString(beam))
.param(PARAM_MODE, mode.toString()) .put(PARAM_TLDS, tlds.stream().collect(Collectors.joining(",")))
.param(PARAM_DIRECTORY, outdir) .put(
.param(PARAM_LENIENT, Boolean.toString(lenient))
.param(PARAM_BEAM, Boolean.toString(beam))
.param(PARAM_TLDS, tlds.stream().collect(Collectors.joining(",")))
.param(
PARAM_WATERMARKS, PARAM_WATERMARKS,
watermarks.stream().map(DateTime::toString).collect(Collectors.joining(","))); watermarks.stream().map(DateTime::toString).collect(Collectors.joining(",")));
if (revision != null) { if (revision != null) {
opts = opts.param(PARAM_REVISION, String.valueOf(revision)); paramsBuilder.put(PARAM_REVISION, String.valueOf(revision));
} }
if (maybeEtaMillis.isPresent()) { cloudTasksUtils.enqueue(
opts = opts.etaMillis(maybeEtaMillis.get()); RDE_REPORT_QUEUE,
} CloudTasksUtils.createPostTask(
queue.add(opts); RdeStagingAction.PATH, Service.BACKEND.toString(), paramsBuilder.build()));
} }
} }

View file

@ -19,6 +19,7 @@ import dagger.Component;
import dagger.Lazy; import dagger.Lazy;
import google.registry.batch.BatchModule; import google.registry.batch.BatchModule;
import google.registry.bigquery.BigqueryModule; import google.registry.bigquery.BigqueryModule;
import google.registry.config.CloudTasksUtilsModule;
import google.registry.config.CredentialModule.LocalCredentialJson; import google.registry.config.CredentialModule.LocalCredentialJson;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.config.RegistryConfig.ConfigModule; import google.registry.config.RegistryConfig.ConfigModule;
@ -64,6 +65,7 @@ import javax.inject.Singleton;
BigqueryModule.class, BigqueryModule.class,
ConfigModule.class, ConfigModule.class,
CloudDnsWriterModule.class, CloudDnsWriterModule.class,
CloudTasksUtilsModule.class,
DatastoreAdminModule.class, DatastoreAdminModule.class,
DatastoreServiceModule.class, DatastoreServiceModule.class,
DummyKeyringModule.class, DummyKeyringModule.class,

View file

@ -14,18 +14,16 @@
package google.registry.tools; package google.registry.tools;
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.testing.DatabaseHelper.createTld; 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.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import com.beust.jcommander.ParameterException; 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.InjectExtension;
import google.registry.testing.TaskQueueHelper.TaskMatcher;
import google.registry.util.AppEngineServiceUtils; import google.registry.util.AppEngineServiceUtils;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.api.extension.RegisterExtension;
@ -42,14 +40,15 @@ public class GenerateEscrowDepositCommandTest
@Mock AppEngineServiceUtils appEngineServiceUtils; @Mock AppEngineServiceUtils appEngineServiceUtils;
CloudTasksHelper cloudTasksHelper = new CloudTasksHelper();
@BeforeEach @BeforeEach
void beforeEach() { void beforeEach() {
createTld("tld"); createTld("tld");
createTld("anothertld"); createTld("anothertld");
command = new GenerateEscrowDepositCommand(); command = new GenerateEscrowDepositCommand();
command.appEngineServiceUtils = appEngineServiceUtils; command.appEngineServiceUtils = appEngineServiceUtils;
command.queue = getQueue("rde-report"); command.cloudTasksUtils = cloudTasksHelper.getTestCloudTasksUtils();
command.maybeEtaMillis = Optional.of(fakeClock.nowUtc().getMillis());
when(appEngineServiceUtils.getCurrentVersionHostname("backend")) when(appEngineServiceUtils.getCurrentVersionHostname("backend"))
.thenReturn("backend.test.localhost"); .thenReturn("backend.test.localhost");
} }
@ -197,11 +196,10 @@ public class GenerateEscrowDepositCommandTest
"-r 42", "-r 42",
"-o test"); "-o test");
assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"rde-report", "rde-report",
new TaskMatcher() new TaskMatcher()
.url("/_dr/task/rdeStaging") .url("/_dr/task/rdeStaging")
.header("Host", "backend.test.localhost")
.param("mode", "THIN") .param("mode", "THIN")
.param("lenient", "true") .param("lenient", "true")
.param("watermarks", "2017-01-01T00:00:00.000Z") .param("watermarks", "2017-01-01T00:00:00.000Z")
@ -221,11 +219,10 @@ public class GenerateEscrowDepositCommandTest
"-r 42", "-r 42",
"-o test"); "-o test");
assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"rde-report", "rde-report",
new TaskMatcher() new TaskMatcher()
.url("/_dr/task/rdeStaging") .url("/_dr/task/rdeStaging")
.header("Host", "backend.test.localhost")
.param("mode", "THIN") .param("mode", "THIN")
.param("beam", "true") .param("beam", "true")
.param("watermarks", "2017-01-01T00:00:00.000Z") .param("watermarks", "2017-01-01T00:00:00.000Z")
@ -239,11 +236,10 @@ public class GenerateEscrowDepositCommandTest
void testCommand_successWithDefaultValidationMode() throws Exception { void testCommand_successWithDefaultValidationMode() throws Exception {
runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-r 42", "-o test"); runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-r 42", "-o test");
assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"rde-report", "rde-report",
new TaskMatcher() new TaskMatcher()
.url("/_dr/task/rdeStaging") .url("/_dr/task/rdeStaging")
.header("Host", "backend.test.localhost")
.param("mode", "THIN") .param("mode", "THIN")
.param("lenient", "false") .param("lenient", "false")
.param("watermarks", "2017-01-01T00:00:00.000Z") .param("watermarks", "2017-01-01T00:00:00.000Z")
@ -257,11 +253,10 @@ public class GenerateEscrowDepositCommandTest
void testCommand_successWithDefaultRevision() throws Exception { void testCommand_successWithDefaultRevision() throws Exception {
runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-o test"); runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-o test");
assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"rde-report", "rde-report",
new TaskMatcher() new TaskMatcher()
.url("/_dr/task/rdeStaging") .url("/_dr/task/rdeStaging")
.header("Host", "backend.test.localhost")
.param("lenient", "false") .param("lenient", "false")
.param("beam", "false") .param("beam", "false")
.param("mode", "THIN") .param("mode", "THIN")
@ -275,11 +270,10 @@ public class GenerateEscrowDepositCommandTest
void testCommand_successWithDefaultMode() throws Exception { void testCommand_successWithDefaultMode() throws Exception {
runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "-r=42", "-o test"); runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "-r=42", "-o test");
assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"rde-report", "rde-report",
new TaskMatcher() new TaskMatcher()
.url("/_dr/task/rdeStaging") .url("/_dr/task/rdeStaging")
.header("Host", "backend.test.localhost")
.param("mode", "FULL") .param("mode", "FULL")
.param("lenient", "false") .param("lenient", "false")
.param("beam", "false") .param("beam", "false")
@ -299,11 +293,10 @@ public class GenerateEscrowDepositCommandTest
"-r 42", "-r 42",
"-o test"); "-o test");
assertTasksEnqueued( cloudTasksHelper.assertTasksEnqueued(
"rde-report", "rde-report",
new TaskMatcher() new TaskMatcher()
.url("/_dr/task/rdeStaging") .url("/_dr/task/rdeStaging")
.header("Host", "backend.test.localhost")
.param("mode", "THIN") .param("mode", "THIN")
.param("lenient", "false") .param("lenient", "false")
.param("beam", "false") .param("beam", "false")