mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 12:07:51 +02:00
Remove Nordn pull queue code (#1966)
The SQL-based flow is verified to work on production.
This commit is contained in:
parent
815be8000a
commit
0c7dbe8a34
11 changed files with 106 additions and 567 deletions
|
@ -6,6 +6,7 @@
|
||||||
<mode>pull</mode>
|
<mode>pull</mode>
|
||||||
</queue>
|
</queue>
|
||||||
|
|
||||||
|
<!-- Queue for publishing DNS updates in batches. -->
|
||||||
<queue>
|
<queue>
|
||||||
<name>dns-publish</name>
|
<name>dns-publish</name>
|
||||||
<rate>100/s</rate>
|
<rate>100/s</rate>
|
||||||
|
@ -18,6 +19,7 @@
|
||||||
</retry-parameters>
|
</retry-parameters>
|
||||||
</queue>
|
</queue>
|
||||||
|
|
||||||
|
<!-- Queue for uploading RDE deposits to the escrow provider. -->
|
||||||
<queue>
|
<queue>
|
||||||
<name>rde-upload</name>
|
<name>rde-upload</name>
|
||||||
<rate>10/m</rate>
|
<rate>10/m</rate>
|
||||||
|
@ -28,6 +30,7 @@
|
||||||
</retry-parameters>
|
</retry-parameters>
|
||||||
</queue>
|
</queue>
|
||||||
|
|
||||||
|
<!-- Queue for uploading RDE reports to ICANN. -->
|
||||||
<queue>
|
<queue>
|
||||||
<name>rde-report</name>
|
<name>rde-report</name>
|
||||||
<rate>1/s</rate>
|
<rate>1/s</rate>
|
||||||
|
@ -37,6 +40,7 @@
|
||||||
</retry-parameters>
|
</retry-parameters>
|
||||||
</queue>
|
</queue>
|
||||||
|
|
||||||
|
<!-- Queue for copying BRDA deposits to GCS. -->
|
||||||
<queue>
|
<queue>
|
||||||
<name>brda</name>
|
<name>brda</name>
|
||||||
<rate>1/m</rate>
|
<rate>1/m</rate>
|
||||||
|
@ -74,7 +78,7 @@
|
||||||
</retry-parameters>
|
</retry-parameters>
|
||||||
</queue>
|
</queue>
|
||||||
|
|
||||||
<!-- Queue for tasks to produce LORDN CSV reports, either by the query or queue method. -->
|
<!-- Queue for tasks to produce LORDN CSV reports, populated by a Cloud Scheduler fanout job. -->
|
||||||
<queue>
|
<queue>
|
||||||
<name>nordn</name>
|
<name>nordn</name>
|
||||||
<rate>1/s</rate>
|
<rate>1/s</rate>
|
||||||
|
@ -84,18 +88,6 @@
|
||||||
</retry-parameters>
|
</retry-parameters>
|
||||||
</queue>
|
</queue>
|
||||||
|
|
||||||
<!-- Queue for LORDN Claims CSV rows to be periodically queried and then uploaded in batches. -->
|
|
||||||
<queue>
|
|
||||||
<name>lordn-claims</name>
|
|
||||||
<mode>pull</mode>
|
|
||||||
</queue>
|
|
||||||
|
|
||||||
<!-- Queue for LORDN Sunrise CSV rows to be periodically queried and then uploaded in batches. -->
|
|
||||||
<queue>
|
|
||||||
<name>lordn-sunrise</name>
|
|
||||||
<mode>pull</mode>
|
|
||||||
</queue>
|
|
||||||
|
|
||||||
<!-- Queue for tasks that sync data to Google Spreadsheets. -->
|
<!-- Queue for tasks that sync data to Google Spreadsheets. -->
|
||||||
<queue>
|
<queue>
|
||||||
<name>sheet</name>
|
<name>sheet</name>
|
||||||
|
|
|
@ -173,30 +173,6 @@
|
||||||
<schedule>0 */12 * * *</schedule>
|
<schedule>0 */12 * * *</schedule>
|
||||||
</task>
|
</task>
|
||||||
|
|
||||||
<task>
|
|
||||||
<url><![CDATA[/_dr/cron/fanout?queue=nordn&endpoint=/_dr/task/nordnUpload&forEachRealTld&lordnPhase=sunrise&pullQueue]]></url>
|
|
||||||
<name>nordnUploadSunrisePullQueue</name>
|
|
||||||
<description>
|
|
||||||
This job uploads LORDN Sunrise CSV files for each TLD to MarksDB using
|
|
||||||
pull queue. It should be run at most every three hours, or at absolute
|
|
||||||
minimum every 26 hours.
|
|
||||||
</description>
|
|
||||||
<!-- This may be set anywhere between "every 3 hours" and "every 25 hours". -->
|
|
||||||
<schedule>0 */12 * * *</schedule>
|
|
||||||
</task>
|
|
||||||
|
|
||||||
<task>
|
|
||||||
<url><![CDATA[/_dr/cron/fanout?queue=nordn&endpoint=/_dr/task/nordnUpload&forEachRealTld&lordnPhase=claims&pullQueue]]></url>
|
|
||||||
<name>nordnUploadClaimsPullQueue</name>
|
|
||||||
<description>
|
|
||||||
This job uploads LORDN Claims CSV files for each TLD to MarksDB using pull
|
|
||||||
queue. It should be run at most every three hours, or at absolute minimum
|
|
||||||
every 26 hours.
|
|
||||||
</description>
|
|
||||||
<!-- This may be set anywhere between "every 3 hours" and "every 25 hours". -->
|
|
||||||
<schedule>0 */12 * * *</schedule>
|
|
||||||
</task>
|
|
||||||
|
|
||||||
<task>
|
<task>
|
||||||
<url><![CDATA[/_dr/cron/fanout?queue=retryable-cron-tasks&endpoint=/_dr/task/deleteProberData&runInEmpty]]></url>
|
<url><![CDATA[/_dr/cron/fanout?queue=retryable-cron-tasks&endpoint=/_dr/task/deleteProberData&runInEmpty]]></url>
|
||||||
<name>deleteProberData</name>
|
<name>deleteProberData</name>
|
||||||
|
|
|
@ -86,8 +86,6 @@ import google.registry.model.billing.BillingEvent.Flag;
|
||||||
import google.registry.model.billing.BillingEvent.Reason;
|
import google.registry.model.billing.BillingEvent.Reason;
|
||||||
import google.registry.model.billing.BillingEvent.Recurring;
|
import google.registry.model.billing.BillingEvent.Recurring;
|
||||||
import google.registry.model.billing.BillingEvent.RenewalPriceBehavior;
|
import google.registry.model.billing.BillingEvent.RenewalPriceBehavior;
|
||||||
import google.registry.model.common.DatabaseMigrationStateSchedule;
|
|
||||||
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
|
|
||||||
import google.registry.model.domain.Domain;
|
import google.registry.model.domain.Domain;
|
||||||
import google.registry.model.domain.DomainCommand;
|
import google.registry.model.domain.DomainCommand;
|
||||||
import google.registry.model.domain.DomainCommand.Create;
|
import google.registry.model.domain.DomainCommand.Create;
|
||||||
|
@ -124,7 +122,6 @@ import google.registry.model.tld.label.ReservationType;
|
||||||
import google.registry.model.tmch.ClaimsList;
|
import google.registry.model.tmch.ClaimsList;
|
||||||
import google.registry.model.tmch.ClaimsListDao;
|
import google.registry.model.tmch.ClaimsListDao;
|
||||||
import google.registry.persistence.VKey;
|
import google.registry.persistence.VKey;
|
||||||
import google.registry.tmch.LordnTaskUtils;
|
|
||||||
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
@ -406,12 +403,7 @@ public final class DomainCreateFlow implements TransactionalFlow {
|
||||||
.addGracePeriod(
|
.addGracePeriod(
|
||||||
GracePeriod.forBillingEvent(GracePeriodStatus.ADD, repoId, createBillingEvent))
|
GracePeriod.forBillingEvent(GracePeriodStatus.ADD, repoId, createBillingEvent))
|
||||||
.setLordnPhase(
|
.setLordnPhase(
|
||||||
!(DatabaseMigrationStateSchedule.getValueAtTime(tm().getTransactionTime())
|
hasSignedMarks
|
||||||
.equals(MigrationState.NORDN_SQL)
|
|
||||||
|| DatabaseMigrationStateSchedule.getValueAtTime(tm().getTransactionTime())
|
|
||||||
.equals(MigrationState.DNS_SQL))
|
|
||||||
? LordnPhase.NONE
|
|
||||||
: hasSignedMarks
|
|
||||||
? LordnPhase.SUNRISE
|
? LordnPhase.SUNRISE
|
||||||
: hasClaimsNotice ? LordnPhase.CLAIMS : LordnPhase.NONE);
|
: hasClaimsNotice ? LordnPhase.CLAIMS : LordnPhase.NONE);
|
||||||
Domain domain = domainBuilder.build();
|
Domain domain = domainBuilder.build();
|
||||||
|
@ -436,8 +428,9 @@ public final class DomainCreateFlow implements TransactionalFlow {
|
||||||
allocationTokenFlowUtils.redeemToken(
|
allocationTokenFlowUtils.redeemToken(
|
||||||
allocationToken.get(), domainHistory.getHistoryEntryId()));
|
allocationToken.get(), domainHistory.getHistoryEntryId()));
|
||||||
}
|
}
|
||||||
enqueueTasks(domain, hasSignedMarks, hasClaimsNotice);
|
if (domain.shouldPublishToDns()) {
|
||||||
|
dnsUtils.requestDomainDnsRefresh(domain.getDomainName());
|
||||||
|
}
|
||||||
EntityChanges entityChanges =
|
EntityChanges entityChanges =
|
||||||
flowCustomLogic.beforeSave(
|
flowCustomLogic.beforeSave(
|
||||||
DomainCreateFlowCustomLogic.BeforeSaveParameters.newBuilder()
|
DomainCreateFlowCustomLogic.BeforeSaveParameters.newBuilder()
|
||||||
|
@ -710,19 +703,6 @@ public final class DomainCreateFlow implements TransactionalFlow {
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void enqueueTasks(Domain newDomain, boolean hasSignedMarks, boolean hasClaimsNotice) {
|
|
||||||
if (newDomain.shouldPublishToDns()) {
|
|
||||||
dnsUtils.requestDomainDnsRefresh(newDomain.getDomainName());
|
|
||||||
}
|
|
||||||
if (!(DatabaseMigrationStateSchedule.getValueAtTime(tm().getTransactionTime())
|
|
||||||
.equals(MigrationState.NORDN_SQL)
|
|
||||||
|| DatabaseMigrationStateSchedule.getValueAtTime(tm().getTransactionTime())
|
|
||||||
.equals(MigrationState.DNS_SQL))
|
|
||||||
&& (hasClaimsNotice || hasSignedMarks)) {
|
|
||||||
LordnTaskUtils.enqueueDomainTask(newDomain);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Determines the {@link RenewalPriceBehavior} and the renewal price that needs be stored in the
|
* Determines the {@link RenewalPriceBehavior} and the renewal price that needs be stored in the
|
||||||
* {@link Recurring} billing events.
|
* {@link Recurring} billing events.
|
||||||
|
|
|
@ -14,21 +14,15 @@
|
||||||
|
|
||||||
package google.registry.tmch;
|
package google.registry.tmch;
|
||||||
|
|
||||||
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
|
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
import static com.google.common.base.Preconditions.checkState;
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
|
||||||
|
|
||||||
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 google.registry.model.domain.Domain;
|
import google.registry.model.domain.Domain;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import org.joda.time.DateTime;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Helper methods for creating tasks containing CSV line data in the lordn-sunrise and lordn-claims
|
* Helper methods for creating tasks containing CSV line data based on {@link Domain#getLordnPhase}.
|
||||||
* queues based on {@link Domain} changes.
|
|
||||||
*
|
*
|
||||||
* <p>Note that, per the <a href="https://tools.ietf.org/html/draft-ietf-regext-tmch-func-spec-04">
|
* <p>Note that, per the <a href="https://tools.ietf.org/html/draft-ietf-regext-tmch-func-spec-04">
|
||||||
* TMCH RFC</a>, while the application-datetime data is optional (which we never send because there
|
* TMCH RFC</a>, while the application-datetime data is optional (which we never send because there
|
||||||
|
@ -36,65 +30,32 @@ import org.joda.time.DateTime;
|
||||||
*/
|
*/
|
||||||
public final class LordnTaskUtils {
|
public final class LordnTaskUtils {
|
||||||
|
|
||||||
public static final String QUEUE_SUNRISE = "lordn-sunrise";
|
|
||||||
public static final String QUEUE_CLAIMS = "lordn-claims";
|
|
||||||
public static final String COLUMNS_CLAIMS =
|
public static final String COLUMNS_CLAIMS =
|
||||||
"roid,domain-name,notice-id,registrar-id,"
|
"roid,domain-name,notice-id,registrar-id,"
|
||||||
+ "registration-datetime,ack-datetime,application-datetime";
|
+ "registration-datetime,ack-datetime,application-datetime";
|
||||||
public static final String COLUMNS_SUNRISE =
|
public static final String COLUMNS_SUNRISE =
|
||||||
"roid,domain-name,SMD-id,registrar-id," + "registration-datetime,application-datetime";
|
"roid,domain-name,SMD-id,registrar-id," + "registration-datetime,application-datetime";
|
||||||
|
|
||||||
/** Enqueues a task in the LORDN queue representing a line of CSV for LORDN export. */
|
|
||||||
public static void enqueueDomainTask(Domain domain) {
|
|
||||||
tm().assertInTransaction();
|
|
||||||
// This method needs to use transactionTime as the Domain's creationTime because CreationTime
|
|
||||||
// isn't yet populated when this method is called during the resource flow.
|
|
||||||
String tld = domain.getTld();
|
|
||||||
if (domain.getLaunchNotice() == null) {
|
|
||||||
getQueue(QUEUE_SUNRISE)
|
|
||||||
.add(
|
|
||||||
TaskOptions.Builder.withTag(tld)
|
|
||||||
.method(Method.PULL)
|
|
||||||
.payload(getCsvLineForSunriseDomain(domain, tm().getTransactionTime())));
|
|
||||||
} else {
|
|
||||||
getQueue(QUEUE_CLAIMS)
|
|
||||||
.add(
|
|
||||||
TaskOptions.Builder.withTag(tld)
|
|
||||||
.method(Method.PULL)
|
|
||||||
.payload(getCsvLineForClaimsDomain(domain, tm().getTransactionTime())));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns the corresponding CSV LORDN line for a sunrise domain. */
|
/** Returns the corresponding CSV LORDN line for a sunrise domain. */
|
||||||
public static String getCsvLineForSunriseDomain(Domain domain) {
|
public static String getCsvLineForSunriseDomain(Domain domain) {
|
||||||
return getCsvLineForSunriseDomain(domain, domain.getCreationTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Merge into the function above after pull queue migration.
|
|
||||||
private static String getCsvLineForSunriseDomain(Domain domain, DateTime transactionTime) {
|
|
||||||
return Joiner.on(',')
|
return Joiner.on(',')
|
||||||
.join(
|
.join(
|
||||||
domain.getRepoId(),
|
domain.getRepoId(),
|
||||||
domain.getDomainName(),
|
domain.getDomainName(),
|
||||||
domain.getSmdId(),
|
domain.getSmdId(),
|
||||||
getIanaIdentifier(domain.getCreationRegistrarId()),
|
getIanaIdentifier(domain.getCreationRegistrarId()),
|
||||||
transactionTime); // Used as creation time.
|
domain.getCreationTime()); // Used as creation time.
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns the corresponding CSV LORDN line for a claims domain. */
|
/** Returns the corresponding CSV LORDN line for a claims domain. */
|
||||||
public static String getCsvLineForClaimsDomain(Domain domain) {
|
public static String getCsvLineForClaimsDomain(Domain domain) {
|
||||||
return getCsvLineForClaimsDomain(domain, domain.getCreationTime());
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: Merge into the function above after pull queue migration.
|
|
||||||
private static String getCsvLineForClaimsDomain(Domain domain, DateTime transactionTime) {
|
|
||||||
return Joiner.on(',')
|
return Joiner.on(',')
|
||||||
.join(
|
.join(
|
||||||
domain.getRepoId(),
|
domain.getRepoId(),
|
||||||
domain.getDomainName(),
|
domain.getDomainName(),
|
||||||
domain.getLaunchNotice().getNoticeId().getTcnId(),
|
domain.getLaunchNotice().getNoticeId().getTcnId(),
|
||||||
getIanaIdentifier(domain.getCreationRegistrarId()),
|
getIanaIdentifier(domain.getCreationRegistrarId()),
|
||||||
transactionTime, // Used as creation time.
|
domain.getCreationTime(), // Used as creation time.
|
||||||
domain.getLaunchNotice().getAcceptedTime());
|
domain.getLaunchNotice().getAcceptedTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
package google.registry.tmch;
|
package google.registry.tmch;
|
||||||
|
|
||||||
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
|
|
||||||
import static com.google.common.base.Preconditions.checkArgument;
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
import static com.google.common.base.Preconditions.checkNotNull;
|
||||||
import static com.google.common.net.HttpHeaders.LOCATION;
|
import static com.google.common.net.HttpHeaders.LOCATION;
|
||||||
|
@ -43,7 +42,6 @@ import com.google.common.base.Strings;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMultimap;
|
import com.google.common.collect.ImmutableMultimap;
|
||||||
import com.google.common.collect.ImmutableSortedSet;
|
import com.google.common.collect.ImmutableSortedSet;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.collect.Ordering;
|
import com.google.common.collect.Ordering;
|
||||||
import com.google.common.flogger.FluentLogger;
|
import com.google.common.flogger.FluentLogger;
|
||||||
import google.registry.batch.CloudTasksUtils;
|
import google.registry.batch.CloudTasksUtils;
|
||||||
|
@ -66,7 +64,6 @@ import java.net.URL;
|
||||||
import java.security.GeneralSecurityException;
|
import java.security.GeneralSecurityException;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
@ -90,8 +87,6 @@ public final class NordnUploadAction implements Runnable {
|
||||||
|
|
||||||
static final String PATH = "/_dr/task/nordnUpload";
|
static final String PATH = "/_dr/task/nordnUpload";
|
||||||
static final String LORDN_PHASE_PARAM = "lordnPhase";
|
static final String LORDN_PHASE_PARAM = "lordnPhase";
|
||||||
// TODO: Delete after migrating off of pull queue.
|
|
||||||
static final String PULL_QUEUE_PARAM = "pullQueue";
|
|
||||||
|
|
||||||
private static final int BATCH_SIZE = 1000;
|
private static final int BATCH_SIZE = 1000;
|
||||||
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
|
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
|
||||||
|
@ -122,10 +117,6 @@ public final class NordnUploadAction implements Runnable {
|
||||||
@Parameter(RequestParameters.PARAM_TLD)
|
@Parameter(RequestParameters.PARAM_TLD)
|
||||||
String tld;
|
String tld;
|
||||||
|
|
||||||
@Inject
|
|
||||||
@Parameter(PULL_QUEUE_PARAM)
|
|
||||||
Optional<Boolean> usePullQueue;
|
|
||||||
|
|
||||||
@Inject CloudTasksUtils cloudTasksUtils;
|
@Inject CloudTasksUtils cloudTasksUtils;
|
||||||
|
|
||||||
@Inject
|
@Inject
|
||||||
|
@ -146,13 +137,6 @@ public final class NordnUploadAction implements Runnable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
if (usePullQueue.orElse(false)) {
|
|
||||||
try {
|
|
||||||
processLordnTasks();
|
|
||||||
} catch (IOException | GeneralSecurityException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
checkArgument(
|
checkArgument(
|
||||||
phase.equals(PARAM_LORDN_PHASE_SUNRISE) || phase.equals(PARAM_LORDN_PHASE_CLAIMS),
|
phase.equals(PARAM_LORDN_PHASE_SUNRISE) || phase.equals(PARAM_LORDN_PHASE_CLAIMS),
|
||||||
"Invalid phase specified to NordnUploadAction: %s.",
|
"Invalid phase specified to NordnUploadAction: %s.",
|
||||||
|
@ -207,7 +191,6 @@ public final class NordnUploadAction implements Runnable {
|
||||||
tm().updateAll(newDomains.build());
|
tm().updateAll(newDomains.build());
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a list of queue tasks, each containing a row of CSV data, into a single newline-
|
* Converts a list of queue tasks, each containing a row of CSV data, into a single newline-
|
||||||
|
@ -249,35 +232,6 @@ public final class NordnUploadAction implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void processLordnTasks() throws IOException, GeneralSecurityException {
|
|
||||||
checkArgument(
|
|
||||||
phase.equals(PARAM_LORDN_PHASE_SUNRISE) || phase.equals(PARAM_LORDN_PHASE_CLAIMS),
|
|
||||||
"Invalid phase specified to NordnUploadAction: %s.",
|
|
||||||
phase);
|
|
||||||
DateTime now = clock.nowUtc();
|
|
||||||
Queue queue =
|
|
||||||
getQueue(
|
|
||||||
phase.equals(PARAM_LORDN_PHASE_SUNRISE)
|
|
||||||
? LordnTaskUtils.QUEUE_SUNRISE
|
|
||||||
: LordnTaskUtils.QUEUE_CLAIMS);
|
|
||||||
String columns = phase.equals(PARAM_LORDN_PHASE_SUNRISE) ? COLUMNS_SUNRISE : COLUMNS_CLAIMS;
|
|
||||||
List<TaskHandle> tasks = loadAllTasks(queue, tld);
|
|
||||||
// Note: This upload/task deletion isn't done atomically (it's not clear how one would do so
|
|
||||||
// anyway). As a result, it is possible that the upload might succeed yet the deletion of
|
|
||||||
// enqueued tasks might fail. If so, this would result in the same lines being uploaded to NORDN
|
|
||||||
// across multiple uploads. This is probably OK; all that we really cannot have is a missing
|
|
||||||
// line.
|
|
||||||
if (!tasks.isEmpty()) {
|
|
||||||
String csvData = convertTasksToCsv(tasks, now, columns);
|
|
||||||
uploadCsvToLordn(String.format("/LORDN/%s/%s", tld, phase), csvData);
|
|
||||||
Lists.partition(tasks, BATCH_SIZE)
|
|
||||||
.forEach(
|
|
||||||
batch ->
|
|
||||||
retrier.callWithRetry(
|
|
||||||
() -> queue.deleteTask(batch), TransientFailureException.class));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Upload LORDN file to MarksDB.
|
* Upload LORDN file to MarksDB.
|
||||||
*
|
*
|
||||||
|
|
|
@ -16,7 +16,6 @@ package google.registry.tmch;
|
||||||
|
|
||||||
import static com.google.common.io.Resources.asByteSource;
|
import static com.google.common.io.Resources.asByteSource;
|
||||||
import static com.google.common.io.Resources.getResource;
|
import static com.google.common.io.Resources.getResource;
|
||||||
import static google.registry.request.RequestParameters.extractOptionalBooleanParameter;
|
|
||||||
import static google.registry.request.RequestParameters.extractRequiredParameter;
|
import static google.registry.request.RequestParameters.extractRequiredParameter;
|
||||||
|
|
||||||
import dagger.Module;
|
import dagger.Module;
|
||||||
|
@ -26,7 +25,6 @@ import google.registry.request.HttpException.BadRequestException;
|
||||||
import google.registry.request.Parameter;
|
import google.registry.request.Parameter;
|
||||||
import java.net.MalformedURLException;
|
import java.net.MalformedURLException;
|
||||||
import java.net.URL;
|
import java.net.URL;
|
||||||
import java.util.Optional;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.bouncycastle.openpgp.PGPPublicKey;
|
import org.bouncycastle.openpgp.PGPPublicKey;
|
||||||
|
|
||||||
|
@ -66,10 +64,4 @@ public final class TmchModule {
|
||||||
static String provideNordnLogId(HttpServletRequest req) {
|
static String provideNordnLogId(HttpServletRequest req) {
|
||||||
return extractRequiredParameter(req, NordnVerifyAction.NORDN_LOG_ID_PARAM);
|
return extractRequiredParameter(req, NordnVerifyAction.NORDN_LOG_ID_PARAM);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Provides
|
|
||||||
@Parameter(NordnUploadAction.PULL_QUEUE_PARAM)
|
|
||||||
static Optional<Boolean> provideUsePullQueue(HttpServletRequest req) {
|
|
||||||
return extractOptionalBooleanParameter(req, NordnUploadAction.PULL_QUEUE_PARAM);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,10 +54,6 @@ import static google.registry.testing.DatabaseHelper.persistReservedList;
|
||||||
import static google.registry.testing.DatabaseHelper.persistResource;
|
import static google.registry.testing.DatabaseHelper.persistResource;
|
||||||
import static google.registry.testing.DomainSubject.assertAboutDomains;
|
import static google.registry.testing.DomainSubject.assertAboutDomains;
|
||||||
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
|
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
|
||||||
import static google.registry.testing.TaskQueueHelper.assertNoTasksEnqueued;
|
|
||||||
import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued;
|
|
||||||
import static google.registry.tmch.LordnTaskUtils.QUEUE_CLAIMS;
|
|
||||||
import static google.registry.tmch.LordnTaskUtils.QUEUE_SUNRISE;
|
|
||||||
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
||||||
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
||||||
import static org.joda.money.CurrencyUnit.JPY;
|
import static org.joda.money.CurrencyUnit.JPY;
|
||||||
|
@ -153,8 +149,6 @@ import google.registry.model.billing.BillingEvent;
|
||||||
import google.registry.model.billing.BillingEvent.Flag;
|
import google.registry.model.billing.BillingEvent.Flag;
|
||||||
import google.registry.model.billing.BillingEvent.Reason;
|
import google.registry.model.billing.BillingEvent.Reason;
|
||||||
import google.registry.model.billing.BillingEvent.RenewalPriceBehavior;
|
import google.registry.model.billing.BillingEvent.RenewalPriceBehavior;
|
||||||
import google.registry.model.common.DatabaseMigrationStateSchedule;
|
|
||||||
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
|
|
||||||
import google.registry.model.domain.Domain;
|
import google.registry.model.domain.Domain;
|
||||||
import google.registry.model.domain.DomainHistory;
|
import google.registry.model.domain.DomainHistory;
|
||||||
import google.registry.model.domain.GracePeriod;
|
import google.registry.model.domain.GracePeriod;
|
||||||
|
@ -181,7 +175,6 @@ import google.registry.monitoring.whitebox.EppMetric;
|
||||||
import google.registry.persistence.VKey;
|
import google.registry.persistence.VKey;
|
||||||
import google.registry.testing.DatabaseHelper;
|
import google.registry.testing.DatabaseHelper;
|
||||||
import google.registry.testing.TaskQueueExtension;
|
import google.registry.testing.TaskQueueExtension;
|
||||||
import google.registry.testing.TaskQueueHelper.TaskMatcher;
|
|
||||||
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
||||||
import google.registry.tmch.SmdrlCsvParser;
|
import google.registry.tmch.SmdrlCsvParser;
|
||||||
import google.registry.tmch.TmchData;
|
import google.registry.tmch.TmchData;
|
||||||
|
@ -193,12 +186,9 @@ import javax.annotation.Nullable;
|
||||||
import org.joda.money.Money;
|
import org.joda.money.Money;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.Duration;
|
import org.joda.time.Duration;
|
||||||
import org.junit.jupiter.api.BeforeAll;
|
|
||||||
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;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
|
||||||
import org.junit.jupiter.params.provider.ValueSource;
|
|
||||||
import org.junitpioneer.jupiter.cartesian.CartesianTest;
|
import org.junitpioneer.jupiter.cartesian.CartesianTest;
|
||||||
import org.junitpioneer.jupiter.cartesian.CartesianTest.Values;
|
import org.junitpioneer.jupiter.cartesian.CartesianTest.Values;
|
||||||
|
|
||||||
|
@ -228,11 +218,6 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
clock.setTo(DateTime.parse("1999-04-03T22:00:00.0Z").minus(Duration.millis(1)));
|
clock.setTo(DateTime.parse("1999-04-03T22:00:00.0Z").minus(Duration.millis(1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
@BeforeAll
|
|
||||||
static void beforeAll() {
|
|
||||||
DatabaseMigrationStateSchedule.useUncachedForTest();
|
|
||||||
}
|
|
||||||
|
|
||||||
@BeforeEach
|
@BeforeEach
|
||||||
void initCreateTest() throws Exception {
|
void initCreateTest() throws Exception {
|
||||||
createTld("tld");
|
createTld("tld");
|
||||||
|
@ -402,32 +387,16 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
.hasLaunchNotice(null)
|
.hasLaunchNotice(null)
|
||||||
.and()
|
.and()
|
||||||
.hasLordnPhase(LordnPhase.NONE);
|
.hasLordnPhase(LordnPhase.NONE);
|
||||||
assertNoTasksEnqueued(QUEUE_CLAIMS, QUEUE_SUNRISE);
|
|
||||||
assertNoTasksEnqueued(QUEUE_CLAIMS, QUEUE_SUNRISE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertSunriseLordn(String domainName) throws Exception {
|
private void assertSunriseLordn() throws Exception {
|
||||||
assertAboutDomains()
|
assertAboutDomains()
|
||||||
.that(reloadResourceByForeignKey())
|
.that(reloadResourceByForeignKey())
|
||||||
.hasSmdId(SMD_ID)
|
.hasSmdId(SMD_ID)
|
||||||
.and()
|
.and()
|
||||||
.hasLaunchNotice(null);
|
.hasLaunchNotice(null)
|
||||||
if (DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc())
|
.and()
|
||||||
.equals(MigrationState.NORDN_SQL)
|
.hasLordnPhase(LordnPhase.SUNRISE);
|
||||||
|| DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc())
|
|
||||||
.equals(MigrationState.DNS_SQL)) {
|
|
||||||
assertAboutDomains().that(reloadResourceByForeignKey()).hasLordnPhase(LordnPhase.SUNRISE);
|
|
||||||
} else {
|
|
||||||
String expectedPayload =
|
|
||||||
String.format(
|
|
||||||
"%s,%s,%s,1,%s",
|
|
||||||
reloadResourceByForeignKey().getRepoId(),
|
|
||||||
domainName,
|
|
||||||
SMD_ID,
|
|
||||||
SMD_VALID_TIME.plusMillis(17));
|
|
||||||
assertTasksEnqueued(QUEUE_SUNRISE, new TaskMatcher().payload(expectedPayload));
|
|
||||||
assertAboutDomains().that(reloadResourceByForeignKey()).hasLordnPhase(LordnPhase.NONE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertClaimsLordn() throws Exception {
|
private void assertClaimsLordn() throws Exception {
|
||||||
|
@ -440,22 +409,9 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
"370d0b7c9223372036854775807",
|
"370d0b7c9223372036854775807",
|
||||||
"tmch",
|
"tmch",
|
||||||
DateTime.parse("2010-08-16T09:00:00.0Z"),
|
DateTime.parse("2010-08-16T09:00:00.0Z"),
|
||||||
DateTime.parse("2009-08-16T09:00:00.0Z")));
|
DateTime.parse("2009-08-16T09:00:00.0Z")))
|
||||||
if ((DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc())
|
.and()
|
||||||
.equals(MigrationState.NORDN_SQL)
|
.hasLordnPhase(LordnPhase.CLAIMS);
|
||||||
|| DatabaseMigrationStateSchedule.getValueAtTime(clock.nowUtc())
|
|
||||||
.equals(MigrationState.DNS_SQL))) {
|
|
||||||
assertAboutDomains().that(reloadResourceByForeignKey()).hasLordnPhase(LordnPhase.CLAIMS);
|
|
||||||
} else {
|
|
||||||
TaskMatcher task =
|
|
||||||
new TaskMatcher()
|
|
||||||
.payload(
|
|
||||||
reloadResourceByForeignKey().getRepoId()
|
|
||||||
+ ",example-one.tld,370d0b7c9223372036854775807,1,"
|
|
||||||
+ "2009-08-16T09:00:00.017Z,2009-08-16T09:00:00.000Z");
|
|
||||||
assertTasksEnqueued(QUEUE_CLAIMS, task);
|
|
||||||
assertAboutDomains().that(reloadResourceByForeignKey()).hasLordnPhase(LordnPhase.NONE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void doSuccessfulTest(
|
private void doSuccessfulTest(
|
||||||
|
@ -979,12 +935,8 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_claimsNotice() throws Exception {
|
||||||
void testSuccess_claimsNotice(boolean usePullQueue) throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
clock.setTo(DateTime.parse("2009-08-16T09:00:00.0Z"));
|
clock.setTo(DateTime.parse("2009-08-16T09:00:00.0Z"));
|
||||||
setEppInput("domain_create_claim_notice.xml");
|
setEppInput("domain_create_claim_notice.xml");
|
||||||
persistContactsAndHosts();
|
persistContactsAndHosts();
|
||||||
|
@ -994,12 +946,8 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
assertClaimsLordn();
|
assertClaimsLordn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_claimsNoticeInQuietPeriod() throws Exception {
|
||||||
void testSuccess_claimsNoticeInQuietPeriod(boolean usePullQueue) throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
allocationToken =
|
allocationToken =
|
||||||
persistResource(
|
persistResource(
|
||||||
new AllocationToken.Builder()
|
new AllocationToken.Builder()
|
||||||
|
@ -1045,7 +993,6 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
persistContactsAndHosts();
|
persistContactsAndHosts();
|
||||||
EppException thrown = assertThrows(MissingClaimsNoticeException.class, this::runFlow);
|
EppException thrown = assertThrows(MissingClaimsNoticeException.class, this::runFlow);
|
||||||
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
||||||
assertNoTasksEnqueued(QUEUE_CLAIMS, QUEUE_SUNRISE);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1421,12 +1368,8 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
assertAllocationTokenWasRedeemed("abcDEF23456");
|
assertAllocationTokenWasRedeemed("abcDEF23456");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_anchorTenant_withClaims() throws Exception {
|
||||||
void testSuccess_anchorTenant_withClaims(boolean usePullQueue) throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
persistResource(
|
persistResource(
|
||||||
new AllocationToken.Builder()
|
new AllocationToken.Builder()
|
||||||
.setDomainName("example-one.tld")
|
.setDomainName("example-one.tld")
|
||||||
|
@ -1494,12 +1437,8 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
assertSuccessfulCreate("tld", ImmutableSet.of(SUNRISE, ANCHOR_TENANT));
|
assertSuccessfulCreate("tld", ImmutableSet.of(SUNRISE, ANCHOR_TENANT));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_anchorTenantInSunrise_withSignedMark() throws Exception {
|
||||||
void testSuccess_anchorTenantInSunrise_withSignedMark(boolean usePullQueue) throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
allocationToken =
|
allocationToken =
|
||||||
persistResource(
|
persistResource(
|
||||||
new AllocationToken.Builder()
|
new AllocationToken.Builder()
|
||||||
|
@ -1529,7 +1468,7 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
SMD_VALID_TIME.plusYears(2).toString())));
|
SMD_VALID_TIME.plusYears(2).toString())));
|
||||||
assertSuccessfulCreate("tld", ImmutableSet.of(ANCHOR_TENANT, SUNRISE), allocationToken);
|
assertSuccessfulCreate("tld", ImmutableSet.of(ANCHOR_TENANT, SUNRISE), allocationToken);
|
||||||
dnsUtilsHelper.assertDomainDnsRequests("test-validate.tld");
|
dnsUtilsHelper.assertDomainDnsRequests("test-validate.tld");
|
||||||
assertSunriseLordn("test-validate.tld");
|
assertSunriseLordn();
|
||||||
assertAllocationTokenWasRedeemed("abcDEF23456");
|
assertAllocationTokenWasRedeemed("abcDEF23456");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2099,13 +2038,9 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
assertSuccessfulCreate("tld", ImmutableSet.of(RESERVED));
|
assertSuccessfulCreate("tld", ImmutableSet.of(RESERVED));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_reservedNameCollisionDomain_inSunrise_setsServerHoldAndPollMessage()
|
||||||
void testSuccess_reservedNameCollisionDomain_inSunrise_setsServerHoldAndPollMessage(
|
throws Exception {
|
||||||
boolean usePullQueue) throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
persistResource(
|
persistResource(
|
||||||
Registry.get("tld")
|
Registry.get("tld")
|
||||||
.asBuilder()
|
.asBuilder()
|
||||||
|
@ -2127,7 +2062,7 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
"EXPIRATION_TIME",
|
"EXPIRATION_TIME",
|
||||||
SMD_VALID_TIME.plusYears(2).toString())));
|
SMD_VALID_TIME.plusYears(2).toString())));
|
||||||
|
|
||||||
assertSunriseLordn("test-and-validate.tld");
|
assertSunriseLordn();
|
||||||
|
|
||||||
// Check for SERVER_HOLD status, no DNS tasks enqueued, and collision poll message.
|
// Check for SERVER_HOLD status, no DNS tasks enqueued, and collision poll message.
|
||||||
dnsUtilsHelper.assertNoMoreDnsRequests();
|
dnsUtilsHelper.assertNoMoreDnsRequests();
|
||||||
|
@ -2648,13 +2583,8 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
"tld", "domain_create_response.xml", SUPERUSER, ImmutableMap.of("DOMAIN", "example.tld"));
|
"tld", "domain_create_response.xml", SUPERUSER, ImmutableMap.of("DOMAIN", "example.tld"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_startDateSunriseRegistration_withEncodedSignedMark() throws Exception {
|
||||||
void testSuccess_startDateSunriseRegistration_withEncodedSignedMark(boolean usePullQueue)
|
|
||||||
throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
createTld("tld", START_DATE_SUNRISE);
|
createTld("tld", START_DATE_SUNRISE);
|
||||||
clock.setTo(SMD_VALID_TIME);
|
clock.setTo(SMD_VALID_TIME);
|
||||||
setEppInput(
|
setEppInput(
|
||||||
|
@ -2672,17 +2602,12 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
"EXPIRATION_TIME",
|
"EXPIRATION_TIME",
|
||||||
SMD_VALID_TIME.plusYears(2).toString())));
|
SMD_VALID_TIME.plusYears(2).toString())));
|
||||||
assertSuccessfulCreate("tld", ImmutableSet.of(SUNRISE));
|
assertSuccessfulCreate("tld", ImmutableSet.of(SUNRISE));
|
||||||
assertSunriseLordn("test-validate.tld");
|
assertSunriseLordn();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Test that missing type= argument on launch create works in start-date sunrise. */
|
/** Test that missing type= argument on launch create works in start-date sunrise. */
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_startDateSunriseRegistration_withEncodedSignedMark_noType() throws Exception {
|
||||||
void testSuccess_startDateSunriseRegistration_withEncodedSignedMark_noType(boolean usePullQueue)
|
|
||||||
throws Exception {
|
|
||||||
if (!usePullQueue) {
|
|
||||||
useNordnSql();
|
|
||||||
}
|
|
||||||
createTld("tld", START_DATE_SUNRISE);
|
createTld("tld", START_DATE_SUNRISE);
|
||||||
clock.setTo(SMD_VALID_TIME);
|
clock.setTo(SMD_VALID_TIME);
|
||||||
setEppInput(
|
setEppInput(
|
||||||
|
@ -2700,7 +2625,7 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
"EXPIRATION_TIME",
|
"EXPIRATION_TIME",
|
||||||
SMD_VALID_TIME.plusYears(2).toString())));
|
SMD_VALID_TIME.plusYears(2).toString())));
|
||||||
assertSuccessfulCreate("tld", ImmutableSet.of(SUNRISE));
|
assertSuccessfulCreate("tld", ImmutableSet.of(SUNRISE));
|
||||||
assertSunriseLordn("test-validate.tld");
|
assertSunriseLordn();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -3735,97 +3660,4 @@ class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow, Domain
|
||||||
.isEqualTo(
|
.isEqualTo(
|
||||||
"The package token abc123 cannot be used to register names for longer than 1 year.");
|
"The package token abc123 cannot be used to register names for longer than 1 year.");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void useNordnSql() {
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.put(
|
|
||||||
START_OF_TIME.plusMillis(3), MigrationState.DATASTORE_PRIMARY_READ_ONLY)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.put(
|
|
||||||
START_OF_TIME.plusMillis(3), MigrationState.DATASTORE_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(4), MigrationState.SQL_PRIMARY_READ_ONLY)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.put(
|
|
||||||
START_OF_TIME.plusMillis(3), MigrationState.DATASTORE_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(4), MigrationState.SQL_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(5), MigrationState.SQL_PRIMARY)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.put(
|
|
||||||
START_OF_TIME.plusMillis(3), MigrationState.DATASTORE_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(4), MigrationState.SQL_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(5), MigrationState.SQL_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(6), MigrationState.SQL_ONLY)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.put(
|
|
||||||
START_OF_TIME.plusMillis(3), MigrationState.DATASTORE_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(4), MigrationState.SQL_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(5), MigrationState.SQL_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(6), MigrationState.SQL_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(7), MigrationState.SEQUENCE_BASED_ALLOCATE_ID)
|
|
||||||
.build()));
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
DatabaseMigrationStateSchedule.set(
|
|
||||||
new ImmutableSortedMap.Builder<DateTime, MigrationState>(Ordering.natural())
|
|
||||||
.put(START_OF_TIME, MigrationState.DATASTORE_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(1), MigrationState.DATASTORE_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(2), MigrationState.DATASTORE_PRIMARY_NO_ASYNC)
|
|
||||||
.put(
|
|
||||||
START_OF_TIME.plusMillis(3), MigrationState.DATASTORE_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(4), MigrationState.SQL_PRIMARY_READ_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(5), MigrationState.SQL_PRIMARY)
|
|
||||||
.put(START_OF_TIME.plusMillis(6), MigrationState.SQL_ONLY)
|
|
||||||
.put(START_OF_TIME.plusMillis(7), MigrationState.SEQUENCE_BASED_ALLOCATE_ID)
|
|
||||||
.put(START_OF_TIME.plusMillis(8), MigrationState.NORDN_SQL)
|
|
||||||
.build()));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -104,7 +104,6 @@ import google.registry.model.transfer.DomainTransferData;
|
||||||
import google.registry.model.transfer.TransferData;
|
import google.registry.model.transfer.TransferData;
|
||||||
import google.registry.model.transfer.TransferStatus;
|
import google.registry.model.transfer.TransferStatus;
|
||||||
import google.registry.persistence.VKey;
|
import google.registry.persistence.VKey;
|
||||||
import google.registry.tmch.LordnTaskUtils;
|
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -312,17 +311,6 @@ public final class DatabaseHelper {
|
||||||
return persistResource(domain.asBuilder().setDeletionTime(deletionTime).build());
|
return persistResource(domain.asBuilder().setDeletionTime(deletionTime).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: delete after pull queue migration.
|
|
||||||
/** Persists a domain and enqueues a LORDN task of the appropriate type for it. */
|
|
||||||
public static Domain persistDomainAndEnqueueLordn(final Domain domain) {
|
|
||||||
final Domain persistedDomain = persistResource(domain);
|
|
||||||
// Calls {@link LordnTaskUtils#enqueueDomainTask} wrapped in a transaction so that the
|
|
||||||
// transaction time is set correctly.
|
|
||||||
tm().transact(() -> LordnTaskUtils.enqueueDomainTask(persistedDomain));
|
|
||||||
maybeAdvanceClock();
|
|
||||||
return persistedDomain;
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Persists a {@link Recurring} and {@link HistoryEntry} for a domain that already exists. */
|
/** Persists a {@link Recurring} and {@link HistoryEntry} for a domain that already exists. */
|
||||||
public static Domain persistBillingRecurrenceForDomain(
|
public static Domain persistBillingRecurrenceForDomain(
|
||||||
Domain domain, RenewalPriceBehavior renewalPriceBehavior, @Nullable Money renewalPrice) {
|
Domain domain, RenewalPriceBehavior renewalPriceBehavior, @Nullable Money renewalPrice) {
|
||||||
|
|
|
@ -1,111 +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.tmch;
|
|
||||||
|
|
||||||
import static google.registry.persistence.transaction.TransactionManagerFactory.tm;
|
|
||||||
import static google.registry.testing.DatabaseHelper.createTld;
|
|
||||||
import static google.registry.testing.DatabaseHelper.loadRegistrar;
|
|
||||||
import static google.registry.testing.DatabaseHelper.persistActiveContact;
|
|
||||||
import static google.registry.testing.DatabaseHelper.persistDomainAndEnqueueLordn;
|
|
||||||
import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued;
|
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
|
||||||
|
|
||||||
import google.registry.model.domain.Domain;
|
|
||||||
import google.registry.model.domain.launch.LaunchNotice;
|
|
||||||
import google.registry.model.registrar.Registrar.Type;
|
|
||||||
import google.registry.persistence.transaction.JpaTestExtensions;
|
|
||||||
import google.registry.persistence.transaction.JpaTestExtensions.JpaIntegrationTestExtension;
|
|
||||||
import google.registry.testing.FakeClock;
|
|
||||||
import google.registry.testing.TaskQueueExtension;
|
|
||||||
import google.registry.testing.TaskQueueHelper.TaskMatcher;
|
|
||||||
import google.registry.util.Clock;
|
|
||||||
import org.joda.time.DateTime;
|
|
||||||
import org.junit.jupiter.api.BeforeEach;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.extension.RegisterExtension;
|
|
||||||
|
|
||||||
/** Unit tests for {@link LordnTaskUtils}. */
|
|
||||||
public class LordnTaskUtilsTest {
|
|
||||||
|
|
||||||
private static final Clock clock = new FakeClock(DateTime.parse("2010-05-01T10:11:12Z"));
|
|
||||||
|
|
||||||
@RegisterExtension
|
|
||||||
final JpaIntegrationTestExtension jpa =
|
|
||||||
new JpaTestExtensions.Builder().withClock(clock).buildIntegrationTestExtension();
|
|
||||||
|
|
||||||
@RegisterExtension final TaskQueueExtension taskQueue = new TaskQueueExtension();
|
|
||||||
|
|
||||||
@BeforeEach
|
|
||||||
void beforeEach() {
|
|
||||||
createTld("example");
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Domain.Builder newDomainBuilder() {
|
|
||||||
return new Domain.Builder()
|
|
||||||
.setDomainName("fleece.example")
|
|
||||||
.setPersistedCurrentSponsorRegistrarId("TheRegistrar")
|
|
||||||
.setCreationRegistrarId("TheRegistrar")
|
|
||||||
.setRegistrant(persistActiveContact("jd1234").createVKey())
|
|
||||||
.setSmdId("smdzzzz")
|
|
||||||
.setCreationRegistrarId("TheRegistrar");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void test_enqueueDomainTask_sunrise() {
|
|
||||||
persistDomainAndEnqueueLordn(newDomainBuilder().setRepoId("A-EXAMPLE").build());
|
|
||||||
String expectedPayload =
|
|
||||||
"A-EXAMPLE,fleece.example,smdzzzz,1,2010-05-01T10:11:12.000Z";
|
|
||||||
assertTasksEnqueued(
|
|
||||||
"lordn-sunrise", new TaskMatcher().payload(expectedPayload).tag("example"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void test_enqueueDomainTask_claims() {
|
|
||||||
Domain domain =
|
|
||||||
newDomainBuilder()
|
|
||||||
.setRepoId("11-EXAMPLE")
|
|
||||||
.setLaunchNotice(
|
|
||||||
LaunchNotice.create(
|
|
||||||
"landrush1tcn", null, null, DateTime.parse("2010-05-01T09:11:12Z")))
|
|
||||||
.build();
|
|
||||||
persistDomainAndEnqueueLordn(domain);
|
|
||||||
String expectedPayload = "11-EXAMPLE,fleece.example,landrush1tcn,1,2010-05-01T10:11:12.000Z,"
|
|
||||||
+ "2010-05-01T09:11:12.000Z";
|
|
||||||
assertTasksEnqueued("lordn-claims", new TaskMatcher().payload(expectedPayload).tag("example"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void test_oteRegistrarWithNullIanaId() {
|
|
||||||
tm().transact(
|
|
||||||
() ->
|
|
||||||
tm().put(
|
|
||||||
loadRegistrar("TheRegistrar")
|
|
||||||
.asBuilder()
|
|
||||||
.setType(Type.OTE)
|
|
||||||
.setIanaIdentifier(null)
|
|
||||||
.build()));
|
|
||||||
persistDomainAndEnqueueLordn(newDomainBuilder().setRepoId("3-EXAMPLE").build());
|
|
||||||
String expectedPayload = "3-EXAMPLE,fleece.example,smdzzzz,null,2010-05-01T10:11:12.000Z";
|
|
||||||
assertTasksEnqueued(
|
|
||||||
"lordn-sunrise", new TaskMatcher().payload(expectedPayload).tag("example"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void test_enqueueDomainTask_throwsNpeOnNullDomain() {
|
|
||||||
assertThrows(
|
|
||||||
NullPointerException.class,
|
|
||||||
() -> tm().transact(() -> LordnTaskUtils.enqueueDomainTask(null)));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,7 +14,6 @@
|
||||||
|
|
||||||
package google.registry.tmch;
|
package google.registry.tmch;
|
||||||
|
|
||||||
import static com.google.appengine.api.taskqueue.QueueFactory.getQueue;
|
|
||||||
import static com.google.common.net.HttpHeaders.AUTHORIZATION;
|
import static com.google.common.net.HttpHeaders.AUTHORIZATION;
|
||||||
import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
|
import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
|
||||||
import static com.google.common.net.HttpHeaders.LOCATION;
|
import static com.google.common.net.HttpHeaders.LOCATION;
|
||||||
|
@ -25,7 +24,6 @@ import static google.registry.testing.DatabaseHelper.createTld;
|
||||||
import static google.registry.testing.DatabaseHelper.loadByKey;
|
import static google.registry.testing.DatabaseHelper.loadByKey;
|
||||||
import static google.registry.testing.DatabaseHelper.loadRegistrar;
|
import static google.registry.testing.DatabaseHelper.loadRegistrar;
|
||||||
import static google.registry.testing.DatabaseHelper.newDomain;
|
import static google.registry.testing.DatabaseHelper.newDomain;
|
||||||
import static google.registry.testing.DatabaseHelper.persistDomainAndEnqueueLordn;
|
|
||||||
import static google.registry.testing.DatabaseHelper.persistResource;
|
import static google.registry.testing.DatabaseHelper.persistResource;
|
||||||
import static java.nio.charset.StandardCharsets.UTF_8;
|
import static java.nio.charset.StandardCharsets.UTF_8;
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED;
|
import static javax.servlet.http.HttpServletResponse.SC_ACCEPTED;
|
||||||
|
@ -63,7 +61,6 @@ import google.registry.testing.CloudTasksHelper.TaskMatcher;
|
||||||
import google.registry.testing.FakeClock;
|
import google.registry.testing.FakeClock;
|
||||||
import google.registry.testing.FakeSleeper;
|
import google.registry.testing.FakeSleeper;
|
||||||
import google.registry.testing.FakeUrlConnectionService;
|
import google.registry.testing.FakeUrlConnectionService;
|
||||||
import google.registry.testing.TaskQueueExtension;
|
|
||||||
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
import google.registry.tmch.LordnTaskUtils.LordnPhase;
|
||||||
import google.registry.util.Retrier;
|
import google.registry.util.Retrier;
|
||||||
import google.registry.util.UrlConnectionException;
|
import google.registry.util.UrlConnectionException;
|
||||||
|
@ -74,14 +71,11 @@ import java.net.URL;
|
||||||
import java.security.SecureRandom;
|
import java.security.SecureRandom;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import java.util.concurrent.TimeUnit;
|
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
import org.joda.time.Duration;
|
import org.joda.time.Duration;
|
||||||
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;
|
||||||
import org.junit.jupiter.params.ParameterizedTest;
|
|
||||||
import org.junit.jupiter.params.provider.ValueSource;
|
|
||||||
|
|
||||||
/** Unit tests for {@link NordnUploadAction}. */
|
/** Unit tests for {@link NordnUploadAction}. */
|
||||||
class NordnUploadActionTest {
|
class NordnUploadActionTest {
|
||||||
|
@ -111,8 +105,6 @@ class NordnUploadActionTest {
|
||||||
final JpaIntegrationTestExtension jpa =
|
final JpaIntegrationTestExtension jpa =
|
||||||
new JpaTestExtensions.Builder().withClock(clock).buildIntegrationTestExtension();
|
new JpaTestExtensions.Builder().withClock(clock).buildIntegrationTestExtension();
|
||||||
|
|
||||||
@RegisterExtension final TaskQueueExtension taskQueueExtension = new TaskQueueExtension();
|
|
||||||
|
|
||||||
private final LordnRequestInitializer lordnRequestInitializer =
|
private final LordnRequestInitializer lordnRequestInitializer =
|
||||||
new LordnRequestInitializer(Optional.of("attack"));
|
new LordnRequestInitializer(Optional.of("attack"));
|
||||||
private final NordnUploadAction action = new NordnUploadAction();
|
private final NordnUploadAction action = new NordnUploadAction();
|
||||||
|
@ -145,7 +137,6 @@ class NordnUploadActionTest {
|
||||||
action.tmchMarksdbUrl = "http://127.0.0.1";
|
action.tmchMarksdbUrl = "http://127.0.0.1";
|
||||||
action.random = new SecureRandom();
|
action.random = new SecureRandom();
|
||||||
action.retrier = new Retrier(new FakeSleeper(clock), 3);
|
action.retrier = new Retrier(new FakeSleeper(clock), 3);
|
||||||
action.usePullQueue = Optional.empty();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -229,23 +220,21 @@ class NordnUploadActionTest {
|
||||||
cloudTasksHelper.assertNoTasksEnqueued(NordnVerifyAction.QUEUE);
|
cloudTasksHelper.assertNoTasksEnqueued(NordnVerifyAction.QUEUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_claimsMode() throws Exception {
|
||||||
void testSuccess_claimsMode(boolean usePullQueue) throws Exception {
|
testRun("claims", "claims-landrush1.tld", "claims-landrush2.tld", CLAIMS_CSV);
|
||||||
testRun("claims", "claims-landrush1.tld", "claims-landrush2.tld", CLAIMS_CSV, usePullQueue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ParameterizedTest
|
@Test
|
||||||
@ValueSource(booleans = {true, false})
|
void testSuccess_sunriseMode() throws Exception {
|
||||||
void testSuccess_sunriseMode(boolean usePullQueue) throws Exception {
|
testRun("sunrise", "sunrise1.tld", "sunrise2.tld", SUNRISE_CSV);
|
||||||
testRun("sunrise", "sunrise1.tld", "sunrise2.tld", SUNRISE_CSV, usePullQueue);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testSuccess_noResponseContent_stillWorksNormally() throws Exception {
|
void testSuccess_noResponseContent_stillWorksNormally() throws Exception {
|
||||||
// Returning null only affects logging.
|
// Returning null only affects logging.
|
||||||
when(httpUrlConnection.getInputStream()).thenReturn(new ByteArrayInputStream(new byte[] {}));
|
when(httpUrlConnection.getInputStream()).thenReturn(new ByteArrayInputStream(new byte[] {}));
|
||||||
testRun("claims", "claims-landrush1.tld", "claims-landrush2.tld", CLAIMS_CSV, false);
|
testRun("claims", "claims-landrush1.tld", "claims-landrush2.tld", CLAIMS_CSV);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -268,7 +257,7 @@ class NordnUploadActionTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void persistClaimsModeDomain() {
|
private void persistClaimsModeDomain() {
|
||||||
persistDomainAndEnqueueLordn(
|
persistResource(
|
||||||
newDomain("claims-landrush2.tld")
|
newDomain("claims-landrush2.tld")
|
||||||
.asBuilder()
|
.asBuilder()
|
||||||
.setCreationTimeForTest(clock.nowUtc())
|
.setCreationTimeForTest(clock.nowUtc())
|
||||||
|
@ -278,7 +267,7 @@ class NordnUploadActionTest {
|
||||||
.setLordnPhase(LordnPhase.CLAIMS)
|
.setLordnPhase(LordnPhase.CLAIMS)
|
||||||
.build());
|
.build());
|
||||||
clock.advanceBy(Duration.standardDays(1));
|
clock.advanceBy(Duration.standardDays(1));
|
||||||
persistDomainAndEnqueueLordn(
|
persistResource(
|
||||||
newDomain("claims-landrush1.tld")
|
newDomain("claims-landrush1.tld")
|
||||||
.asBuilder()
|
.asBuilder()
|
||||||
.setCreationTimeForTest(clock.nowUtc())
|
.setCreationTimeForTest(clock.nowUtc())
|
||||||
|
@ -289,7 +278,7 @@ class NordnUploadActionTest {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void persistSunriseModeDomain() {
|
private void persistSunriseModeDomain() {
|
||||||
persistDomainAndEnqueueLordn(
|
persistResource(
|
||||||
newDomain("sunrise2.tld")
|
newDomain("sunrise2.tld")
|
||||||
.asBuilder()
|
.asBuilder()
|
||||||
.setCreationTimeForTest(clock.nowUtc())
|
.setCreationTimeForTest(clock.nowUtc())
|
||||||
|
@ -298,7 +287,7 @@ class NordnUploadActionTest {
|
||||||
.setLordnPhase(LordnPhase.SUNRISE)
|
.setLordnPhase(LordnPhase.SUNRISE)
|
||||||
.build());
|
.build());
|
||||||
clock.advanceBy(Duration.standardDays(1));
|
clock.advanceBy(Duration.standardDays(1));
|
||||||
persistDomainAndEnqueueLordn(
|
persistResource(
|
||||||
newDomain("sunrise1.tld")
|
newDomain("sunrise1.tld")
|
||||||
.asBuilder()
|
.asBuilder()
|
||||||
.setCreationTimeForTest(clock.nowUtc())
|
.setCreationTimeForTest(clock.nowUtc())
|
||||||
|
@ -320,10 +309,7 @@ class NordnUploadActionTest {
|
||||||
assertThat(domain.getLordnPhase()).isEqualTo(LordnPhase.NONE);
|
assertThat(domain.getLordnPhase()).isEqualTo(LordnPhase.NONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void testRun(
|
private void testRun(String phase, String domain1, String domain2, String csv) throws Exception {
|
||||||
String phase, String domain1, String domain2, String csv, boolean usePullQueue)
|
|
||||||
throws Exception {
|
|
||||||
action.usePullQueue = Optional.of(usePullQueue);
|
|
||||||
action.phase = phase;
|
action.phase = phase;
|
||||||
action.run();
|
action.run();
|
||||||
verify(httpUrlConnection)
|
verify(httpUrlConnection)
|
||||||
|
@ -335,18 +321,8 @@ class NordnUploadActionTest {
|
||||||
assertThat(httpUrlConnection.getURL())
|
assertThat(httpUrlConnection.getURL())
|
||||||
.isEqualTo(new URL("http://127.0.0.1/LORDN/tld/" + phase));
|
.isEqualTo(new URL("http://127.0.0.1/LORDN/tld/" + phase));
|
||||||
assertThat(connectionOutputStream.toString(UTF_8)).contains(csv);
|
assertThat(connectionOutputStream.toString(UTF_8)).contains(csv);
|
||||||
if (!usePullQueue) {
|
|
||||||
verifyColumnCleared(domain1);
|
verifyColumnCleared(domain1);
|
||||||
verifyColumnCleared(domain2);
|
verifyColumnCleared(domain2);
|
||||||
} else {
|
|
||||||
assertThat(
|
|
||||||
getQueue("lordn-" + phase)
|
|
||||||
.leaseTasks(
|
|
||||||
LeaseOptions.Builder.withTag("tld")
|
|
||||||
.leasePeriod(1, TimeUnit.HOURS)
|
|
||||||
.countLimit(100)))
|
|
||||||
.isEmpty();
|
|
||||||
}
|
|
||||||
cloudTasksHelper.assertTasksEnqueued(
|
cloudTasksHelper.assertTasksEnqueued(
|
||||||
NordnVerifyAction.QUEUE,
|
NordnVerifyAction.QUEUE,
|
||||||
new TaskMatcher()
|
new TaskMatcher()
|
||||||
|
|
|
@ -21,7 +21,6 @@ import org.junit.runners.Suite.SuiteClasses;
|
||||||
/** Convenience class to run all TMCH tests inside IDE with one keystroke. */
|
/** Convenience class to run all TMCH tests inside IDE with one keystroke. */
|
||||||
@RunWith(Suite.class)
|
@RunWith(Suite.class)
|
||||||
@SuiteClasses({
|
@SuiteClasses({
|
||||||
LordnTaskUtilsTest.class,
|
|
||||||
NordnUploadAction.class,
|
NordnUploadAction.class,
|
||||||
NordnVerifyAction.class,
|
NordnVerifyAction.class,
|
||||||
SmdrlCsvParserTest.class,
|
SmdrlCsvParserTest.class,
|
||||||
|
|
Loading…
Add table
Reference in a new issue