From 620a9c6204216555a0d68b6d8924768ccfbb501f Mon Sep 17 00:00:00 2001
From: Guido Trotter <ultrotter@google.com>
Date: Mon, 25 Jul 2011 15:17:23 +0000
Subject: [PATCH] cluster-merge: add instance restart strategy opt

Right now we always restart all instances, which is not right if some
instances were already down for other reasons. Thus we add an option to
decide how to handle this. The right default should be "up" which is:
"restart all options which were switched off by the merge", but since
that's not implemented yet, the default remains the old one, for now.

Signed-off-by: Guido Trotter <ultrotter@google.com>
Reviewed-by: Iustin Pop <iustin@google.com>
---
 tools/cluster-merge | 34 +++++++++++++++++++++++++++++-----
 1 file changed, 29 insertions(+), 5 deletions(-)

diff --git a/tools/cluster-merge b/tools/cluster-merge
index 2de09bc60..117c38f9a 100755
--- a/tools/cluster-merge
+++ b/tools/cluster-merge
@@ -45,6 +45,11 @@ from ganeti import utils
 _GROUPS_MERGE = "merge"
 _GROUPS_RENAME = "rename"
 _CLUSTERMERGE_ECID = "clustermerge-ecid"
+_RESTART_ALL = "all"
+_RESTART_UP = "up"
+_RESTART_NONE = "none"
+_RESTART_CHOICES = (_RESTART_ALL, _RESTART_UP, _RESTART_NONE)
+
 
 PAUSE_PERIOD_OPT = cli.cli_option("-p", "--watcher-pause-period", default=1800,
                                   action="store", type="int",
@@ -57,6 +62,13 @@ GROUPS_OPT = cli.cli_option("--groups", default=None, metavar="STRATEGY",
                             help=("How to handle groups that have the"
                                   " same name (One of: %s/%s)" %
                                   (_GROUPS_MERGE, _GROUPS_RENAME)))
+RESTART_OPT = cli.cli_option("--restart", default=_RESTART_ALL,
+                             metavar="STRATEGY",
+                             choices=_RESTART_CHOICES,
+                             dest="restart",
+                             help=("How to handle restarting instances"
+                                   " same name (One of: %s/%s/%s)" %
+                                   _RESTART_CHOICES))
 
 
 def Flatten(unflattened_list):
@@ -101,12 +113,13 @@ class Merger(object):
   """Handling the merge.
 
   """
-  def __init__(self, clusters, pause_period, groups):
+  def __init__(self, clusters, pause_period, groups, restart):
     """Initialize object with sane defaults and infos required.
 
     @param clusters: The list of clusters to merge in
     @param pause_period: The time watcher shall be disabled for
     @param groups: How to handle group conflicts
+    @param restart: How to handle instance restart
 
     """
     self.merger_data = []
@@ -116,6 +129,10 @@ class Merger(object):
     (self.cluster_name, ) = cli.GetClient().QueryConfigValues(["cluster_name"])
     self.ssh_runner = ssh.SshRunner(self.cluster_name)
     self.groups = groups
+    self.restart = restart
+    if self.restart == _RESTART_UP:
+      raise NotImplementedError
+
 
   def Setup(self):
     """Sets up our end so we can do the merger.
@@ -630,8 +647,11 @@ class Merger(object):
       self._KillMasterDaemon()
       self._StartMasterDaemon()
 
-      logging.info("Starting instances again")
-      self._StartupAllInstances()
+      if self.restart == _RESTART_ALL:
+        logging.info("Starting instances again")
+        self._StartupAllInstances()
+      else:
+        logging.info("Not starting instances again")
       logging.info("Post cluster verification")
       self._VerifyCluster()
     except errors.GenericError, e:
@@ -692,13 +712,17 @@ def main():
   parser = optparse.OptionParser(usage=("%%prog [--debug|--verbose]"
                                         " [--watcher-pause-period SECONDS]"
                                         " [--groups [%s|%s]]"
+                                        " [--restart [%s|%s|%s]]"
                                         " <cluster> [<cluster...>]" %
-                                        (_GROUPS_MERGE, _GROUPS_RENAME)),
+                                        (_GROUPS_MERGE, _GROUPS_RENAME,
+                                         _RESTART_ALL, _RESTART_UP,
+                                         _RESTART_NONE)),
                                         prog=program)
   parser.add_option(cli.DEBUG_OPT)
   parser.add_option(cli.VERBOSE_OPT)
   parser.add_option(PAUSE_PERIOD_OPT)
   parser.add_option(GROUPS_OPT)
+  parser.add_option(RESTART_OPT)
 
   (options, args) = parser.parse_args()
 
@@ -708,7 +732,7 @@ def main():
     parser.error("No clusters specified")
 
   cluster_merger = Merger(utils.UniqueSequence(args), options.pause_period,
-                          options.groups)
+                          options.groups, options.restart)
   try:
     try:
       cluster_merger.Setup()
-- 
GitLab