From 6a272bc8c6f6b79ed16c608466f45e973edad90d Mon Sep 17 00:00:00 2001 From: gbrodman Date: Wed, 29 May 2019 08:13:01 -0700 Subject: [PATCH] Modify DeleteAllocationTokensCommand to have the same input structure as UpdateATC It's dangerous to have a blank prefix delete all tokens and this allows for some code unification. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=250493453 --- .../tools/DeleteAllocationTokensCommand.java | 30 ++------- .../tools/UpdateAllocationTokensCommand.java | 63 ++++-------------- ...UpdateOrDeleteAllocationTokensCommand.java | 65 +++++++++++++++++++ .../DeleteAllocationTokensCommandTest.java | 44 +++++++++---- .../UpdateAllocationTokensCommandTest.java | 11 +++- 5 files changed, 124 insertions(+), 89 deletions(-) create mode 100644 java/google/registry/tools/UpdateOrDeleteAllocationTokensCommand.java diff --git a/java/google/registry/tools/DeleteAllocationTokensCommand.java b/java/google/registry/tools/DeleteAllocationTokensCommand.java index 88719a5dc..6ee184d12 100644 --- a/java/google/registry/tools/DeleteAllocationTokensCommand.java +++ b/java/google/registry/tools/DeleteAllocationTokensCommand.java @@ -25,37 +25,24 @@ import com.beust.jcommander.Parameters; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableSet; import com.googlecode.objectify.Key; -import com.googlecode.objectify.cmd.Query; import google.registry.model.domain.token.AllocationToken; import java.util.List; /** * Command to delete unused {@link AllocationToken}s. * - *

Allocation tokens that have been redeemed cannot be deleted. To delete a single allocation - * token, specify the entire token as the prefix. + *

Note that all multi-use tokens and redeemed single-use tokens cannot be deleted. */ @Parameters( separators = " =", - commandDescription = "Deletes the unused AllocationTokens with a given prefix.") -final class DeleteAllocationTokensCommand extends ConfirmingCommand - implements CommandWithRemoteApi { - - @Parameter( - names = {"-p", "--prefix"}, - description = "Allocation token prefix; if blank, deletes all unused tokens", - required = true) - private String prefix; + commandDescription = + "Deletes the unused AllocationTokens with a given prefix (or specified tokens).") +final class DeleteAllocationTokensCommand extends UpdateOrDeleteAllocationTokensCommand { @Parameter( names = {"--with_domains"}, description = "Allow deletion of allocation tokens with specified domains; defaults to false") - boolean withDomains; - - @Parameter( - names = {"--dry_run"}, - description = "Do not actually delete the tokens; defaults to false") - boolean dryRun; + private boolean withDomains; private static final int BATCH_SIZE = 20; private static final Joiner JOINER = Joiner.on(", "); @@ -64,12 +51,7 @@ final class DeleteAllocationTokensCommand extends ConfirmingCommand @Override public void init() { - Query query = - ofy().load().type(AllocationToken.class).filter("redemptionHistoryEntry", null); - tokensToDelete = - query.keys().list().stream() - .filter(key -> key.getName().startsWith(prefix)) - .collect(toImmutableSet()); + tokensToDelete = getTokenKeys(); } @Override diff --git a/java/google/registry/tools/UpdateAllocationTokensCommand.java b/java/google/registry/tools/UpdateAllocationTokensCommand.java index 8455568ee..171b9e760 100644 --- a/java/google/registry/tools/UpdateAllocationTokensCommand.java +++ b/java/google/registry/tools/UpdateAllocationTokensCommand.java @@ -14,8 +14,6 @@ package google.registry.tools; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.collect.ImmutableList.toImmutableList; import static com.google.common.collect.ImmutableMap.toImmutableMap; import static com.google.common.collect.ImmutableSet.toImmutableSet; import static com.google.common.collect.Iterables.partition; @@ -28,7 +26,6 @@ import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedMap; -import com.googlecode.objectify.Key; import google.registry.model.domain.token.AllocationToken; import google.registry.model.domain.token.AllocationToken.TokenStatus; import google.registry.tools.params.TransitionListParameter.TokenStatusTransitions; @@ -42,49 +39,30 @@ import org.joda.time.DateTime; @Parameters( separators = " =", commandDescription = - "Updates AllocationTokens with the given prefix, modifying some subset of their allowed" - + " client IDs, allowed TLDs, discount fraction, or status transitions") -public final class UpdateAllocationTokensCommand extends ConfirmingCommand - implements CommandWithRemoteApi { - - @Parameter( - names = {"-p", "--prefix"}, - description = - "Update all allocation tokens with this prefix; otherwise use '--tokens' to specify" - + " exact tokens(s) to update") - private String prefix; - - @Parameter( - names = {"--tokens"}, - description = - "Comma-separated list of tokens to update; otherwise use '--prefix' to update all tokens" - + " with a given prefix") - private List tokens; - - @Parameter( - names = {"--dry_run"}, - description = "Do not actually update the tokens; defaults to false") - private boolean dryRun; + "Updates AllocationTokens with the given prefix (or specified tokens), modifying some " + + "subset of their allowed client IDs, allowed TLDs, discount fraction, or status " + + "transitions") +final class UpdateAllocationTokensCommand extends UpdateOrDeleteAllocationTokensCommand { @Parameter( names = {"--allowed_client_ids"}, description = - "Comma-separated list of allowed client IDs. Use the empty string to clear the" - + " existing list.") + "Comma-separated list of allowed client IDs. Use the empty string to clear the " + + "existing list.") private List allowedClientIds; @Parameter( names = {"--allowed_tlds"}, description = - "Comma-separated list of allowed TLDs. Use the empty string to clear the" - + " existing list.") + "Comma-separated list of allowed TLDs. Use the empty string to clear the " + + "existing list.") private List allowedTlds; @Parameter( names = {"--discount_fraction"}, description = - "A discount off the base price for the first year between 0.0 and 1.0. Default is 0.0," - + " i.e. no discount.") + "A discount off the base price for the first year between 0.0 and 1.0. Default is 0.0, " + + "i.e. no discount.") private Double discountFraction; @Parameter( @@ -92,8 +70,8 @@ public final class UpdateAllocationTokensCommand extends ConfirmingCommand converter = TokenStatusTransitions.class, validateWith = TokenStatusTransitions.class, description = - "Comma-delimited list of token status transitions effective on specific dates, of the" - + " form