diff --git a/core/src/main/java/google/registry/rde/RdeModule.java b/core/src/main/java/google/registry/rde/RdeModule.java index ee3a3abee..685868952 100644 --- a/core/src/main/java/google/registry/rde/RdeModule.java +++ b/core/src/main/java/google/registry/rde/RdeModule.java @@ -45,6 +45,7 @@ public abstract class RdeModule { public static final String PARAM_WATERMARK = "watermark"; public static final String PARAM_WATERMARKS = "watermarks"; public static final String PARAM_MANUAL = "manual"; + public static final String PARAM_BEAM = "beam"; public static final String PARAM_DIRECTORY = "directory"; public static final String PARAM_MODE = "mode"; public static final String PARAM_REVISION = "revision"; @@ -72,6 +73,12 @@ public abstract class RdeModule { return extractBooleanParameter(req, PARAM_MANUAL); } + @Provides + @Parameter(PARAM_BEAM) + static boolean provideBeam(HttpServletRequest req) { + return extractBooleanParameter(req, PARAM_BEAM); + } + @Provides @Parameter(PARAM_DIRECTORY) static Optional provideDirectory(HttpServletRequest req) { diff --git a/core/src/main/java/google/registry/rde/RdeStagingAction.java b/core/src/main/java/google/registry/rde/RdeStagingAction.java index 1dd0418a7..bae879cfb 100644 --- a/core/src/main/java/google/registry/rde/RdeStagingAction.java +++ b/core/src/main/java/google/registry/rde/RdeStagingAction.java @@ -264,6 +264,11 @@ public final class RdeStagingAction implements Runnable { @Inject @Config("beamStagingBucketUrl") String stagingBucketUrl; @Inject @Config("rdeBucket") String rdeBucket; @Inject @Parameter(RdeModule.PARAM_MANUAL) boolean manual; + + @Inject + @Parameter(RdeModule.PARAM_BEAM) + boolean beam; + @Inject @Parameter(RdeModule.PARAM_DIRECTORY) Optional directory; @Inject @Parameter(RdeModule.PARAM_MODE) ImmutableSet modeStrings; @Inject @Parameter(RequestParameters.PARAM_TLDS) ImmutableSet tlds; @@ -289,7 +294,7 @@ public final class RdeStagingAction implements Runnable { logger.atInfo().log("Pending deposit: %s", pending); } ValidationMode validationMode = lenient ? LENIENT : STRICT; - if (tm().isOfy()) { + if (tm().isOfy() && !beam) { RdeStagingMapper mapper = new RdeStagingMapper(validationMode, pendings); RdeStagingReducer reducer = reducerFactory.create(validationMode, gcsUtils); mrRunner @@ -382,6 +387,9 @@ public final class RdeStagingAction implements Runnable { if (revision.isPresent()) { throw new BadRequestException("Revision parameter not allowed in standard operation"); } + if (beam) { + throw new BadRequestException("Beam parameter not allowed in standard operation"); + } return ImmutableSetMultimap.copyOf( Multimaps.filterValues( diff --git a/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java b/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java index 3f4a2258e..c5a37fb3e 100644 --- a/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java +++ b/core/src/main/java/google/registry/tools/GenerateEscrowDepositCommand.java @@ -16,7 +16,9 @@ package google.registry.tools; import static com.google.appengine.api.taskqueue.TaskOptions.Builder.withUrl; import static google.registry.model.tld.Registries.assertTldsExist; +import static google.registry.rde.RdeModule.PARAM_BEAM; import static google.registry.rde.RdeModule.PARAM_DIRECTORY; +import static google.registry.rde.RdeModule.PARAM_LENIENT; import static google.registry.rde.RdeModule.PARAM_MANUAL; import static google.registry.rde.RdeModule.PARAM_MODE; import static google.registry.rde.RdeModule.PARAM_REVISION; @@ -65,6 +67,20 @@ final class GenerateEscrowDepositCommand implements CommandWithRemoteApi { description = "Mode of operation: FULL for RDE deposits, THIN for BRDA deposits.") private RdeMode mode = RdeMode.FULL; + @Parameter( + names = {"-l", "--lenient"}, + description = + "Whether to run RDE in LENIENT mode, which omits validation of the generated " + + "XML deposit files.") + private boolean lenient = false; + + @Parameter( + names = {"-b", "--beam"}, + description = + "Whether to explicitly launch the beam pipeline instead of letting the action decide" + + " which one to run.") + private boolean beam = false; + @Parameter( names = {"-r", "--revision"}, description = "Revision number. Use >0 for resends.") @@ -119,6 +135,8 @@ final class GenerateEscrowDepositCommand implements CommandWithRemoteApi { .param(PARAM_MANUAL, String.valueOf(true)) .param(PARAM_MODE, mode.toString()) .param(PARAM_DIRECTORY, outdir) + .param(PARAM_LENIENT, Boolean.toString(lenient)) + .param(PARAM_BEAM, Boolean.toString(beam)) .param(PARAM_TLDS, tlds.stream().collect(Collectors.joining(","))) .param( PARAM_WATERMARKS, diff --git a/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java b/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java index c0ef56b25..e027538d1 100644 --- a/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java +++ b/core/src/test/java/google/registry/tools/GenerateEscrowDepositCommandTest.java @@ -188,7 +188,55 @@ public class GenerateEscrowDepositCommandTest } @Test - void testCommand_success() throws Exception { + void testCommand_successWithLenientValidationMode() throws Exception { + runCommand( + "--tld=tld", + "--watermark=2017-01-01T00:00:00Z", + "--mode=thin", + "--lenient", + "-r 42", + "-o test"); + + assertTasksEnqueued( + "rde-report", + new TaskMatcher() + .url("/_dr/task/rdeStaging") + .header("Host", "backend.test.localhost") + .param("mode", "THIN") + .param("lenient", "true") + .param("watermarks", "2017-01-01T00:00:00.000Z") + .param("tlds", "tld") + .param("directory", "test") + .param("manual", "true") + .param("revision", "42")); + } + + @Test + void testCommand_successWithBeam() throws Exception { + runCommand( + "--tld=tld", + "--watermark=2017-01-01T00:00:00Z", + "--mode=thin", + "--beam", + "-r 42", + "-o test"); + + assertTasksEnqueued( + "rde-report", + new TaskMatcher() + .url("/_dr/task/rdeStaging") + .header("Host", "backend.test.localhost") + .param("mode", "THIN") + .param("beam", "true") + .param("watermarks", "2017-01-01T00:00:00.000Z") + .param("tlds", "tld") + .param("directory", "test") + .param("manual", "true") + .param("revision", "42")); + } + + @Test + void testCommand_successWithDefaultValidationMode() throws Exception { runCommand("--tld=tld", "--watermark=2017-01-01T00:00:00Z", "--mode=thin", "-r 42", "-o test"); assertTasksEnqueued( @@ -197,6 +245,7 @@ public class GenerateEscrowDepositCommandTest .url("/_dr/task/rdeStaging") .header("Host", "backend.test.localhost") .param("mode", "THIN") + .param("lenient", "false") .param("watermarks", "2017-01-01T00:00:00.000Z") .param("tlds", "tld") .param("directory", "test") @@ -213,6 +262,8 @@ public class GenerateEscrowDepositCommandTest new TaskMatcher() .url("/_dr/task/rdeStaging") .header("Host", "backend.test.localhost") + .param("lenient", "false") + .param("beam", "false") .param("mode", "THIN") .param("watermarks", "2017-01-01T00:00:00.000Z") .param("tlds", "tld") @@ -230,6 +281,8 @@ public class GenerateEscrowDepositCommandTest .url("/_dr/task/rdeStaging") .header("Host", "backend.test.localhost") .param("mode", "FULL") + .param("lenient", "false") + .param("beam", "false") .param("watermarks", "2017-01-01T00:00:00.000Z") .param("tlds", "tld") .param("directory", "test") @@ -252,6 +305,8 @@ public class GenerateEscrowDepositCommandTest .url("/_dr/task/rdeStaging") .header("Host", "backend.test.localhost") .param("mode", "THIN") + .param("lenient", "false") + .param("beam", "false") .param("watermarks", "2017-01-01T00:00:00.000Z,2017-01-02T00:00:00.000Z") .param("tlds", "tld,anothertld") .param("directory", "test")