mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 20:17:51 +02:00
Record transaction for domain adds, renews and allocates
This is the second of many cls adding explicit logging in all our domain mutation flows to facilitate transaction reporting. Adds and renews each result in a +1 counter for the NET_ADDS/RENEWS_#_YR field, which I've added simple (# of years, add or renew) -> Enum functions to get. Allocates are just a special case of adds, and are counted in a similar manner. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=165963249
This commit is contained in:
parent
cb854f1b8b
commit
c40dc67c5b
8 changed files with 170 additions and 24 deletions
|
@ -32,6 +32,7 @@ import static google.registry.model.EppResourceUtils.createDomainRepoId;
|
||||||
import static google.registry.model.EppResourceUtils.loadDomainApplication;
|
import static google.registry.model.EppResourceUtils.loadDomainApplication;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation;
|
import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation;
|
||||||
|
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
|
||||||
import static google.registry.pricing.PricingEngineProxy.getDomainCreateCost;
|
import static google.registry.pricing.PricingEngineProxy.getDomainCreateCost;
|
||||||
import static google.registry.util.CollectionUtils.isNullOrEmpty;
|
import static google.registry.util.CollectionUtils.isNullOrEmpty;
|
||||||
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
||||||
|
@ -85,12 +86,15 @@ import google.registry.model.poll.PendingActionNotificationResponse.DomainPendin
|
||||||
import google.registry.model.poll.PollMessage;
|
import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
import google.registry.model.registry.label.ReservationType;
|
import google.registry.model.registry.label.ReservationType;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
||||||
import google.registry.tmch.LordnTask;
|
import google.registry.tmch.LordnTask;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
import org.joda.time.Duration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An EPP flow that allocates a new domain resource from a domain application.
|
* An EPP flow that allocates a new domain resource from a domain application.
|
||||||
|
@ -156,7 +160,8 @@ public class DomainAllocateFlow implements TransactionalFlow {
|
||||||
loadAndValidateApplication(allocateCreate.getApplicationRoid(), now);
|
loadAndValidateApplication(allocateCreate.getApplicationRoid(), now);
|
||||||
String repoId = createDomainRepoId(ObjectifyService.allocateId(), registry.getTldStr());
|
String repoId = createDomainRepoId(ObjectifyService.allocateId(), registry.getTldStr());
|
||||||
ImmutableSet.Builder<ImmutableObject> entitiesToSave = new ImmutableSet.Builder<>();
|
ImmutableSet.Builder<ImmutableObject> entitiesToSave = new ImmutableSet.Builder<>();
|
||||||
HistoryEntry historyEntry = buildHistoryEntry(repoId, period, now);
|
HistoryEntry historyEntry = buildHistoryEntry(
|
||||||
|
repoId, period, now, registry.getAddGracePeriodLength(), registry.getTldStr());
|
||||||
entitiesToSave.add(historyEntry);
|
entitiesToSave.add(historyEntry);
|
||||||
ImmutableSet<? extends ImmutableObject> billsAndPolls = createBillingEventsAndPollMessages(
|
ImmutableSet<? extends ImmutableObject> billsAndPolls = createBillingEventsAndPollMessages(
|
||||||
domainName, application, historyEntry, isSunrushAddGracePeriod, registry, now, years);
|
domainName, application, historyEntry, isSunrushAddGracePeriod, registry, now, years);
|
||||||
|
@ -229,12 +234,18 @@ public class DomainAllocateFlow implements TransactionalFlow {
|
||||||
return application;
|
return application;
|
||||||
}
|
}
|
||||||
|
|
||||||
private HistoryEntry buildHistoryEntry(String repoId, Period period, DateTime now) {
|
private HistoryEntry buildHistoryEntry(
|
||||||
|
String repoId, Period period, DateTime now, Duration addGracePeriod, String tld) {
|
||||||
return historyBuilder
|
return historyBuilder
|
||||||
.setType(HistoryEntry.Type.DOMAIN_ALLOCATE)
|
.setType(HistoryEntry.Type.DOMAIN_ALLOCATE)
|
||||||
.setPeriod(period)
|
.setPeriod(period)
|
||||||
.setModificationTime(now)
|
.setModificationTime(now)
|
||||||
.setParent(Key.create(DomainResource.class, repoId))
|
.setParent(Key.create(DomainResource.class, repoId))
|
||||||
|
.setDomainTransactionRecord(
|
||||||
|
DomainTransactionRecord.create(
|
||||||
|
tld,
|
||||||
|
now.plus(addGracePeriod),
|
||||||
|
TransactionFieldAmount.create(netAddsFieldFromYears(period.getValue()), 1)))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,7 @@ import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBIT
|
||||||
import static google.registry.model.index.DomainApplicationIndex.loadActiveApplicationsByDomainName;
|
import static google.registry.model.index.DomainApplicationIndex.loadActiveApplicationsByDomainName;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation;
|
import static google.registry.model.registry.label.ReservedList.matchesAnchorTenantReservation;
|
||||||
|
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
|
||||||
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
import static google.registry.util.DateTimeUtils.END_OF_TIME;
|
||||||
import static google.registry.util.DateTimeUtils.leapSafeAddYears;
|
import static google.registry.util.DateTimeUtils.leapSafeAddYears;
|
||||||
|
|
||||||
|
@ -98,11 +99,14 @@ import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.poll.PollMessage.Autorenew;
|
import google.registry.model.poll.PollMessage.Autorenew;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
import google.registry.model.registry.Registry.TldState;
|
import google.registry.model.registry.Registry.TldState;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
||||||
import google.registry.tmch.LordnTask;
|
import google.registry.tmch.LordnTask;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
import org.joda.time.Duration;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An EPP flow that creates a new domain resource.
|
* An EPP flow that creates a new domain resource.
|
||||||
|
@ -258,7 +262,8 @@ public class DomainCreateFlow implements TransactionalFlow {
|
||||||
validateSecDnsExtension(eppInput.getSingleExtension(SecDnsCreateExtension.class));
|
validateSecDnsExtension(eppInput.getSingleExtension(SecDnsCreateExtension.class));
|
||||||
String repoId = createDomainRepoId(ObjectifyService.allocateId(), registry.getTldStr());
|
String repoId = createDomainRepoId(ObjectifyService.allocateId(), registry.getTldStr());
|
||||||
DateTime registrationExpirationTime = leapSafeAddYears(now, years);
|
DateTime registrationExpirationTime = leapSafeAddYears(now, years);
|
||||||
HistoryEntry historyEntry = buildHistoryEntry(repoId, period, now);
|
HistoryEntry historyEntry = buildHistoryEntry(
|
||||||
|
repoId, period, now, registry.getAddGracePeriodLength(), registry.getTldStr());
|
||||||
// Bill for the create.
|
// Bill for the create.
|
||||||
BillingEvent.OneTime createBillingEvent =
|
BillingEvent.OneTime createBillingEvent =
|
||||||
createOneTimeBillingEvent(
|
createOneTimeBillingEvent(
|
||||||
|
@ -360,12 +365,18 @@ public class DomainCreateFlow implements TransactionalFlow {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private HistoryEntry buildHistoryEntry(String repoId, Period period, DateTime now) {
|
private HistoryEntry buildHistoryEntry(
|
||||||
|
String repoId, Period period, DateTime now, Duration addGracePeriod, String tld) {
|
||||||
return historyBuilder
|
return historyBuilder
|
||||||
.setType(HistoryEntry.Type.DOMAIN_CREATE)
|
.setType(HistoryEntry.Type.DOMAIN_CREATE)
|
||||||
.setPeriod(period)
|
.setPeriod(period)
|
||||||
.setModificationTime(now)
|
.setModificationTime(now)
|
||||||
.setParent(Key.create(DomainResource.class, repoId))
|
.setParent(Key.create(DomainResource.class, repoId))
|
||||||
|
.setDomainTransactionRecord(
|
||||||
|
DomainTransactionRecord.create(
|
||||||
|
tld,
|
||||||
|
now.plus(addGracePeriod),
|
||||||
|
TransactionFieldAmount.create(netAddsFieldFromYears(period.getValue()), 1)))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@ import static google.registry.flows.domain.DomainFlowUtils.validateFeeChallenge;
|
||||||
import static google.registry.flows.domain.DomainFlowUtils.validateRegistrationPeriod;
|
import static google.registry.flows.domain.DomainFlowUtils.validateRegistrationPeriod;
|
||||||
import static google.registry.flows.domain.DomainFlowUtils.verifyUnitIsYears;
|
import static google.registry.flows.domain.DomainFlowUtils.verifyUnitIsYears;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
|
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netRenewsFieldFromYears;
|
||||||
import static google.registry.util.DateTimeUtils.leapSafeAddYears;
|
import static google.registry.util.DateTimeUtils.leapSafeAddYears;
|
||||||
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
|
@ -56,6 +57,7 @@ import google.registry.model.domain.DomainCommand.Renew;
|
||||||
import google.registry.model.domain.DomainRenewData;
|
import google.registry.model.domain.DomainRenewData;
|
||||||
import google.registry.model.domain.DomainResource;
|
import google.registry.model.domain.DomainResource;
|
||||||
import google.registry.model.domain.GracePeriod;
|
import google.registry.model.domain.GracePeriod;
|
||||||
|
import google.registry.model.domain.Period;
|
||||||
import google.registry.model.domain.fee.BaseFee.FeeType;
|
import google.registry.model.domain.fee.BaseFee.FeeType;
|
||||||
import google.registry.model.domain.fee.Fee;
|
import google.registry.model.domain.fee.Fee;
|
||||||
import google.registry.model.domain.fee.FeeRenewCommandExtension;
|
import google.registry.model.domain.fee.FeeRenewCommandExtension;
|
||||||
|
@ -69,11 +71,14 @@ import google.registry.model.eppinput.ResourceCommand;
|
||||||
import google.registry.model.eppoutput.EppResponse;
|
import google.registry.model.eppoutput.EppResponse;
|
||||||
import google.registry.model.poll.PollMessage;
|
import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An EPP flow that renews a domain.
|
* An EPP flow that renews a domain.
|
||||||
|
@ -150,12 +155,9 @@ public final class DomainRenewFlow implements TransactionalFlow {
|
||||||
.setNow(now)
|
.setNow(now)
|
||||||
.setYears(years)
|
.setYears(years)
|
||||||
.build());
|
.build());
|
||||||
HistoryEntry historyEntry = historyBuilder
|
Registry registry = Registry.get(existingDomain.getTld());
|
||||||
.setType(HistoryEntry.Type.DOMAIN_RENEW)
|
HistoryEntry historyEntry = buildHistoryEntry(
|
||||||
.setPeriod(command.getPeriod())
|
existingDomain, command.getPeriod(), now, registry.getRenewGracePeriodLength());
|
||||||
.setModificationTime(now)
|
|
||||||
.setParent(Key.create(existingDomain))
|
|
||||||
.build();
|
|
||||||
String tld = existingDomain.getTld();
|
String tld = existingDomain.getTld();
|
||||||
// Bill for this explicit renew itself.
|
// Bill for this explicit renew itself.
|
||||||
BillingEvent.OneTime explicitRenewEvent =
|
BillingEvent.OneTime explicitRenewEvent =
|
||||||
|
@ -211,6 +213,21 @@ public final class DomainRenewFlow implements TransactionalFlow {
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private HistoryEntry buildHistoryEntry(
|
||||||
|
DomainResource existingDomain, Period period, DateTime now, Duration renewGracePeriod) {
|
||||||
|
return historyBuilder
|
||||||
|
.setType(HistoryEntry.Type.DOMAIN_RENEW)
|
||||||
|
.setPeriod(period)
|
||||||
|
.setModificationTime(now)
|
||||||
|
.setParent(Key.create(existingDomain))
|
||||||
|
.setDomainTransactionRecord(
|
||||||
|
DomainTransactionRecord.create(
|
||||||
|
existingDomain.getTld(),
|
||||||
|
now.plus(renewGracePeriod),
|
||||||
|
TransactionFieldAmount.create(netRenewsFieldFromYears(period.getValue()), 1)))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
private void verifyRenewAllowed(
|
private void verifyRenewAllowed(
|
||||||
Optional<AuthInfo> authInfo,
|
Optional<AuthInfo> authInfo,
|
||||||
DomainResource existingDomain,
|
DomainResource existingDomain,
|
||||||
|
|
|
@ -173,18 +173,13 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow {
|
||||||
}
|
}
|
||||||
|
|
||||||
private HistoryEntry buildHistoryEntry(DomainResource existingDomain, DateTime now) {
|
private HistoryEntry buildHistoryEntry(DomainResource existingDomain, DateTime now) {
|
||||||
DomainTransactionRecord transactionRecord =
|
|
||||||
new DomainTransactionRecord.Builder()
|
|
||||||
.setTld(existingDomain.getTld())
|
|
||||||
.setReportingTime(now)
|
|
||||||
.setTransactionFieldAmounts(
|
|
||||||
ImmutableSet.of(TransactionFieldAmount.create(RESTORED_DOMAINS, 1)))
|
|
||||||
.build();
|
|
||||||
return historyBuilder
|
return historyBuilder
|
||||||
.setType(HistoryEntry.Type.DOMAIN_RESTORE)
|
.setType(HistoryEntry.Type.DOMAIN_RESTORE)
|
||||||
.setModificationTime(now)
|
.setModificationTime(now)
|
||||||
.setParent(Key.create(existingDomain))
|
.setParent(Key.create(existingDomain))
|
||||||
.setDomainTransactionRecord(transactionRecord)
|
.setDomainTransactionRecord(
|
||||||
|
DomainTransactionRecord.create(
|
||||||
|
existingDomain.getTld(), now, TransactionFieldAmount.create(RESTORED_DOMAINS, 1)))
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
package google.registry.model.reporting;
|
package google.registry.model.reporting;
|
||||||
|
|
||||||
|
import static com.google.common.base.Preconditions.checkArgument;
|
||||||
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
|
import static google.registry.util.PreconditionsUtils.checkArgumentNotNull;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableSet;
|
import com.google.common.collect.ImmutableSet;
|
||||||
|
@ -118,7 +119,28 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
|
||||||
TRANSFER_LOSING_NACKED,
|
TRANSFER_LOSING_NACKED,
|
||||||
DELETED_DOMAINS_GRACE,
|
DELETED_DOMAINS_GRACE,
|
||||||
DELETED_DOMAINS_NOGRACE,
|
DELETED_DOMAINS_NOGRACE,
|
||||||
RESTORED_DOMAINS
|
RESTORED_DOMAINS;
|
||||||
|
|
||||||
|
/** Boilerplate to simplify getting the NET_ADDS_#_YR enum from a number of years. */
|
||||||
|
public static TransactionReportField netAddsFieldFromYears(int years) {
|
||||||
|
return nameToField("NET_ADDS_%d_YR", years);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Boilerplate to simplify getting the NET_RENEWS_#_YR enum from a number of years. */
|
||||||
|
public static TransactionReportField netRenewsFieldFromYears(int years) {
|
||||||
|
return nameToField("NET_RENEWS_%d_YR", years);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static TransactionReportField nameToField(String enumTemplate, int years) {
|
||||||
|
checkArgument(
|
||||||
|
years >= 1 && years <= 10, "domain add and renew years must be between 1 and 10");
|
||||||
|
try {
|
||||||
|
return TransactionReportField.valueOf(String.format(enumTemplate, years));
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
throw new IllegalArgumentException(
|
||||||
|
"Unexpected error converting add/renew years to enum TransactionReportField", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,6 +156,19 @@ public class DomainTransactionRecord extends ImmutableObject implements Buildabl
|
||||||
return transactionFieldAmounts;
|
return transactionFieldAmounts;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** An alternative construction method when the builder is not necessary. */
|
||||||
|
public static DomainTransactionRecord create(
|
||||||
|
String tld,
|
||||||
|
DateTime reportingTime,
|
||||||
|
TransactionFieldAmount... transactionFieldAmounts) {
|
||||||
|
return new DomainTransactionRecord.Builder()
|
||||||
|
.setTld(tld)
|
||||||
|
// We report this event when the grace period ends, if applicable
|
||||||
|
.setReportingTime(reportingTime)
|
||||||
|
.setTransactionFieldAmounts(ImmutableSet.copyOf(transactionFieldAmounts))
|
||||||
|
.build();
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Builder asBuilder() {
|
public Builder asBuilder() {
|
||||||
return new Builder(clone(this));
|
return new Builder(clone(this));
|
||||||
|
|
|
@ -18,6 +18,7 @@ import static com.google.common.io.BaseEncoding.base16;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static google.registry.model.EppResourceUtils.loadDomainApplication;
|
import static google.registry.model.EppResourceUtils.loadDomainApplication;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
|
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
|
||||||
import static google.registry.testing.DatastoreHelper.assertBillingEvents;
|
import static google.registry.testing.DatastoreHelper.assertBillingEvents;
|
||||||
import static google.registry.testing.DatastoreHelper.createTld;
|
import static google.registry.testing.DatastoreHelper.createTld;
|
||||||
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
|
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
|
||||||
|
@ -71,6 +72,8 @@ import google.registry.model.poll.PendingActionNotificationResponse.DomainPendin
|
||||||
import google.registry.model.poll.PollMessage;
|
import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
import google.registry.model.registry.Registry.TldState;
|
import google.registry.model.registry.Registry.TldState;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import google.registry.model.smd.EncodedSignedMark;
|
import google.registry.model.smd.EncodedSignedMark;
|
||||||
import google.registry.testing.TaskQueueHelper.TaskMatcher;
|
import google.registry.testing.TaskQueueHelper.TaskMatcher;
|
||||||
|
@ -106,10 +109,14 @@ public class DomainAllocateFlowTest
|
||||||
|
|
||||||
private void setupDomainApplication(String tld, TldState tldState) throws Exception {
|
private void setupDomainApplication(String tld, TldState tldState) throws Exception {
|
||||||
createTld(tld, tldState);
|
createTld(tld, tldState);
|
||||||
persistResource(Registry.get(tld).asBuilder().setReservedLists(persistReservedList(
|
persistResource(Registry.get(tld).asBuilder()
|
||||||
tld + "-reserved",
|
.setReservedLists(
|
||||||
"reserved-label,FULLY_BLOCKED",
|
persistReservedList(
|
||||||
"collision-label,NAME_COLLISION")).build());
|
tld + "-reserved",
|
||||||
|
"reserved-label,FULLY_BLOCKED",
|
||||||
|
"collision-label,NAME_COLLISION"))
|
||||||
|
.setAddGracePeriodLength(Duration.standardMinutes(9))
|
||||||
|
.build());
|
||||||
String domainName = getUniqueIdFromCommand();
|
String domainName = getUniqueIdFromCommand();
|
||||||
application = persistResource(newDomainApplication(domainName).asBuilder()
|
application = persistResource(newDomainApplication(domainName).asBuilder()
|
||||||
.setCreationTrid(TRID)
|
.setCreationTrid(TRID)
|
||||||
|
@ -586,7 +593,7 @@ public class DomainAllocateFlowTest
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSucess_quietPeriod() throws Exception {
|
public void testSuccess_quietPeriod() throws Exception {
|
||||||
setupDomainApplication("tld", TldState.QUIET_PERIOD);
|
setupDomainApplication("tld", TldState.QUIET_PERIOD);
|
||||||
createTld("tld", TldState.QUIET_PERIOD);
|
createTld("tld", TldState.QUIET_PERIOD);
|
||||||
doSuccessfulTest(2);
|
doSuccessfulTest(2);
|
||||||
|
@ -655,4 +662,25 @@ public class DomainAllocateFlowTest
|
||||||
// Ensure we log the client ID for srs-dom-create so we can also use it for attempted-adds.
|
// Ensure we log the client ID for srs-dom-create so we can also use it for attempted-adds.
|
||||||
assertClientIdFieldLogged("TheRegistrar");
|
assertClientIdFieldLogged("TheRegistrar");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIcannTransactionRecord_getsStored() throws Exception {
|
||||||
|
setupDomainApplication("tld", TldState.QUIET_PERIOD);
|
||||||
|
persistResource(
|
||||||
|
Registry.get("tld")
|
||||||
|
.asBuilder()
|
||||||
|
.setRenewGracePeriodLength(Duration.standardMinutes(9))
|
||||||
|
.build());
|
||||||
|
runFlow(CommitMode.LIVE, UserPrivileges.SUPERUSER);
|
||||||
|
DomainResource domain = reloadResourceByForeignKey();
|
||||||
|
HistoryEntry historyEntry =
|
||||||
|
getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_ALLOCATE);
|
||||||
|
DomainTransactionRecord transactionRecord = historyEntry.getDomainTransactionRecord();
|
||||||
|
|
||||||
|
assertThat(transactionRecord.getTld()).isEqualTo("tld");
|
||||||
|
assertThat(transactionRecord.getReportingTime())
|
||||||
|
.isEqualTo(historyEntry.getModificationTime().plusMinutes(9));
|
||||||
|
assertThat(transactionRecord.getTransactionFieldAmounts())
|
||||||
|
.containsExactly(TransactionFieldAmount.create(netAddsFieldFromYears(2), 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ import static google.registry.model.eppcommon.StatusValue.OK;
|
||||||
import static google.registry.model.eppcommon.StatusValue.SERVER_TRANSFER_PROHIBITED;
|
import static google.registry.model.eppcommon.StatusValue.SERVER_TRANSFER_PROHIBITED;
|
||||||
import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBITED;
|
import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBITED;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
|
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netAddsFieldFromYears;
|
||||||
import static google.registry.pricing.PricingEngineProxy.isDomainPremium;
|
import static google.registry.pricing.PricingEngineProxy.isDomainPremium;
|
||||||
import static google.registry.testing.DatastoreHelper.assertBillingEvents;
|
import static google.registry.testing.DatastoreHelper.assertBillingEvents;
|
||||||
import static google.registry.testing.DatastoreHelper.assertPollMessagesForResource;
|
import static google.registry.testing.DatastoreHelper.assertPollMessagesForResource;
|
||||||
|
@ -127,6 +128,8 @@ import google.registry.model.eppcommon.StatusValue;
|
||||||
import google.registry.model.poll.PollMessage;
|
import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
import google.registry.model.registry.Registry.TldState;
|
import google.registry.model.registry.Registry.TldState;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import google.registry.monitoring.whitebox.EppMetric;
|
import google.registry.monitoring.whitebox.EppMetric;
|
||||||
import google.registry.testing.DatastoreHelper;
|
import google.registry.testing.DatastoreHelper;
|
||||||
|
@ -1989,6 +1992,27 @@ public class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow,
|
||||||
assertClientIdFieldLogged("TheRegistrar");
|
assertClientIdFieldLogged("TheRegistrar");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIcannTransactionRecord_getsStored() throws Exception {
|
||||||
|
persistContactsAndHosts();
|
||||||
|
persistResource(
|
||||||
|
Registry.get("tld")
|
||||||
|
.asBuilder()
|
||||||
|
.setAddGracePeriodLength(Duration.standardMinutes(9))
|
||||||
|
.build());
|
||||||
|
runFlow();
|
||||||
|
DomainResource domain = reloadResourceByForeignKey();
|
||||||
|
HistoryEntry historyEntry = getHistoryEntries(domain).get(0);
|
||||||
|
DomainTransactionRecord transactionRecord =
|
||||||
|
historyEntry.getDomainTransactionRecord();
|
||||||
|
|
||||||
|
assertThat(transactionRecord.getTld()).isEqualTo("tld");
|
||||||
|
assertThat(transactionRecord.getReportingTime())
|
||||||
|
.isEqualTo(historyEntry.getModificationTime().plusMinutes(9));
|
||||||
|
assertThat(transactionRecord.getTransactionFieldAmounts())
|
||||||
|
.containsExactly(TransactionFieldAmount.create(netAddsFieldFromYears(2), 1));
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEppMetric_isSuccessfullyCreated() throws Exception {
|
public void testEppMetric_isSuccessfullyCreated() throws Exception {
|
||||||
persistContactsAndHosts();
|
persistContactsAndHosts();
|
||||||
|
|
|
@ -17,6 +17,7 @@ package google.registry.flows.domain;
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
import static google.registry.flows.domain.DomainTransferFlowTestCase.persistWithPendingTransfer;
|
import static google.registry.flows.domain.DomainTransferFlowTestCase.persistWithPendingTransfer;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
|
import static google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount.TransactionReportField.netRenewsFieldFromYears;
|
||||||
import static google.registry.testing.DatastoreHelper.assertBillingEvents;
|
import static google.registry.testing.DatastoreHelper.assertBillingEvents;
|
||||||
import static google.registry.testing.DatastoreHelper.createTld;
|
import static google.registry.testing.DatastoreHelper.createTld;
|
||||||
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
|
import static google.registry.testing.DatastoreHelper.getOnlyHistoryEntryOfType;
|
||||||
|
@ -58,6 +59,8 @@ import google.registry.model.domain.rgp.GracePeriodStatus;
|
||||||
import google.registry.model.eppcommon.StatusValue;
|
import google.registry.model.eppcommon.StatusValue;
|
||||||
import google.registry.model.poll.PollMessage;
|
import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.registry.Registry;
|
import google.registry.model.registry.Registry;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord;
|
||||||
|
import google.registry.model.reporting.DomainTransactionRecord.TransactionFieldAmount;
|
||||||
import google.registry.model.reporting.HistoryEntry;
|
import google.registry.model.reporting.HistoryEntry;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import org.joda.money.Money;
|
import org.joda.money.Money;
|
||||||
|
@ -660,4 +663,26 @@ public class DomainRenewFlowTest extends ResourceFlowTestCase<DomainRenewFlow, D
|
||||||
assertIcannReportingActivityFieldLogged("srs-dom-renew");
|
assertIcannReportingActivityFieldLogged("srs-dom-renew");
|
||||||
assertTldsFieldLogged("tld");
|
assertTldsFieldLogged("tld");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIcannTransactionRecord_getsStored() throws Exception {
|
||||||
|
persistDomain();
|
||||||
|
// Test with a nonstandard Renew period to ensure the reporting time is correct regardless
|
||||||
|
persistResource(
|
||||||
|
Registry.get("tld")
|
||||||
|
.asBuilder()
|
||||||
|
.setRenewGracePeriodLength(Duration.standardMinutes(9))
|
||||||
|
.build());
|
||||||
|
runFlow();
|
||||||
|
DomainResource domain = reloadResourceByForeignKey();
|
||||||
|
HistoryEntry historyEntry =
|
||||||
|
getOnlyHistoryEntryOfType(domain, HistoryEntry.Type.DOMAIN_RENEW);
|
||||||
|
DomainTransactionRecord transactionRecord = historyEntry.getDomainTransactionRecord();
|
||||||
|
|
||||||
|
assertThat(transactionRecord.getTld()).isEqualTo("tld");
|
||||||
|
assertThat(transactionRecord.getReportingTime())
|
||||||
|
.isEqualTo(historyEntry.getModificationTime().plusMinutes(9));
|
||||||
|
assertThat(transactionRecord.getTransactionFieldAmounts())
|
||||||
|
.containsExactly(TransactionFieldAmount.create(netRenewsFieldFromYears(5), 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue