diff --git a/core/src/main/java/google/registry/flows/FlowModule.java b/core/src/main/java/google/registry/flows/FlowModule.java index 2a5faf32b..2905d26a5 100644 --- a/core/src/main/java/google/registry/flows/FlowModule.java +++ b/core/src/main/java/google/registry/flows/FlowModule.java @@ -32,6 +32,7 @@ import google.registry.model.eppinput.ResourceCommand; import google.registry.model.eppinput.ResourceCommand.SingleResourceCommand; import google.registry.model.eppoutput.EppResponse; import google.registry.model.eppoutput.Result; +import google.registry.model.host.HostHistory; import google.registry.model.reporting.HistoryEntry; import java.lang.annotation.Documented; import java.util.Optional; @@ -233,11 +234,11 @@ public class FlowModule { .setClientId(clientId); Optional metadataExtension = eppInput.getSingleExtension(MetadataExtension.class); - if (metadataExtension.isPresent()) { - historyBuilder - .setReason(metadataExtension.get().getReason()) - .setRequestedByRegistrar(metadataExtension.get().getRequestedByRegistrar()); - } + metadataExtension.ifPresent( + extension -> + historyBuilder + .setReason(extension.getReason()) + .setRequestedByRegistrar(extension.getRequestedByRegistrar())); return historyBuilder; } @@ -253,6 +254,11 @@ public class FlowModule { return new DomainHistory.Builder().copyFrom(historyEntryBuilder); } + @Provides + static HostHistory.Builder provideHostHistoryBuilder(HistoryEntry.Builder historyEntryBuilder) { + return new HostHistory.Builder().copyFrom(historyEntryBuilder); + } + /** * Provides a partially filled in {@link EppResponse} builder. * @@ -263,7 +269,7 @@ public class FlowModule { static EppResponse.Builder provideEppResponseBuilder(Trid trid) { return new EppResponse.Builder() .setTrid(trid) - .setResultFromCode(Result.Code.SUCCESS); // Default to success. + .setResultFromCode(Result.Code.SUCCESS); // Default to success. } @Provides diff --git a/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java b/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java index b276c608a..af488b4bb 100644 --- a/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java +++ b/core/src/main/java/google/registry/flows/host/HostDeleteFlow.java @@ -20,12 +20,13 @@ import static google.registry.flows.ResourceFlowUtils.loadAndVerifyExistence; import static google.registry.flows.ResourceFlowUtils.verifyNoDisallowedStatuses; import static google.registry.flows.ResourceFlowUtils.verifyResourceOwnership; import static google.registry.flows.host.HostFlowUtils.validateHostName; +import static google.registry.model.eppoutput.Result.Code.SUCCESS; import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import com.google.common.collect.ImmutableSet; -import com.googlecode.objectify.Key; import google.registry.batch.AsyncTaskEnqueuer; +import google.registry.dns.DnsQueue; import google.registry.flows.EppException; import google.registry.flows.ExtensionManager; import google.registry.flows.FlowModule.ClientId; @@ -39,8 +40,11 @@ import google.registry.model.domain.metadata.MetadataExtension; import google.registry.model.eppcommon.StatusValue; import google.registry.model.eppcommon.Trid; import google.registry.model.eppoutput.EppResponse; +import google.registry.model.eppoutput.Result; +import google.registry.model.host.HostHistory; import google.registry.model.host.HostResource; import google.registry.model.reporting.HistoryEntry; +import google.registry.model.reporting.HistoryEntry.Type; import google.registry.model.reporting.IcannReportingTypes.ActivityReportField; import javax.inject.Inject; import org.joda.time.DateTime; @@ -71,12 +75,14 @@ public final class HostDeleteFlow implements TransactionalFlow { StatusValue.PENDING_DELETE, StatusValue.SERVER_DELETE_PROHIBITED); + private static final DnsQueue dnsQueue = DnsQueue.create(); + @Inject ExtensionManager extensionManager; @Inject @ClientId String clientId; @Inject @TargetId String targetId; @Inject Trid trid; @Inject @Superuser boolean isSuperuser; - @Inject HistoryEntry.Builder historyBuilder; + @Inject HostHistory.Builder historyBuilder; @Inject AsyncTaskEnqueuer asyncTaskEnqueuer; @Inject EppResponse.Builder responseBuilder; @@ -102,16 +108,31 @@ public final class HostDeleteFlow implements TransactionalFlow { : existingHost; verifyResourceOwnership(clientId, owningResource); } - asyncTaskEnqueuer.enqueueAsyncDelete( - existingHost, tm().getTransactionTime(), clientId, trid, isSuperuser); - HostResource newHost = - existingHost.asBuilder().addStatusValue(StatusValue.PENDING_DELETE).build(); - historyBuilder - .setType(HistoryEntry.Type.HOST_PENDING_DELETE) - .setModificationTime(now) - .setParent(Key.create(existingHost)); - tm().insert(historyBuilder.build().toChildHistoryEntity()); + HistoryEntry.Type historyEntryType; + Result.Code resultCode; + HostResource newHost; + if (tm().isOfy()) { + asyncTaskEnqueuer.enqueueAsyncDelete( + existingHost, tm().getTransactionTime(), clientId, trid, isSuperuser); + newHost = existingHost.asBuilder().addStatusValue(StatusValue.PENDING_DELETE).build(); + historyEntryType = Type.HOST_PENDING_DELETE; + resultCode = SUCCESS_WITH_ACTION_PENDING; + } else { + newHost = existingHost.asBuilder().setStatusValues(null).setDeletionTime(now).build(); + if (existingHost.isSubordinate()) { + dnsQueue.addHostRefreshTask(existingHost.getHostName()); + tm().update( + tm().loadByKey(existingHost.getSuperordinateDomain()) + .asBuilder() + .removeSubordinateHost(existingHost.getHostName()) + .build()); + } + historyEntryType = Type.HOST_DELETE; + resultCode = SUCCESS; + } + historyBuilder.setType(historyEntryType).setModificationTime(now).setHostBase(newHost); + tm().insert(historyBuilder.build()); tm().update(newHost); - return responseBuilder.setResultFromCode(SUCCESS_WITH_ACTION_PENDING).build(); + return responseBuilder.setResultFromCode(resultCode).build(); } } diff --git a/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java b/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java index 3691c7004..93346e74e 100644 --- a/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java +++ b/core/src/test/java/google/registry/flows/EppLifecycleContactTest.java @@ -65,22 +65,22 @@ class EppLifecycleContactTest extends EppTestCase { .hasCommandName("ContactInfo") .and() .hasStatus(SUCCESS); - Result.Code resultCode; + Result.Code deleteResultCode; if (tm().isOfy()) { assertThatCommand("contact_delete_sh8013.xml") .hasResponse("contact_delete_response_sh8013_pending.xml"); - resultCode = SUCCESS_WITH_ACTION_PENDING; + deleteResultCode = SUCCESS_WITH_ACTION_PENDING; } else { assertThatCommand("contact_delete_sh8013.xml") .hasResponse("contact_delete_response_sh8013.xml"); - resultCode = SUCCESS; + deleteResultCode = SUCCESS; } assertThat(getRecordedEppMetric()) .hasClientId("NewRegistrar") .and() .hasCommandName("ContactDelete") .and() - .hasStatus(resultCode); + .hasStatus(deleteResultCode); assertThatLogoutSucceeds(); } diff --git a/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java b/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java index c82cd38fe..42987cf9a 100644 --- a/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java +++ b/core/src/test/java/google/registry/flows/EppLifecycleHostTest.java @@ -18,6 +18,7 @@ import static com.google.common.truth.Truth.assertThat; import static google.registry.model.EppResourceUtils.loadByForeignKey; import static google.registry.model.eppoutput.Result.Code.SUCCESS; import static google.registry.model.eppoutput.Result.Code.SUCCESS_WITH_ACTION_PENDING; +import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.testing.DatabaseHelper.createTld; import static google.registry.testing.DatabaseHelper.createTlds; import static google.registry.testing.EppMetricSubject.assertThat; @@ -25,6 +26,7 @@ import static google.registry.testing.HostResourceSubject.assertAboutHosts; import com.google.common.collect.ImmutableMap; import google.registry.model.domain.DomainBase; +import google.registry.model.eppoutput.Result; import google.registry.model.host.HostResource; import google.registry.testing.AppEngineExtension; import google.registry.testing.DualDatabaseTest; @@ -80,15 +82,24 @@ class EppLifecycleHostTest extends EppTestCase { .hasCommandName("HostInfo") .and() .hasStatus(SUCCESS); - assertThatCommand("host_delete.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld")) - .atTime("2000-06-02T00:03:00Z") - .hasResponse("generic_success_action_pending_response.xml"); + Result.Code deleteResultCode; + if (tm().isOfy()) { + assertThatCommand("host_delete.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld")) + .atTime("2000-06-02T00:03:00Z") + .hasResponse("generic_success_action_pending_response.xml"); + deleteResultCode = SUCCESS_WITH_ACTION_PENDING; + } else { + assertThatCommand("host_delete.xml", ImmutableMap.of("HOSTNAME", "ns1.example.tld")) + .atTime("2000-06-02T00:03:00Z") + .hasResponse("generic_success_response.xml"); + deleteResultCode = SUCCESS; + } assertThat(getRecordedEppMetric()) .hasClientId("NewRegistrar") .and() .hasCommandName("HostDelete") .and() - .hasStatus(SUCCESS_WITH_ACTION_PENDING); + .hasStatus(deleteResultCode); assertThatLogoutSucceeds(); } diff --git a/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java b/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java index 81e43159e..bc2ecc033 100644 --- a/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java +++ b/core/src/test/java/google/registry/flows/contact/ContactDeleteFlowTest.java @@ -17,7 +17,7 @@ package google.registry.flows.contact; import static com.google.common.collect.MoreCollectors.onlyElement; import static com.google.common.truth.Truth.assertThat; import static google.registry.batch.AsyncTaskEnqueuer.QUEUE_ASYNC_DELETE; -import static google.registry.model.reporting.HistoryEntry.Type.CONTACT_PENDING_DELETE; +import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static google.registry.testing.ContactResourceSubject.assertAboutContacts; import static google.registry.testing.DatabaseHelper.assertNoBillingEvents; import static google.registry.testing.DatabaseHelper.createTld; @@ -46,6 +46,7 @@ import google.registry.model.eppcommon.Trid; import google.registry.model.poll.PendingActionNotificationResponse; import google.registry.model.poll.PollMessage; import google.registry.model.registry.Registry; +import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry.Type; import google.registry.model.transfer.TransferData; import google.registry.model.transfer.TransferResponse; @@ -53,7 +54,6 @@ import google.registry.model.transfer.TransferStatus; import google.registry.testing.DualDatabaseTest; import google.registry.testing.ReplayExtension; import google.registry.testing.TestOfyAndSql; -import google.registry.testing.TestOfyOnly; import google.registry.testing.TestSqlOnly; import org.joda.time.DateTime; import org.junit.jupiter.api.BeforeEach; @@ -73,61 +73,28 @@ class ContactDeleteFlowTest extends ResourceFlowTestCase - - Command completed successfully; action pending + + Command completed successfully ABC-12345 diff --git a/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid.xml b/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid.xml index 7d1721ff9..32dd8b167 100644 --- a/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid.xml +++ b/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid.xml @@ -1,7 +1,7 @@ - - Command completed successfully; action pending + + Command completed successfully server-trid diff --git a/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid_pending.xml b/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid_pending.xml new file mode 100644 index 000000000..7d1721ff9 --- /dev/null +++ b/core/src/test/resources/google/registry/flows/host/host_delete_response_no_cltrid_pending.xml @@ -0,0 +1,10 @@ + + + + Command completed successfully; action pending + + + server-trid + + + diff --git a/core/src/test/resources/google/registry/flows/host/host_delete_response_pending.xml b/core/src/test/resources/google/registry/flows/host/host_delete_response_pending.xml new file mode 100644 index 000000000..91fe71a83 --- /dev/null +++ b/core/src/test/resources/google/registry/flows/host/host_delete_response_pending.xml @@ -0,0 +1,11 @@ + + + + Command completed successfully; action pending + + + ABC-12345 + server-trid + + +