Use CloudTasksUtil to enqueue task in IcannReportingStagingAction (#1489)

* Use CloudTasksUtil to enqueue task

* Use schedule time helper and add schedule time comparison
This commit is contained in:
Rachel Guan 2022-02-09 12:33:56 -05:00 committed by GitHub
parent f66a60673c
commit c1065daeac
2 changed files with 32 additions and 15 deletions

View file

@ -21,9 +21,6 @@ import static google.registry.request.Action.Method.POST;
import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR; import static javax.servlet.http.HttpServletResponse.SC_INTERNAL_SERVER_ERROR;
import static javax.servlet.http.HttpServletResponse.SC_OK; import static javax.servlet.http.HttpServletResponse.SC_OK;
import com.google.appengine.api.taskqueue.QueueFactory;
import com.google.appengine.api.taskqueue.TaskOptions;
import com.google.appengine.api.taskqueue.TaskOptions.Method;
import com.google.common.base.Joiner; import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@ -33,9 +30,12 @@ import google.registry.bigquery.BigqueryJobFailureException;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.reporting.icann.IcannReportingModule.ReportType; import google.registry.reporting.icann.IcannReportingModule.ReportType;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.Action.Service;
import google.registry.request.Parameter; import google.registry.request.Parameter;
import google.registry.request.Response; import google.registry.request.Response;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.CloudTasksUtils;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.Retrier; import google.registry.util.Retrier;
import google.registry.util.SendEmailService; import google.registry.util.SendEmailService;
@ -86,6 +86,8 @@ public final class IcannReportingStagingAction implements Runnable {
@Inject @Config("gSuiteOutgoingEmailAddress") InternetAddress sender; @Inject @Config("gSuiteOutgoingEmailAddress") InternetAddress sender;
@Inject @Config("alertRecipientEmailAddress") InternetAddress recipient; @Inject @Config("alertRecipientEmailAddress") InternetAddress recipient;
@Inject SendEmailService emailService; @Inject SendEmailService emailService;
@Inject Clock clock;
@Inject CloudTasksUtils cloudTasksUtils;
@Inject IcannReportingStagingAction() {} @Inject IcannReportingStagingAction() {}
@ -119,11 +121,14 @@ public final class IcannReportingStagingAction implements Runnable {
response.setPayload("Completed staging action."); response.setPayload("Completed staging action.");
logger.atInfo().log("Enqueueing report upload."); logger.atInfo().log("Enqueueing report upload.");
TaskOptions uploadTask = cloudTasksUtils.enqueue(
TaskOptions.Builder.withUrl(IcannReportingUploadAction.PATH) CRON_QUEUE,
.method(Method.POST) CloudTasksUtils.createPostTask(
.countdownMillis(Duration.standardMinutes(2).getMillis()); IcannReportingUploadAction.PATH,
QueueFactory.getQueue(CRON_QUEUE).add(uploadTask); Service.BACKEND.toString(),
null,
clock,
Duration.standardMinutes(2)));
return null; return null;
}, },
BigqueryJobFailureException.class); BigqueryJobFailureException.class);

View file

@ -15,29 +15,32 @@
package google.registry.reporting.icann; package google.registry.reporting.icann;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.testing.TaskQueueHelper.assertNoTasksEnqueued;
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.mock; import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times; import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import com.google.cloud.tasks.v2.HttpMethod;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import com.google.protobuf.util.Timestamps;
import google.registry.bigquery.BigqueryJobFailureException; import google.registry.bigquery.BigqueryJobFailureException;
import google.registry.reporting.icann.IcannReportingModule.ReportType; import google.registry.reporting.icann.IcannReportingModule.ReportType;
import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.BadRequestException;
import google.registry.testing.AppEngineExtension; import google.registry.testing.AppEngineExtension;
import google.registry.testing.CloudTasksHelper;
import google.registry.testing.CloudTasksHelper.TaskMatcher;
import google.registry.testing.FakeClock; import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.testing.FakeSleeper; import google.registry.testing.FakeSleeper;
import google.registry.testing.TaskQueueHelper.TaskMatcher;
import google.registry.util.EmailMessage; import google.registry.util.EmailMessage;
import google.registry.util.Retrier; import google.registry.util.Retrier;
import google.registry.util.SendEmailService; import google.registry.util.SendEmailService;
import java.util.Optional; import java.util.Optional;
import javax.mail.internet.InternetAddress; import javax.mail.internet.InternetAddress;
import org.joda.time.DateTime;
import org.joda.time.Duration;
import org.joda.time.YearMonth; import org.joda.time.YearMonth;
import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -51,6 +54,7 @@ class IcannReportingStagingActionTest {
private YearMonth yearMonth = new YearMonth(2017, 6); private YearMonth yearMonth = new YearMonth(2017, 6);
private String subdir = "default/dir"; private String subdir = "default/dir";
private IcannReportingStagingAction action; private IcannReportingStagingAction action;
private CloudTasksHelper cloudTasksHelper = new CloudTasksHelper();
@RegisterExtension @RegisterExtension
final AppEngineExtension appEngine = final AppEngineExtension appEngine =
@ -72,6 +76,8 @@ class IcannReportingStagingActionTest {
action.sender = new InternetAddress("sender@example.com"); action.sender = new InternetAddress("sender@example.com");
action.recipient = new InternetAddress("recipient@example.com"); action.recipient = new InternetAddress("recipient@example.com");
action.emailService = mock(SendEmailService.class); action.emailService = mock(SendEmailService.class);
action.cloudTasksUtils = cloudTasksHelper.getTestCloudTasksUtils();
action.clock = new FakeClock(DateTime.parse("2021-01-02T11:00:00Z"));
when(stager.stageReports(yearMonth, subdir, ReportType.ACTIVITY)) when(stager.stageReports(yearMonth, subdir, ReportType.ACTIVITY))
.thenReturn(ImmutableList.of("a", "b")); .thenReturn(ImmutableList.of("a", "b"));
@ -79,9 +85,15 @@ class IcannReportingStagingActionTest {
.thenReturn(ImmutableList.of("c", "d")); .thenReturn(ImmutableList.of("c", "d"));
} }
private static void assertUploadTaskEnqueued() { private void assertUploadTaskEnqueued() {
TaskMatcher matcher = new TaskMatcher().url("/_dr/task/icannReportingUpload").method("POST"); cloudTasksHelper.assertTasksEnqueued(
assertTasksEnqueued("retryable-cron-tasks", matcher); "retryable-cron-tasks",
new TaskMatcher()
.url("/_dr/task/icannReportingUpload")
.method(HttpMethod.POST)
.scheduleTime(
Timestamps.fromMillis(
action.clock.nowUtc().plus(Duration.standardMinutes(2)).getMillis())));
} }
@Test @Test
@ -157,7 +169,7 @@ class IcannReportingStagingActionTest {
new InternetAddress("recipient@example.com"), new InternetAddress("recipient@example.com"),
new InternetAddress("sender@example.com"))); new InternetAddress("sender@example.com")));
// Assert no upload task enqueued // Assert no upload task enqueued
assertNoTasksEnqueued("retryable-cron-tasks"); cloudTasksHelper.assertNoTasksEnqueued("retryable-cron-tasks");
} }
@Test @Test