From 69a590217ce3d5295650de5b3e87d1602b990c97 Mon Sep 17 00:00:00 2001 From: Rob Rudin Date: Mon, 21 Sep 2015 20:36:04 -0400 Subject: [PATCH] #56 ConfigureForestReplicasCommand now has an undo method --- CHANGELOG.mdown | 4 +-- .../command/AbstractResourceCommand.java | 12 +------- .../command/AbstractUndoableCommand.java | 19 ++++++++++++ .../ConfigureForestReplicasCommand.java | 29 +++++++++++++++---- .../forests/ConfigureForestReplicasDebug.java | 7 ++--- 5 files changed, 49 insertions(+), 22 deletions(-) create mode 100644 src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractUndoableCommand.java diff --git a/CHANGELOG.mdown b/CHANGELOG.mdown index 9d7db879..b076dcca 100644 --- a/CHANGELOG.mdown +++ b/CHANGELOG.mdown @@ -6,5 +6,5 @@ TODO Reconcile this with what's in gradle.properties ## 2.0b9 -* [#55](https://github.com/rjrudin/ml-app-deployer/issues/56) ForestManager now has methods for simplifying the -deletion of replica forests. +* [#56](https://github.com/rjrudin/ml-app-deployer/issues/56) ConfigureForestReplicasCommand now supports "undo", using +new methods in ForestManager to delete replica forests. Also extracted AbstractUndoableCommand. diff --git a/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractResourceCommand.java b/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractResourceCommand.java index eee456c8..dbc09734 100644 --- a/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractResourceCommand.java +++ b/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractResourceCommand.java @@ -10,21 +10,15 @@ * Provides a basic implementation for creating/updating a resource while an app is being deployed and then deleting it * while the app is being undeployed. */ -public abstract class AbstractResourceCommand extends AbstractCommand implements UndoableCommand { +public abstract class AbstractResourceCommand extends AbstractUndoableCommand { private boolean deleteResourcesOnUndo = true; private boolean restartAfterDelete = false; - private int undoSortOrder = Integer.MAX_VALUE; protected abstract File[] getResourceDirs(CommandContext context); protected abstract ResourceManager getResourceManager(CommandContext context); - @Override - public Integer getUndoSortOrder() { - return undoSortOrder; - } - @Override public void execute(CommandContext context) { for (File resourceDir : getResourceDirs(context)) { @@ -94,8 +88,4 @@ public boolean isDeleteResourcesOnUndo() { public boolean isRestartAfterDelete() { return restartAfterDelete; } - - public void setUndoSortOrder(int undoSortOrder) { - this.undoSortOrder = undoSortOrder; - } } diff --git a/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractUndoableCommand.java b/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractUndoableCommand.java new file mode 100644 index 00000000..ca7fc2ce --- /dev/null +++ b/src/main/java/com/rjrudin/marklogic/appdeployer/command/AbstractUndoableCommand.java @@ -0,0 +1,19 @@ +package com.rjrudin.marklogic.appdeployer.command; + +/** + * Useful base class for implementing UndoableCommand, allowing you to configure the undo sort order easily. + */ +public abstract class AbstractUndoableCommand extends AbstractCommand implements UndoableCommand { + + private int undoSortOrder = Integer.MAX_VALUE; + + @Override + public Integer getUndoSortOrder() { + return undoSortOrder; + } + + public void setUndoSortOrder(int undoSortOrder) { + this.undoSortOrder = undoSortOrder; + } + +} diff --git a/src/main/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasCommand.java b/src/main/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasCommand.java index b81f7fab..007102a3 100644 --- a/src/main/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasCommand.java +++ b/src/main/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasCommand.java @@ -4,7 +4,7 @@ import java.util.List; import java.util.Map; -import com.rjrudin.marklogic.appdeployer.command.AbstractCommand; +import com.rjrudin.marklogic.appdeployer.command.AbstractUndoableCommand; import com.rjrudin.marklogic.appdeployer.command.CommandContext; import com.rjrudin.marklogic.mgmt.forests.ForestManager; import com.rjrudin.marklogic.mgmt.hosts.HostManager; @@ -14,9 +14,10 @@ * for the out-of-the-box forests such as Security, Schemas, App-Services, and Meters, which normally need replicas for * failover in a cluster. */ -public class ConfigureForestReplicasCommand extends AbstractCommand { +public class ConfigureForestReplicasCommand extends AbstractUndoableCommand { private Map forestNamesAndReplicaCounts = new HashMap<>(); + private boolean deleteReplicasOnUndo = true; /** * By default, the execute sort order is Integer.MAX_VALUE as a way of guaranteeing that the referenced primary @@ -59,9 +60,7 @@ public void execute(CommandContext context) { */ protected void configureReplicaForests(String primaryForestName, int replicaCount, List hostIds, ForestManager forestMgr) { - if (logger.isInfoEnabled()) { - logger.info("Configuring forest replicas for primary forest: " + primaryForestName); - } + logger.info(format("Configuring forest replicas for primary forest %s", primaryForestName)); String primaryForestHostId = forestMgr.getHostId(primaryForestName); @@ -81,6 +80,22 @@ protected void configureReplicaForests(String primaryForestName, int replicaCoun if (!replicaNamesAndHostIds.isEmpty()) { forestMgr.setReplicas(primaryForestName, replicaNamesAndHostIds); } + + logger.info(format("Finished configuring forest replicas for primary forest %s", primaryForestName)); + } + + @Override + public void undo(CommandContext context) { + if (deleteReplicasOnUndo) { + ForestManager mgr = new ForestManager(context.getManageClient()); + for (String forestName : forestNamesAndReplicaCounts.keySet()) { + logger.info(format("Deleting forest replicas for primary forest %s", forestName)); + mgr.deleteReplicas(forestName); + logger.info(format("Finished deleting forest replicas for primary forest %s", forestName)); + } + } else { + logger.info("deleteReplicasOnUndo is set to false, so not deleting any replicas"); + } } public void setForestNamesAndReplicaCounts(Map forestNamesAndReplicaCounts) { @@ -90,4 +105,8 @@ public void setForestNamesAndReplicaCounts(Map forestNamesAndRe public Map getForestNamesAndReplicaCounts() { return forestNamesAndReplicaCounts; } + + public void setDeleteReplicasOnUndo(boolean deleteReplicasOnUndo) { + this.deleteReplicasOnUndo = deleteReplicasOnUndo; + } } diff --git a/src/test/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasDebug.java b/src/test/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasDebug.java index 6a6610e4..eb6e6200 100644 --- a/src/test/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasDebug.java +++ b/src/test/java/com/rjrudin/marklogic/appdeployer/command/forests/ConfigureForestReplicasDebug.java @@ -4,7 +4,6 @@ import com.rjrudin.marklogic.appdeployer.command.CommandContext; import com.rjrudin.marklogic.mgmt.ManageClient; import com.rjrudin.marklogic.mgmt.ManageConfig; -import com.rjrudin.marklogic.mgmt.databases.DatabaseManager; /** * Not an actual test, as this depends on an environment with multiple hosts, which is normally not the case on a @@ -21,13 +20,13 @@ public static void main(String[] args) { AppConfig appConfig = new AppConfig(); CommandContext context = new CommandContext(appConfig, manageClient, null); + // Configure replicas ConfigureForestReplicasCommand command = new ConfigureForestReplicasCommand(); command.getForestNamesAndReplicaCounts().put("Security", 1); command.getForestNamesAndReplicaCounts().put("Schemas", 2); command.execute(context); - DatabaseManager dbMgr = new DatabaseManager(manageClient); - dbMgr.deleteReplicaForests("Security"); - dbMgr.deleteReplicaForests("Schemas"); + // And then delete those replicas + command.undo(context); } }