Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions core/src/main/java/google/registry/batch/BatchModule.java
Original file line number Diff line number Diff line change
Expand Up @@ -169,8 +169,8 @@ static String provideGainingRegistrarId(HttpServletRequest req) {

@Provides
@Parameter("losingRegistrarId")
static String provideLosingRegistrarId(HttpServletRequest req) {
return extractRequiredParameter(req, "losingRegistrarId");
static Optional<String> provideLosingRegistrarId(HttpServletRequest req) {
return extractOptionalParameter(req, "losingRegistrarId");
}

@Provides
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public class BulkDomainTransferAction implements Runnable {
private final RateLimiter rateLimiter;
private final ImmutableList<String> bulkTransferDomainNames;
private final String gainingRegistrarId;
private final String losingRegistrarId;
private final Optional<String> losingRegistrarId;
private final boolean requestedByRegistrar;
private final String reason;
private final Response response;
Expand All @@ -127,7 +127,7 @@ public class BulkDomainTransferAction implements Runnable {
@Named("standardRateLimiter") RateLimiter rateLimiter,
@Parameter("bulkTransferDomainNames") ImmutableList<String> bulkTransferDomainNames,
@Parameter("gainingRegistrarId") String gainingRegistrarId,
@Parameter("losingRegistrarId") String losingRegistrarId,
@Parameter("losingRegistrarId") Optional<String> losingRegistrarId,
@Parameter("requestedByRegistrar") boolean requestedByRegistrar,
@Parameter("reason") String reason,
Response response) {
Expand Down Expand Up @@ -225,7 +225,7 @@ private boolean shouldSkipDomain(String domainName) {
alreadyTransferred++;
return true;
}
if (!currentRegistrarId.equals(losingRegistrarId)) {
if (losingRegistrarId.isPresent() && !currentRegistrarId.equals(losingRegistrarId.get())) {
logger.atWarning().log(
"Domain '%s' had unexpected registrar '%s'", domainName, currentRegistrarId);
errors++;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.Optional;

/**
* A command to bulk-transfer any number of domains from one registrar to another.
Expand Down Expand Up @@ -76,8 +77,7 @@ public class BulkDomainTransferCommand extends ConfirmingCommand implements Comm

@Parameter(
names = {"-l", "--losing_registrar_id"},
description = "The ID of the registrar from which domains should be transferred",
required = true)
description = "The ID of the registrar from which domains should be transferred")
private String losingRegistrarId;

@Parameter(
Expand Down Expand Up @@ -119,14 +119,17 @@ protected String execute() throws Exception {
Registrar.loadByRegistrarIdCached(gainingRegistrarId).isPresent(),
"Gaining registrar %s doesn't exist",
gainingRegistrarId);
checkArgument(
Registrar.loadByRegistrarIdCached(losingRegistrarId).isPresent(),
"Losing registrar %s doesn't exist",
losingRegistrarId);
if (losingRegistrarId != null) {
checkArgument(
Registrar.loadByRegistrarIdCached(losingRegistrarId).isPresent(),
"Losing registrar %s doesn't exist",
losingRegistrarId);
}

ImmutableMap.Builder<String, Object> paramsBuilder = new ImmutableMap.Builder<>();
paramsBuilder.put("gainingRegistrarId", gainingRegistrarId);
paramsBuilder.put("losingRegistrarId", losingRegistrarId);
Optional.ofNullable(losingRegistrarId)
.ifPresent(id -> paramsBuilder.put("losingRegistrarId", id));
paramsBuilder.put("requestedByRegistrar", requestedByRegistrar);
paramsBuilder.put("reason", reason);
if (maxQps > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@
import google.registry.testing.FakeLockHandler;
import google.registry.testing.FakeResponse;
import java.time.Instant;
import java.util.Optional;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
Expand Down Expand Up @@ -127,7 +128,22 @@ void testSuccess_normalRun() {
assertThat(deletedDomain.getUpdateTimestamp().getTimestamp()).isEqualTo(preRunTime);
}

private BulkDomainTransferAction createAction(String... domains) {
@Test
void testSuccess_withoutLosingRegistrarId() {
BulkDomainTransferAction action =
createActionWithOptionalLosingRegistrar(
Optional.empty(), "active.tld", "alreadytransferred.tld");
fakeClock.advanceOneMilli();
Instant now = fakeClock.now();
action.run();
assertThat(response.getStatus()).isEqualTo(200);
activeDomain = loadByEntity(activeDomain);
assertThat(activeDomain.cloneProjectedAtTime(now).getCurrentSponsorRegistrarId())
.isEqualTo("NewRegistrar");
}

private BulkDomainTransferAction createActionWithOptionalLosingRegistrar(
Optional<String> losingRegistrarId, String... domains) {
EppController eppController =
DaggerEppTestComponent.builder()
.fakesAndMocksModule(FakesAndMocksModule.create(new FakeClock()))
Expand All @@ -140,9 +156,13 @@ private BulkDomainTransferAction createAction(String... domains) {
rateLimiter,
ImmutableList.copyOf(domains),
"NewRegistrar",
"TheRegistrar",
losingRegistrarId,
true,
"reason",
response);
}

private BulkDomainTransferAction createAction(String... domains) {
return createActionWithOptionalLosingRegistrar(Optional.of("TheRegistrar"), domains);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -193,4 +193,27 @@ void testSuccess_registrarRequestExplicit() throws Exception {
MediaType.PLAIN_TEXT_UTF_8,
"[\"foo.tld\",\"bar.tld\"]".getBytes(UTF_8));
}

@Test
void testSuccess_noLosingRegistrarId() throws Exception {
runCommandForced(
"--gaining_registrar_id",
"NewRegistrar",
"--reason",
"someReason",
"--domains",
"foo.tld,bar.tld");
verify(connection)
.sendPostRequest(
"/_dr/task/bulkDomainTransfer",
ImmutableMap.of(
"gainingRegistrarId",
"NewRegistrar",
"requestedByRegistrar",
false,
"reason",
"someReason"),
MediaType.PLAIN_TEXT_UTF_8,
"[\"foo.tld\",\"bar.tld\"]".getBytes(UTF_8));
}
}
Loading