From cfa5699cc34c50e1c9c08502d65661ed459abd18 Mon Sep 17 00:00:00 2001 From: Lai Jiang Date: Fri, 19 Aug 2022 14:24:03 -0400 Subject: [PATCH] Remove ofy support from PollMessage (#1732) Also deletes the autorenew poll message history revision id field in Domain, which is only needed to recreate the ofy key for the poll message. The column already contains null values in it, making it impossible to depend on it. The column itself will be deleted from the schema after this PR is deployed. The logic to update autorenew recurrence end time is changed accordingly: When a poll message already exists, we simply update the endtime, but when it no longer exists, i. e. when it's deleted speculatively after a transfer request, we recreate one using the history entry id that resulted in its creation (e. g. cancelled or rejected transfer). This should fix b/240984498. Though the exact reason for that bug is still unclear to me. Namely, it throws an NPE at this line during an explicit domain transfer approval: https://cs.opensource.google/nomulus/nomulus/+/master:core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java;l=603;bpv=1;bpt=0;drc=ede919d7dcdb7f209b074563b3d449ebee19118a The domain in question has a null autorenewPollMessageHistoryId, but that in itself should not have caused an NPE because we are not operating on the null pointer. On that line the only possible way to throw an NPE is for the domain itself to be null, but if that were the case, the NPE would have been thrown at line 599 where we called a method on the domain object. Regardless of the cause, with this PR we are using an explicitly provided history id and checking for its nullness before using it. If a similar issue arises again, we should have a better idea why. Lastly, the way poll message id is constructed is largely simplified in PollMessageExternalKeyConverter as a result of the removal ofy parent keys in PollMessage. This does present a possibility of failure when immediately before deployment, a registrar requests a poll message and received the old id, but by the time the registrar acks the id, the new version is deployed and therefore does not recognize the old key. The likelihood of this happening should be slim, and we could have prevented it by letting the converter recognize both the old and the new key. However, we would like to eventually phase out the old key, and in theory a registrar could ack a poll message at any time after it was requested. So, there is not a safe time by which all the old ids are acked, lest we develop some elaborate scheme to keep track of which messages were sent with an old id when requested and which of these old ids are acked. Only then can we be truly safe to phase out the old id. The benefit does not seem to warrant the effort. If a registrar does encounter a situation like this, they could open a support bug to have us manually ack the poll message for them. --- .../flows/domain/DomainCreateFlow.java | 3 +- .../flows/domain/DomainDeleteFlow.java | 3 +- .../flows/domain/DomainFlowUtils.java | 34 ++-- .../flows/domain/DomainRenewFlow.java | 10 +- .../domain/DomainRestoreRequestFlow.java | 3 +- .../domain/DomainTransferApproveFlow.java | 10 +- .../domain/DomainTransferCancelFlow.java | 3 +- .../domain/DomainTransferRejectFlow.java | 3 +- .../domain/DomainTransferRequestFlow.java | 7 +- .../google/registry/model/EntityClasses.java | 4 - .../google/registry/model/domain/Domain.java | 23 +-- .../registry/model/domain/DomainBase.java | 20 +-- .../registry/model/poll/PollMessage.java | 146 +++++------------- .../poll/PollMessageExternalKeyConverter.java | 55 ++----- .../registry/tools/UnrenewDomainCommand.java | 9 +- .../batch/DeleteExpiredDomainsActionTest.java | 3 +- .../flows/EppLifecycleContactTest.java | 2 +- .../flows/EppLifecycleDomainTest.java | 14 +- .../flows/domain/DomainDeleteFlowTest.java | 6 +- .../flows/domain/DomainRenewFlowTest.java | 4 +- .../domain/DomainTransferCancelFlowTest.java | 2 +- .../registry/flows/poll/PollAckFlowTest.java | 37 ++--- .../model/common/ClassPathManagerTest.java | 3 - .../registry/model/domain/DomainSqlTest.java | 145 +---------------- .../registry/model/domain/DomainTest.java | 15 +- .../PollMessageExternalKeyConverterTest.java | 41 ++--- .../model/transfer/TransferDataTest.java | 17 +- .../rde/DomainToXjcConverterTest.java | 3 +- .../java/google/registry/rde/RdeFixtures.java | 3 +- .../registry/testing/DatabaseHelper.java | 3 +- .../tools/AckPollMessagesCommandTest.java | 20 +-- .../registry/tools/EppLifecycleToolsTest.java | 4 +- .../tools/UnrenewDomainCommandTest.java | 1 - ...domain_pending_action_immediate_delete.xml | 2 +- .../flows/poll/poll_response_autorenew.xml | 2 +- .../poll/poll_response_contact_delete.xml | 2 +- .../poll/poll_response_contact_transfer.xml | 2 +- ...l_response_domain_pending_notification.xml | 2 +- .../poll/poll_response_domain_transfer.xml | 2 +- ...oll_response_domain_transfer_no_cltrid.xml | 2 +- .../flows/poll/poll_response_host_delete.xml | 2 +- .../flows/poll_response_contact_transfer.xml | 2 +- .../flows/poll_response_server_hold.xml | 2 +- .../registry/flows/poll_response_unrenew.xml | 2 +- .../google/registry/model/schema.txt | 20 --- .../sql/schema/db-schema.sql.generated | 2 - 46 files changed, 188 insertions(+), 512 deletions(-) diff --git a/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java b/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java index f1355985b..edd5b307a 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainCreateFlow.java @@ -377,8 +377,7 @@ public final class DomainCreateFlow implements TransactionalFlow { .setIdnTableName(validateDomainNameWithIdnTables(domainName)) .setRegistrationExpirationTime(registrationExpirationTime) .setAutorenewBillingEvent(autorenewBillingEvent.createVKey()) - .setAutorenewPollMessage( - autorenewPollMessage.createVKey(), autorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(autorenewPollMessage.createVKey()) .setLaunchNotice(hasClaimsNotice ? launchCreate.get().getNotice() : null) .setSmdId(signedMarkId) .setDsData(secDnsCreate.map(SecDnsCreateExtension::getDsData).orElse(null)) diff --git a/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java b/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java index d75269b6d..4f36e43b9 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainDeleteFlow.java @@ -263,7 +263,8 @@ public final class DomainDeleteFlow implements TransactionalFlow { // the updated recurring billing event, we'll need it later and can't reload it. Recurring existingRecurring = tm().loadByKey(existingDomain.getAutorenewBillingEvent()); BillingEvent.Recurring recurringBillingEvent = - updateAutorenewRecurrenceEndTime(existingDomain, existingRecurring, now); + updateAutorenewRecurrenceEndTime( + existingDomain, existingRecurring, now, domainHistory.getDomainHistoryId()); // If there's a pending transfer, the gaining client's autorenew billing // event and poll message will already have been deleted in // ResourceDeleteFlow since it's listed in serverApproveEntities. diff --git a/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java b/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java index c920463cf..f5f642395 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java +++ b/core/src/main/java/google/registry/flows/domain/DomainFlowUtils.java @@ -591,7 +591,10 @@ public class DomainFlowUtils { *

Returns the new autorenew recurring billing event. */ public static Recurring updateAutorenewRecurrenceEndTime( - Domain domain, Recurring existingRecurring, DateTime newEndTime) { + Domain domain, + Recurring existingRecurring, + DateTime newEndTime, + @Nullable DomainHistoryId historyId) { Optional autorenewPollMessage = tm().loadByKeyIfPresent(domain.getAutorenewPollMessage()); @@ -599,20 +602,25 @@ public class DomainFlowUtils { // create a new one at the same id. This can happen if a transfer was requested on a domain // where all autorenew poll messages had already been delivered (this would cause the poll // message to be deleted), and then subsequently the transfer was canceled, rejected, or deleted - // (which would cause the poll message to be recreated here). - PollMessage.Autorenew updatedAutorenewPollMessage = - autorenewPollMessage.isPresent() - ? autorenewPollMessage.get().asBuilder().setAutorenewEndTime(newEndTime).build() - : newAutorenewPollMessage(domain) - .setId((Long) domain.getAutorenewPollMessage().getSqlKey()) - .setAutorenewEndTime(newEndTime) - .setDomainHistoryId( - new DomainHistoryId( - domain.getRepoId(), domain.getAutorenewPollMessageHistoryId())) - .build(); + // (which would cause the poll message to be recreated here). In the latter case, the history id + // of the event that created the new poll message will also be used. + PollMessage.Autorenew updatedAutorenewPollMessage; + if (autorenewPollMessage.isPresent()) { + updatedAutorenewPollMessage = + autorenewPollMessage.get().asBuilder().setAutorenewEndTime(newEndTime).build(); + } else { + checkNotNull( + historyId, "Cannot create a new autorenew poll message without a domain history id"); + updatedAutorenewPollMessage = + newAutorenewPollMessage(domain) + .setId((Long) domain.getAutorenewPollMessage().getSqlKey()) + .setAutorenewEndTime(newEndTime) + .setDomainHistoryId(historyId) + .build(); + } // If the resultant autorenew poll message would have no poll messages to deliver, then just - // delete it. Otherwise save it with the new end time. + // delete it. Otherwise, save it with the new end time. if (isAtOrAfter(updatedAutorenewPollMessage.getEventTime(), newEndTime)) { autorenewPollMessage.ifPresent(autorenew -> tm().delete(autorenew)); } else { diff --git a/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java b/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java index bd788f77b..901c2baf0 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainRenewFlow.java @@ -223,7 +223,11 @@ public final class DomainRenewFlow implements TransactionalFlow { .build(); // End the old autorenew billing event and poll message now. This may delete the poll message. Recurring existingRecurring = tm().loadByKey(existingDomain.getAutorenewBillingEvent()); - updateAutorenewRecurrenceEndTime(existingDomain, existingRecurring, now); + updateAutorenewRecurrenceEndTime( + existingDomain, + existingRecurring, + now, + new DomainHistoryId(domainHistoryKey.getParent().getName(), domainHistoryKey.getId())); Domain newDomain = existingDomain .asBuilder() @@ -231,9 +235,7 @@ public final class DomainRenewFlow implements TransactionalFlow { .setLastEppUpdateRegistrarId(registrarId) .setRegistrationExpirationTime(newExpirationTime) .setAutorenewBillingEvent(newAutorenewEvent.createVKey()) - .setAutorenewPollMessage( - newAutorenewPollMessage.createVKey(), - newAutorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(newAutorenewPollMessage.createVKey()) .addGracePeriod( GracePeriod.forBillingEvent( GracePeriodStatus.RENEW, existingDomain.getRepoId(), explicitRenewEvent)) diff --git a/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java b/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java index ee43fec81..556e557d5 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainRestoreRequestFlow.java @@ -251,8 +251,7 @@ public final class DomainRestoreRequestFlow implements TransactionalFlow { .setGracePeriods(null) .setDeletePollMessage(null) .setAutorenewBillingEvent(autorenewEvent.createVKey()) - .setAutorenewPollMessage( - autorenewPollMessage.createVKey(), autorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(autorenewPollMessage.createVKey()) // Clear the autorenew end time so if it had expired but is now explicitly being restored, // it won't immediately be deleted again. .setAutorenewEndTime(Optional.empty()) diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java index 3d6c90131..f47410d26 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferApproveFlow.java @@ -194,7 +194,11 @@ public final class DomainTransferApproveFlow implements TransactionalFlow { } // Close the old autorenew event and poll message at the transfer time (aka now). This may end // up deleting the poll message. - updateAutorenewRecurrenceEndTime(existingDomain, existingRecurring, now); + updateAutorenewRecurrenceEndTime( + existingDomain, + existingRecurring, + now, + new DomainHistoryId(domainHistoryKey.getParent().getName(), domainHistoryKey.getId())); DateTime newExpirationTime = computeExDateForApprovalTime(existingDomain, now, transferData.getTransferPeriod()); // Create a new autorenew event starting at the expiration time. @@ -240,9 +244,7 @@ public final class DomainTransferApproveFlow implements TransactionalFlow { .build()) .setRegistrationExpirationTime(newExpirationTime) .setAutorenewBillingEvent(autorenewEvent.createVKey()) - .setAutorenewPollMessage( - gainingClientAutorenewPollMessage.createVKey(), - gainingClientAutorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(gainingClientAutorenewPollMessage.createVKey()) // Remove all the old grace periods and add a new one for the transfer. .setGracePeriods( billingEvent diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java index feeeaa4d3..a12d6fc0b 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferCancelFlow.java @@ -116,7 +116,8 @@ public final class DomainTransferCancelFlow implements TransactionalFlow { // Reopen the autorenew event and poll message that we closed for the implicit transfer. This // may recreate the autorenew poll message if it was deleted when the transfer request was made. Recurring existingRecurring = tm().loadByKey(existingDomain.getAutorenewBillingEvent()); - updateAutorenewRecurrenceEndTime(existingDomain, existingRecurring, END_OF_TIME); + updateAutorenewRecurrenceEndTime( + existingDomain, existingRecurring, END_OF_TIME, domainHistory.getDomainHistoryId()); // Delete the billing event and poll messages that were written in case the transfer would have // been implicitly server approved. tm().delete(existingDomain.getTransferData().getServerApproveEntities()); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java index b9a2596d4..0b0f8d280 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferRejectFlow.java @@ -117,7 +117,8 @@ public final class DomainTransferRejectFlow implements TransactionalFlow { // Reopen the autorenew event and poll message that we closed for the implicit transfer. This // may end up recreating the poll message if it was deleted upon the transfer request. Recurring existingRecurring = tm().loadByKey(existingDomain.getAutorenewBillingEvent()); - updateAutorenewRecurrenceEndTime(existingDomain, existingRecurring, END_OF_TIME); + updateAutorenewRecurrenceEndTime( + existingDomain, existingRecurring, END_OF_TIME, domainHistory.getDomainHistoryId()); // Delete the billing event and poll messages that were written in case the transfer would have // been implicitly server approved. tm().delete(existingDomain.getTransferData().getServerApproveEntities()); diff --git a/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java b/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java index 1c5bd5dc7..6ea4a2b82 100644 --- a/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java +++ b/core/src/main/java/google/registry/flows/domain/DomainTransferRequestFlow.java @@ -57,6 +57,7 @@ import google.registry.model.billing.BillingEvent.Recurring; import google.registry.model.domain.Domain; import google.registry.model.domain.DomainCommand.Transfer; import google.registry.model.domain.DomainHistory; +import google.registry.model.domain.DomainHistory.DomainHistoryId; import google.registry.model.domain.Period; import google.registry.model.domain.fee.FeeTransferCommandExtension; import google.registry.model.domain.fee.FeeTransformResponseExtension; @@ -260,7 +261,11 @@ public final class DomainTransferRequestFlow implements TransactionalFlow { // the poll message if it has no events left. Note that if the automatic transfer succeeds, then // cloneProjectedAtTime() will replace these old autorenew entities with the server approve ones // that we've created in this flow and stored in pendingTransferData. - updateAutorenewRecurrenceEndTime(existingDomain, existingRecurring, automaticTransferTime); + updateAutorenewRecurrenceEndTime( + existingDomain, + existingRecurring, + automaticTransferTime, + new DomainHistoryId(domainHistoryKey.getParent().getName(), domainHistoryKey.getId())); Domain newDomain = existingDomain .asBuilder() diff --git a/core/src/main/java/google/registry/model/EntityClasses.java b/core/src/main/java/google/registry/model/EntityClasses.java index 02d99728a..822146390 100644 --- a/core/src/main/java/google/registry/model/EntityClasses.java +++ b/core/src/main/java/google/registry/model/EntityClasses.java @@ -28,7 +28,6 @@ import google.registry.model.host.HostHistory; import google.registry.model.index.EppResourceIndex; import google.registry.model.index.EppResourceIndexBucket; import google.registry.model.index.ForeignKeyIndex; -import google.registry.model.poll.PollMessage; import google.registry.model.rde.RdeRevision; import google.registry.model.registrar.Registrar; import google.registry.model.reporting.HistoryEntry; @@ -58,9 +57,6 @@ public final class EntityClasses { Host.class, HostHistory.class, Lock.class, - PollMessage.class, - PollMessage.Autorenew.class, - PollMessage.OneTime.class, RdeRevision.class, Registrar.class, ServerSecret.class); diff --git a/core/src/main/java/google/registry/model/domain/Domain.java b/core/src/main/java/google/registry/model/domain/Domain.java index bd655acab..96d1dfaa0 100644 --- a/core/src/main/java/google/registry/model/domain/Domain.java +++ b/core/src/main/java/google/registry/model/domain/Domain.java @@ -90,13 +90,13 @@ public class Domain extends DomainBase implements ForeignKeyedEppResource { @Access(AccessType.PROPERTY) @Column(name = "host_repo_id") public Set> getNsHosts() { - return super.nsHosts; + return nsHosts; } /** * Returns the set of {@link GracePeriod} associated with the domain. * - *

This is the getter method specific for Hibernate to access the field so it is set to + *

This is the getter method specific for Hibernate to access the field, so it is set to * private. The caller can use the public {@link #getGracePeriods()} to get the grace periods. * *

Note that we need to set `insertable = false, updatable = false` for @JoinColumn, otherwise @@ -104,10 +104,7 @@ public class Domain extends DomainBase implements ForeignKeyedEppResource { * deleting the whole entry from the table when the {@link GracePeriod} is removed from the set. */ @Access(AccessType.PROPERTY) - @OneToMany( - cascade = {CascadeType.ALL}, - fetch = FetchType.EAGER, - orphanRemoval = true) + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) @JoinColumn( name = "domainRepoId", referencedColumnName = "repoId", @@ -121,7 +118,7 @@ public class Domain extends DomainBase implements ForeignKeyedEppResource { /** * Returns the set of {@link DelegationSignerData} associated with the domain. * - *

This is the getter method specific for Hibernate to access the field so it is set to + *

This is the getter method specific for Hibernate to access the field, so it is set to * private. The caller can use the public {@link #getDsData()} to get the DS data. * *

Note that we need to set `insertable = false, updatable = false` for @JoinColumn, otherwise @@ -130,10 +127,7 @@ public class Domain extends DomainBase implements ForeignKeyedEppResource { * the set. */ @Access(AccessType.PROPERTY) - @OneToMany( - cascade = {CascadeType.ALL}, - fetch = FetchType.EAGER, - orphanRemoval = true) + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval = true) @JoinColumn( name = "domainRepoId", referencedColumnName = "repoId", @@ -182,10 +176,9 @@ public class Domain extends DomainBase implements ForeignKeyedEppResource { } public Builder copyFrom(DomainBase domainBase) { - this.getInstance().copyUpdateTimestamp(domainBase); - return this.setAuthInfo(domainBase.getAuthInfo()) - .setAutorenewPollMessage( - domainBase.getAutorenewPollMessage(), domainBase.getAutorenewPollMessageHistoryId()) + getInstance().copyUpdateTimestamp(domainBase); + return setAuthInfo(domainBase.getAuthInfo()) + .setAutorenewPollMessage(domainBase.getAutorenewPollMessage()) .setAutorenewBillingEvent(domainBase.getAutorenewBillingEvent()) .setAutorenewEndTime(domainBase.getAutorenewEndTime()) .setContacts(domainBase.getContacts()) diff --git a/core/src/main/java/google/registry/model/domain/DomainBase.java b/core/src/main/java/google/registry/model/domain/DomainBase.java index 75624daf4..f301b1412 100644 --- a/core/src/main/java/google/registry/model/domain/DomainBase.java +++ b/core/src/main/java/google/registry/model/domain/DomainBase.java @@ -216,13 +216,6 @@ public class DomainBase extends EppResource @Column(name = "autorenew_poll_message_id") VKey autorenewPollMessage; - /** - * History record for the autorenew poll message. - * - *

Here so we can restore the original ofy key from sql. - */ - @Ignore Long autorenewPollMessageHistoryId; - /** The unexpired grace periods for this domain (some of which may not be active yet). */ @Transient Set gracePeriods; @@ -322,10 +315,6 @@ public class DomainBase extends EppResource return autorenewPollMessage; } - public Long getAutorenewPollMessageHistoryId() { - return autorenewPollMessageHistoryId; - } - public ImmutableSet getGracePeriods() { return nullToEmptyImmutableCopy(gracePeriods); } @@ -509,9 +498,7 @@ public class DomainBase extends EppResource // Set the speculatively-written new autorenew events as the domain's autorenew // events. .setAutorenewBillingEvent(transferData.getServerApproveAutorenewEvent()) - .setAutorenewPollMessage( - transferData.getServerApproveAutorenewPollMessage(), - transferData.getServerApproveAutorenewPollMessageHistoryId()); + .setAutorenewPollMessage(transferData.getServerApproveAutorenewPollMessage()); if (transferData.getTransferPeriod().getValue() == 1) { // Set the grace period using a key to the prescheduled transfer billing event. Not using // GracePeriod.forBillingEvent() here in order to avoid the actual Datastore fetch. @@ -886,11 +873,8 @@ public class DomainBase extends EppResource return thisCastToDerived(); } - public B setAutorenewPollMessage( - @Nullable VKey autorenewPollMessage, - @Nullable Long autorenewPollMessageHistoryId) { + public B setAutorenewPollMessage(@Nullable VKey autorenewPollMessage) { getInstance().autorenewPollMessage = autorenewPollMessage; - getInstance().autorenewPollMessageHistoryId = autorenewPollMessageHistoryId; return thisCastToDerived(); } diff --git a/core/src/main/java/google/registry/model/poll/PollMessage.java b/core/src/main/java/google/registry/model/poll/PollMessage.java index 7a00c4e0e..2d3d6f867 100644 --- a/core/src/main/java/google/registry/model/poll/PollMessage.java +++ b/core/src/main/java/google/registry/model/poll/PollMessage.java @@ -20,18 +20,12 @@ import static google.registry.util.DateTimeUtils.END_OF_TIME; import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import com.google.common.collect.ImmutableList; -import com.googlecode.objectify.Key; -import com.googlecode.objectify.annotation.Entity; -import com.googlecode.objectify.annotation.EntitySubclass; -import com.googlecode.objectify.annotation.Id; -import com.googlecode.objectify.annotation.Ignore; -import com.googlecode.objectify.annotation.Index; import google.registry.model.Buildable; import google.registry.model.EppResource; import google.registry.model.ImmutableObject; import google.registry.model.UnsafeSerializable; import google.registry.model.annotations.ExternalMessagingName; -import google.registry.model.annotations.ReportedOn; +import google.registry.model.annotations.OfyIdAllocation; import google.registry.model.contact.ContactHistory; import google.registry.model.contact.ContactHistory.ContactHistoryId; import google.registry.model.contact.ContactResource; @@ -55,16 +49,19 @@ import google.registry.persistence.VKey; import google.registry.persistence.WithLongVKey; import google.registry.util.NullIgnoringCollectionBuilder; import java.util.Optional; -import javax.annotation.Nullable; import javax.persistence.AttributeOverride; import javax.persistence.AttributeOverrides; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; import javax.persistence.DiscriminatorValue; import javax.persistence.Embedded; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Index; import javax.persistence.Inheritance; import javax.persistence.InheritanceType; import javax.persistence.PostLoad; +import javax.persistence.Table; import org.joda.time.DateTime; /** @@ -76,10 +73,10 @@ import org.joda.time.DateTime; * retained for historical purposes, poll messages are truly deleted once they have been delivered * and ACKed. * - *

Poll messages are parented off of the {@link HistoryEntry} that resulted in their creation. - * This means that poll messages are contained in the Datastore entity group of the parent {@link - * EppResource} (which can be a domain, contact, or host). It is thus possible to perform a strongly - * consistent query to find all poll messages associated with a given EPP resource. + *

Poll messages have a reference to the revision id of the {@link HistoryEntry} that resulted in + * their creation or re-creation, in case of transfer cancellation/rejection. The revision ids are + * not used directly by the Java code, but their presence in the database makes it easier to + * diagnose potential issues related to poll messages. * *

Poll messages are identified externally by registrars using the format defined in {@link * PollMessageExternalKeyConverter}. @@ -88,16 +85,10 @@ import org.joda.time.DateTime; * Command */ @Entity -@ReportedOn @ExternalMessagingName("message") -@javax.persistence.Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn(name = "type") -@javax.persistence.Table( - indexes = { - @javax.persistence.Index(columnList = "registrar_id"), - @javax.persistence.Index(columnList = "eventTime") - }) +@Table(indexes = {@Index(columnList = "registrar_id"), @Index(columnList = "eventTime")}) public abstract class PollMessage extends ImmutableObject implements Buildable, TransferServerApproveEntity, UnsafeSerializable { @@ -108,9 +99,9 @@ public abstract class PollMessage extends ImmutableObject HOST(3L, Host.class); private final long id; - private final Class clazz; + private final Class clazz; - Type(long id, Class clazz) { + Type(long id, Class clazz) { this.id = id; this.clazz = clazz; } @@ -124,58 +115,40 @@ public abstract class PollMessage extends ImmutableObject } /** Returns the class of the underlying resource for the poll message type. */ - public Class getResourceClass() { + public Class getResourceClass() { return clazz; } - - /** - * Returns the type specified by the identifer, {@code Optional.empty()} if the id is out of - * range. - */ - public static Optional fromId(long id) { - for (Type val : values()) { - if (val.id == id) { - return Optional.of(val); - } - } - - return Optional.empty(); - } } /** Entity id. */ @Id - @javax.persistence.Id + @OfyIdAllocation @Column(name = "poll_message_id") Long id; /** The registrar that this poll message will be delivered to. */ - @Index @Column(name = "registrar_id", nullable = false) String clientId; /** The time when the poll message should be delivered. May be in the future. */ - @Index @Column(nullable = false) DateTime eventTime; - /** Human readable message that will be returned with this poll message. */ + /** Human-readable message that will be returned with this poll message. */ @Column(name = "message") String msg; - // TODO(b/456803336): Replace these fields with {Domain,Contact,Host}HistoryId objects. + String domainRepoId; - @Ignore String domainRepoId; + String contactRepoId; - @Ignore String contactRepoId; + String hostRepoId; - @Ignore String hostRepoId; + Long domainHistoryRevisionId; - @Ignore Long domainHistoryRevisionId; + Long contactHistoryRevisionId; - @Ignore Long contactHistoryRevisionId; - - @Ignore Long hostHistoryRevisionId; + Long hostHistoryRevisionId; public Long getId() { return id; @@ -228,32 +201,22 @@ public abstract class PollMessage extends ImmutableObject * the resource. */ public String getResourceName() { - return domainRepoId != null - ? domainRepoId - : (contactRepoId != null ? contactRepoId : hostRepoId); + return domainRepoId != null ? domainRepoId : contactRepoId != null ? contactRepoId : hostRepoId; } /** Gets the underlying history revision id, regardless of the type of the resource. */ public Long getHistoryRevisionId() { return domainHistoryRevisionId != null ? domainHistoryRevisionId - : (contactHistoryRevisionId != null ? contactHistoryRevisionId : hostHistoryRevisionId); + : contactHistoryRevisionId != null ? contactHistoryRevisionId : hostHistoryRevisionId; } public Type getType() { - return domainRepoId != null ? Type.DOMAIN : (contactRepoId != null ? Type.CONTACT : Type.HOST); + return domainRepoId != null ? Type.DOMAIN : contactRepoId != null ? Type.CONTACT : Type.HOST; } public abstract ImmutableList getResponseData(); - @Override - public abstract VKey createVKey(); - - /** Static VKey factory method for use by VKeyTranslatorFactory. */ - public static VKey createVKey(Key key) { - return VKey.create(PollMessage.class, key.getId(), key); - } - /** Override Buildable.asBuilder() to give this method stronger typing. */ @Override public abstract Builder asBuilder(); @@ -318,9 +281,11 @@ public abstract class PollMessage extends ImmutableObject // Set the appropriate field based on the history entry type. if (history instanceof DomainHistory) { return setDomainHistoryId(((DomainHistory) history).getDomainHistoryId()); - } else if (history instanceof ContactHistory) { + } + if (history instanceof ContactHistory) { return setContactHistoryId(((ContactHistory) history).getContactHistoryId()); - } else if (history instanceof HostHistory) { + } + if (history instanceof HostHistory) { return setHostHistoryId(((HostHistory) history).getHostHistoryId()); } return thisCastToDerived(); @@ -330,7 +295,7 @@ public abstract class PollMessage extends ImmutableObject * Given an array containing pairs of objects, verifies that both members of exactly one of the * pairs is non-null. */ - private boolean exactlyOnePairNonNull(Object... pairs) { + private static boolean exactlyOnePairNonNull(Object... pairs) { int count = 0; checkArgument(pairs.length % 2 == 0, "Odd number of arguments provided."); for (int i = 0; i < pairs.length; i += 2) { @@ -360,9 +325,9 @@ public abstract class PollMessage extends ImmutableObject instance.contactHistoryRevisionId, instance.hostRepoId, instance.hostHistoryRevisionId), - "the repo id and history revision id must be defined for exactly one of domain, " - + "contact or host: " - + instance); + "The repo id and history revision id must be defined for exactly one of domain, " + + "contact or host: %s", + instance); return super.build(); } } @@ -372,13 +337,11 @@ public abstract class PollMessage extends ImmutableObject * *

One-time poll messages are deleted from Datastore once they have been delivered and ACKed. */ - @EntitySubclass(index = false) - @javax.persistence.Entity + @Entity @DiscriminatorValue("ONE_TIME") @WithLongVKey(compositeKey = true) public static class OneTime extends PollMessage { - @Ignore @Embedded @AttributeOverrides({ @AttributeOverride( @@ -399,7 +362,6 @@ public abstract class PollMessage extends ImmutableObject }) PendingActionNotificationResponse pendingActionNotificationResponse; - @Ignore @Embedded @AttributeOverrides({ @AttributeOverride( @@ -420,35 +382,21 @@ public abstract class PollMessage extends ImmutableObject }) TransferResponse transferResponse; - @Ignore @Column(name = "transfer_response_domain_name") String fullyQualifiedDomainName; - @Ignore @Column(name = "transfer_response_domain_expiration_time") DateTime extendedRegistrationExpirationTime; - @Ignore @Column(name = "transfer_response_contact_id") String contactId; - @Ignore @Column(name = "transfer_response_host_id") String hostId; @Override public VKey createVKey() { - return VKey.create(OneTime.class, getId(), Key.create(this)); - } - - /** Converts an unspecialized VKey<PollMessage> to a VKey of the derived class. */ - public static @Nullable VKey convertVKey(@Nullable VKey key) { - if (key == null) { - return null; - } - Key ofyKey = - Key.create(key.getOfyKey().getParent(), OneTime.class, key.getOfyKey().getId()); - return VKey.create(OneTime.class, key.getSqlKey(), ofyKey); + return VKey.createSql(OneTime.class, getId()); } @Override @@ -525,8 +473,7 @@ public abstract class PollMessage extends ImmutableObject /** A builder for {@link OneTime} since it is immutable. */ public static class Builder extends PollMessage.Builder { - public Builder() { - } + public Builder() {} private Builder(OneTime instance) { super(instance); @@ -587,14 +534,13 @@ public abstract class PollMessage extends ImmutableObject } /** - * An auto-renew poll message which recurs annually. + * An autorenew poll message which recurs annually. * *

Auto-renew poll messages are not deleted until the registration of their parent domain has * been canceled, because there will always be a speculative renewal for next year until that * happens. */ - @EntitySubclass(index = false) - @javax.persistence.Entity + @Entity @DiscriminatorValue("AUTORENEW") @WithLongVKey(compositeKey = true) public static class Autorenew extends PollMessage { @@ -604,7 +550,6 @@ public abstract class PollMessage extends ImmutableObject String targetId; /** The autorenew recurs annually between {@link #eventTime} and this time. */ - @Index DateTime autorenewEndTime; public String getTargetId() { @@ -617,25 +562,14 @@ public abstract class PollMessage extends ImmutableObject @Override public VKey createVKey() { - return VKey.create(Autorenew.class, getId(), Key.create(this)); - } - - /** Converts an unspecialized VKey<PollMessage> to a VKey of the derived class. */ - public static @Nullable VKey convertVKey(VKey key) { - if (key == null) { - return null; - } - Key ofyKey = - Key.create(key.getOfyKey().getParent(), Autorenew.class, key.getOfyKey().getId()); - return VKey.create(Autorenew.class, key.getSqlKey(), ofyKey); + return VKey.createSql(Autorenew.class, getId()); } @Override public ImmutableList getResponseData() { - // Note that the event time is when the auto-renew occured, so the expiration time in the + // Note that the event time is when the autorenew occurred, so the expiration time in the // response should be 1 year past that, since it denotes the new expiration time. - return ImmutableList.of( - DomainRenewData.create(getTargetId(), getEventTime().plusYears(1))); + return ImmutableList.of(DomainRenewData.create(getTargetId(), getEventTime().plusYears(1))); } @Override diff --git a/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java b/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java index 78b0aa307..a27f7d066 100644 --- a/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java +++ b/core/src/main/java/google/registry/model/poll/PollMessageExternalKeyConverter.java @@ -14,48 +14,38 @@ package google.registry.model.poll; - import com.google.common.base.Splitter; -import com.googlecode.objectify.Key; -import google.registry.model.reporting.HistoryEntry; import google.registry.persistence.VKey; import java.util.List; /** * A converter between external key strings for {@link PollMessage}s (i.e. what registrars use to - * identify and ACK them) and Datastore keys to the resource. + * identify and ACK them) and {@link VKey}s to the resource. * - *

The format of the key string is A-B-C-D-E-F as follows: + *

The format of the key string is A-B as follows: * *

- *   A = EppResource.typeId (decimal)
- *   B = EppResource.repoId prefix (STRING)
- *   C = EppResource.repoId suffix (STRING)
- *   D = HistoryEntry.id (decimal)
- *   E = PollMessage.id (decimal)
- *   F = PollMessage.eventTime (decimal, year only)
+ *   A = PollMessage.id (decimal)
+ *   B = PollMessage.eventTime (decimal, year only)
  * 
* - *

A typical poll message ID might thus look like: 1-FE0F22-TLD-10071463070-10072612074-2018 + *

A typical poll message ID might thus look like: 10072612074-2018 */ -public class PollMessageExternalKeyConverter { +public final class PollMessageExternalKeyConverter { /** An exception thrown when an external key cannot be parsed. */ - public static class PollMessageExternalKeyParseException extends RuntimeException {} + public static class PollMessageExternalKeyParseException extends RuntimeException { + + private static final long serialVersionUID = 9026397649048831777L; + } /** Returns an external poll message ID for the given poll message. */ public static String makePollMessageExternalId(PollMessage pollMessage) { - return String.format( - "%d-%s-%d-%d-%d", - pollMessage.getType().getId(), - pollMessage.getResourceName(), - pollMessage.getHistoryRevisionId(), - pollMessage.getId(), - pollMessage.getEventTime().getYear()); + return String.format("%d-%d", pollMessage.getId(), pollMessage.getEventTime().getYear()); } /** - * Returns an Objectify Key to a PollMessage corresponding with the external ID. + * Returns a {@link VKey} to a {@link PollMessage} corresponding with the external ID. * *

Note that the year field that is included at the end of the poll message isn't actually used * for anything; it exists solely to create unique externally visible IDs for autorenews. We thus @@ -66,26 +56,13 @@ public class PollMessageExternalKeyConverter { */ public static VKey parsePollMessageExternalId(String externalKey) { List idComponents = Splitter.on('-').splitToList(externalKey); - if (idComponents.size() != 6) { + if (idComponents.size() != 2) { throw new PollMessageExternalKeyParseException(); } try { - Class resourceClazz = - PollMessage.Type.fromId(Long.parseLong(idComponents.get(0))) - .orElseThrow(() -> new PollMessageExternalKeyParseException()) - .getResourceClass(); - return VKey.from( - Key.create( - Key.create( - Key.create( - null, - resourceClazz, - String.format("%s-%s", idComponents.get(1), idComponents.get(2))), - HistoryEntry.class, - Long.parseLong(idComponents.get(3))), - PollMessage.class, - Long.parseLong(idComponents.get(4)))); - // Note that idComponents.get(5) is entirely ignored; we never use the year field internally. + Long id = Long.parseLong(idComponents.get(0)); + return VKey.createSql(PollMessage.class, id); + // Note that idComponents.get(1) is entirely ignored; we never use the year field internally. } catch (NumberFormatException e) { throw new PollMessageExternalKeyParseException(); } diff --git a/core/src/main/java/google/registry/tools/UnrenewDomainCommand.java b/core/src/main/java/google/registry/tools/UnrenewDomainCommand.java index 27ffdaed0..90e813c59 100644 --- a/core/src/main/java/google/registry/tools/UnrenewDomainCommand.java +++ b/core/src/main/java/google/registry/tools/UnrenewDomainCommand.java @@ -54,7 +54,7 @@ import org.joda.time.DateTime; *

This removes years off a domain's registration period. Note that the expiration time cannot be * set to prior than the present. Reversal of the charges for these years (if desired) must happen * out of band, as they may already have been billed out and thus cannot and won't be reversed in - * Datastore. + * the database. */ @Parameters(separators = " =", commandDescription = "Unrenew a domain.") @NonFinalForTesting @@ -217,7 +217,8 @@ class UnrenewDomainCommand extends ConfirmingCommand implements CommandWithRemot .build(); // End the old autorenew billing event and poll message now. Recurring existingRecurring = tm().loadByKey(domain.getAutorenewBillingEvent()); - updateAutorenewRecurrenceEndTime(domain, existingRecurring, now); + updateAutorenewRecurrenceEndTime( + domain, existingRecurring, now, domainHistory.getDomainHistoryId()); Domain newDomain = domain .asBuilder() @@ -225,9 +226,7 @@ class UnrenewDomainCommand extends ConfirmingCommand implements CommandWithRemot .setLastEppUpdateTime(now) .setLastEppUpdateRegistrarId(domain.getCurrentSponsorRegistrarId()) .setAutorenewBillingEvent(newAutorenewEvent.createVKey()) - .setAutorenewPollMessage( - newAutorenewPollMessage.createVKey(), - newAutorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(newAutorenewPollMessage.createVKey()) .build(); // In order to do it'll need to write out a new HistoryEntry (likely of type SYNTHETIC), a new // autorenew billing event and poll message, and a new one time poll message at the present time diff --git a/core/src/test/java/google/registry/batch/DeleteExpiredDomainsActionTest.java b/core/src/test/java/google/registry/batch/DeleteExpiredDomainsActionTest.java index 81cce4cda..6e69ccbdf 100644 --- a/core/src/test/java/google/registry/batch/DeleteExpiredDomainsActionTest.java +++ b/core/src/test/java/google/registry/batch/DeleteExpiredDomainsActionTest.java @@ -179,8 +179,7 @@ class DeleteExpiredDomainsActionTest { .asBuilder() .setAutorenewEndTime(Optional.of(clock.nowUtc().minusDays(10))) .setAutorenewBillingEvent(autorenewBillingEvent.createVKey()) - .setAutorenewPollMessage( - autorenewPollMessage.createVKey(), autorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(autorenewPollMessage.createVKey()) .build()); return pendingExpirationDomain; diff --git a/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java b/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java index d1355fad1..94f1d7acf 100644 --- a/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java +++ b/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java @@ -95,7 +95,7 @@ class EppLifecycleContactTest extends EppTestCase { .hasCommandName("PollRequest") .and() .hasStatus(SUCCESS_WITH_ACK_MESSAGE); - assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "2-1-ROID-3-6-2000")) + assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "6-2000")) .atTime("2000-06-08T22:02:00Z") .hasResponse("poll_ack_response_empty.xml"); assertThat(getRecordedEppMetric()) diff --git a/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java b/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java index f088a36da..9c4bc1aff 100644 --- a/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java +++ b/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java @@ -747,11 +747,11 @@ class EppLifecycleDomainTest extends EppTestCase { .hasResponse( "poll_response_autorenew.xml", ImmutableMap.of( - "ID", "1-B-EXAMPLE-12-15-2002", + "ID", "15-2002", "QDATE", "2002-06-01T00:04:00Z", "DOMAIN", "fakesite.example", "EXDATE", "2003-06-01T00:04:00Z")); - assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "1-B-EXAMPLE-12-15-2002")) + assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "15-2002")) .atTime("2002-07-01T00:02:00Z") .hasResponse("poll_ack_response_empty.xml"); @@ -765,13 +765,13 @@ class EppLifecycleDomainTest extends EppTestCase { .hasResponse( "poll_response_autorenew.xml", ImmutableMap.of( - "ID", "1-B-EXAMPLE-12-15-2003", // Note -- Year is different from previous ID. + "ID", "15-2003", // Note -- Year is different from previous ID. "QDATE", "2003-06-01T00:04:00Z", "DOMAIN", "fakesite.example", "EXDATE", "2004-06-01T00:04:00Z")); // Ack the second poll message and verify that none remain. - assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "1-B-EXAMPLE-12-15-2003")) + assertThatCommand("poll_ack.xml", ImmutableMap.of("ID", "15-2003")) .atTime("2003-07-01T00:05:05Z") .hasResponse("poll_ack_response_empty.xml"); assertThatCommand("poll.xml") @@ -801,7 +801,7 @@ class EppLifecycleDomainTest extends EppTestCase { // As the losing registrar, read the request poll message, and then ack it. assertThatLoginSucceeds("NewRegistrar", "foo-BAR2"); - String messageId = "1-B-EXAMPLE-18-24-2001"; + String messageId = "24-2001"; assertThatCommand("poll.xml") .atTime("2001-01-01T00:01:00Z") .hasResponse("poll_response_domain_transfer_request.xml", ImmutableMap.of("ID", messageId)); @@ -810,7 +810,7 @@ class EppLifecycleDomainTest extends EppTestCase { .hasResponse("poll_ack_response_empty.xml"); // Five days in the future, expect a server approval poll message to the loser, and ack it. - messageId = "1-B-EXAMPLE-18-23-2001"; + messageId = "23-2001"; assertThatCommand("poll.xml") .atTime("2001-01-06T00:01:00Z") .hasResponse( @@ -822,7 +822,7 @@ class EppLifecycleDomainTest extends EppTestCase { assertThatLogoutSucceeds(); // Also expect a server approval poll message to the winner, with the transfer request trid. - messageId = "1-B-EXAMPLE-18-22-2001"; + messageId = "22-2001"; assertThatLoginSucceeds("TheRegistrar", "password2"); assertThatCommand("poll.xml") .atTime("2001-01-06T00:02:00Z") diff --git a/core/src/test/java/google/registry/flows/domain/DomainDeleteFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainDeleteFlowTest.java index b773add5c..c5d9d0748 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainDeleteFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainDeleteFlowTest.java @@ -147,8 +147,7 @@ class DomainDeleteFlowTest extends ResourceFlowTestCase .setRegistrationExpirationTime(expirationTime) .setStatusValues(ImmutableSet.copyOf(statusValues)) .setAutorenewBillingEvent(autorenewEvent.createVKey()) - .setAutorenewPollMessage( - autorenewPollMessage.createVKey(), - autorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(autorenewPollMessage.createVKey()) .build(); persistResources( ImmutableSet.of( diff --git a/core/src/test/java/google/registry/flows/domain/DomainTransferCancelFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainTransferCancelFlowTest.java index 3ed6da9b5..cb7a3d6f2 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainTransferCancelFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainTransferCancelFlowTest.java @@ -162,7 +162,7 @@ class DomainTransferCancelFlowTest .setEventTime(originalExpirationTime) .setAutorenewEndTime(END_OF_TIME) .setMsg("Domain was auto-renewed.") - .setHistoryEntry(getOnlyHistoryEntryOfType(domain, DOMAIN_CREATE)) + .setHistoryEntry(getOnlyHistoryEntryOfType(domain, DOMAIN_TRANSFER_CANCEL)) .build(), new PollMessage.OneTime.Builder() .setRegistrarId("TheRegistrar") diff --git a/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java b/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java index 57ba255ff..15de362c3 100644 --- a/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java +++ b/core/src/test/java/google/registry/flows/poll/PollAckFlowTest.java @@ -47,7 +47,7 @@ class PollAckFlowTest extends FlowTestCase { @BeforeEach void setUp() { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1-3-EXAMPLE-4-3-2011")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2011")); clock.setTo(DateTime.parse("2011-01-02T01:01:01Z")); setRegistrarIdForFlow("NewRegistrar"); createTld("example"); @@ -87,7 +87,7 @@ class PollAckFlowTest extends FlowTestCase { @Test void testSuccess_contactPollMessage() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "2-2-ROID-4-3-2011")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2011")); persistResource( new PollMessage.OneTime.Builder() .setId(MESSAGE_ID) @@ -102,7 +102,7 @@ class PollAckFlowTest extends FlowTestCase { @Test void testFailure_contactPollMessage_withIncorrectYearField() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "2-2-ROID-4-3-1999")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-1999")); persistResource( new PollMessage.OneTime.Builder() .setId(MESSAGE_ID) @@ -124,7 +124,7 @@ class PollAckFlowTest extends FlowTestCase { @Test void testSuccess_recentActiveAutorenew() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1-3-EXAMPLE-4-3-2010")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2010")); persistAutorenewPollMessage(clock.nowUtc().minusMonths(6), END_OF_TIME); assertTransactionalFlow(true); runFlowAssertResponse(loadFile("poll_ack_response_empty.xml")); @@ -132,7 +132,7 @@ class PollAckFlowTest extends FlowTestCase { @Test void testSuccess_oldActiveAutorenew() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1-3-EXAMPLE-4-3-2009")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2009")); persistAutorenewPollMessage(clock.nowUtc().minusYears(2), END_OF_TIME); // Create three other messages to be queued for retrieval to get our count right, since the poll // ack response wants there to be 4 messages in the queue when the ack comes back. @@ -141,14 +141,12 @@ class PollAckFlowTest extends FlowTestCase { } assertTransactionalFlow(true); runFlowAssertResponse( - loadFile( - "poll_ack_response.xml", - ImmutableMap.of("MSGID", "1-3-EXAMPLE-4-3-2009", "COUNT", "4"))); + loadFile("poll_ack_response.xml", ImmutableMap.of("MSGID", "3-2009", "COUNT", "4"))); } @Test void testSuccess_oldInactiveAutorenew() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1-3-EXAMPLE-4-3-2010")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3-2010")); persistAutorenewPollMessage(clock.nowUtc().minusMonths(6), clock.nowUtc()); assertTransactionalFlow(true); runFlowAssertResponse(loadFile("poll_ack_response_empty.xml")); @@ -162,35 +160,33 @@ class PollAckFlowTest extends FlowTestCase { } assertTransactionalFlow(true); runFlowAssertResponse( - loadFile( - "poll_ack_response.xml", - ImmutableMap.of("MSGID", "1-3-EXAMPLE-4-3-2011", "COUNT", "4"))); + loadFile("poll_ack_response.xml", ImmutableMap.of("MSGID", "3-2011", "COUNT", "4"))); } @Test void testFailure_noSuchMessage() throws Exception { assertTransactionalFlow(true); Exception e = assertThrows(MessageDoesNotExistException.class, this::runFlow); - assertThat(e).hasMessageThat().contains(String.format("(1-3-EXAMPLE-4-%d-2011)", MESSAGE_ID)); + assertThat(e).hasMessageThat().contains(String.format("(%d-2011)", MESSAGE_ID)); } @Test void testFailure_invalidId_tooFewComponents() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1-2-3")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "1")); assertTransactionalFlow(true); assertThrows(InvalidMessageIdException.class, this::runFlow); } @Test void testFailure_invalidId_tooManyComponents() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "2-2-ROID-4-3-1999-2007")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "2-2-1999-2007")); assertTransactionalFlow(true); assertThrows(InvalidMessageIdException.class, this::runFlow); } @Test void testFailure_contactPollMessage_withMissingYearField() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "2-2-ROID-4-3")); + setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "3")); persistResource( new PollMessage.OneTime.Builder() .setId(MESSAGE_ID) @@ -210,13 +206,6 @@ class PollAckFlowTest extends FlowTestCase { assertThrows(InvalidMessageIdException.class, this::runFlow); } - @Test - void testFailure_invalidEppResourceClassId() throws Exception { - setEppInput("poll_ack.xml", ImmutableMap.of("MSGID", "999-1-1-1")); - assertTransactionalFlow(true); - assertThrows(InvalidMessageIdException.class, this::runFlow); - } - @Test void testFailure_missingId() throws Exception { setEppInput("poll_ack_missing_id.xml"); @@ -250,6 +239,6 @@ class PollAckFlowTest extends FlowTestCase { .build()); assertTransactionalFlow(true); Exception e = assertThrows(MessageDoesNotExistException.class, this::runFlow); - assertThat(e).hasMessageThat().contains(String.format("(1-3-EXAMPLE-4-%d-2011)", MESSAGE_ID)); + assertThat(e).hasMessageThat().contains(String.format("(%d-2011)", MESSAGE_ID)); } } diff --git a/core/src/test/java/google/registry/model/common/ClassPathManagerTest.java b/core/src/test/java/google/registry/model/common/ClassPathManagerTest.java index 000412eb3..d98d1d4bd 100644 --- a/core/src/test/java/google/registry/model/common/ClassPathManagerTest.java +++ b/core/src/test/java/google/registry/model/common/ClassPathManagerTest.java @@ -27,7 +27,6 @@ import google.registry.model.index.EppResourceIndexBucket; import google.registry.model.index.ForeignKeyIndex.ForeignKeyContactIndex; import google.registry.model.index.ForeignKeyIndex.ForeignKeyDomainIndex; import google.registry.model.index.ForeignKeyIndex.ForeignKeyHostIndex; -import google.registry.model.poll.PollMessage; import google.registry.model.rde.RdeRevision; import google.registry.model.registrar.Registrar; import google.registry.model.reporting.HistoryEntry; @@ -63,7 +62,6 @@ public class ClassPathManagerTest { assertThat(ClassPathManager.getClass("Lock")).isEqualTo(Lock.class); assertThat(ClassPathManager.getClass("Domain")).isEqualTo(Domain.class); assertThat(ClassPathManager.getClass("HistoryEntry")).isEqualTo(HistoryEntry.class); - assertThat(ClassPathManager.getClass("PollMessage")).isEqualTo(PollMessage.class); assertThat(ClassPathManager.getClass("ForeignKeyHostIndex")) .isEqualTo(ForeignKeyHostIndex.class); assertThat(ClassPathManager.getClass("ServerSecret")).isEqualTo(ServerSecret.class); @@ -117,7 +115,6 @@ public class ClassPathManagerTest { assertThat(ClassPathManager.getClassName(Lock.class)).isEqualTo("Lock"); assertThat(ClassPathManager.getClassName(Domain.class)).isEqualTo("Domain"); assertThat(ClassPathManager.getClassName(HistoryEntry.class)).isEqualTo("HistoryEntry"); - assertThat(ClassPathManager.getClassName(PollMessage.class)).isEqualTo("PollMessage"); assertThat(ClassPathManager.getClassName(ForeignKeyHostIndex.class)) .isEqualTo("ForeignKeyHostIndex"); assertThat(ClassPathManager.getClassName(ServerSecret.class)).isEqualTo("ServerSecret"); diff --git a/core/src/test/java/google/registry/model/domain/DomainSqlTest.java b/core/src/test/java/google/registry/model/domain/DomainSqlTest.java index 47085763a..1a2c415ff 100644 --- a/core/src/test/java/google/registry/model/domain/DomainSqlTest.java +++ b/core/src/test/java/google/registry/model/domain/DomainSqlTest.java @@ -15,7 +15,6 @@ package google.registry.model.domain; import static com.google.common.truth.Truth.assertThat; -import static google.registry.flows.domain.DomainTransferUtils.createPendingTransferData; import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects; import static google.registry.model.domain.token.AllocationToken.TokenStatus.NOT_STARTED; import static google.registry.model.domain.token.AllocationToken.TokenType.UNLIMITED_USE; @@ -40,11 +39,8 @@ import com.googlecode.objectify.Key; import google.registry.model.billing.BillingEvent; import google.registry.model.billing.BillingEvent.Flag; import google.registry.model.billing.BillingEvent.Reason; -import google.registry.model.billing.BillingEvent.Recurring; -import google.registry.model.common.EntityGroupRoot; import google.registry.model.contact.ContactResource; import google.registry.model.domain.DesignatedContact.Type; -import google.registry.model.domain.Period.Unit; import google.registry.model.domain.launch.LaunchNotice; import google.registry.model.domain.rgp.GracePeriodStatus; import google.registry.model.domain.secdns.DelegationSignerData; @@ -52,7 +48,6 @@ import google.registry.model.domain.token.AllocationToken; import google.registry.model.domain.token.AllocationToken.TokenStatus; import google.registry.model.eppcommon.AuthInfo.PasswordAuth; import google.registry.model.eppcommon.StatusValue; -import google.registry.model.eppcommon.Trid; import google.registry.model.host.Host; import google.registry.model.poll.PollMessage; import google.registry.model.reporting.HistoryEntry; @@ -503,8 +498,7 @@ public class DomainSqlTest { domain .asBuilder() .setAutorenewBillingEvent(billEvent.createVKey()) - .setAutorenewPollMessage( - autorenewPollMessage.createVKey(), autorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(autorenewPollMessage.createVKey()) .setDeletePollMessage(deletePollMessage.createVKey()) .setTransferData(transferData) .setGracePeriods(gracePeriods) @@ -549,147 +543,10 @@ public class DomainSqlTest { assertThat(persisted.getGracePeriods()).isEqualTo(gracePeriods); } - @Test - void persistDomainWithLegacyVKeys() { - createTld("com"); - historyEntry = - new DomainHistory.Builder() - .setId(100L) - .setType(HistoryEntry.Type.DOMAIN_CREATE) - .setPeriod(Period.create(1, Period.Unit.YEARS)) - .setModificationTime(DateTime.now(UTC)) - .setDomainRepoId("4-COM") - .setRegistrarId("registrar1") - // These are non-null, but I don't think some tests set them. - .setReason("felt like it") - .setRequestedByRegistrar(false) - .setXmlBytes(new byte[0]) - .build(); - BillingEvent.Recurring billEvent = - new BillingEvent.Recurring.Builder() - .setId(200L) - .setReason(Reason.RENEW) - .setFlags(ImmutableSet.of(Flag.AUTO_RENEW)) - .setTargetId("example.com") - .setRegistrarId("registrar1") - .setEventTime(DateTime.now(UTC).plusYears(1)) - .setRecurrenceEndTime(END_OF_TIME) - .setDomainHistory(historyEntry) - .build(); - PollMessage.Autorenew autorenewPollMessage = - new PollMessage.Autorenew.Builder() - .setId(300L) - .setRegistrarId("registrar1") - .setEventTime(DateTime.now(UTC).plusYears(1)) - .setHistoryEntry(historyEntry) - .build(); - PollMessage.OneTime deletePollMessage = - new PollMessage.OneTime.Builder() - .setId(400L) - .setRegistrarId("registrar1") - .setEventTime(DateTime.now(UTC).plusYears(1)) - .setHistoryEntry(historyEntry) - .build(); - BillingEvent.OneTime oneTimeBillingEvent = - new BillingEvent.OneTime.Builder() - .setId(500L) - // Use SERVER_STATUS so we don't have to add a period. - .setReason(Reason.SERVER_STATUS) - .setTargetId("example.com") - .setRegistrarId("registrar1") - .setBillingTime(DateTime.now(UTC)) - .setCost(Money.of(USD, 100)) - .setEventTime(DateTime.now(UTC).plusYears(1)) - .setDomainHistory(historyEntry) - .build(); - DomainTransferData transferData = - createPendingTransferData( - domain.getRepoId(), - historyEntry.getId(), - new DomainTransferData.Builder() - .setTransferRequestTrid(Trid.create("foo", "bar")) - .setTransferRequestTime(fakeClock.nowUtc()) - .setGainingRegistrarId("registrar2") - .setLosingRegistrarId("registrar1") - .setPendingTransferExpirationTime(fakeClock.nowUtc().plusDays(1)), - ImmutableSet.of(oneTimeBillingEvent, billEvent, autorenewPollMessage), - Period.create(0, Unit.YEARS)); - gracePeriods = - ImmutableSet.of( - GracePeriod.create( - GracePeriodStatus.ADD, - "4-COM", - END_OF_TIME, - "registrar1", - oneTimeBillingEvent.createVKey()), - GracePeriod.createForRecurring( - GracePeriodStatus.AUTO_RENEW, - "4-COM", - END_OF_TIME, - "registrar1", - billEvent.createVKey())); - - domain = - domain - .asBuilder() - .setAutorenewBillingEvent(Recurring.createVKey(billEvent.getId())) - .setAutorenewPollMessage( - createLegacyVKey(PollMessage.Autorenew.class, autorenewPollMessage.getId()), - autorenewPollMessage.getHistoryRevisionId()) - .setDeletePollMessage( - createLegacyVKey(PollMessage.OneTime.class, deletePollMessage.getId())) - .setTransferData(transferData) - .setGracePeriods(gracePeriods) - .build(); - historyEntry = historyEntry.asBuilder().setDomain(domain).build(); - insertInDb( - contact, - contact2, - host, - historyEntry, - autorenewPollMessage, - billEvent, - deletePollMessage, - oneTimeBillingEvent, - domain); - - // Store the existing BillingRecurrence VKey. This happens after the event has been persisted. - Domain persisted = loadByKey(domain.createVKey()); - - // Verify that the domain data has been persisted. - // dsData still isn't persisted. gracePeriods appears to have the same values but for some - // reason is showing up as different. - assertEqualDomainExcept(persisted, "creationTime", "dsData", "gracePeriods"); - - // Verify that the DomainBase object from the history record sets the fields correctly. - DomainHistory persistedHistoryEntry = loadByKey(historyEntry.createVKey()); - assertThat(persistedHistoryEntry.getDomainBase().get().getAutorenewPollMessage()) - .isEqualTo(domain.getAutorenewPollMessage()); - assertThat(persistedHistoryEntry.getDomainBase().get().getAutorenewBillingEvent()) - .isEqualTo(domain.getAutorenewBillingEvent()); - assertThat(persistedHistoryEntry.getDomainBase().get().getDeletePollMessage()) - .isEqualTo(domain.getDeletePollMessage()); - DomainTransferData persistedTransferData = - persistedHistoryEntry.getDomainBase().get().getTransferData(); - DomainTransferData originalTransferData = domain.getTransferData(); - assertThat(persistedTransferData.getServerApproveBillingEvent()) - .isEqualTo(originalTransferData.getServerApproveBillingEvent()); - assertThat(persistedTransferData.getServerApproveAutorenewEvent()) - .isEqualTo(originalTransferData.getServerApproveAutorenewEvent()); - assertThat(persistedTransferData.getServerApproveAutorenewPollMessage()) - .isEqualTo(originalTransferData.getServerApproveAutorenewPollMessage()); - assertThat(domain.getGracePeriods()).isEqualTo(gracePeriods); - } - private VKey createKey(Class clazz, String name) { return VKey.create(clazz, name, Key.create(clazz, name)); } - private VKey createLegacyVKey(Class clazz, long id) { - return VKey.create( - clazz, id, Key.create(Key.create(EntityGroupRoot.class, "per-tld"), clazz, id)); - } - private void assertEqualDomainExcept(Domain thatDomain, String... excepts) { ImmutableList moreExcepts = new ImmutableList.Builder() diff --git a/core/src/test/java/google/registry/model/domain/DomainTest.java b/core/src/test/java/google/registry/model/domain/DomainTest.java index 3de3b0351..8b991e75f 100644 --- a/core/src/test/java/google/registry/model/domain/DomainTest.java +++ b/core/src/test/java/google/registry/model/domain/DomainTest.java @@ -41,7 +41,6 @@ import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Iterables; import com.google.common.collect.Ordering; import com.google.common.collect.Streams; -import com.googlecode.objectify.Key; import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObjectSubject; import google.registry.model.billing.BillingEvent; @@ -114,7 +113,7 @@ public class DomainTest { oneTimeBillKey = persistResource( new BillingEvent.OneTime.Builder() - // Use SERVER_STATUS so we don't have to add a period. + // Use SERVER_STATUS, so we don't have to add a period. .setReason(Reason.SERVER_STATUS) .setTargetId(domain.getDomainName()) .setRegistrarId(domain.getCurrentSponsorRegistrarId()) @@ -140,7 +139,7 @@ public class DomainTest { BillingEvent.OneTime oneTimeBill = new BillingEvent.OneTime.Builder() .setId(500L) - // Use SERVER_STATUS so we don't have to add a period. + // Use SERVER_STATUS, so we don't have to add a period. .setReason(Reason.SERVER_STATUS) .setTargetId("example.com") .setRegistrarId("registrar1") @@ -163,10 +162,8 @@ public class DomainTest { .build(); insertInDb(historyEntry, oneTimeBill, recurringBill); recurringBillKey = recurringBill.createVKey(); - VKey autorenewPollKey = - VKey.from(Key.create(Key.create(domainHistory), PollMessage.Autorenew.class, 3)); - VKey onetimePollKey = - VKey.from(Key.create(Key.create(domainHistory), PollMessage.OneTime.class, 1)); + VKey autorenewPollKey = VKey.createSql(PollMessage.Autorenew.class, 3L); + VKey onetimePollKey = VKey.createSql(PollMessage.OneTime.class, 1L); // Set up a new persisted domain entity. domain = persistResource( @@ -215,7 +212,7 @@ public class DomainTest { .build()) .setDeletePollMessage(onetimePollKey) .setAutorenewBillingEvent(recurringBillKey) - .setAutorenewPollMessage(autorenewPollKey, historyEntry.getId()) + .setAutorenewPollMessage(autorenewPollKey) .setSmdId("smdid") .addGracePeriod( GracePeriod.create( @@ -849,7 +846,7 @@ public class DomainTest { @Test void testClone_transferDuringAutorenew() { - // When the domain is an an autorenew grace period, we should not extend the registration + // When the domain is an autorenew grace period, we should not extend the registration // expiration by a further year--it should just be whatever the autorenew was DateTime now = DateTime.now(UTC); DateTime transferExpirationTime = now.minusDays(1); diff --git a/core/src/test/java/google/registry/model/poll/PollMessageExternalKeyConverterTest.java b/core/src/test/java/google/registry/model/poll/PollMessageExternalKeyConverterTest.java index 5a5782a23..2837e519c 100644 --- a/core/src/test/java/google/registry/model/poll/PollMessageExternalKeyConverterTest.java +++ b/core/src/test/java/google/registry/model/poll/PollMessageExternalKeyConverterTest.java @@ -46,7 +46,7 @@ public class PollMessageExternalKeyConverterTest { public final AppEngineExtension appEngine = AppEngineExtension.builder().withCloudSql().build(); private HistoryEntry historyEntry; - private FakeClock clock = new FakeClock(DateTime.parse("2007-07-07T01:01:01Z")); + private final FakeClock clock = new FakeClock(DateTime.parse("2007-07-07T01:01:01Z")); @BeforeEach void beforeEach() { @@ -77,8 +77,8 @@ public class PollMessageExternalKeyConverterTest { .setMsg("Test poll message") .setHistoryEntry(historyEntry) .build()); - assertThat(makePollMessageExternalId(pollMessage)).isEqualTo("1-2-FOOBAR-4-5-2007"); - assertVKeysEqual(parsePollMessageExternalId("1-2-FOOBAR-4-5-2007"), pollMessage.createVKey()); + assertThat(makePollMessageExternalId(pollMessage)).isEqualTo("5-2007"); + assertVKeysEqual(parsePollMessageExternalId("5-2007"), pollMessage.createVKey()); } @Test @@ -94,8 +94,8 @@ public class PollMessageExternalKeyConverterTest { .setMsg("Test poll message") .setHistoryEntry(historyEntry) .build()); - assertThat(makePollMessageExternalId(pollMessage)).isEqualTo("2-5-ROID-6-7-2007"); - assertVKeysEqual(parsePollMessageExternalId("2-5-ROID-6-7-2007"), pollMessage.createVKey()); + assertThat(makePollMessageExternalId(pollMessage)).isEqualTo("7-2007"); + assertVKeysEqual(parsePollMessageExternalId("7-2007"), pollMessage.createVKey()); } @Test @@ -111,46 +111,25 @@ public class PollMessageExternalKeyConverterTest { .setMsg("Test poll message") .setHistoryEntry(historyEntry) .build()); - assertThat(makePollMessageExternalId(pollMessage)).isEqualTo("3-5-ROID-6-7-2007"); - assertVKeysEqual(parsePollMessageExternalId("3-5-ROID-6-7-2007"), pollMessage.createVKey()); - } - - @Test - void testFailure_missingYearField() { - assertThrows( - PollMessageExternalKeyParseException.class, - () -> parsePollMessageExternalId("1-2-FOOBAR-4-5")); - } - - @Test - void testFailure_invalidEppResourceTypeId() { - // Populate the testdata correctly as for 1-2-FOOBAR-4-5 so we know that the only thing that - // is wrong here is the EppResourceTypeId. - testSuccess_domain(); - assertThrows( - PollMessageExternalKeyParseException.class, - () -> parsePollMessageExternalId("4-2-FOOBAR-4-5-2007")); + assertThat(makePollMessageExternalId(pollMessage)).isEqualTo("7-2007"); + assertVKeysEqual(parsePollMessageExternalId("7-2007"), pollMessage.createVKey()); } @Test void testFailure_tooFewComponentParts() { - assertThrows( - PollMessageExternalKeyParseException.class, - () -> parsePollMessageExternalId("1-3-EXAMPLE")); + assertThrows(PollMessageExternalKeyParseException.class, () -> parsePollMessageExternalId("1")); } @Test void testFailure_tooManyComponentParts() { assertThrows( - PollMessageExternalKeyParseException.class, - () -> parsePollMessageExternalId("1-3-EXAMPLE-4-5-2007-2009")); + PollMessageExternalKeyParseException.class, () -> parsePollMessageExternalId("1-3-2009")); } @Test void testFailure_nonNumericIds() { assertThrows( - PollMessageExternalKeyParseException.class, - () -> parsePollMessageExternalId("A-B-FOOBAR-D-E-F")); + PollMessageExternalKeyParseException.class, () -> parsePollMessageExternalId("A-2007")); } // We may have VKeys of slightly varying types, e.g. VKey (superclass) and diff --git a/core/src/test/java/google/registry/model/transfer/TransferDataTest.java b/core/src/test/java/google/registry/model/transfer/TransferDataTest.java index df0608667..54f523375 100644 --- a/core/src/test/java/google/registry/model/transfer/TransferDataTest.java +++ b/core/src/test/java/google/registry/model/transfer/TransferDataTest.java @@ -18,16 +18,13 @@ import static com.google.common.truth.Truth.assertThat; import static org.joda.time.DateTimeZone.UTC; import com.google.common.collect.ImmutableSet; -import com.googlecode.objectify.Key; import google.registry.model.billing.BillingEvent; import google.registry.model.billing.BillingEvent.Cancellation; import google.registry.model.billing.BillingEvent.OneTime; import google.registry.model.billing.BillingEvent.Recurring; -import google.registry.model.domain.Domain; import google.registry.model.domain.Period; import google.registry.model.eppcommon.Trid; import google.registry.model.poll.PollMessage; -import google.registry.model.reporting.HistoryEntry; import google.registry.persistence.VKey; import google.registry.testing.AppEngineExtension; import org.joda.time.DateTime; @@ -51,21 +48,11 @@ public class TransferDataTest { @BeforeEach void beforeEach() { - Key historyEntryKey = - Key.create(Key.create(Domain.class, "4-TLD"), HistoryEntry.class, 1356L); transferBillingEventKey = OneTime.createVKey(12345L); otherServerApproveBillingEventKey = Cancellation.createVKey(2468L); recurringBillingEventKey = Recurring.createVKey(13579L); - autorenewPollMessageKey = - VKey.create( - PollMessage.Autorenew.class, - 67890L, - Key.create(historyEntryKey, PollMessage.Autorenew.class, 67890L)); - otherServerApprovePollMessageKey = - VKey.create( - PollMessage.OneTime.class, - 314159L, - Key.create(historyEntryKey, PollMessage.OneTime.class, 314159L)); + autorenewPollMessageKey = VKey.createSql(PollMessage.Autorenew.class, 67890L); + otherServerApprovePollMessageKey = VKey.createSql(PollMessage.OneTime.class, 314159L); } @Test diff --git a/core/src/test/java/google/registry/rde/DomainToXjcConverterTest.java b/core/src/test/java/google/registry/rde/DomainToXjcConverterTest.java index 222ba2604..b13fda6fa 100644 --- a/core/src/test/java/google/registry/rde/DomainToXjcConverterTest.java +++ b/core/src/test/java/google/registry/rde/DomainToXjcConverterTest.java @@ -334,8 +334,7 @@ public class DomainToXjcConverterTest { .setMsg("Domain was auto-renewed.") .setHistoryEntry(domainHistory) .build()) - .createVKey(), - domainHistory.getId()) + .createVKey()) .setTransferData( new DomainTransferData.Builder() .setGainingRegistrarId("NewRegistrar") diff --git a/core/src/test/java/google/registry/rde/RdeFixtures.java b/core/src/test/java/google/registry/rde/RdeFixtures.java index 42a4ecbf5..adbc7be3b 100644 --- a/core/src/test/java/google/registry/rde/RdeFixtures.java +++ b/core/src/test/java/google/registry/rde/RdeFixtures.java @@ -175,8 +175,7 @@ final class RdeFixtures { .setMsg("Domain was auto-renewed.") .setHistoryEntry(historyEntry) .build()) - .createVKey(), - historyEntry.getId()) + .createVKey()) .setTransferData( new DomainTransferData.Builder() .setGainingRegistrarId("gaining") diff --git a/core/src/test/java/google/registry/testing/DatabaseHelper.java b/core/src/test/java/google/registry/testing/DatabaseHelper.java index 4b75e9fa9..09321663d 100644 --- a/core/src/test/java/google/registry/testing/DatabaseHelper.java +++ b/core/src/test/java/google/registry/testing/DatabaseHelper.java @@ -667,8 +667,7 @@ public class DatabaseHelper { domain .asBuilder() .setAutorenewBillingEvent(autorenewEvent.createVKey()) - .setAutorenewPollMessage( - autorenewPollMessage.createVKey(), autorenewPollMessage.getHistoryRevisionId()) + .setAutorenewPollMessage(autorenewPollMessage.createVKey()) .build()); } diff --git a/core/src/test/java/google/registry/tools/AckPollMessagesCommandTest.java b/core/src/test/java/google/registry/tools/AckPollMessagesCommandTest.java index c03263378..0f329fb7d 100644 --- a/core/src/test/java/google/registry/tools/AckPollMessagesCommandTest.java +++ b/core/src/test/java/google/registry/tools/AckPollMessagesCommandTest.java @@ -77,10 +77,10 @@ public class AckPollMessagesCommandTest extends CommandTestCase Command completed successfully; ack to dequeue - + 2011-01-02T01:01:01Z Domain test.example was deleted by registry administrator with final deletion effective: 2011-01-02T00:56:01.008Z diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_autorenew.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_autorenew.xml index b5f056fbd..5495bb248 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_autorenew.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_autorenew.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2011-01-01T01:01:01Z Domain was auto-renewed. diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_contact_delete.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_contact_delete.xml index 43c908ceb..5b20a6b4b 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_contact_delete.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_contact_delete.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2011-01-01T01:01:01Z Deleted contact jd1234 diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_contact_transfer.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_contact_transfer.xml index 54b0c5f4a..87c4ab11d 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_contact_transfer.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_contact_transfer.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2010-12-28T01:01:01Z Transfer requested. diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_domain_pending_notification.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_domain_pending_notification.xml index ca1bac781..2ea9ec61b 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_domain_pending_notification.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_domain_pending_notification.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2011-01-01T01:01:01Z Domain deleted. diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer.xml index f60f65892..534606d78 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2011-01-01T01:01:01Z Transfer approved. diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer_no_cltrid.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer_no_cltrid.xml index 0525a5c8a..92f27c1f1 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer_no_cltrid.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_domain_transfer_no_cltrid.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2011-01-01T01:01:01Z Transfer approved. diff --git a/core/src/test/resources/google/registry/flows/poll/poll_response_host_delete.xml b/core/src/test/resources/google/registry/flows/poll/poll_response_host_delete.xml index a5ef2e8f2..695e1e68e 100644 --- a/core/src/test/resources/google/registry/flows/poll/poll_response_host_delete.xml +++ b/core/src/test/resources/google/registry/flows/poll/poll_response_host_delete.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2011-01-01T01:01:01Z Deleted host ns1.test.example diff --git a/core/src/test/resources/google/registry/flows/poll_response_contact_transfer.xml b/core/src/test/resources/google/registry/flows/poll_response_contact_transfer.xml index a9ce57551..605c711d4 100644 --- a/core/src/test/resources/google/registry/flows/poll_response_contact_transfer.xml +++ b/core/src/test/resources/google/registry/flows/poll_response_contact_transfer.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2000-06-08T22:00:00Z Transfer requested. diff --git a/core/src/test/resources/google/registry/flows/poll_response_server_hold.xml b/core/src/test/resources/google/registry/flows/poll_response_server_hold.xml index 05b930215..93f0d7169 100644 --- a/core/src/test/resources/google/registry/flows/poll_response_server_hold.xml +++ b/core/src/test/resources/google/registry/flows/poll_response_server_hold.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2000-06-02T13:00:00Z The registry administrator has added the status(es) [serverHold]. diff --git a/core/src/test/resources/google/registry/flows/poll_response_unrenew.xml b/core/src/test/resources/google/registry/flows/poll_response_unrenew.xml index f44fa8957..a14bc1071 100644 --- a/core/src/test/resources/google/registry/flows/poll_response_unrenew.xml +++ b/core/src/test/resources/google/registry/flows/poll_response_unrenew.xml @@ -3,7 +3,7 @@ Command completed successfully; ack to dequeue - + 2001-06-07T00:00:00Z Domain example.tld was unrenewed by 3 years; now expires at 2003-06-01T00:02:00.000Z. diff --git a/core/src/test/resources/google/registry/model/schema.txt b/core/src/test/resources/google/registry/model/schema.txt index b7465bae5..5d7ca744c 100644 --- a/core/src/test/resources/google/registry/model/schema.txt +++ b/core/src/test/resources/google/registry/model/schema.txt @@ -359,26 +359,6 @@ class google.registry.model.index.ForeignKeyIndex$ForeignKeyHostIndex { google.registry.persistence.VKey topReference; org.joda.time.DateTime deletionTime; } -class google.registry.model.poll.PollMessage { - @Id java.lang.Long id; - java.lang.String clientId; - java.lang.String msg; - org.joda.time.DateTime eventTime; -} -class google.registry.model.poll.PollMessage$Autorenew { - @Id java.lang.Long id; - java.lang.String clientId; - java.lang.String msg; - java.lang.String targetId; - org.joda.time.DateTime autorenewEndTime; - org.joda.time.DateTime eventTime; -} -class google.registry.model.poll.PollMessage$OneTime { - @Id java.lang.Long id; - java.lang.String clientId; - java.lang.String msg; - org.joda.time.DateTime eventTime; -} class google.registry.model.rde.RdeRevision { @Id java.lang.String id; int revision; diff --git a/db/src/main/resources/sql/schema/db-schema.sql.generated b/db/src/main/resources/sql/schema/db-schema.sql.generated index 2371d1809..f3782ff13 100644 --- a/db/src/main/resources/sql/schema/db-schema.sql.generated +++ b/db/src/main/resources/sql/schema/db-schema.sql.generated @@ -270,7 +270,6 @@ billing_recurrence_id int8, autorenew_end_time timestamptz, autorenew_poll_message_id int8, - autorenew_poll_message_history_id int8, billing_contact text, current_package_token text, deletion_poll_message_id int8, @@ -340,7 +339,6 @@ billing_recurrence_id int8, autorenew_end_time timestamptz, autorenew_poll_message_id int8, - autorenew_poll_message_history_id int8, billing_contact text, current_package_token text, deletion_poll_message_id int8,