diff --git a/java/google/registry/backup/RestoreCommitLogsAction.java b/java/google/registry/backup/RestoreCommitLogsAction.java index 02fe955e9..d963733ad 100644 --- a/java/google/registry/backup/RestoreCommitLogsAction.java +++ b/java/google/registry/backup/RestoreCommitLogsAction.java @@ -75,7 +75,7 @@ public class RestoreCommitLogsAction implements Runnable { static final int BLOCK_SIZE = 1024 * 1024; // Buffer 1mb at a time, for no particular reason. - static final String PATH = "/_dr/task/restoreCommitLogs"; + public static final String PATH = "/_dr/task/restoreCommitLogs"; static final String DRY_RUN_PARAM = "dryRun"; static final String FROM_TIME_PARAM = "fromTime"; static final String TO_TIME_PARAM = "toTime"; diff --git a/java/google/registry/tools/BUILD b/java/google/registry/tools/BUILD index c664f8d42..b8c343411 100644 --- a/java/google/registry/tools/BUILD +++ b/java/google/registry/tools/BUILD @@ -34,6 +34,7 @@ java_library( ]), visibility = [":allowed-tools"], deps = [ + "//java/google/registry/backup", "//java/google/registry/bigquery", "//java/google/registry/config", "//java/google/registry/dns", diff --git a/java/google/registry/tools/RegistryTool.java b/java/google/registry/tools/RegistryTool.java index cc8992c58..53fdf0103 100644 --- a/java/google/registry/tools/RegistryTool.java +++ b/java/google/registry/tools/RegistryTool.java @@ -108,6 +108,7 @@ public final class RegistryTool { .put("resave_entities", ResaveEntitiesCommand.class) .put("resave_environment_entities", ResaveEnvironmentEntitiesCommand.class) .put("resave_epp_resource", ResaveEppResourceCommand.class) + .put("restore_commit_logs", RestoreCommitLogsCommand.class) .put("send_escrow_report_to_icann", SendEscrowReportToIcannCommand.class) .put("setup_ote", SetupOteCommand.class) .put("uniform_rapid_suspension", UniformRapidSuspensionCommand.class) diff --git a/java/google/registry/tools/RestoreCommitLogsCommand.java b/java/google/registry/tools/RestoreCommitLogsCommand.java new file mode 100644 index 000000000..31b9f7c39 --- /dev/null +++ b/java/google/registry/tools/RestoreCommitLogsCommand.java @@ -0,0 +1,65 @@ +// Copyright 2017 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.tools; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import com.google.common.collect.ImmutableMap; +import com.google.common.net.MediaType; +import google.registry.backup.RestoreCommitLogsAction; +import org.joda.time.DateTime; + +@Parameters(separators = " =", commandDescription = "Restore the commit logs.") +class RestoreCommitLogsCommand implements ServerSideCommand { + private Connection connection; + + @Parameter( + names = {"-d", "--dry_run"}, + description = "Don't actually make any changes, just show what you would do." + ) + private boolean dryRun = false; + + @Parameter( + names = {"-f", "--from_time"}, + description = "Time to start restoring from.", + required = true + ) + private DateTime fromTime; + + @Parameter( + names = {"-t", "--to_time"}, + description = "Last commit diff timestamp to use when restoring." + ) + private DateTime toTime; + + @Override + public void setConnection(Connection connection) { + this.connection = connection; + } + + @Override + public void run() throws Exception { + ImmutableMap.Builder params = new ImmutableMap.Builder<>(); + params.put("dryRun", dryRun); + params.put("fromTime", fromTime); + if (toTime != null) { + params.put("toTime", toTime); + } + String response = + connection.send( + RestoreCommitLogsAction.PATH, params.build(), MediaType.PLAIN_TEXT_UTF_8, new byte[0]); + System.out.println(response); + } +} diff --git a/javatests/google/registry/tools/BUILD b/javatests/google/registry/tools/BUILD index a731ceff5..f291bc8f8 100644 --- a/javatests/google/registry/tools/BUILD +++ b/javatests/google/registry/tools/BUILD @@ -16,6 +16,7 @@ java_library( "testdata/*.*", ]), deps = [ + "//java/google/registry/backup", "//java/google/registry/config", "//java/google/registry/flows", "//java/google/registry/keyring/api", diff --git a/javatests/google/registry/tools/RestoreCommitLogsCommandTest.java b/javatests/google/registry/tools/RestoreCommitLogsCommandTest.java new file mode 100644 index 000000000..b9d8ca5c8 --- /dev/null +++ b/javatests/google/registry/tools/RestoreCommitLogsCommandTest.java @@ -0,0 +1,77 @@ +// Copyright 2017 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.tools; + +import static com.google.common.truth.Truth.assertThat; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; + +import com.google.common.collect.ImmutableMap; +import google.registry.backup.RestoreCommitLogsAction; +import google.registry.tools.ServerSideCommand.Connection; +import org.joda.time.DateTime; +import org.junit.Before; +import org.junit.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.Mock; + +/** Unit tests for {@link CreateRegistrarCommand}. */ +public class RestoreCommitLogsCommandTest extends CommandTestCase { + @Mock private Connection connection; + + @Before + public void init() { + command.setConnection(connection); + } + + @Captor ArgumentCaptor> urlParamCaptor; + + @Test + public void testNormalForm() throws Exception { + runCommand("--from_time=2017-05-19T20:30:00Z"); + verifySend( + ImmutableMap.of("dryRun", false, "fromTime", DateTime.parse("2017-05-19T20:30:00.000Z"))); + } + + @Test + public void testToTime() throws Exception { + runCommand("--from_time=2017-05-19T20:30:00Z", "--to_time=2017-05-19T20:40:00Z"); + verifySend( + ImmutableMap.of( + "dryRun", false, + "fromTime", DateTime.parse("2017-05-19T20:30:00.000Z"), + "toTime", DateTime.parse("2017-05-19T20:40:00.000Z"))); + } + + @Test + public void testDryRun() throws Exception { + runCommand("--dry_run", "--from_time=2017-05-19T20:30:00Z", "--to_time=2017-05-19T20:40:00Z"); + verifySend( + ImmutableMap.of( + "dryRun", true, + "fromTime", DateTime.parse("2017-05-19T20:30:00.000Z"), + "toTime", DateTime.parse("2017-05-19T20:40:00.000Z"))); + } + + // Note that this is very similar to the one in CreateOrUpdatePremiumListCommandTestCase.java but + // not identical. + void verifySend(ImmutableMap parameters) throws Exception { + verify(connection) + .send(eq(RestoreCommitLogsAction.PATH), urlParamCaptor.capture(), any(), eq(new byte[0])); + assertThat(urlParamCaptor.getValue()).containsExactlyEntriesIn(parameters); + } +}