From 702c5b9692d8713afe331d39811e610b9c648bcb Mon Sep 17 00:00:00 2001 From: mcilwain Date: Tue, 15 Mar 2016 13:59:13 -0700 Subject: [PATCH] Annihilate the annihilator [] I am become Ben, annihilator of annihilators. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=117275133 --- .../registry/env/common/tools/WEB-INF/web.xml | 15 -- .../module/tools/ToolsRequestComponent.java | 2 - .../AnnihilateNonDefaultNamespacesAction.java | 136 ------------------ ...ihilateNonDefaultNamespacesActionTest.java | 107 -------------- 4 files changed, 260 deletions(-) delete mode 100644 java/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesAction.java delete mode 100644 javatests/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesActionTest.java diff --git a/java/com/google/domain/registry/env/common/tools/WEB-INF/web.xml b/java/com/google/domain/registry/env/common/tools/WEB-INF/web.xml index 839a600c1..686ac6a9a 100644 --- a/java/com/google/domain/registry/env/common/tools/WEB-INF/web.xml +++ b/java/com/google/domain/registry/env/common/tools/WEB-INF/web.xml @@ -125,21 +125,6 @@ /_dr/task/deleteProberData - - - - Deletes entities in non-default namespaces. - - Annihilate Non-Default Namespaces Mapreduce - annihilate-non-default-namespaces - com.google.domain.registry.module.tools.ToolsServlet - 1 - - - annihilate-non-default-namespaces - /_dr/task/annihilateNonDefaultNamespaces - - diff --git a/java/com/google/domain/registry/module/tools/ToolsRequestComponent.java b/java/com/google/domain/registry/module/tools/ToolsRequestComponent.java index 0bfc9949a..d6b054338 100644 --- a/java/com/google/domain/registry/module/tools/ToolsRequestComponent.java +++ b/java/com/google/domain/registry/module/tools/ToolsRequestComponent.java @@ -37,7 +37,6 @@ import com.google.domain.registry.tools.server.ListTldsAction; import com.google.domain.registry.tools.server.ToolsServerModule; import com.google.domain.registry.tools.server.UpdatePremiumListAction; import com.google.domain.registry.tools.server.VerifyOteAction; -import com.google.domain.registry.tools.server.javascrap.AnnihilateNonDefaultNamespacesAction; import dagger.Subcomponent; @@ -51,7 +50,6 @@ import dagger.Subcomponent; ToolsServerModule.class, }) interface ToolsRequestComponent { - AnnihilateNonDefaultNamespacesAction annihilateNonDefaultNamespacesAction(); CreateGroupsAction createGroupsAction(); CreatePremiumListAction createPremiumListAction(); DeleteEntityAction deleteEntityAction(); diff --git a/java/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesAction.java b/java/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesAction.java deleted file mode 100644 index 6d7b6f3a9..000000000 --- a/java/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesAction.java +++ /dev/null @@ -1,136 +0,0 @@ -// Copyright 2016 Google Inc. 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 com.google.domain.registry.tools.server.javascrap; - -import static com.google.appengine.api.datastore.DatastoreServiceFactory.getDatastoreService; -import static com.google.common.base.Preconditions.checkState; -import static com.google.domain.registry.mapreduce.MapreduceRunner.PARAM_DRY_RUN; -import static com.google.domain.registry.model.ofy.ObjectifyService.ofy; - -import com.google.appengine.api.NamespaceManager; -import com.google.appengine.api.datastore.DatastoreService; -import com.google.appengine.api.datastore.Entities; -import com.google.appengine.api.datastore.Entity; -import com.google.appengine.api.datastore.Key; -import com.google.appengine.api.datastore.Query; -import com.google.appengine.tools.mapreduce.Input; -import com.google.appengine.tools.mapreduce.Mapper; -import com.google.appengine.tools.mapreduce.inputs.DatastoreKeyInput; -import com.google.common.base.Strings; -import com.google.common.collect.ImmutableSet; -import com.google.domain.registry.mapreduce.MapreduceAction; -import com.google.domain.registry.mapreduce.MapreduceRunner; -import com.google.domain.registry.mapreduce.inputs.ChunkingKeyInput; -import com.google.domain.registry.request.Action; -import com.google.domain.registry.request.Parameter; -import com.google.domain.registry.request.Response; -import com.google.domain.registry.util.FormattingLogger; -import com.google.domain.registry.util.PipelineUtils; - -import com.googlecode.objectify.VoidWork; - -import java.util.List; - -import javax.inject.Inject; - -/** - * A mapreduce that deletes all entities in all namespaces except for the default namespace. - */ -@Action(path = "/_dr/task/annihilateNonDefaultNamespaces") -public class AnnihilateNonDefaultNamespacesAction implements MapreduceAction { - - private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); - - @Inject DatastoreService datastoreService; - @Inject @Parameter(PARAM_DRY_RUN) boolean isDryRun; - @Inject MapreduceRunner mrRunner; - @Inject Response response; - @Inject AnnihilateNonDefaultNamespacesAction() {} - - @Override - public void run() { - response.sendJavaScriptRedirect(PipelineUtils.createJobPath(mrRunner - .setJobName("Annihilate non-default namespaces") - .setModuleName("backend") - .runMapOnly( - new AnnihilateNonDefaultNamespacesMapper(isDryRun), - getInputs()))); - } - - /** Mapper to delete all entities in non-default namespaces. */ - public static class AnnihilateNonDefaultNamespacesMapper extends Mapper, Void, Void> { - - private static final long serialVersionUID = 8415923063881853727L; - private final boolean isDryRun; - - public AnnihilateNonDefaultNamespacesMapper(boolean isDryRun) { - this.isDryRun = isDryRun; - } - - @Override - public final void map(final List keys) { - if (isDryRun) { - logger.infofmt("Would delete these entities: %s", keys); - } else { - for (Key key : keys) { - // Additional safety check to prevent deleting real data. - checkState( - !Strings.isNullOrEmpty(key.getNamespace()), - "Will not delete key %s is in default namespace", - key); - } - ofy().transact(new VoidWork() { - @Override - public void vrun() { - getDatastoreService().delete(keys); - }}); - } - getContext().incrementCounter("entities deleted", keys.size()); - } - } - - private Iterable>> getInputs() { - ImmutableSet.Builder namespaces = new ImmutableSet.Builder<>(); - Query namespacesQuery = new Query(Entities.NAMESPACE_METADATA_KIND).setKeysOnly(); - for (Entity entity : datastoreService.prepare(namespacesQuery).asIterable()) { - // Don't delete anything in the default namespace! - if (!Strings.isNullOrEmpty(entity.getKey().getName())) { - namespaces.add(entity.getKey().getName()); - } - } - - ImmutableSet.Builder>> inputs = new ImmutableSet.Builder<>(); - for (String namespace : namespaces.build()) { - NamespaceManager.set(namespace); - ImmutableSet.Builder kindsBuilder = new ImmutableSet.Builder<>(); - Query kindsQuery = new Query(Entities.KIND_METADATA_KIND).setKeysOnly(); - for (Entity entity : datastoreService.prepare(kindsQuery).asIterable()) { - // Don't delete built-in kinds such as __Stat_* entities. - if (!entity.getKey().getName().startsWith("_")) { - kindsBuilder.add(entity.getKey().getName()); - } - } - ImmutableSet kinds = kindsBuilder.build(); - logger.infofmt("For namespace %s, found kinds: %s", namespace, kinds); - for (String kind : kinds) { - // Don't try to parallelize here, because Registry 1.0 entities are almost all in a single - // entity group. - inputs.add(new ChunkingKeyInput(new DatastoreKeyInput(kind, 1, namespace), 20)); - } - } - NamespaceManager.set(""); - return inputs.build(); - } -} diff --git a/javatests/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesActionTest.java b/javatests/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesActionTest.java deleted file mode 100644 index 994788970..000000000 --- a/javatests/com/google/domain/registry/tools/server/javascrap/AnnihilateNonDefaultNamespacesActionTest.java +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright 2016 Google Inc. 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 com.google.domain.registry.tools.server.javascrap; - -import static com.google.appengine.api.datastore.DatastoreServiceFactory.getDatastoreService; -import static com.google.common.truth.Truth.assertThat; -import static com.google.domain.registry.model.ofy.ObjectifyService.ofy; -import static com.google.domain.registry.testing.DatastoreHelper.newRegistry; - -import com.google.appengine.api.NamespaceManager; -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableSet; -import com.google.domain.registry.mapreduce.MapreduceRunner; -import com.google.domain.registry.model.ImmutableObject; -import com.google.domain.registry.model.domain.DomainApplication; -import com.google.domain.registry.model.host.HostResource; -import com.google.domain.registry.model.index.DomainApplicationIndex; -import com.google.domain.registry.model.registry.Registry; -import com.google.domain.registry.testing.DatastoreHelper; -import com.google.domain.registry.testing.FakeResponse; -import com.google.domain.registry.testing.mapreduce.MapreduceTestCase; - -import com.googlecode.objectify.Key; -import com.googlecode.objectify.Ref; -import com.googlecode.objectify.VoidWork; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; - -/** Unit tests for {@link AnnihilateNonDefaultNamespacesAction}. */ -@RunWith(JUnit4.class) -public class AnnihilateNonDefaultNamespacesActionTest - extends MapreduceTestCase { - - @Before - public void init() { - action = new AnnihilateNonDefaultNamespacesAction(); - action.datastoreService = getDatastoreService(); - action.mrRunner = new MapreduceRunner(Optional.absent(), Optional.absent()); - action.response = new FakeResponse(); - } - - private void runMapreduce() throws Exception { - action.run(); - executeTasksUntilEmpty("mapreduce"); - } - - private void runTest(boolean shouldBeDeleted) throws Exception { - NamespaceManager.set("blah1"); - final DomainApplicationIndex toDelete1 = - DomainApplicationIndex.createWithSpecifiedReferences( - "foo.bar", ImmutableSet.of(Ref.create(Key.create(DomainApplication.class, 1L)))); - final Registry toDelete2 = newRegistry("bar", "BAR"); - ofy().transact(new VoidWork() { - @Override - public void vrun() { - ofy().save().entities(toDelete1, toDelete2).now(); - }}); - - NamespaceManager.set(""); - final HostResource dontDelete1 = DatastoreHelper.newHostResource("blah.test.bar"); - final Registry dontDelete2 = newRegistry("baz", "BAZ"); - ofy().transact(new VoidWork() { - @Override - public void vrun() { - ofy().save().entities(dontDelete1, dontDelete2).now(); - }}); - ofy().clearSessionCache(); - runMapreduce(); - assertThat(ofy().load().entity(dontDelete1).now()).isNotNull(); - assertThat(ofy().load().entity(dontDelete2).now()).isNotNull(); - - NamespaceManager.set("blah1"); - if (shouldBeDeleted) { - assertThat(ofy().load().entity(toDelete1).now()).isNull(); - assertThat(ofy().load().entity(toDelete2).now()).isNull(); - } else { - assertThat(ofy().load().entity(toDelete1).now()).isNotNull(); - assertThat(ofy().load().entity(toDelete2).now()).isNotNull(); - } - } - - @Test - public void test_deletesOnlyEntitesInNonDefaultNamespace() throws Exception { - runTest(true); - } - - @Test - public void test_dryRunDoesntDeleteAnything() throws Exception { - action.isDryRun = true; - runTest(false); - } -}