@return: the desired exit code
"""
+ if not opts.no_voting:
+ # Verify that a majority of nodes is still healthy
+ if not bootstrap.MajorityHealthy():
+ ToStderr("Master-failover with voting is only possible if the majority"
+ " of nodes is still healthy; use the --no-voting option after"
+ " ensuring by other means that you won't end up in a dual-master"
+ " scenario.")
+ return 1
if opts.no_voting and not opts.yes_do_it:
usertext = ("This will perform the failover even if most other nodes"
" are down, or if this node is outdated. This is dangerous"
rollback.append(
lambda: utils.RunCmd(["rm", "-f", pathutils.INTENT_TO_UPGRADE]))
- ToStdout("Draining queue")
+ ToStdoutAndLoginfo("Draining queue")
client = GetClient()
client.SetQueueDrainFlag(True)
ToStderr("Failed to completely empty the queue.")
return (False, rollback)
- ToStdout("Pausing the watcher for one hour.")
+ ToStdoutAndLoginfo("Pausing the watcher for one hour.")
rollback.append(lambda: GetClient().SetWatcherPause(None))
GetClient().SetWatcherPause(time.time() + 60 * 60)
- ToStdout("Stopping daemons on master node.")
+ ToStdoutAndLoginfo("Stopping daemons on master node.")
if not _RunCommandAndReport([pathutils.DAEMON_UTIL, "stop-all"]):
return (False, rollback)
utils.RunCmd([pathutils.DAEMON_UTIL, "start-all"])
return (False, rollback)
- ToStdout("Stopping daemons everywhere.")
+ ToStdoutAndLoginfo("Stopping daemons everywhere.")
rollback.append(lambda: _VerifyCommand([pathutils.DAEMON_UTIL, "start-all"]))
badnodes = _VerifyCommand([pathutils.DAEMON_UTIL, "stop-all"])
if badnodes:
return (False, rollback)
backuptar = os.path.join(pathutils.BACKUP_DIR, "ganeti%d.tar" % time.time())
- ToStdout("Backing up configuration as %s" % backuptar)
+ ToStdoutAndLoginfo("Backing up configuration as %s", backuptar)
if not _RunCommandAndReport(["mkdir", "-p", pathutils.BACKUP_DIR]):
return (False, rollback)
@return: True upon success
"""
- ToStdout("Performing version-specific downgrade tasks.")
+ ToStdoutAndLoginfo("Performing version-specific downgrade tasks.")
# Determine if this cluster is set up with SSH handling
# (aka not using --no-ssh-init), check if the public
"""
rollback = []
if downgrade:
- ToStdout("Downgrading configuration")
+ ToStdoutAndLoginfo("Downgrading configuration")
if not _RunCommandAndReport([pathutils.CFGUPGRADE, "--downgrade", "-f"]):
return (False, rollback)
# Note: version specific downgrades need to be done before switching
# Configuration change is the point of no return. From then onwards, it is
# safer to push through the up/dowgrade than to try to roll it back.
- ToStdout("Switching to version %s on all nodes" % versionstring)
+ ToStdoutAndLoginfo("Switching to version %s on all nodes", versionstring)
rollback.append(lambda: _SetGanetiVersion(constants.DIR_VERSION))
badnodes = _SetGanetiVersion(versionstring)
if badnodes:
# commands using their canonical (version independent) path.
if not downgrade:
- ToStdout("Upgrading configuration")
+ ToStdoutAndLoginfo("Upgrading configuration")
if not _RunCommandAndReport([pathutils.CFGUPGRADE, "-f"]):
return (False, rollback)
"""
returnvalue = 0
- ToStdout("Ensuring directories everywhere.")
+ ToStdoutAndLoginfo("Ensuring directories everywhere.")
badnodes = _VerifyCommand([pathutils.ENSURE_DIRS])
if badnodes:
ToStderr("Warning: failed to ensure directories on %s." %
(", ".join(badnodes)))
returnvalue = 1
- ToStdout("Starting daemons everywhere.")
+ ToStdoutAndLoginfo("Starting daemons everywhere.")
badnodes = _VerifyCommand([pathutils.DAEMON_UTIL, "start-all"])
if badnodes:
ToStderr("Warning: failed to start daemons on %s." % (", ".join(badnodes),))
returnvalue = 1
- ToStdout("Redistributing the configuration.")
+ ToStdoutAndLoginfo("Redistributing the configuration.")
if not _RunCommandAndReport(["gnt-cluster", "redist-conf", "--yes-do-it"]):
returnvalue = 1
- ToStdout("Restarting daemons everywhere.")
+ ToStdoutAndLoginfo("Restarting daemons everywhere.")
badnodes = _VerifyCommand([pathutils.DAEMON_UTIL, "stop-all"])
badnodes.extend(_VerifyCommand([pathutils.DAEMON_UTIL, "start-all"]))
if badnodes:
(", ".join(list(set(badnodes))),))
returnvalue = 1
- ToStdout("Undraining the queue.")
+ ToStdoutAndLoginfo("Undraining the queue.")
if not _RunCommandAndReport(["gnt-cluster", "queue", "undrain"]):
returnvalue = 1
_RunCommandAndReport(["rm", "-f", pathutils.INTENT_TO_UPGRADE])
- ToStdout("Running post-upgrade hooks")
+ ToStdoutAndLoginfo("Running post-upgrade hooks")
if not _RunCommandAndReport([pathutils.POST_UPGRADE, oldversion]):
returnvalue = 1
- ToStdout("Unpausing the watcher.")
+ ToStdoutAndLoginfo("Unpausing the watcher.")
if not _RunCommandAndReport(["gnt-cluster", "watcher", "continue"]):
returnvalue = 1
- ToStdout("Verifying cluster.")
+ ToStdoutAndLoginfo("Verifying cluster.")
if not _RunCommandAndReport(["gnt-cluster", "verify"]):
returnvalue = 1
" finish it first" % (oldversion, versionstring))
return 1
+ utils.SetupLogging(pathutils.LOG_COMMANDS, 'gnt-cluster upgrade', debug=1)
+
oldversion = constants.RELEASE_VERSION
if opts.resume: