diff --git a/core/src/main/java/google/registry/model/EntityClasses.java b/core/src/main/java/google/registry/model/EntityClasses.java
index c0870301d..ba5fd409a 100644
--- a/core/src/main/java/google/registry/model/EntityClasses.java
+++ b/core/src/main/java/google/registry/model/EntityClasses.java
@@ -15,6 +15,7 @@
package google.registry.model;
import com.google.common.collect.ImmutableSet;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.billing.BillingEvent;
import google.registry.model.common.Cursor;
import google.registry.model.common.EntityGroupRoot;
@@ -45,6 +46,7 @@ import google.registry.model.server.ServerSecret;
import google.registry.model.tld.Registry;
/** Sets of classes of the Objectify-registered entities in use throughout the model. */
+@DeleteAfterMigration
public final class EntityClasses {
/** Set of entity classes. */
diff --git a/core/src/main/java/google/registry/model/IdService.java b/core/src/main/java/google/registry/model/IdService.java
index f41291194..8074c0583 100644
--- a/core/src/main/java/google/registry/model/IdService.java
+++ b/core/src/main/java/google/registry/model/IdService.java
@@ -20,6 +20,7 @@ import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.common.annotations.VisibleForTesting;
import google.registry.beam.common.RegistryPipelineWorkerInitializer;
import google.registry.config.RegistryEnvironment;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.concurrent.atomic.AtomicLong;
/**
@@ -28,6 +29,7 @@ import java.util.concurrent.atomic.AtomicLong;
*
In non-test, non-beam environments the Id is generated by Datastore, otherwise it's from an
* atomic long number that's incremented every time this method is called.
*/
+@DeleteAfterMigration
public final class IdService {
/**
diff --git a/core/src/main/java/google/registry/model/SchemaVersion.java b/core/src/main/java/google/registry/model/SchemaVersion.java
index 5c5bc152c..06b4791a9 100644
--- a/core/src/main/java/google/registry/model/SchemaVersion.java
+++ b/core/src/main/java/google/registry/model/SchemaVersion.java
@@ -19,12 +19,14 @@ import static com.google.common.base.Predicates.subtypeOf;
import static java.util.stream.Collectors.joining;
import com.google.common.collect.Ordering;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.ArrayDeque;
import java.util.Queue;
import java.util.SortedSet;
import java.util.TreeSet;
/** Utility methods for getting the version of the model schema from the model code. */
+@DeleteAfterMigration
public final class SchemaVersion {
/**
diff --git a/core/src/main/java/google/registry/model/common/CrossTldSingleton.java b/core/src/main/java/google/registry/model/common/CrossTldSingleton.java
index acc9baa0e..d57db4afe 100644
--- a/core/src/main/java/google/registry/model/common/CrossTldSingleton.java
+++ b/core/src/main/java/google/registry/model/common/CrossTldSingleton.java
@@ -20,11 +20,13 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.InCrossTld;
import javax.persistence.MappedSuperclass;
import javax.persistence.Transient;
/** A singleton entity in Datastore. */
+@DeleteAfterMigration
@MappedSuperclass
@InCrossTld
public abstract class CrossTldSingleton extends ImmutableObject {
diff --git a/core/src/main/java/google/registry/model/common/DatabaseMigrationStateSchedule.java b/core/src/main/java/google/registry/model/common/DatabaseMigrationStateSchedule.java
index a87d73235..8bd4f7572 100644
--- a/core/src/main/java/google/registry/model/common/DatabaseMigrationStateSchedule.java
+++ b/core/src/main/java/google/registry/model/common/DatabaseMigrationStateSchedule.java
@@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableMultimap;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.flogger.FluentLogger;
import google.registry.config.RegistryEnvironment;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.TimedTransitionProperty.TimedTransition;
import google.registry.model.replay.SqlOnlyEntity;
import java.time.Duration;
@@ -39,6 +40,7 @@ import org.joda.time.DateTime;
*
The entity is stored in SQL throughout the entire migration so as to have a single point of
* access.
*/
+@DeleteAfterMigration
@Entity
public class DatabaseMigrationStateSchedule extends CrossTldSingleton implements SqlOnlyEntity {
diff --git a/core/src/main/java/google/registry/model/common/EntityGroupRoot.java b/core/src/main/java/google/registry/model/common/EntityGroupRoot.java
index 791432461..6009ad454 100644
--- a/core/src/main/java/google/registry/model/common/EntityGroupRoot.java
+++ b/core/src/main/java/google/registry/model/common/EntityGroupRoot.java
@@ -19,6 +19,7 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import google.registry.model.BackupGroupRoot;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.replay.DatastoreOnlyEntity;
import javax.annotation.Nullable;
@@ -37,6 +38,7 @@ import javax.annotation.Nullable;
* entity group for the single namespace where global data applicable for all TLDs lived.
*/
@Entity
+@DeleteAfterMigration
public class EntityGroupRoot extends BackupGroupRoot implements DatastoreOnlyEntity {
@SuppressWarnings("unused")
diff --git a/core/src/main/java/google/registry/model/index/EppResourceIndex.java b/core/src/main/java/google/registry/model/index/EppResourceIndex.java
index bfa80c8fa..2920af6b8 100644
--- a/core/src/main/java/google/registry/model/index/EppResourceIndex.java
+++ b/core/src/main/java/google/registry/model/index/EppResourceIndex.java
@@ -24,12 +24,14 @@ import com.googlecode.objectify.annotation.Index;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.BackupGroupRoot;
import google.registry.model.EppResource;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.replay.DatastoreOnlyEntity;
/** An index that allows for quick enumeration of all EppResource entities (e.g. via map reduce). */
@ReportedOn
@Entity
+@DeleteAfterMigration
public class EppResourceIndex extends BackupGroupRoot implements DatastoreOnlyEntity {
@Id String id;
diff --git a/core/src/main/java/google/registry/model/index/EppResourceIndexBucket.java b/core/src/main/java/google/registry/model/index/EppResourceIndexBucket.java
index 6a228ba51..ad41ff035 100644
--- a/core/src/main/java/google/registry/model/index/EppResourceIndexBucket.java
+++ b/core/src/main/java/google/registry/model/index/EppResourceIndexBucket.java
@@ -23,12 +23,14 @@ import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import google.registry.model.EppResource;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.VirtualEntity;
import google.registry.model.replay.DatastoreOnlyEntity;
/** A virtual entity to represent buckets to which EppResourceIndex objects are randomly added. */
@Entity
@VirtualEntity
+@DeleteAfterMigration
public class EppResourceIndexBucket extends ImmutableObject implements DatastoreOnlyEntity {
@SuppressWarnings("unused")
diff --git a/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java b/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java
index 19ac5b258..0437931e2 100644
--- a/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java
+++ b/core/src/main/java/google/registry/model/index/ForeignKeyIndex.java
@@ -43,6 +43,7 @@ import com.googlecode.objectify.annotation.Index;
import google.registry.config.RegistryConfig;
import google.registry.model.BackupGroupRoot;
import google.registry.model.EppResource;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.ReportedOn;
import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase;
@@ -65,6 +66,7 @@ import org.joda.time.Duration;
* the foreign key string. The instance is never deleted, but it is updated if a newer entity
* becomes the active entity.
*/
+@DeleteAfterMigration
public abstract class ForeignKeyIndex extends BackupGroupRoot {
/** The {@link ForeignKeyIndex} type for {@link ContactResource} entities. */
diff --git a/core/src/main/java/google/registry/model/ofy/AugmentedDeleter.java b/core/src/main/java/google/registry/model/ofy/AugmentedDeleter.java
index 2ccca290e..94a6c33a9 100644
--- a/core/src/main/java/google/registry/model/ofy/AugmentedDeleter.java
+++ b/core/src/main/java/google/registry/model/ofy/AugmentedDeleter.java
@@ -23,6 +23,7 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.Result;
import com.googlecode.objectify.cmd.DeleteType;
import com.googlecode.objectify.cmd.Deleter;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Arrays;
import java.util.stream.Stream;
@@ -30,6 +31,7 @@ import java.util.stream.Stream;
* A Deleter that forwards to {@code auditedOfy().delete()}, but can be augmented via subclassing to
* do custom processing on the keys to be deleted prior to their deletion.
*/
+@DeleteAfterMigration
abstract class AugmentedDeleter implements Deleter {
private final Deleter delegate = ofy().delete();
diff --git a/core/src/main/java/google/registry/model/ofy/AugmentedSaver.java b/core/src/main/java/google/registry/model/ofy/AugmentedSaver.java
index b42c1df4d..9896572c0 100644
--- a/core/src/main/java/google/registry/model/ofy/AugmentedSaver.java
+++ b/core/src/main/java/google/registry/model/ofy/AugmentedSaver.java
@@ -21,13 +21,15 @@ import com.google.common.collect.ImmutableList;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Result;
import com.googlecode.objectify.cmd.Saver;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Arrays;
import java.util.Map;
/**
- * A Saver that forwards to {@code ofy().save()}, but can be augmented via subclassing to
- * do custom processing on the entities to be saved prior to their saving.
+ * A Saver that forwards to {@code ofy().save()}, but can be augmented via subclassing to do custom
+ * processing on the entities to be saved prior to their saving.
*/
+@DeleteAfterMigration
abstract class AugmentedSaver implements Saver {
private final Saver delegate = ofy().save();
diff --git a/core/src/main/java/google/registry/model/ofy/CommitLogBucket.java b/core/src/main/java/google/registry/model/ofy/CommitLogBucket.java
index 61b72f03a..c8e53747f 100644
--- a/core/src/main/java/google/registry/model/ofy/CommitLogBucket.java
+++ b/core/src/main/java/google/registry/model/ofy/CommitLogBucket.java
@@ -31,6 +31,7 @@ import com.googlecode.objectify.annotation.Id;
import google.registry.config.RegistryConfig;
import google.registry.model.Buildable;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
@@ -51,6 +52,7 @@ import org.joda.time.DateTime;
*/
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
+@DeleteAfterMigration
public class CommitLogBucket extends ImmutableObject implements Buildable, DatastoreOnlyEntity {
/**
diff --git a/core/src/main/java/google/registry/model/ofy/CommitLogCheckpoint.java b/core/src/main/java/google/registry/model/ofy/CommitLogCheckpoint.java
index 08262a924..867f5f804 100644
--- a/core/src/main/java/google/registry/model/ofy/CommitLogCheckpoint.java
+++ b/core/src/main/java/google/registry/model/ofy/CommitLogCheckpoint.java
@@ -25,6 +25,7 @@ import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
@@ -45,6 +46,7 @@ import org.joda.time.DateTime;
*/
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
+@DeleteAfterMigration
public class CommitLogCheckpoint extends ImmutableObject implements DatastoreOnlyEntity {
/** Shared singleton parent entity for commit log checkpoints. */
diff --git a/core/src/main/java/google/registry/model/ofy/CommitLogCheckpointRoot.java b/core/src/main/java/google/registry/model/ofy/CommitLogCheckpointRoot.java
index 4f7a6eb78..e173f61d6 100644
--- a/core/src/main/java/google/registry/model/ofy/CommitLogCheckpointRoot.java
+++ b/core/src/main/java/google/registry/model/ofy/CommitLogCheckpointRoot.java
@@ -21,6 +21,7 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
@@ -29,6 +30,7 @@ import org.joda.time.DateTime;
/** Singleton parent entity for all commit log checkpoints. */
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
+@DeleteAfterMigration
public class CommitLogCheckpointRoot extends ImmutableObject implements DatastoreOnlyEntity {
public static final long SINGLETON_ID = 1; // There is always exactly one of these.
diff --git a/core/src/main/java/google/registry/model/ofy/CommitLogManifest.java b/core/src/main/java/google/registry/model/ofy/CommitLogManifest.java
index 4df6cec3e..8ad8248f7 100644
--- a/core/src/main/java/google/registry/model/ofy/CommitLogManifest.java
+++ b/core/src/main/java/google/registry/model/ofy/CommitLogManifest.java
@@ -23,6 +23,7 @@ import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
@@ -39,6 +40,7 @@ import org.joda.time.DateTime;
*/
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
+@DeleteAfterMigration
public class CommitLogManifest extends ImmutableObject implements DatastoreOnlyEntity {
/** Commit log manifests are parented on a random bucket. */
diff --git a/core/src/main/java/google/registry/model/ofy/CommitLogMutation.java b/core/src/main/java/google/registry/model/ofy/CommitLogMutation.java
index 1706748de..65ba03823 100644
--- a/core/src/main/java/google/registry/model/ofy/CommitLogMutation.java
+++ b/core/src/main/java/google/registry/model/ofy/CommitLogMutation.java
@@ -27,6 +27,7 @@ import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.NotBackedUp.Reason;
import google.registry.model.replay.DatastoreOnlyEntity;
@@ -34,6 +35,7 @@ import google.registry.model.replay.DatastoreOnlyEntity;
/** Representation of a saved entity in a {@link CommitLogManifest} (not deletes). */
@Entity
@NotBackedUp(reason = Reason.COMMIT_LOGS)
+@DeleteAfterMigration
public class CommitLogMutation extends ImmutableObject implements DatastoreOnlyEntity {
/** The manifest this belongs to. */
diff --git a/core/src/main/java/google/registry/model/ofy/CommitLoggedWork.java b/core/src/main/java/google/registry/model/ofy/CommitLoggedWork.java
index 0237bb717..d3efc043a 100644
--- a/core/src/main/java/google/registry/model/ofy/CommitLoggedWork.java
+++ b/core/src/main/java/google/registry/model/ofy/CommitLoggedWork.java
@@ -30,6 +30,7 @@ import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key;
import google.registry.model.BackupGroupRoot;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.util.Clock;
import java.util.HashSet;
import java.util.Map;
@@ -39,6 +40,7 @@ import java.util.function.Supplier;
import org.joda.time.DateTime;
/** Wrapper for {@link Supplier} that associates a time with each attempt. */
+@DeleteAfterMigration
class CommitLoggedWork implements Runnable {
private final Supplier work;
diff --git a/core/src/main/java/google/registry/model/ofy/DatastoreTransactionManager.java b/core/src/main/java/google/registry/model/ofy/DatastoreTransactionManager.java
index 566020fa6..e8187d2f3 100644
--- a/core/src/main/java/google/registry/model/ofy/DatastoreTransactionManager.java
+++ b/core/src/main/java/google/registry/model/ofy/DatastoreTransactionManager.java
@@ -33,6 +33,7 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.Result;
import com.googlecode.objectify.cmd.Query;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.InCrossTld;
import google.registry.model.contact.ContactHistory;
import google.registry.model.domain.DomainHistory;
@@ -55,6 +56,7 @@ import javax.persistence.NonUniqueResultException;
import org.joda.time.DateTime;
/** Datastore implementation of {@link TransactionManager}. */
+@DeleteAfterMigration
public class DatastoreTransactionManager implements TransactionManager {
private Ofy injectedOfy;
diff --git a/core/src/main/java/google/registry/model/ofy/EntityWritePriorities.java b/core/src/main/java/google/registry/model/ofy/EntityWritePriorities.java
index a2afbf61a..e3aec086f 100644
--- a/core/src/main/java/google/registry/model/ofy/EntityWritePriorities.java
+++ b/core/src/main/java/google/registry/model/ofy/EntityWritePriorities.java
@@ -16,6 +16,7 @@ package google.registry.model.ofy;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableMap;
+import google.registry.model.annotations.DeleteAfterMigration;
/**
* Contains the mapping from class names to SQL-replay-write priorities.
@@ -26,6 +27,7 @@ import com.google.common.collect.ImmutableMap;
* values represent an earlier write (and later delete). Higher-valued classes can have foreign keys
* on lower-valued classes, but not vice versa.
*/
+@DeleteAfterMigration
public class EntityWritePriorities {
/**
diff --git a/core/src/main/java/google/registry/model/ofy/ObjectifyService.java b/core/src/main/java/google/registry/model/ofy/ObjectifyService.java
index 26fc23e3d..ca486e187 100644
--- a/core/src/main/java/google/registry/model/ofy/ObjectifyService.java
+++ b/core/src/main/java/google/registry/model/ofy/ObjectifyService.java
@@ -35,6 +35,7 @@ import google.registry.config.RegistryEnvironment;
import google.registry.model.Buildable;
import google.registry.model.EntityClasses;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.translators.BloomFilterOfStringTranslatorFactory;
import google.registry.model.translators.CidrAddressBlockTranslatorFactory;
import google.registry.model.translators.CommitLogRevisionsTranslatorFactory;
@@ -52,6 +53,7 @@ import google.registry.model.translators.VKeyTranslatorFactory;
* objects. The class contains a static initializer to call factory().register(...) on all
* persistable objects in this package.
*/
+@DeleteAfterMigration
public class ObjectifyService {
/** A singleton instance of our Ofy wrapper. */
diff --git a/core/src/main/java/google/registry/model/ofy/Ofy.java b/core/src/main/java/google/registry/model/ofy/Ofy.java
index a8df05fdc..be69d7efe 100644
--- a/core/src/main/java/google/registry/model/ofy/Ofy.java
+++ b/core/src/main/java/google/registry/model/ofy/Ofy.java
@@ -37,6 +37,7 @@ import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.cmd.Deleter;
import com.googlecode.objectify.cmd.Loader;
import com.googlecode.objectify.cmd.Saver;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.VirtualEntity;
import google.registry.model.ofy.ReadOnlyWork.KillTransactionException;
@@ -59,6 +60,7 @@ import org.joda.time.Duration;
* simpler to wrap {@link Objectify} rather than extend it because this way we can remove some
* methods that we don't really want exposed and add some shortcuts.
*/
+@DeleteAfterMigration
public class Ofy {
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
diff --git a/core/src/main/java/google/registry/model/ofy/OfyFilter.java b/core/src/main/java/google/registry/model/ofy/OfyFilter.java
index 19417c0da..b3daa3412 100644
--- a/core/src/main/java/google/registry/model/ofy/OfyFilter.java
+++ b/core/src/main/java/google/registry/model/ofy/OfyFilter.java
@@ -14,6 +14,7 @@
package google.registry.model.ofy;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
@@ -23,6 +24,7 @@ import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
/** A filter that statically registers types with Objectify. */
+@DeleteAfterMigration
public class OfyFilter implements Filter {
@Override
diff --git a/core/src/main/java/google/registry/model/ofy/ReadOnlyWork.java b/core/src/main/java/google/registry/model/ofy/ReadOnlyWork.java
index aca72f196..d3113cbcf 100644
--- a/core/src/main/java/google/registry/model/ofy/ReadOnlyWork.java
+++ b/core/src/main/java/google/registry/model/ofy/ReadOnlyWork.java
@@ -14,10 +14,12 @@
package google.registry.model.ofy;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.util.Clock;
import java.util.function.Supplier;
/** Wrapper for {@link Supplier} that disallows mutations and fails the transaction at the end. */
+@DeleteAfterMigration
class ReadOnlyWork extends CommitLoggedWork {
ReadOnlyWork(Supplier work, Clock clock) {
diff --git a/core/src/main/java/google/registry/model/ofy/ReplayQueue.java b/core/src/main/java/google/registry/model/ofy/ReplayQueue.java
index c4c184a86..47ffef9a3 100644
--- a/core/src/main/java/google/registry/model/ofy/ReplayQueue.java
+++ b/core/src/main/java/google/registry/model/ofy/ReplayQueue.java
@@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableMap;
import com.googlecode.objectify.Key;
import google.registry.config.RegistryEnvironment;
import google.registry.model.UpdateAutoTimestamp;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.replay.DatastoreEntity;
import google.registry.model.replay.ReplaySpecializer;
import google.registry.persistence.VKey;
@@ -34,6 +35,7 @@ import java.util.concurrent.ConcurrentLinkedQueue;
*
* This code is to be removed when the actual replay cron job is implemented.
*/
+@DeleteAfterMigration
public class ReplayQueue {
static ConcurrentLinkedQueue, Object>> queue =
diff --git a/core/src/main/java/google/registry/model/ofy/RequestCapturingAsyncDatastoreService.java b/core/src/main/java/google/registry/model/ofy/RequestCapturingAsyncDatastoreService.java
index 37cab637f..f036a5abf 100644
--- a/core/src/main/java/google/registry/model/ofy/RequestCapturingAsyncDatastoreService.java
+++ b/core/src/main/java/google/registry/model/ofy/RequestCapturingAsyncDatastoreService.java
@@ -28,6 +28,7 @@ import com.google.appengine.api.datastore.Query;
import com.google.appengine.api.datastore.Transaction;
import com.google.appengine.api.datastore.TransactionOptions;
import com.google.common.collect.ImmutableList;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
@@ -35,6 +36,7 @@ import java.util.Map;
import java.util.concurrent.Future;
/** A proxy for {@link AsyncDatastoreService} that exposes call counts. */
+@DeleteAfterMigration
public class RequestCapturingAsyncDatastoreService implements AsyncDatastoreService {
private final AsyncDatastoreService delegate;
diff --git a/core/src/main/java/google/registry/model/ofy/SessionKeyExposingObjectify.java b/core/src/main/java/google/registry/model/ofy/SessionKeyExposingObjectify.java
index eb938cbfb..103181828 100644
--- a/core/src/main/java/google/registry/model/ofy/SessionKeyExposingObjectify.java
+++ b/core/src/main/java/google/registry/model/ofy/SessionKeyExposingObjectify.java
@@ -18,8 +18,10 @@ import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.ObjectifyFactory;
import com.googlecode.objectify.impl.ObjectifyImpl;
+import google.registry.model.annotations.DeleteAfterMigration;
/** Registry-specific Objectify subclass that exposes the keys used in the current session. */
+@DeleteAfterMigration
public class SessionKeyExposingObjectify extends ObjectifyImpl {
public SessionKeyExposingObjectify(ObjectifyFactory factory) {
diff --git a/core/src/main/java/google/registry/model/ofy/TimestampInversionException.java b/core/src/main/java/google/registry/model/ofy/TimestampInversionException.java
index 33b1c4ad2..653cec8c3 100644
--- a/core/src/main/java/google/registry/model/ofy/TimestampInversionException.java
+++ b/core/src/main/java/google/registry/model/ofy/TimestampInversionException.java
@@ -17,6 +17,7 @@ package google.registry.model.ofy;
import com.googlecode.objectify.Key;
import com.googlecode.objectify.Objectify;
import google.registry.model.BackupGroupRoot;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Arrays;
import java.util.Map;
import org.joda.time.DateTime;
@@ -25,6 +26,7 @@ import org.joda.time.DateTime;
* Exception when trying to write to Datastore with a timestamp that is inconsistent with a partial
* ordering on transactions that touch the same entities.
*/
+@DeleteAfterMigration
class TimestampInversionException extends RuntimeException {
static String getFileAndLine(StackTraceElement callsite) {
diff --git a/core/src/main/java/google/registry/model/ofy/TransactionInfo.java b/core/src/main/java/google/registry/model/ofy/TransactionInfo.java
index 4e4518f9c..5ae239d36 100644
--- a/core/src/main/java/google/registry/model/ofy/TransactionInfo.java
+++ b/core/src/main/java/google/registry/model/ofy/TransactionInfo.java
@@ -26,10 +26,12 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Map;
import org.joda.time.DateTime;
/** Metadata for an {@link Ofy} transaction that saves commit logs. */
+@DeleteAfterMigration
public class TransactionInfo {
@VisibleForTesting
diff --git a/core/src/main/java/google/registry/model/replay/DatastoreAndSqlEntity.java b/core/src/main/java/google/registry/model/replay/DatastoreAndSqlEntity.java
index eb6d54646..8fb61dc90 100644
--- a/core/src/main/java/google/registry/model/replay/DatastoreAndSqlEntity.java
+++ b/core/src/main/java/google/registry/model/replay/DatastoreAndSqlEntity.java
@@ -14,9 +14,11 @@
package google.registry.model.replay;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Optional;
/** An entity that has the same Java object representation in SQL and Datastore. */
+@DeleteAfterMigration
public interface DatastoreAndSqlEntity extends DatastoreEntity, SqlEntity {
@Override
diff --git a/core/src/main/java/google/registry/model/replay/DatastoreEntity.java b/core/src/main/java/google/registry/model/replay/DatastoreEntity.java
index 8c719b22b..f78644e7a 100644
--- a/core/src/main/java/google/registry/model/replay/DatastoreEntity.java
+++ b/core/src/main/java/google/registry/model/replay/DatastoreEntity.java
@@ -14,6 +14,7 @@
package google.registry.model.replay;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Optional;
/**
@@ -24,6 +25,7 @@ import java.util.Optional;
* transactions and data into the secondary SQL store during the first, Datastore-primary, phase of
* the migration.
*/
+@DeleteAfterMigration
public interface DatastoreEntity {
Optional toSqlEntity();
diff --git a/core/src/main/java/google/registry/model/replay/DatastoreOnlyEntity.java b/core/src/main/java/google/registry/model/replay/DatastoreOnlyEntity.java
index 621d7cb37..842e31a51 100644
--- a/core/src/main/java/google/registry/model/replay/DatastoreOnlyEntity.java
+++ b/core/src/main/java/google/registry/model/replay/DatastoreOnlyEntity.java
@@ -14,9 +14,11 @@
package google.registry.model.replay;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Optional;
/** An entity that is only stored in Datastore, that should not be replayed to SQL. */
+@DeleteAfterMigration
public interface DatastoreOnlyEntity extends DatastoreEntity {
@Override
default Optional toSqlEntity() {
diff --git a/core/src/main/java/google/registry/model/replay/LastSqlTransaction.java b/core/src/main/java/google/registry/model/replay/LastSqlTransaction.java
index 6d2e90e72..678e24c8b 100644
--- a/core/src/main/java/google/registry/model/replay/LastSqlTransaction.java
+++ b/core/src/main/java/google/registry/model/replay/LastSqlTransaction.java
@@ -22,9 +22,11 @@ import com.googlecode.objectify.Key;
import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.Id;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
/** Datastore entity to keep track of the last SQL transaction imported into the datastore. */
@Entity
+@DeleteAfterMigration
public class LastSqlTransaction extends ImmutableObject implements DatastoreOnlyEntity {
/** The key for this singleton. */
diff --git a/core/src/main/java/google/registry/model/replay/NonReplicatedEntity.java b/core/src/main/java/google/registry/model/replay/NonReplicatedEntity.java
index 0059f560e..7878a3132 100644
--- a/core/src/main/java/google/registry/model/replay/NonReplicatedEntity.java
+++ b/core/src/main/java/google/registry/model/replay/NonReplicatedEntity.java
@@ -14,6 +14,7 @@
package google.registry.model.replay;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Optional;
/**
@@ -21,6 +22,7 @@ import java.util.Optional;
*
* We expect that this is a result of the entity being dually-written.
*/
+@DeleteAfterMigration
public interface NonReplicatedEntity extends DatastoreEntity, SqlEntity {
@Override
diff --git a/core/src/main/java/google/registry/model/replay/ReplaySpecializer.java b/core/src/main/java/google/registry/model/replay/ReplaySpecializer.java
index b09794772..26018d57c 100644
--- a/core/src/main/java/google/registry/model/replay/ReplaySpecializer.java
+++ b/core/src/main/java/google/registry/model/replay/ReplaySpecializer.java
@@ -14,6 +14,7 @@
package google.registry.model.replay;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.persistence.VKey;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
@@ -25,6 +26,7 @@ import java.lang.reflect.Method;
* not directly present in the other database. This class allows us to do that by using reflection
* to invoke special class methods if they are present.
*/
+@DeleteAfterMigration
public class ReplaySpecializer {
public static void beforeSqlDelete(VKey> key) {
diff --git a/core/src/main/java/google/registry/model/replay/ReplicateToDatastoreAction.java b/core/src/main/java/google/registry/model/replay/ReplicateToDatastoreAction.java
index 2292bb4aa..794cfe840 100644
--- a/core/src/main/java/google/registry/model/replay/ReplicateToDatastoreAction.java
+++ b/core/src/main/java/google/registry/model/replay/ReplicateToDatastoreAction.java
@@ -27,6 +27,7 @@ import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableList;
import com.google.common.flogger.FluentLogger;
import google.registry.model.UpdateAutoTimestamp;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.ReplayDirection;
@@ -53,6 +54,7 @@ import org.joda.time.Duration;
automaticallyPrintOk = true,
auth = Auth.AUTH_INTERNAL_OR_ADMIN)
@VisibleForTesting
+@DeleteAfterMigration
public class ReplicateToDatastoreAction implements Runnable {
public static final String PATH = "/_dr/cron/replicateToDatastore";
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
diff --git a/core/src/main/java/google/registry/model/replay/SqlEntity.java b/core/src/main/java/google/registry/model/replay/SqlEntity.java
index 6fb618790..e22f00572 100644
--- a/core/src/main/java/google/registry/model/replay/SqlEntity.java
+++ b/core/src/main/java/google/registry/model/replay/SqlEntity.java
@@ -16,6 +16,7 @@ package google.registry.model.replay;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Optional;
/**
@@ -25,6 +26,7 @@ import java.util.Optional;
*
This will be used when replaying SQL transactions into Datastore, during the second,
* SQL-primary, phase of the migration from Datastore to SQL.
*/
+@DeleteAfterMigration
public interface SqlEntity {
Optional toDatastoreEntity();
diff --git a/core/src/main/java/google/registry/model/replay/SqlOnlyEntity.java b/core/src/main/java/google/registry/model/replay/SqlOnlyEntity.java
index 0c25349da..ac156b758 100644
--- a/core/src/main/java/google/registry/model/replay/SqlOnlyEntity.java
+++ b/core/src/main/java/google/registry/model/replay/SqlOnlyEntity.java
@@ -14,9 +14,11 @@
package google.registry.model.replay;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Optional;
/** An entity that is only stored in SQL, that should not be replayed to Datastore. */
+@DeleteAfterMigration
public interface SqlOnlyEntity extends SqlEntity {
@Override
default Optional toDatastoreEntity() {
diff --git a/core/src/main/java/google/registry/model/replay/SqlReplayCheckpoint.java b/core/src/main/java/google/registry/model/replay/SqlReplayCheckpoint.java
index 4f2df5633..89f8cedf1 100644
--- a/core/src/main/java/google/registry/model/replay/SqlReplayCheckpoint.java
+++ b/core/src/main/java/google/registry/model/replay/SqlReplayCheckpoint.java
@@ -17,12 +17,14 @@ package google.registry.model.replay;
import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm;
import static google.registry.util.DateTimeUtils.START_OF_TIME;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.CrossTldSingleton;
import javax.persistence.Column;
import javax.persistence.Entity;
import org.joda.time.DateTime;
@Entity
+@DeleteAfterMigration
public class SqlReplayCheckpoint extends CrossTldSingleton implements SqlOnlyEntity {
@Column(nullable = false)
diff --git a/core/src/main/java/google/registry/model/translators/CommitLogRevisionsTranslatorFactory.java b/core/src/main/java/google/registry/model/translators/CommitLogRevisionsTranslatorFactory.java
index e25a67fc8..1ab51d66d 100644
--- a/core/src/main/java/google/registry/model/translators/CommitLogRevisionsTranslatorFactory.java
+++ b/core/src/main/java/google/registry/model/translators/CommitLogRevisionsTranslatorFactory.java
@@ -23,6 +23,7 @@ import static google.registry.util.DateTimeUtils.START_OF_TIME;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.Ordering;
import com.googlecode.objectify.Key;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.ofy.CommitLogManifest;
import google.registry.persistence.transaction.Transaction;
import org.joda.time.DateTime;
@@ -31,11 +32,12 @@ import org.joda.time.DateTime;
* Objectify translator for {@code ImmutableSortedMap>} fields.
*
* This translator is responsible for doing three things:
+ *
*
- * - Translating the data into two lists of {@code Date} and {@code Key} objects, in a manner
- * similar to {@code @Mapify}.
- *
- Inserting a key to the transaction's {@link CommitLogManifest} on save.
- *
- Truncating the map to include only the last key per day for the last 30 days.
+ *
- Translating the data into two lists of {@code Date} and {@code Key} objects, in a manner
+ * similar to {@code @Mapify}.
+ *
- Inserting a key to the transaction's {@link CommitLogManifest} on save.
+ *
- Truncating the map to include only the last key per day for the last 30 days.
*
*
* This allows you to have a field on your model object that tracks historical revisions of
@@ -46,6 +48,7 @@ import org.joda.time.DateTime;
*
* @see google.registry.model.EppResource
*/
+@DeleteAfterMigration
public final class CommitLogRevisionsTranslatorFactory
extends ImmutableSortedMapTranslatorFactory> {
diff --git a/core/src/main/java/google/registry/persistence/converter/DatabaseMigrationScheduleTransitionConverter.java b/core/src/main/java/google/registry/persistence/converter/DatabaseMigrationScheduleTransitionConverter.java
index 979ae3a33..70f2b5ff6 100644
--- a/core/src/main/java/google/registry/persistence/converter/DatabaseMigrationScheduleTransitionConverter.java
+++ b/core/src/main/java/google/registry/persistence/converter/DatabaseMigrationScheduleTransitionConverter.java
@@ -15,6 +15,7 @@
package google.registry.persistence.converter;
import com.google.common.collect.Maps;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationStateTransition;
@@ -23,6 +24,7 @@ import javax.persistence.Converter;
import org.joda.time.DateTime;
/** JPA converter for {@link DatabaseMigrationStateSchedule} transitions. */
+@DeleteAfterMigration
@Converter(autoApply = true)
public class DatabaseMigrationScheduleTransitionConverter
extends TimedTransitionPropertyConverterBase {
diff --git a/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingEntityManager.java b/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingEntityManager.java
index 7fe305666..227f99cb3 100644
--- a/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingEntityManager.java
+++ b/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingEntityManager.java
@@ -16,6 +16,7 @@ package google.registry.persistence.transaction;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertNotReadOnlyMode;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityGraph;
@@ -34,6 +35,7 @@ import javax.persistence.criteria.CriteriaUpdate;
import javax.persistence.metamodel.Metamodel;
/** An {@link EntityManager} that throws exceptions on write actions if in read-only mode. */
+@DeleteAfterMigration
public class ReadOnlyCheckingEntityManager implements EntityManager {
private final EntityManager delegate;
diff --git a/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingQuery.java b/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingQuery.java
index e7b57c33a..345946253 100644
--- a/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingQuery.java
+++ b/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingQuery.java
@@ -16,6 +16,7 @@ package google.registry.persistence.transaction;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertNotReadOnlyMode;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -29,6 +30,7 @@ import javax.persistence.Query;
import javax.persistence.TemporalType;
/** A {@link Query} that throws exceptions on write actions if in read-only mode. */
+@DeleteAfterMigration
class ReadOnlyCheckingQuery implements Query {
private final Query delegate;
diff --git a/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingTypedQuery.java b/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingTypedQuery.java
index f0077c835..e3eab9e2f 100644
--- a/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingTypedQuery.java
+++ b/core/src/main/java/google/registry/persistence/transaction/ReadOnlyCheckingTypedQuery.java
@@ -16,6 +16,7 @@ package google.registry.persistence.transaction;
import static google.registry.persistence.transaction.TransactionManagerFactory.assertNotReadOnlyMode;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -29,6 +30,7 @@ import javax.persistence.TemporalType;
import javax.persistence.TypedQuery;
/** A {@link TypedQuery } that throws exceptions on write actions if in read-only mode. */
+@DeleteAfterMigration
class ReadOnlyCheckingTypedQuery implements TypedQuery {
private final TypedQuery delegate;
diff --git a/core/src/main/java/google/registry/tools/CompareDbBackups.java b/core/src/main/java/google/registry/tools/CompareDbBackups.java
index e58c73b97..44e58bbdf 100644
--- a/core/src/main/java/google/registry/tools/CompareDbBackups.java
+++ b/core/src/main/java/google/registry/tools/CompareDbBackups.java
@@ -17,6 +17,7 @@ package google.registry.tools;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
import com.google.common.collect.Sets.SetView;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.io.File;
/**
@@ -27,6 +28,7 @@ import java.io.File;
* two-level directory hierarchy with data files in level-db format (output-*) and Datastore
* metadata files (*.export_metadata).
*/
+@DeleteAfterMigration
class CompareDbBackups {
private static final String DS_V3_BACKUP_FILE_PREFIX = "output-";
diff --git a/core/src/main/java/google/registry/tools/GetDatabaseMigrationStateCommand.java b/core/src/main/java/google/registry/tools/GetDatabaseMigrationStateCommand.java
index 1f858473c..8a4c680f2 100644
--- a/core/src/main/java/google/registry/tools/GetDatabaseMigrationStateCommand.java
+++ b/core/src/main/java/google/registry/tools/GetDatabaseMigrationStateCommand.java
@@ -15,12 +15,14 @@
package google.registry.tools;
import com.beust.jcommander.Parameters;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationStateTransition;
import google.registry.model.common.TimedTransitionProperty;
/** A command to check the current Registry 3.0 migration state of the database. */
+@DeleteAfterMigration
@Parameters(separators = " =", commandDescription = "Check current Registry 3.0 migration state")
public class GetDatabaseMigrationStateCommand implements CommandWithRemoteApi {
diff --git a/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java b/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java
index 8a83e63b9..aa06cc23f 100644
--- a/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java
+++ b/core/src/main/java/google/registry/tools/GetResourceByKeyCommand.java
@@ -20,12 +20,12 @@ import static google.registry.model.ofy.ObjectifyService.auditedOfy;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import google.registry.model.EppResource;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.persistence.VKey;
import java.util.List;
-/**
- * Command to get info on a Datastore resource by websafe key.
- */
+/** Command to get info on a Datastore resource by websafe key. */
+@DeleteAfterMigration
@Parameters(separators = " =", commandDescription = "Fetch a Datastore resource by websafe key")
final class GetResourceByKeyCommand implements CommandWithRemoteApi {
diff --git a/core/src/main/java/google/registry/tools/GetSchemaCommand.java b/core/src/main/java/google/registry/tools/GetSchemaCommand.java
index 5e1c628fc..3e2e77fa4 100644
--- a/core/src/main/java/google/registry/tools/GetSchemaCommand.java
+++ b/core/src/main/java/google/registry/tools/GetSchemaCommand.java
@@ -19,11 +19,13 @@ import static java.nio.charset.StandardCharsets.UTF_8;
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import google.registry.model.SchemaVersion;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
/** Generates the schema file used for model versioning. */
+@DeleteAfterMigration
@Parameters(commandDescription = "Generate a model schema file")
final class GetSchemaCommand implements Command {
diff --git a/core/src/main/java/google/registry/tools/GetSchemaTreeCommand.java b/core/src/main/java/google/registry/tools/GetSchemaTreeCommand.java
index 305a176e2..fa3a9f581 100644
--- a/core/src/main/java/google/registry/tools/GetSchemaTreeCommand.java
+++ b/core/src/main/java/google/registry/tools/GetSchemaTreeCommand.java
@@ -29,6 +29,7 @@ import com.googlecode.objectify.annotation.Entity;
import com.googlecode.objectify.annotation.EntitySubclass;
import com.googlecode.objectify.annotation.Parent;
import google.registry.model.BackupGroupRoot;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.annotations.NotBackedUp;
import google.registry.model.annotations.VirtualEntity;
import java.io.Serializable;
@@ -40,6 +41,7 @@ import java.util.Map;
import java.util.Set;
/** Visualizes the schema parentage tree. */
+@DeleteAfterMigration
@Parameters(commandDescription = "Generate a model schema file")
final class GetSchemaTreeCommand implements Command {
diff --git a/core/src/main/java/google/registry/tools/ImportDatastoreCommand.java b/core/src/main/java/google/registry/tools/ImportDatastoreCommand.java
index ca4c537d7..7e2e3d31f 100644
--- a/core/src/main/java/google/registry/tools/ImportDatastoreCommand.java
+++ b/core/src/main/java/google/registry/tools/ImportDatastoreCommand.java
@@ -22,6 +22,7 @@ import com.google.common.base.Ascii;
import com.google.common.collect.ImmutableList;
import google.registry.export.datastore.DatastoreAdmin;
import google.registry.export.datastore.Operation;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.List;
import java.util.concurrent.TimeUnit;
import javax.annotation.Nullable;
@@ -35,6 +36,7 @@ import org.joda.time.Duration;
* href="http://playbooks/domain_registry/procedures/backup-restore-testing.md">the playbook for
* the entire process.
*/
+@DeleteAfterMigration
@Parameters(separators = " =", commandDescription = "Imports a backup of the Datastore.")
public class ImportDatastoreCommand extends ConfirmingCommand {
diff --git a/core/src/main/java/google/registry/tools/ListDatastoreOperationsCommand.java b/core/src/main/java/google/registry/tools/ListDatastoreOperationsCommand.java
index bcef363f5..dca5fef9c 100644
--- a/core/src/main/java/google/registry/tools/ListDatastoreOperationsCommand.java
+++ b/core/src/main/java/google/registry/tools/ListDatastoreOperationsCommand.java
@@ -20,6 +20,7 @@ import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson2.JacksonFactory;
import google.registry.export.datastore.DatastoreAdmin;
import google.registry.export.datastore.DatastoreAdmin.ListOperations;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.util.Clock;
import java.util.Optional;
import javax.annotation.Nullable;
@@ -28,6 +29,7 @@ import org.joda.time.DateTime;
import org.joda.time.Duration;
/** Command that lists Datastore operations. */
+@DeleteAfterMigration
@Parameters(separators = " =", commandDescription = "List Datastore operations.")
public class ListDatastoreOperationsCommand implements Command {
diff --git a/core/src/main/java/google/registry/tools/LoadSnapshotCommand.java b/core/src/main/java/google/registry/tools/LoadSnapshotCommand.java
index 8319af524..a5d09d088 100644
--- a/core/src/main/java/google/registry/tools/LoadSnapshotCommand.java
+++ b/core/src/main/java/google/registry/tools/LoadSnapshotCommand.java
@@ -26,12 +26,14 @@ import com.google.common.util.concurrent.Futures;
import com.google.common.util.concurrent.ListenableFuture;
import google.registry.bigquery.BigqueryUtils.SourceFormat;
import google.registry.export.AnnotatedEntities;
+import google.registry.model.annotations.DeleteAfterMigration;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
/** Command to load Datastore snapshots into Bigquery. */
+@DeleteAfterMigration
@Parameters(separators = " =", commandDescription = "Load Datastore snapshot into Bigquery")
final class LoadSnapshotCommand extends BigqueryCommand {
diff --git a/core/src/main/java/google/registry/tools/ReadEntityFromKeyPathCommand.java b/core/src/main/java/google/registry/tools/ReadEntityFromKeyPathCommand.java
index 37973367d..43d28dd55 100644
--- a/core/src/main/java/google/registry/tools/ReadEntityFromKeyPathCommand.java
+++ b/core/src/main/java/google/registry/tools/ReadEntityFromKeyPathCommand.java
@@ -25,6 +25,7 @@ import com.google.common.io.CharStreams;
import com.google.common.io.Files;
import com.googlecode.objectify.Key;
import google.registry.model.ImmutableObject;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.domain.DomainBase;
import google.registry.persistence.VKey;
import google.registry.util.NonFinalForTesting;
@@ -40,6 +41,7 @@ import java.util.List;
* The key path is the value of column __key__.path of the entity's BigQuery table. Its value is
* converted from the entity's key.
*/
+@DeleteAfterMigration
abstract class ReadEntityFromKeyPathCommand extends MutatingCommand {
@Parameter(
diff --git a/core/src/main/java/google/registry/tools/SetDatabaseMigrationStateCommand.java b/core/src/main/java/google/registry/tools/SetDatabaseMigrationStateCommand.java
index 199d3a78d..f880eced6 100644
--- a/core/src/main/java/google/registry/tools/SetDatabaseMigrationStateCommand.java
+++ b/core/src/main/java/google/registry/tools/SetDatabaseMigrationStateCommand.java
@@ -19,12 +19,14 @@ import static google.registry.persistence.transaction.TransactionManagerFactory.
import com.beust.jcommander.Parameter;
import com.beust.jcommander.Parameters;
import com.google.common.collect.ImmutableSortedMap;
+import google.registry.model.annotations.DeleteAfterMigration;
import google.registry.model.common.DatabaseMigrationStateSchedule;
import google.registry.model.common.DatabaseMigrationStateSchedule.MigrationState;
import google.registry.tools.params.TransitionListParameter.MigrationStateTransitions;
import org.joda.time.DateTime;
/** Command to set the Registry 3.0 database migration state schedule. */
+@DeleteAfterMigration
@Parameters(
separators = " =",
commandDescription = "Set the current database migration state schedule.")