diff --git a/java/google/registry/tools/UpdateDomainCommand.java b/java/google/registry/tools/UpdateDomainCommand.java index 542df8994..082457532 100644 --- a/java/google/registry/tools/UpdateDomainCommand.java +++ b/java/google/registry/tools/UpdateDomainCommand.java @@ -19,6 +19,7 @@ import static com.google.common.collect.ImmutableSet.toImmutableSet; import static google.registry.model.EppResourceUtils.loadByForeignKey; import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBITED; import static google.registry.model.ofy.ObjectifyService.ofy; +import static google.registry.util.PreconditionsUtils.checkArgumentNotNull; import static org.joda.time.DateTimeZone.UTC; import com.beust.jcommander.Parameter; @@ -155,10 +156,19 @@ final class UpdateDomainCommand extends CreateOrUpdateDomainCommand { } for (String domain : domains) { + Set addAdminsThisDomain = new HashSet<>(addAdmins); + Set removeAdminsThisDomain = new HashSet<>(removeAdmins); + Set addTechsThisDomain = new HashSet<>(addTechs); + Set removeTechsThisDomain = new HashSet<>(removeTechs); + Set addNameserversThisDomain = new HashSet<>(addNameservers); + Set removeNameserversThisDomain = new HashSet<>(removeNameservers); + Set addStatusesThisDomain = new HashSet<>(addStatuses); + Set removeStatusesThisDomain = new HashSet<>(removeStatuses); + if (!nameservers.isEmpty() || !admins.isEmpty() || !techs.isEmpty() || !statuses.isEmpty()) { DateTime now = DateTime.now(UTC); DomainResource domainResource = loadByForeignKey(DomainResource.class, domain, now); - checkArgument(domainResource != null, "Domain '%s' does not exist", domain); + checkArgumentNotNull(domainResource, "Domain '%s' does not exist", domain); checkArgument( !domainResource.getStatusValues().contains(SERVER_UPDATE_PROHIBITED), "The domain '%s' has status SERVER_UPDATE_PROHIBITED. Verify that you are allowed " @@ -170,10 +180,14 @@ final class UpdateDomainCommand extends CreateOrUpdateDomainCommand { populateAddRemoveLists( ImmutableSet.copyOf(nameservers), existingNameservers, - addNameservers, - removeNameservers); + addNameserversThisDomain, + removeNameserversThisDomain); + int numNameservers = + existingNameservers.size() + + addNameserversThisDomain.size() + - removeNameserversThisDomain.size(); checkArgument( - existingNameservers.size() + addNameservers.size() - removeNameservers.size() <= 13, + numNameservers <= 13, "The resulting nameservers count for domain %s would be more than 13", domain); } @@ -185,11 +199,17 @@ final class UpdateDomainCommand extends CreateOrUpdateDomainCommand { if (!admins.isEmpty()) { populateAddRemoveLists( - ImmutableSet.copyOf(admins), existingAdmins, addAdmins, removeAdmins); + ImmutableSet.copyOf(admins), + existingAdmins, + addAdminsThisDomain, + removeAdminsThisDomain); } if (!techs.isEmpty()) { populateAddRemoveLists( - ImmutableSet.copyOf(techs), existingTechs, addTechs, removeTechs); + ImmutableSet.copyOf(techs), + existingTechs, + addTechsThisDomain, + removeTechsThisDomain); } } if (!statuses.isEmpty()) { @@ -198,21 +218,24 @@ final class UpdateDomainCommand extends CreateOrUpdateDomainCommand { currentStatusValues.add(statusValue.getXmlName()); } populateAddRemoveLists( - ImmutableSet.copyOf(statuses), currentStatusValues, addStatuses, removeStatuses); + ImmutableSet.copyOf(statuses), + currentStatusValues, + addStatusesThisDomain, + removeStatusesThisDomain); } } boolean add = - !addNameservers.isEmpty() - || !addAdmins.isEmpty() - || !addTechs.isEmpty() - || !addStatuses.isEmpty(); + !addNameserversThisDomain.isEmpty() + || !addAdminsThisDomain.isEmpty() + || !addTechsThisDomain.isEmpty() + || !addStatusesThisDomain.isEmpty(); boolean remove = - !removeNameservers.isEmpty() - || !removeAdmins.isEmpty() - || !removeTechs.isEmpty() - || !removeStatuses.isEmpty(); + !removeNameserversThisDomain.isEmpty() + || !removeAdminsThisDomain.isEmpty() + || !removeTechsThisDomain.isEmpty() + || !removeStatusesThisDomain.isEmpty(); boolean change = registrant != null || password != null; @@ -233,15 +256,15 @@ final class UpdateDomainCommand extends CreateOrUpdateDomainCommand { new SoyMapData( "domain", domain, "add", add, - "addNameservers", addNameservers, - "addAdmins", addAdmins, - "addTechs", addTechs, - "addStatuses", addStatuses, + "addNameservers", addNameserversThisDomain, + "addAdmins", addAdminsThisDomain, + "addTechs", addTechsThisDomain, + "addStatuses", addStatusesThisDomain, "remove", remove, - "removeNameservers", removeNameservers, - "removeAdmins", removeAdmins, - "removeTechs", removeTechs, - "removeStatuses", removeStatuses, + "removeNameservers", removeNameserversThisDomain, + "removeAdmins", removeAdminsThisDomain, + "removeTechs", removeTechsThisDomain, + "removeStatuses", removeStatusesThisDomain, "change", change, "registrant", registrant, "password", password, @@ -253,9 +276,9 @@ final class UpdateDomainCommand extends CreateOrUpdateDomainCommand { } protected void populateAddRemoveLists( - Set targetSet, Set oldSet, List addList, List removeList) { - addList.addAll(Sets.difference(targetSet, oldSet)); - removeList.addAll(Sets.difference(oldSet, targetSet)); + Set targetSet, Set oldSet, Set addSet, Set removeSet) { + addSet.addAll(Sets.difference(targetSet, oldSet)); + removeSet.addAll(Sets.difference(oldSet, targetSet)); } ImmutableSet getContactsOfType( diff --git a/javatests/google/registry/tools/UpdateDomainCommandTest.java b/javatests/google/registry/tools/UpdateDomainCommandTest.java index 2c84c78f6..0d9a7bc07 100644 --- a/javatests/google/registry/tools/UpdateDomainCommandTest.java +++ b/javatests/google/registry/tools/UpdateDomainCommandTest.java @@ -16,6 +16,7 @@ package google.registry.tools; import static com.google.common.truth.Truth.assertThat; import static google.registry.model.eppcommon.StatusValue.SERVER_UPDATE_PROHIBITED; +import static google.registry.testing.DatastoreHelper.createTlds; import static google.registry.testing.DatastoreHelper.newContactResource; import static google.registry.testing.DatastoreHelper.newDomainResource; import static google.registry.testing.DatastoreHelper.persistActiveHost; @@ -23,6 +24,7 @@ import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.JUnitBackports.assertThrows; import com.beust.jcommander.ParameterException; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.googlecode.objectify.Key; import google.registry.model.contact.ContactResource; @@ -77,6 +79,32 @@ public class UpdateDomainCommandTest extends EppToolCommandTestCase + + + + + %DOMAIN% + + + ns1.foo.fake + ns2.foo.fake + + + + + %REMOVEHOST% + + + + + RegistryTool + +