mirror of
https://github.com/google/nomulus.git
synced 2025-04-30 12:07:51 +02:00
Update conditions when domain update flow triggers dns publish task (#1811)
Addressing b/246375161
This commit is contained in:
parent
7c70606a1b
commit
28c43264e2
3 changed files with 92 additions and 10 deletions
|
@ -87,6 +87,7 @@ import google.registry.model.poll.PendingActionNotificationResponse.DomainPendin
|
||||||
import google.registry.model.poll.PollMessage;
|
import google.registry.model.poll.PollMessage;
|
||||||
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
import google.registry.model.reporting.IcannReportingTypes.ActivityReportField;
|
||||||
import google.registry.model.tld.Registry;
|
import google.registry.model.tld.Registry;
|
||||||
|
import java.util.Objects;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
@ -181,7 +182,9 @@ public final class DomainUpdateFlow implements TransactionalFlow {
|
||||||
DomainHistory domainHistory =
|
DomainHistory domainHistory =
|
||||||
historyBuilder.setType(DOMAIN_UPDATE).setDomain(newDomain).build();
|
historyBuilder.setType(DOMAIN_UPDATE).setDomain(newDomain).build();
|
||||||
validateNewState(newDomain);
|
validateNewState(newDomain);
|
||||||
|
if (requiresDnsUpdate(existingDomain, newDomain)) {
|
||||||
dnsQueue.addDomainRefreshTask(targetId);
|
dnsQueue.addDomainRefreshTask(targetId);
|
||||||
|
}
|
||||||
ImmutableSet.Builder<ImmutableObject> entitiesToSave = new ImmutableSet.Builder<>();
|
ImmutableSet.Builder<ImmutableObject> entitiesToSave = new ImmutableSet.Builder<>();
|
||||||
entitiesToSave.add(newDomain, domainHistory);
|
entitiesToSave.add(newDomain, domainHistory);
|
||||||
Optional<BillingEvent.OneTime> statusUpdateBillingEvent =
|
Optional<BillingEvent.OneTime> statusUpdateBillingEvent =
|
||||||
|
@ -203,6 +206,16 @@ public final class DomainUpdateFlow implements TransactionalFlow {
|
||||||
return responseBuilder.build();
|
return responseBuilder.build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Determines if any of the changes to new domain should trigger DNS update. */
|
||||||
|
private boolean requiresDnsUpdate(Domain existingDomain, Domain newDomain) {
|
||||||
|
if (existingDomain.shouldPublishToDns() != newDomain.shouldPublishToDns()
|
||||||
|
|| !Objects.equals(newDomain.getDsData(), existingDomain.getDsData())
|
||||||
|
|| !Objects.equals(newDomain.getNsHosts(), existingDomain.getNsHosts())) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/** Fail if the object doesn't exist or was deleted. */
|
/** Fail if the object doesn't exist or was deleted. */
|
||||||
private void verifyUpdateAllowed(Update command, Domain existingDomain, DateTime now)
|
private void verifyUpdateAllowed(Update command, Domain existingDomain, DateTime now)
|
||||||
throws EppException {
|
throws EppException {
|
||||||
|
@ -267,12 +280,18 @@ public final class DomainUpdateFlow implements TransactionalFlow {
|
||||||
.setLastEppUpdateRegistrarId(registrarId)
|
.setLastEppUpdateRegistrarId(registrarId)
|
||||||
.addStatusValues(add.getStatusValues())
|
.addStatusValues(add.getStatusValues())
|
||||||
.removeStatusValues(remove.getStatusValues())
|
.removeStatusValues(remove.getStatusValues())
|
||||||
.addNameservers(add.getNameservers().stream().collect(toImmutableSet()))
|
|
||||||
.removeNameservers(remove.getNameservers().stream().collect(toImmutableSet()))
|
|
||||||
.removeContacts(remove.getContacts())
|
.removeContacts(remove.getContacts())
|
||||||
.addContacts(add.getContacts())
|
.addContacts(add.getContacts())
|
||||||
.setRegistrant(firstNonNull(change.getRegistrant(), domain.getRegistrant()))
|
.setRegistrant(firstNonNull(change.getRegistrant(), domain.getRegistrant()))
|
||||||
.setAuthInfo(firstNonNull(change.getAuthInfo(), domain.getAuthInfo()));
|
.setAuthInfo(firstNonNull(change.getAuthInfo(), domain.getAuthInfo()));
|
||||||
|
|
||||||
|
if (!add.getNameservers().isEmpty()) {
|
||||||
|
domainBuilder.addNameservers(add.getNameservers().stream().collect(toImmutableSet()));
|
||||||
|
}
|
||||||
|
if (!remove.getNameservers().isEmpty()) {
|
||||||
|
domainBuilder.removeNameservers(remove.getNameservers().stream().collect(toImmutableSet()));
|
||||||
|
}
|
||||||
|
|
||||||
Optional<DomainUpdateSuperuserExtension> superuserExt =
|
Optional<DomainUpdateSuperuserExtension> superuserExt =
|
||||||
eppInput.getSingleExtension(DomainUpdateSuperuserExtension.class);
|
eppInput.getSingleExtension(DomainUpdateSuperuserExtension.class);
|
||||||
if (superuserExt.isPresent()) {
|
if (superuserExt.isPresent()) {
|
||||||
|
|
|
@ -47,6 +47,7 @@ import static google.registry.testing.DomainSubject.assertAboutDomains;
|
||||||
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
|
import static google.registry.testing.EppExceptionSubject.assertAboutEppExceptions;
|
||||||
import static google.registry.testing.HistoryEntrySubject.assertAboutHistoryEntries;
|
import static google.registry.testing.HistoryEntrySubject.assertAboutHistoryEntries;
|
||||||
import static google.registry.testing.TaskQueueHelper.assertDnsTasksEnqueued;
|
import static google.registry.testing.TaskQueueHelper.assertDnsTasksEnqueued;
|
||||||
|
import static google.registry.testing.TaskQueueHelper.assertNoDnsTasksEnqueued;
|
||||||
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
||||||
import static org.joda.money.CurrencyUnit.USD;
|
import static org.joda.money.CurrencyUnit.USD;
|
||||||
import static org.junit.jupiter.api.Assertions.assertThrows;
|
import static org.junit.jupiter.api.Assertions.assertThrows;
|
||||||
|
@ -496,13 +497,11 @@ class DomainUpdateFlowTest extends ResourceFlowTestCase<DomainUpdateFlow, Domain
|
||||||
expectedDsData.stream()
|
expectedDsData.stream()
|
||||||
.map(ds -> ds.cloneWithDomainRepoId(resource.getRepoId()))
|
.map(ds -> ds.cloneWithDomainRepoId(resource.getRepoId()))
|
||||||
.collect(toImmutableSet()));
|
.collect(toImmutableSet()));
|
||||||
|
if (dnsTaskEnqueued) {
|
||||||
// TODO: REENABLE AFTER PROPER FIX FOR DNS PUBLISHING TASKS IS FOUND
|
assertDnsTasksEnqueued("example.tld");
|
||||||
// if (dnsTaskEnqueued) {
|
} else {
|
||||||
// assertDnsTasksEnqueued("example.tld");
|
assertNoDnsTasksEnqueued();
|
||||||
// } else {
|
}
|
||||||
// assertNoDnsTasksEnqueued();
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -1747,4 +1746,51 @@ class DomainUpdateFlowTest extends ResourceFlowTestCase<DomainUpdateFlow, Domain
|
||||||
assertAboutDomains().that(reloadResourceByForeignKey()).hasNoAutorenewEndTime();
|
assertAboutDomains().that(reloadResourceByForeignKey()).hasNoAutorenewEndTime();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testAddDnsPublishStatus_enqueueDnsTask() throws Exception {
|
||||||
|
setEppInput(
|
||||||
|
"domain_update_status_change.xml",
|
||||||
|
ImmutableMap.of("STATUS_ADD", "clientHold", "STATUS_REM", "clientTransferProhibited"));
|
||||||
|
persistReferencedEntities();
|
||||||
|
persistResource(
|
||||||
|
persistDomain()
|
||||||
|
.asBuilder()
|
||||||
|
.setDomainName("example.tld")
|
||||||
|
.setStatusValues(ImmutableSet.of(StatusValue.CLIENT_TRANSFER_PROHIBITED))
|
||||||
|
.build());
|
||||||
|
runFlowAsSuperuser();
|
||||||
|
assertDnsTasksEnqueued("example.tld");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testRemoveEveryDnsPublishStatus_enqueueDnsTask() throws Exception {
|
||||||
|
setEppInput(
|
||||||
|
"domain_update_status_change.xml",
|
||||||
|
ImmutableMap.of("STATUS_REM", "serverHold", "STATUS_ADD", "clientTransferProhibited"));
|
||||||
|
persistReferencedEntities();
|
||||||
|
persistResource(
|
||||||
|
persistDomain()
|
||||||
|
.asBuilder()
|
||||||
|
.setDomainName("example.tld")
|
||||||
|
.setStatusValues(ImmutableSet.of(StatusValue.SERVER_HOLD))
|
||||||
|
.build());
|
||||||
|
runFlowAsSuperuser();
|
||||||
|
assertDnsTasksEnqueued("example.tld");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testChangeSomeOrNoChangeDnsPublishStatus_doNotEnqueueDnsTask() throws Exception {
|
||||||
|
setEppInput(
|
||||||
|
"domain_update_status_change.xml",
|
||||||
|
ImmutableMap.of("STATUS_ADD", "clientUpdateProhibited", "STATUS_REM", "pendingDelete"));
|
||||||
|
persistReferencedEntities();
|
||||||
|
persistResource(
|
||||||
|
persistDomain()
|
||||||
|
.asBuilder()
|
||||||
|
.setDomainName("example.tld")
|
||||||
|
.setStatusValues(ImmutableSet.of(StatusValue.PENDING_DELETE, StatusValue.SERVER_HOLD))
|
||||||
|
.build());
|
||||||
|
runFlowAsSuperuser();
|
||||||
|
assertNoDnsTasksEnqueued();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||||
|
<command>
|
||||||
|
<update>
|
||||||
|
<domain:update
|
||||||
|
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||||
|
<domain:name>example.tld</domain:name>
|
||||||
|
<domain:add>
|
||||||
|
<domain:status s="%STATUS_ADD%"/>
|
||||||
|
</domain:add>
|
||||||
|
<domain:rem>
|
||||||
|
<domain:status s="%STATUS_REM%"/>
|
||||||
|
</domain:rem>
|
||||||
|
</domain:update>
|
||||||
|
</update>
|
||||||
|
<clTRID>ABC-12345</clTRID>
|
||||||
|
</command>
|
||||||
|
</epp>
|
Loading…
Add table
Reference in a new issue